indent fretwork.c

This commit is contained in:
Bill Kendrick 2017-10-15 11:45:47 -07:00
parent 31cb4f4505
commit 8a7edd82bf

View file

@ -55,23 +55,19 @@ char * fretwork_get_name(magic_api * api, int which);
char *fretwork_get_description(magic_api * api, int which, int mode); char *fretwork_get_description(magic_api * api, int which, int mode);
int fretwork_requires_colors(magic_api * api, int which); int fretwork_requires_colors(magic_api * api, int which);
void fretwork_release(magic_api * api, int which, void fretwork_release(magic_api * api, int which,
SDL_Surface * canvas, SDL_Surface * snapshot, SDL_Surface * canvas, SDL_Surface * snapshot, int x, int y, SDL_Rect * update_rect);
int x, int y, SDL_Rect * update_rect);
void fretwork_shutdown(magic_api * api); void fretwork_shutdown(magic_api * api);
void fretwork_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * snapshot); void fretwork_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * snapshot);
void fretwork_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * snapshot); void fretwork_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * snapshot);
inline void fretwork_extract_coords_from_segment(unsigned int segment, Sint16 * x, Sint16 * y); inline void fretwork_extract_coords_from_segment(unsigned int segment, Sint16 * x, Sint16 * y);
void fretwork_click(magic_api * api, int which, int mode, void fretwork_click(magic_api * api, int which, int mode,
SDL_Surface * canvas, SDL_Surface * snapshot, SDL_Surface * canvas, SDL_Surface * snapshot, int x, int y, SDL_Rect * update_rect);
int x, int y, SDL_Rect * update_rect);
void fretwork_drag(magic_api * api, int which, SDL_Surface * canvas, void fretwork_drag(magic_api * api, int which, SDL_Surface * canvas,
SDL_Surface * snapshot, int ox, int oy, int x, int y, SDL_Surface * snapshot, int ox, int oy, int x, int y, SDL_Rect * update_rect);
SDL_Rect * update_rect); static void fretwork_draw_wrapper(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y);
static void fretwork_draw_wrapper(void * ptr, int which, SDL_Surface * canvas, SDL_Surface * last,
int x, int y);
inline unsigned int fretwork_get_segment(int x, int y); inline unsigned int fretwork_get_segment(int x, int y);
@ -111,12 +107,9 @@ static void fretwork_colorize(magic_api * api, SDL_Surface * dest, SDL_Surface *
{ {
for (x = 0; x < src->w; x++) for (x = 0; x < src->w; x++)
{ {
SDL_GetRGBA(api->getpixel(src, x, y), SDL_GetRGBA(api->getpixel(src, x, y), src->format, &r, &g, &b, &a);
src->format, &r, &g, &b, &a);
api->putpixel(dest, x, y, api->putpixel(dest, x, y, SDL_MapRGBA(dest->format, fretwork_r, fretwork_g, fretwork_b, a));
SDL_MapRGBA(dest->format,
fretwork_r, fretwork_g, fretwork_b, a));
} }
} }
@ -167,22 +160,28 @@ SDL_Surface * fretwork_get_icon(magic_api * api, int which ATTRIBUTE_UNUSED)
{ {
char fname[1024]; char fname[1024];
snprintf(fname, sizeof(fname), "%s/images/magic/fretwork.png", snprintf(fname, sizeof(fname), "%s/images/magic/fretwork.png", api->data_directory);
api->data_directory);
return (IMG_Load(fname)); return (IMG_Load(fname));
} }
char * fretwork_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) { return strdup(gettext_noop("Fretwork")); } char *fretwork_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
{
return strdup(gettext_noop("Fretwork"));
}
char * fretwork_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode) { char *fretwork_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode)
{
if (mode == MODE_PAINT) if (mode == MODE_PAINT)
return strdup(gettext_noop("Click and drag to draw repetitive patterns. ")); return strdup(gettext_noop("Click and drag to draw repetitive patterns. "));
else else
return strdup(gettext_noop("Click to surround your picture with repetitive patterns.")); return strdup(gettext_noop("Click to surround your picture with repetitive patterns."));
} }
int fretwork_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) { return 1;} int fretwork_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
{
return 1;
}
void fretwork_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, void fretwork_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * snapshot ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * snapshot ATTRIBUTE_UNUSED,
@ -213,12 +212,14 @@ void fretwork_shutdown(magic_api * api ATTRIBUTE_UNUSED)
free(fretwork_status_of_segments); free(fretwork_status_of_segments);
} }
void fretwork_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas, SDL_Surface * snapshot ATTRIBUTE_UNUSED) void fretwork_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
SDL_Surface * canvas, SDL_Surface * snapshot ATTRIBUTE_UNUSED)
{ {
//we've to compute the quantity of segments in each direction //we've to compute the quantity of segments in each direction
canvas_backup = SDL_CreateRGBSurface(SDL_ANYFORMAT, canvas->w, canvas->h, canvas->format->BitsPerPixel, canvas_backup = SDL_CreateRGBSurface(SDL_ANYFORMAT, canvas->w, canvas->h, canvas->format->BitsPerPixel,
canvas->format->Rmask, canvas->format->Gmask, canvas->format->Bmask, canvas->format->Amask); canvas->format->Rmask, canvas->format->Gmask, canvas->format->Bmask,
canvas->format->Amask);
SDL_BlitSurface(canvas, NULL, canvas_backup, NULL); SDL_BlitSurface(canvas, NULL, canvas_backup, NULL);
fretwork_segments_x = fretwork_math_ceil(canvas->w, img_w); fretwork_segments_x = fretwork_math_ceil(canvas->w, img_w);
@ -228,7 +229,8 @@ void fretwork_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNU
} }
void fretwork_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * snapshot ATTRIBUTE_UNUSED) void fretwork_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * snapshot ATTRIBUTE_UNUSED)
{ {
free(fretwork_status_of_segments); free(fretwork_status_of_segments);
fretwork_status_of_segments = NULL; fretwork_status_of_segments = NULL;
@ -240,16 +242,19 @@ void fretwork_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UN
static int fretwork_math_ceil(int x, int y) static int fretwork_math_ceil(int x, int y)
{ {
int temp; int temp;
temp = (int)x / y; temp = (int)x / y;
if (x % y) if (x % y)
return temp + 1; return temp + 1;
else return temp; else
return temp;
} }
inline unsigned int fretwork_get_segment(int x, int y) inline unsigned int fretwork_get_segment(int x, int y)
{ {
int xx; //segments are numerated just like pixels int xx; //segments are numerated just like pixels
int yy; //in computer graphics: left upper (=1), ... ,right upper, int yy; //in computer graphics: left upper (=1), ... ,right upper,
//left bottom, ... , right bottom //left bottom, ... , right bottom
xx = fretwork_math_ceil(x, img_w); xx = fretwork_math_ceil(x, img_w);
yy = fretwork_math_ceil(y, img_h); yy = fretwork_math_ceil(y, img_h);
@ -278,6 +283,7 @@ static void fretwork_flip_flop(void * ptr, SDL_Surface * dest, SDL_Surface * src
{ {
magic_api *api = (magic_api *) ptr; magic_api *api = (magic_api *) ptr;
Sint16 x, y; Sint16 x, y;
for (x = 0; x < dest->w; x++) for (x = 0; x < dest->w; x++)
for (y = 0; y < dest->h; y++) for (y = 0; y < dest->h; y++)
api->putpixel(dest, dest->w - 1 - x, dest->h - 1 - y, api->getpixel(src, x, y)); api->putpixel(dest, dest->w - 1 - x, dest->h - 1 - y, api->getpixel(src, x, y));
@ -306,10 +312,10 @@ static void fretwork_rotate (void * ptr, SDL_Surface * dest, SDL_Surface * src,
void fretwork_click(magic_api * api, int which, int mode, void fretwork_click(magic_api * api, int which, int mode,
SDL_Surface * canvas, SDL_Surface * snapshot, SDL_Surface * canvas, SDL_Surface * snapshot, int x, int y, SDL_Rect * update_rect)
int x, int y, SDL_Rect * update_rect)
{ {
int left_x, right_x, top_y, bottom_y; int left_x, right_x, top_y, bottom_y;
fretwork_segment_modified_last = 0; fretwork_segment_modified_last = 0;
if (mode == MODE_PAINT) if (mode == MODE_PAINT)
{ {
@ -326,16 +332,20 @@ void fretwork_click(magic_api * api, int which, int mode,
bottom_y = img_h * fretwork_segments_y - img_h * (fretwork_full_runs - 1); bottom_y = img_h * fretwork_segments_y - img_h * (fretwork_full_runs - 1);
//left line //left line
api->line((void *) api, which, canvas, snapshot, left_x, top_y, left_x, bottom_y, img_w/2, fretwork_draw_wrapper); api->line((void *)api, which, canvas, snapshot, left_x, top_y, left_x, bottom_y, img_w / 2,
fretwork_draw_wrapper);
//top line //top line
api->line((void *) api, which, canvas, snapshot, left_x, top_y, right_x, top_y, img_w/2, fretwork_draw_wrapper); api->line((void *)api, which, canvas, snapshot, left_x, top_y, right_x, top_y, img_w / 2,
fretwork_draw_wrapper);
//bottom line //bottom line
api->line((void *) api, which, canvas, snapshot, left_x, bottom_y, right_x, bottom_y, img_w/2, fretwork_draw_wrapper); api->line((void *)api, which, canvas, snapshot, left_x, bottom_y, right_x, bottom_y, img_w / 2,
fretwork_draw_wrapper);
//right line //right line
api->line((void *) api, which, canvas, snapshot, right_x, top_y, right_x, bottom_y, img_w/2, fretwork_draw_wrapper); api->line((void *)api, which, canvas, snapshot, right_x, top_y, right_x, bottom_y, img_w / 2,
fretwork_draw_wrapper);
fretwork_full_runs += 1; fretwork_full_runs += 1;
update_rect->x = 0; update_rect->x = 0;
@ -391,22 +401,31 @@ static Uint8 fretwork_select_image(Uint16 segment)
} }
take_up = segment - fretwork_segments_x; take_up = segment - fretwork_segments_x;
if (take_up<=0) val_up = SEG_NONE; if (take_up <= 0)
else val_up = fretwork_status_of_segments[take_up]; val_up = SEG_NONE;
else
val_up = fretwork_status_of_segments[take_up];
take_down = segment + fretwork_segments_x; take_down = segment + fretwork_segments_x;
if (take_down>(signed)(fretwork_segments_x*fretwork_segments_y)) val_down = SEG_NONE; if (take_down > (signed)(fretwork_segments_x * fretwork_segments_y))
else val_down = fretwork_status_of_segments[take_down]; val_down = SEG_NONE;
else
val_down = fretwork_status_of_segments[take_down];
if ((segment%fretwork_segments_x)==1) val_left=SEG_NONE; if ((segment % fretwork_segments_x) == 1)
else val_left = fretwork_status_of_segments[segment-1]; val_left = SEG_NONE;
else
val_left = fretwork_status_of_segments[segment - 1];
if ((segment%fretwork_segments_x)==0) val_right=SEG_NONE; if ((segment % fretwork_segments_x) == 0)
else val_right = fretwork_status_of_segments[segment+1]; val_right = SEG_NONE;
else
val_right = fretwork_status_of_segments[segment + 1];
if (from_left || (val_left & SEG_RIGHT) || from_bottom_left) if (from_left || (val_left & SEG_RIGHT) || from_bottom_left)
{ {
LEFT = 1;} LEFT = 1;
}
if (from_right || (val_right & SEG_LEFT) || from_top_right) if (from_right || (val_right & SEG_LEFT) || from_top_right)
RIGHT = 1; RIGHT = 1;
if (from_top || (val_up & SEG_BOTTOM) || from_top_left) if (from_top || (val_up & SEG_BOTTOM) || from_top_left)
@ -444,8 +463,8 @@ static Uint8 fretwork_select_image(Uint16 segment)
} }
static void fretwork_draw(void * ptr, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas, SDL_Surface * last ATTRIBUTE_UNUSED, static void fretwork_draw(void *ptr, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas,
int x, int y ATTRIBUTE_UNUSED, unsigned int segment) SDL_Surface * last ATTRIBUTE_UNUSED, int x, int y ATTRIBUTE_UNUSED, unsigned int segment)
{ {
magic_api *api = (magic_api *) ptr; magic_api *api = (magic_api *) ptr;
SDL_Surface *result, *temp; SDL_Surface *result, *temp;
@ -467,10 +486,12 @@ static void fretwork_draw(void * ptr, int which ATTRIBUTE_UNUSED, SDL_Surface *
fretwork_status_of_segments[segment] = image; //and write it to global table fretwork_status_of_segments[segment] = image; //and write it to global table
result = SDL_CreateRGBSurface(SDL_ANYFORMAT, img_w, img_h, fretwork_one->format->BitsPerPixel, result = SDL_CreateRGBSurface(SDL_ANYFORMAT, img_w, img_h, fretwork_one->format->BitsPerPixel,
fretwork_one->format->Rmask, fretwork_one->format->Gmask, fretwork_one->format->Bmask, fretwork_one->format->Amask); fretwork_one->format->Rmask, fretwork_one->format->Gmask, fretwork_one->format->Bmask,
fretwork_one->format->Amask);
temp = SDL_CreateRGBSurface(SDL_ANYFORMAT, img_w, img_h, fretwork_one->format->BitsPerPixel, temp = SDL_CreateRGBSurface(SDL_ANYFORMAT, img_w, img_h, fretwork_one->format->BitsPerPixel,
fretwork_one->format->Rmask, fretwork_one->format->Gmask, fretwork_one->format->Bmask, fretwork_one->format->Amask); fretwork_one->format->Rmask, fretwork_one->format->Gmask, fretwork_one->format->Bmask,
fretwork_one->format->Amask);
SDL_BlitSurface(canvas_backup, &modification_rect, result, NULL); SDL_BlitSurface(canvas_backup, &modification_rect, result, NULL);
@ -542,8 +563,7 @@ static void fretwork_draw(void * ptr, int which ATTRIBUTE_UNUSED, SDL_Surface *
} }
static void fretwork_draw_wrapper(void * ptr, int which, SDL_Surface * canvas, SDL_Surface * last, static void fretwork_draw_wrapper(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y)
int x, int y)
{ {
fretwork_segment_modified = fretwork_get_segment(x, y); fretwork_segment_modified = fretwork_get_segment(x, y);
@ -553,24 +573,29 @@ static void fretwork_draw_wrapper(void * ptr, int which, SDL_Surface * canvas, S
{ {
fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_modified_last); fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_modified_last);
fretwork_extract_coords_from_segment(fretwork_segment_start_rectangle, &modification_rect.x, &modification_rect.y); fretwork_extract_coords_from_segment(fretwork_segment_start_rectangle, &modification_rect.x,
&modification_rect.y);
modification_rect.w = fretwork_update_rectangle_width * img_w; modification_rect.w = fretwork_update_rectangle_width * img_w;
modification_rect.h = fretwork_update_rectangle_height * img_h; modification_rect.h = fretwork_update_rectangle_height * img_h;
} }
if (fretwork_segment_to_add>0){ if (fretwork_segment_to_add > 0)
{
fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_to_add); fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_to_add);
fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_modified_last); fretwork_draw((void *)ptr, which, canvas, last, x, y, fretwork_segment_modified_last);
fretwork_segment_to_add=0;} fretwork_segment_to_add = 0;
}
fretwork_segment_modified_last = fretwork_segment_modified; fretwork_segment_modified_last = fretwork_segment_modified;
} }
void fretwork_drag(magic_api * api, int which, void fretwork_drag(magic_api * api, int which,
SDL_Surface * canvas, SDL_Surface * snapshot, int ox, int oy, int x, int y, SDL_Surface * canvas, SDL_Surface * snapshot, int ox, int oy, int x, int y, SDL_Rect * update_rect)
SDL_Rect * update_rect) {
{ int start_x, end_x, start_y, end_y, segment_start, segment_end, w, h; int start_x, end_x, start_y, end_y, segment_start, segment_end, w, h;
if ((x<canvas->w)&&(y<canvas->h)&&(ox<canvas->w)&&(oy<canvas->h)&&((signed)x>0)&&((signed)y>0)&&((signed)ox>0)&&((signed)oy>0))
if ((x < canvas->w) && (y < canvas->h) && (ox < canvas->w) && (oy < canvas->h) && ((signed)x > 0) && ((signed)y > 0)
&& ((signed)ox > 0) && ((signed)oy > 0))
{ {
api->line((void *)api, which, canvas, snapshot, ox, oy, x, y, img_w / 2, fretwork_draw_wrapper); api->line((void *)api, which, canvas, snapshot, ox, oy, x, y, img_w / 2, fretwork_draw_wrapper);
// This should be improved, maybe passed to fretwork_draw() // This should be improved, maybe passed to fretwork_draw()
@ -589,6 +614,7 @@ void fretwork_drag(magic_api * api, int which,
update_rect->x = x; update_rect->x = x;
update_rect->y = y; update_rect->y = y;
update_rect->w = w; update_rect->w = w;
update_rect->h=h;} update_rect->h = h;
}
} }