From c9f978b1ca04f924647140589f8858adcbd14181 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Thu, 26 Sep 2024 00:35:01 -0700 Subject: [PATCH] WIP ASCII art Magic tools; code working! --- docs/AUTHORS.txt | 18 ++- docs/CHANGES.txt | 21 ++- magic/icons/ascii-computer.png | Bin 7560 -> 7417 bytes magic/icons/ascii-typewriter.png | Bin 39397 -> 12878 bytes magic/src/ascii.c | 171 +++++++++++++++++++---- src/org.tuxpaint.Tuxpaint.appdata.xml.in | 4 +- src/tuxpaint.c | 2 +- 7 files changed, 181 insertions(+), 35 deletions(-) diff --git a/docs/AUTHORS.txt b/docs/AUTHORS.txt index a94b3f59f..0b26ac7a4 100644 --- a/docs/AUTHORS.txt +++ b/docs/AUTHORS.txt @@ -6,7 +6,7 @@ Copyright (c) 2002-2024 Various contributors (see below, and CHANGES.txt) https://tuxpaint.org/ -June 17, 2002 - September 24, 2024 +June 17, 2002 - September 26, 2024 * Design and Coding: @@ -197,6 +197,22 @@ June 17, 2002 - September 24, 2024 Creative Commons 0 by lorefold + "ASCII Typewriter" & "ASCII Computer" magic tools + by Bill Kendrick + + "ASCII Computer" font: IBM CGA Adapter + taken from "Typography in 16-bits: System fonts" by Damien Guard + + + "ASCII Typewriter" font based on: "Patrician" + + Creative Commons CC0 1.0 Universal + by Richard Polt (based on a 1959 Royal FP typewriter) + And using a subset of characters taken from + "Character representation of grey scale images" + + by Paul Bourke + Bloom magic tool by Bill Kendrick diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 26caecac9..07f342948 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -6,7 +6,7 @@ Copyright (c) 2002-2024 Various contributors (see below, and AUTHORS.txt) https://tuxpaint.org/ -2024.September.25 (0.9.34) +2024.September.26 (0.9.34) * New Magic Tools: ---------------- * "Comic Dots", draws repeating dots (using a multiply blend) @@ -31,6 +31,25 @@ https://tuxpaint.org/ + Closes https://sourceforge.net/p/tuxpaint/feature-requests/260/ + * WIP "ASCII Typewriter" & "ASCII Computer", turn your drawing into + ASCII art. + + TODO Sound effects + + TODO Icons + + TODO Documentation + + Code by Bill Kendrick + + Computer font: IBM CGA Adapter + taken from "Typography in 16-bits: System fonts" + + by Damien Guard + + Typewriter font based on: "Patrician" + + Creative Commons CC0 1.0 Universal + by Richard Polt (based on a 1959 Royal FP typewriter) + And using a subset of characters taken from + "Character representation of grey scale images" + + by Paul Bourke + * Magic Tool Improvements: ------------------------ * Sound pause/resume functions added to API diff --git a/magic/icons/ascii-computer.png b/magic/icons/ascii-computer.png index e9474a0090b354e113d5cdbec4ab01e22d37c384..49c2a63d6d0481d84ae85332ce52cad2d7ee399e 100644 GIT binary patch delta 3789 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 DRB9vD delta 4125 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 diff --git a/magic/icons/ascii-typewriter.png b/magic/icons/ascii-typewriter.png index ec142bc07289c24a914e12729cd5b16cd867682e..e416408fa4e29490fa40dfd7d425cd08ee495ce7 100644 GIT binary patch literal 12878 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
4SIVV`7$f|7MSy^rqszJxSO{N2{iaxa#B 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 m`7SVD-&RK_rm5-74?^w{)!ubJ1qBY+A!o% literal 39397 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 y #include #include "tp_magic_api.h" @@ -38,8 +46,8 @@ enum { }; char * ascii_tool_names[NUM_TOOLS] = { - "Typewriter", - "Computer", + gettext_noop("Typewriter"), + gettext_noop("Computer"), }; char * ascii_tool_filenames[NUM_TOOLS] = { @@ -91,6 +99,8 @@ Uint8 ascii_default_size(magic_api * api, int which, int mode); void ascii_set_size(magic_api * api, int which, int mode, SDL_Surface * canvas, SDL_Surface * last, Uint8 size, SDL_Rect * update_rect); void do_ascii_effect(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y); +int get_best_char(int which, int brightness); +int get_bright(magic_api * api, int r, int g, int b); Uint32 ascii_api_version(void) @@ -101,9 +111,11 @@ Uint32 ascii_api_version(void) int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 complexity_level ATTRIBUTE_UNUSED) { char fname[1024]; - int i, j, x, y, xx, w, num_chars, all_clear, area, bright; + int i, j, x, y, xx, w, num_chars, all_clear, area, bright, clear_brightness; + int min_bright, max_bright; Uint32 clear_pixel, pixel; Uint8 r, g, b; + Uint8 clear_r, clear_g, clear_b; for (i = 0; i < NUM_TOOLS; i++) { @@ -129,12 +141,14 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 } clear_pixel = api->getpixel(ascii_bitmap[i], 0, 0); -// printf("%s; clear pixel %d\n", fname, clear_pixel); + SDL_GetRGB(clear_pixel, ascii_bitmap[i]->format, &clear_r, &clear_g, &clear_b); + DEBUG_PRINTF("%s; clear pixel %d (%d,%d,%d)\n", fname, clear_pixel, clear_r, clear_g, clear_b); + clear_brightness = (clear_r + clear_g + clear_b) / 3; + num_chars = 0; for (x = 0; x < ascii_bitmap[i]->w; x++) { - ascii_char_x[i][num_chars] = x; - + /* Skip whitespace between characters */ do { all_clear = 1; @@ -148,6 +162,9 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 } while (all_clear && x < ascii_bitmap[i]->w); + ascii_char_x[i][num_chars] = x; + + /* Capture the extent of the character */ all_clear = 0; for (xx = x; xx < ascii_bitmap[i]->w && !all_clear; xx++) { @@ -164,26 +181,26 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 /* Magenta counts as a connecting pixel, but we * want it to appear as the clear color */ api->putpixel(ascii_bitmap[i], xx, y, clear_pixel); -// printf("x"); + DEBUG_PRINTF("x"); } else { -// printf("#"); + DEBUG_PRINTF("#"); } } else { -// printf("-"); + DEBUG_PRINTF("-"); } } -// printf("\n"); + DEBUG_PRINTF("\n"); } - x = xx; + x = xx - 1; num_chars++; -// printf(".......................................\n"); + DEBUG_PRINTF(".......................................\n"); } ascii_num_chars[i] = num_chars; - printf("%s has %d characters\n", fname, num_chars); + DEBUG_PRINTF("%s has %d characters\n", fname, num_chars); /* Determine the max. width of any character */ ascii_char_x[i][num_chars] = x; @@ -191,7 +208,7 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 for (j = 0; j < num_chars; j++) { w = ascii_char_x[i][j + 1] - ascii_char_x[i][j]; -// printf("%d->%d = %d\n", j, j + 1, w); + DEBUG_PRINTF("%d->%d = %d\n", j, j + 1, w); if (w > ascii_char_maxwidth[i]) { ascii_char_maxwidth[i] = w; @@ -201,7 +218,7 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 /* Calculate the intensity of each character */ area = ascii_char_maxwidth[i] * ascii_bitmap[i]->h; -// printf("%s max char width is %d -- * %d = area %d\n", fname, ascii_char_maxwidth[i], ascii_bitmap[i]->h, area); + DEBUG_PRINTF("%s max char width is %d -- * %d = area %d\n", fname, ascii_char_maxwidth[i], ascii_bitmap[i]->h, area); for (j = 0; j < num_chars; j++) { @@ -213,14 +230,40 @@ int ascii_init(magic_api * api, Uint8 disabled_features ATTRIBUTE_UNUSED, Uint8 pixel = api->getpixel(ascii_bitmap[i], x, y); SDL_GetRGB(pixel, ascii_bitmap[i]->format, &r, &g, &b); -// printf("%3d ", (r + g + b) / 3); - bright += ((r + g + b) / 3); + DEBUG_PRINTF("%3d (%3d) ", (r + g + b) / 3, get_bright(api, r, g, b)); + bright += get_bright(api, r, g, b); } -// printf("\n"); + DEBUG_PRINTF("\n"); } -// printf("char %d brightness = %d\n", j, bright / area); + DEBUG_PRINTF("char %3d brightness = %3d before padding -- ", j, bright / area); + w = ascii_char_maxwidth[i] - (ascii_char_x[i][j + 1] - ascii_char_x[i][j]) - 2; /* don't let padding affect _too_ much */ + if (w >= 1) + bright += (clear_brightness * ascii_bitmap[i]->h * w); + DEBUG_PRINTF("%3d after padding %d width\n", bright / area, w); ascii_char_brightness[i][j] = bright / area; } + + /* Stretch the brightnesses, so we cover more of 0->255 */ + min_bright = 255; + max_bright = 0; + for (j = 0; j < num_chars; j++) + { + if (ascii_char_brightness[i][j] > max_bright) + max_bright = ascii_char_brightness[i][j]; + if (ascii_char_brightness[i][j] < max_bright) + min_bright = ascii_char_brightness[i][j]; + } + DEBUG_PRINTF("brightnesses between %d and %d\n", min_bright, max_bright); + + /* https://rosettacode.org/wiki/Map_range#C */ +#define map_range(a1,a2,b1,b2,s) (b1 + (s-a1)*(b2-b1)/(a2-a1)) + + for (j = 0; j < num_chars; j++) + { + DEBUG_PRINTF("mapping %3d -> ", ascii_char_brightness[i][j]); + ascii_char_brightness[i][j] = map_range(min_bright, max_bright, 0, 255, ascii_char_brightness[i][j]); + DEBUG_PRINTF("%3d\n", ascii_char_brightness[i][j]); + } } return (1); @@ -246,7 +289,7 @@ char *ascii_get_name(magic_api * api ATTRIBUTE_UNUSED, int which) { char tmp[1024]; - snprintf(tmp, sizeof(tmp), gettext("ASCII %s"), ascii_tool_names[which]); + snprintf(tmp, sizeof(tmp), gettext("ASCII %s"), gettext(ascii_tool_names[which])); return(strdup(tmp)); } @@ -373,8 +416,10 @@ void ascii_set_size(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED void do_ascii_effect(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * last, int x, int y) { magic_api *api = (magic_api *) ptr; - int w, h, n; + int w, h, n, xx, yy, brightness; + Uint8 r, g, b; Uint32 clear_pixel; + Uint8 clear_brightness; SDL_Rect src, dest; w = ascii_char_maxwidth[which]; @@ -386,6 +431,8 @@ void do_ascii_effect(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * l if (!api->touched(x, y)) { clear_pixel = api->getpixel(ascii_bitmap[which], 0, 0); + SDL_GetRGB(clear_pixel, ascii_bitmap[which]->format, &r, &g, &b); + clear_brightness = ((r + g + b) / 3.0); dest.x = x; dest.y = y; @@ -394,15 +441,79 @@ void do_ascii_effect(void *ptr, int which, SDL_Surface * canvas, SDL_Surface * l SDL_FillRect(canvas, &dest, clear_pixel); - n = rand() % ascii_num_chars[which]; - src.x = ascii_char_x[which][n]; - src.y = 0; - src.w = ascii_char_x[which][n + 1] - ascii_char_x[which][n]; - src.h = h; + brightness = 0; + for (yy = y; yy < y + h; yy++) + { + for (xx = x; xx < x + w; xx++) + { + SDL_GetRGB(api->getpixel(last, xx, yy), last->format, &r, &g, &b); + brightness += get_bright(api, r, g, b); + } + } + brightness = brightness / (w * h); - dest.x = x + (w - src.w) / 2; - dest.y = y; + /* FIXME: Increase contrast */ - SDL_BlitSurface(ascii_bitmap[which], &src, canvas, &dest); + if (brightness != clear_brightness) + { + n = get_best_char(which, brightness); + src.x = ascii_char_x[which][n]; + src.y = 0; + src.w = ascii_char_x[which][n + 1] - ascii_char_x[which][n]; + src.h = h; + + dest.x = x + (w - src.w) / 2; + dest.y = y; + + SDL_BlitSurface(ascii_bitmap[which], &src, canvas, &dest); + } } } + +int get_best_char(int which, int brightness) +{ + int i, diff, best_idx, best_diff; + + best_idx = -1; + best_diff = 255; + for (i = 0; i < ascii_num_chars[which]; i++) + { + diff = abs(ascii_char_brightness[which][i] - brightness); + + if (diff == best_diff) + { + if (rand() % 10 <= 3) + best_idx = 1; + } + else if (diff < best_diff) + { + best_diff = diff; + best_idx = i; + } + } + + if (best_idx == -1) + { + /* Shouldn't happen, but just in case */ + best_idx = rand() % ascii_num_chars[which]; + printf("!?\n"); + } + + DEBUG_PRINTF("best for brightness %d is %d (brightness %d)\n", + brightness, best_idx, ascii_char_brightness[which][best_idx]); + + return best_idx; +} + +int get_bright(magic_api * api, int r, int g, int b) +{ + float fr, fg, fb, y; + + fr = api->sRGB_to_linear(r); + fg = api->sRGB_to_linear(g); + fb = api->sRGB_to_linear(b); + + y = (0.2126 * fr) + (0.7152 * fg) + (0.0722 * fb); + + return (int) (y * 255); +} diff --git a/src/org.tuxpaint.Tuxpaint.appdata.xml.in b/src/org.tuxpaint.Tuxpaint.appdata.xml.in index 7d3695ce8..a925cb983 100644 --- a/src/org.tuxpaint.Tuxpaint.appdata.xml.in +++ b/src/org.tuxpaint.Tuxpaint.appdata.xml.in @@ -47,10 +47,10 @@ - +

New Fill mode: "Eraser" flood fill.

-

New Magic tools: "Comic dots", "Rotate", and various "Fractals".

+

New Magic tools: "Comic dots", "Rotate", "ASCII Computer", "ASCII Typewriter", and various "Fractals".

New brush: Fluff (gradient).

diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 37ceb5d3a..fb20d72b5 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -11918,7 +11918,7 @@ static SDL_Surface *thumbnail2(SDL_Surface * src, int max_x, int max_y, int keep SDL_GetRGBA(getpixel(src, src_x, src_y), src->format, &r, &g, &b, &a); #ifdef GAMMA_CORRECTED_THUMBNAILS - /* per: http://www.4p8.com/eric.brasseur/gamma.html */ + /* per: http://www.ericbrasseur.org/gamma.html?i=1 */ tr = tr + sRGB_to_linear_table[r]; tg = tg + sRGB_to_linear_table[g];