From c1a5ca7fb84b149720fa47f1034b60333277a5e3 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Sun, 30 Jan 2022 02:23:01 -0800 Subject: [PATCH] New Magic tool: "Tile Zoom" --- docs/CHANGES.txt | 5 ++ magic/icons/tilezoom.png | Bin 0 -> 13523 bytes magic/src/perspective.c | 96 ++++++++++++++++++++++++++++++++------- 3 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 magic/icons/tilezoom.png diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 187fbfc94..5950671a3 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -85,6 +85,11 @@ http://www.tuxpaint.org/ * Don't play 'bubble' paint sound when color picker or selector (or new mixer) are aborted (via their "Back" buttons or [Esc] key). + * New Magic Tools: + ---------------- + * "Tile Zoom"; like the regular "Zoom", but tiles the results when + you scale down (similar to "Panels", but with non-integer scaling). + * Localization Updates: --------------------- * Albanian translation diff --git a/magic/icons/tilezoom.png b/magic/icons/tilezoom.png new file mode 100644 index 0000000000000000000000000000000000000000..930f67b916901eba6a6d9958cb9362a739180769 GIT binary patch literal 13523 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 literal 0 HcmV?d00001 diff --git a/magic/src/perspective.c b/magic/src/perspective.c index c9bd03b3a..40672e71d 100644 --- a/magic/src/perspective.c +++ b/magic/src/perspective.c @@ -2,13 +2,14 @@ perspective.c perspective, stretches the plane of the image. - zoom, zooms in and out the image. + zoom & tile zoom, zooms in and out the image. + panels, turns the images into a 2x2 grid. Tux Paint - A simple drawing program for children. Credits: Andrew Corcoran - Copyright (c) 2002-2021 by Bill Kendrick and others; see AUTHORS.txt + Copyright (c) 2002-2022 by Bill Kendrick and others; see AUTHORS.txt bill@newbreedsoftware.com http://www.tuxpaint.org/ @@ -27,7 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (See COPYING.txt) - Last updated: September 20, 2021 + Last updated: January 30, 2022 $Id$ */ @@ -116,6 +117,7 @@ enum { TOOL_PERSPECTIVE, TOOL_PANELS, + TOOL_TILEZOOM, TOOL_ZOOM, perspective_NUM_TOOLS }; @@ -144,12 +146,14 @@ const char *perspective_snd_filenames[perspective_NUM_TOOLS + 1] = { const char *perspective_icon_filenames[perspective_NUM_TOOLS] = { "perspective.png", "panels.png", + "tilezoom.png", "zoom.png", }; const char *perspective_names[perspective_NUM_TOOLS] = { gettext_noop("Perspective"), gettext_noop("Panels"), + gettext_noop("Tile Zoom"), gettext_noop("Zoom"), }; @@ -159,6 +163,8 @@ const char *perspective_descs[perspective_NUM_TOOLS] = { gettext_noop("Click to turn your picture into 2-by-2 panels."), gettext_noop("Click and drag up to zoom in or drag down to zoom out the picture."), + + gettext_noop("Click and drag up to zoom in or drag down to zoom out the picture."), }; Uint32 perspective_api_version(void) @@ -282,14 +288,18 @@ void perspective_drag(magic_api * api, int which, SDL_Surface * canvas, } break; case TOOL_ZOOM: + case TOOL_TILEZOOM: { int x_distance, y_distance; - update_rect->x = update_rect->y = 0; - update_rect->w = canvas->w; - update_rect->h = canvas->h; - - SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); + if (which == TOOL_ZOOM) + { + update_rect->x = update_rect->y = 0; + update_rect->w = canvas->w; + update_rect->h = canvas->h; + + SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); + } new_h = max(1, old_h + click_y - y); new_w = canvas->w * new_h / canvas->h; @@ -361,6 +371,7 @@ void perspective_click(magic_api * api, int which, int mode ATTRIBUTE_UNUSED, } break; case TOOL_ZOOM: + case TOOL_TILEZOOM: { click_x = x; click_y = y; @@ -433,6 +444,7 @@ void perspective_release(magic_api * api, int which, break; case TOOL_ZOOM: + case TOOL_TILEZOOM: { SDL_Surface *aux_surf; SDL_Surface *scaled_surf; @@ -441,17 +453,35 @@ void perspective_release(magic_api * api, int which, update_rect->w = canvas->w; update_rect->h = canvas->h; - SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); + if (which == TOOL_ZOOM) + SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); if (new_h < canvas->h) { + int xx, yy, x_span, y_span; + scaled_surf = api->scale(canvas_back, new_w, new_h, 0); - update_rect->x = (canvas->w - new_w) / 2; - update_rect->y = (canvas->h - new_h) / 2; - update_rect->w = new_w; - update_rect->h = new_h; - SDL_BlitSurface(scaled_surf, NULL, canvas, update_rect); + + if (which == TOOL_TILEZOOM && (new_w < canvas->w || new_h < canvas->h)) + { + x_span = ceil(canvas->w / new_w); + y_span = ceil(canvas->h / new_h); + } + else + x_span = y_span = 0; + + for (yy = -y_span; yy <= y_span; yy++) + { + for (xx = -x_span; xx <= x_span; xx++) + { + update_rect->x = ((canvas->w - new_w) / 2) + (new_w * xx); + update_rect->y = ((canvas->h - new_h) / 2) + (new_h * yy); + update_rect->w = new_w; + update_rect->h = new_h; + SDL_BlitSurface(scaled_surf, NULL, canvas, update_rect); + } + } } else { @@ -487,7 +517,7 @@ void perspective_release(magic_api * api, int which, } } -void perspective_preview(magic_api * api, int which ATTRIBUTE_UNUSED, +void perspective_preview(magic_api * api, int which, SDL_Surface * canvas, SDL_Surface * last ATTRIBUTE_UNUSED, int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect, float step) { @@ -501,7 +531,10 @@ void perspective_preview(magic_api * api, int which ATTRIBUTE_UNUSED, update_rect->w = canvas->w; update_rect->h = canvas->h; - SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); + if (which == TOOL_ZOOM) + SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, perspective_r, perspective_g, perspective_b)); + else if (which == TOOL_TILEZOOM) + SDL_FillRect(canvas, update_rect, SDL_MapRGB(canvas->format, 128, 128, 128)); ox_distance = otop_right_x - otop_left_x; oy_distance = obottom_left_y - otop_left_y; @@ -537,6 +570,35 @@ void perspective_preview(magic_api * api, int which ATTRIBUTE_UNUSED, api->putpixel(canvas, ax + dx - center_ofset_x, ay + dy - center_ofset_y, api->getpixel(canvas_back, i, j)); } } + + if (which == TOOL_TILEZOOM && new_w >= 2 && new_h >= 2) + { + int xx, yy, x_span, y_span; + SDL_Rect src_rect, dest_rect; + + x_span = ceil(canvas->w / new_w); + y_span = ceil(canvas->h / new_h); + + src_rect.x = -center_ofset_x; + src_rect.y = -center_ofset_y; + src_rect.w = new_w; + src_rect.h = new_h; + + for (yy = -y_span; yy <= y_span; yy++) + { + for (xx = -x_span; xx <= x_span; xx++) + { + if (xx != 0 || yy != 0) + { + dest_rect.x = ((canvas->w - new_w) / 2) + (new_w * xx); + dest_rect.y = ((canvas->h - new_h) / 2) + (new_h * yy); + dest_rect.w = new_w; + dest_rect.h = new_h; + SDL_BlitSurface(canvas, &src_rect, canvas, &dest_rect); + } + } + } + } } void perspective_shutdown(magic_api * api ATTRIBUTE_UNUSED) @@ -564,7 +626,7 @@ void perspective_set_color(magic_api * api ATTRIBUTE_UNUSED, Uint8 r, Uint8 g, U // Use colors: int perspective_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which) { - if (which == TOOL_PANELS) + if (which == TOOL_PANELS || which == TOOL_TILEZOOM) return 0; return 1; }