From 113522569113f190d64491b101a69dbb15b9c008 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Wed, 20 Oct 2021 22:32:34 -0700 Subject: [PATCH] New "Stretch" magic tool Docs/etc. to be updated in a separate commit. --- magic/icons/stretch.png | Bin 0 -> 8980 bytes magic/sounds/stretch.ogg | Bin 0 -> 12135 bytes magic/src/stretch.c | 286 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 286 insertions(+) create mode 100644 magic/icons/stretch.png create mode 100644 magic/sounds/stretch.ogg create mode 100644 magic/src/stretch.c diff --git a/magic/icons/stretch.png b/magic/icons/stretch.png new file mode 100644 index 0000000000000000000000000000000000000000..870f08de1e46635731611e3a1fa59620b4858887 GIT binary patch literal 8980 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 + stretch_snd = Mix_LoadWAV(fname); + + return (1); +} + +int stretch_get_tool_count(magic_api * api ATTRIBUTE_UNUSED) +{ + return STRETCH_NUMTOOLS; +} + +SDL_Surface *stretch_get_icon(magic_api * api, int which ATTRIBUTE_UNUSED) +{ + char fname[1024]; + + snprintf(fname, sizeof(fname), "%s/images/magic/stretch.png", api->data_directory); + + return (IMG_Load(fname)); +} + +char *stretch_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return strdup(gettext_noop("Stretch")); +} + +int stretch_get_group(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return MAGIC_TYPE_PICTURE_WARPS; +} + +char *stretch_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED) +{ + return + strdup(gettext_noop + ("Click and drag to stretch part of your picture vertically or horizontally.")); +} + +int stretch_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return 0; +} + +void stretch_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * snapshot ATTRIBUTE_UNUSED, + int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED) +{ +} + +void stretch_shutdown(magic_api * api ATTRIBUTE_UNUSED) +{ + Mix_FreeChunk(stretch_snd); +} + +// Interactivity functions + +void stretch_drag(magic_api * api, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas, + SDL_Surface * snapshot, int ox ATTRIBUTE_UNUSED, int oy ATTRIBUTE_UNUSED, + int x, int y, SDL_Rect * update_rect) +{ + SDL_Rect src, dest; + float xx, yy; + float divisor1, divisor2; + + SDL_BlitSurface(snapshot, NULL, canvas, NULL); + + switch (stretch_side) + { + case STRETCH_DIRECTION_VERT: + { + if (y != stretch_start_y) + { + divisor1 = (float) y / (float) stretch_start_y; + divisor2 = (float) (canvas->h - y) / (float) (canvas->h - stretch_start_y); + + for (yy = 0; yy < y; yy++) + { + src.x = 0; + src.y = (yy / divisor1); + src.w = canvas->w; + src.h = 1; + + dest.x = 0; + dest.y = yy; + dest.w = canvas->w; + dest.h = 1; + + SDL_BlitSurface(snapshot, &src, canvas, &dest); + } + + for (yy = y; yy < canvas->h; yy++) + { + src.x = 0; + src.y = stretch_start_y + ((yy - y) / divisor2); + src.w = canvas->w; + src.h = 1; + + dest.x = 0; + dest.y = yy; + dest.w = canvas->w; + dest.h = 1; + + SDL_BlitSurface(snapshot, &src, canvas, &dest); + } + + api->playsound(stretch_snd, 128, 255); + } + break; + } + + case STRETCH_DIRECTION_HORIZ: + { + if (x != stretch_start_x) + { + divisor1 = (float) x / (float) stretch_start_x; + divisor2 = (float) (canvas->w - x) / (float) (canvas->w - stretch_start_x); + + for (xx = 0; xx < x; xx++) + { + src.x = (xx / divisor1); + src.y = 0; + src.w = 1; + src.h = canvas->h; + + dest.x = xx; + dest.y = 0; + dest.w = 1; + dest.h = canvas->h; + + SDL_BlitSurface(snapshot, &src, canvas, &dest); + } + + for (xx = x; xx < canvas->w; xx++) + { + src.x = stretch_start_x + ((xx - x) / divisor2); + src.y = 0; + src.w = 1; + src.h = canvas->h; + + dest.x = xx; + dest.y = 0; + dest.w = 1; + dest.h = canvas->h; + + SDL_BlitSurface(snapshot, &src, canvas, &dest); + } + api->playsound(stretch_snd, (x * 255) / canvas->w, 255); + } + + break; + } + } + + update_rect->x = 0; + update_rect->y = 0; + update_rect->w = canvas->w; + update_rect->h = canvas->h; +} + +void stretch_click(magic_api * api, int which, int mode ATTRIBUTE_UNUSED, + SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect) +{ + if (y < canvas->h / 2) + { + if (x < y) + stretch_side = STRETCH_DIRECTION_HORIZ; + else if (canvas->w - x < y) + stretch_side = STRETCH_DIRECTION_HORIZ; + else + stretch_side = STRETCH_DIRECTION_VERT; + } + else + { + if (x < canvas->h - y) + stretch_side = STRETCH_DIRECTION_HORIZ; + else if (canvas->w - x < canvas->h - y) + stretch_side = STRETCH_DIRECTION_HORIZ; + else + stretch_side = STRETCH_DIRECTION_VERT; + } + + stretch_start_x = x; + stretch_start_y = y; + + stretch_drag(api, which, canvas, last, x, y, x, y, update_rect); +} + +void stretch_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED) +{ + +} + +void stretch_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED) +{ + +} + +int stretch_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return (MODE_PAINT); +}