From e0a34c1c7ab15b430e7e82eaa513a0ac2b204dd4 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Wed, 25 Sep 2024 21:29:24 -0700 Subject: [PATCH] WIP "ASCII" ASCII art magic tool --- magic/icons/ascii-computer.png | Bin 0 -> 7560 bytes magic/icons/ascii-typewriter.png | Bin 0 -> 39397 bytes magic/src/ascii.c | 351 +++++++++++++++++++++++++++++++ 3 files changed, 351 insertions(+) create mode 100644 magic/icons/ascii-computer.png create mode 100644 magic/icons/ascii-typewriter.png create mode 100644 magic/src/ascii.c diff --git a/magic/icons/ascii-computer.png b/magic/icons/ascii-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..e9474a0090b354e113d5cdbec4ab01e22d37c384 GIT binary patch literal 7560 zcmeHMdo+}7*B_Khsjl2|9fVwnfto0YwzE+_iyig-TPj1-hQ9e zS}7$d5D2u^dN=j}2qY;EjKM1xf8CdluLXftBn06PaSjjyz&qncW z%{i-=RSGnM+{>Rk%uT2B`@}}%op+9uWrTh2y%I(2+ zZzgZI;Izdze)bx8Trm^jJ9nLHwpB%`mzeXs0+sU2e6@saE$l^p9lvtfr12Fa(goxD zGbY{O@;Ju>b(&GDhlRGM)a@ju)uy}78EYyfwOp)tq>pD!m#-V4%(*eJtH-1ea3pTq zg~BWIl|9q#CxX*lBSxR+bsUm&LhsRtkiD^xvPn|S*X(+ea@XYO;NYiZ!h;T&va;6= z_Z-cjDEIDa!&gZsE{|ysX4H9zgNYyZ!1SK&yqHMe0Qn;xX?YyE^4RHp2Dhapa+{E= z;FnXDvtCFy^(jV8*5exn4em!Y_9buCZo61<(P0nH%w^45elq>| zG{&&jB|r0S=8=Kc9fxy|5sy(BwU<0TmY@R%`i8S}JxP7f8=}Orzr1GaKKB36nmyC_ zW~XUJB%1vG!P|^lb z-%=E1NU%eWHhz^d0Wxfb?ep&3lGlumKg=k@=+|@G*x`LcIft&^*%Ns+*GXxMy~Vbf zD_XaSj>>fAn5#lRk#;BdQxbpR?hsKGe+w4uuqn}YRACj*-l90`R>s$KE?2E>y+Vmw z+;$!Hb9Wvhd~8(1UY)!-oLo}b+AxmO%Xb~PS9)sgIIf#tY#Wf2cWz&%yK05{SS2wt zud*WtLAw%~ey$_8_`F`Vo3ieettH@t6lKFBLUt30s~3(CHCT}8lik5lY4)Jp^d9^aV9{WJmI8g3z%YZG0QEdMCc#zn7!_<;h)<&!W6Py{P5^gOQ zmymwN4S8bl*vBXD8@x1m<8H?l9j-XknAg?Eu2~hk>~g8Qxtt2rt%dH|WOq~o#QHeo znN@N4>vm6>AjB%uCZ(33{dc(KaUW$d+o6GtPKeCWTS_mQS3b)5Fm8=`r{4OtxH23I`?bUb9&d>^m?q>T=C?2Vv%Z|XP3*&4*YofL*W6^ zW0A)1M7cs8|U(4&mSN8ByqLG?yNdFFz{Xv zc-Q`1z8tlgz1#%U@0As9TaRO|xX$%GbEWMVd5@o!F--}Cy&M!)0q%?d{oxGUXA8Pt^G z>jJ7wpF)%z+Xh^&6e;Q0o;#^HkbC3&3P{5xKaD0YPrE&}R!N~={+IU^Sq&xd2>r&8 zqc_I*a8cB^!X+|Dh{ ziuYB&w%~NG@A_CW>GD{n4~>hq8RK@q+rIK8``GC(md}yYpSf1=TbEk?(y9)V8_;R$ zuDT=<4DAuO zT0&kOMDD?RCQ61SrNs4~!&c*{vc7$$eG!)N-jP>jZ#CV&=A*fcn@Q}K?l?)fy=xZ& za>Zu zxgQM*)7x}A;CS<>BXqXc)~QPr4!U(~@X`D<_7n&tcA92kVQ+0=@#7HK>+lsnMXoy9xF z1FsA_Ze(nvS-kuF!d@vT(Zp!DvLraBBmgA3yFFQ6X$7*~prPvY#oBDCw@%}b2w5&? zZv>_0JW;BwXK;&HK}Uu2m4zZRD?xJM1~6DwsCAaMo+)d`Y?bT@CAw)^YmK5t6Rj20 z!^p)SN0ochU#h(9t+ffdmZ-5YV)KrG2M6H#-J0ErnIGbX6pW)HQ?E%&|CXQK#M9kw z?#@(nEkQl^+}3ll;Ec0ytp{><95gD-lPA`j&fgtWsM>mox8{t>>bvHrdZ&M%?+Pe% zB(R?DjZi;+U!ihpli1Ueoq5AXot4oICSoUrPcC;%I4M7=(fIJCV570PWWk9Gg9Y10 z#1f33)L;5nQk?d38taVsr!dRTcnL}7i8B41!Y0#ws>j#(T`m@rmOk+cLdlsaExD6d z7%t48o)J^nz&gpq%R~dM6qg3HOowc3&?Kg}4uQ-hQgpc9K0r$a0-2a`eF!8vg##v1 zJZKCIWTZp@0n^ABh?Bl8%+|+(;z`>b#G)Jw+J`3v(Mc#W#LQI6go_3MyeS+4nCtDu zV57Mh$Pz9Z7%xuiLcmKR96APa$krZg!DLauNFAgO42t8@{NWH&DXoz z5@itz0N0@bI7Ao*V1Lcndl5KPKmh}>p)vfpe=Xo?-jstJ!Xle`hHyiG4ShJu z&_EBa|IO_sJVy$P4P@dXrXEZO0bf#I3=0}?1|XKOn5O{1(mdb`+JZ$PaF{GSlj((l zEJA=6HUC_;1@3*^ew_dcRQUZgQiULg_eRF|L@TZWM>;$mBEs;D43=ax$ zdVEjUAM>>TkP3Q47?nsyBA^sFf&xV%Q9vY(U@$05UtiA%hCu3}3`xJDvzb&*0D(o> z&VTXqJr@7P9RTQmHu+op{zKP4bp0&`{+94R+4T=ye~W>? zCHzlz{lC#A_1EhZg#mOy0l>>rh`LKB@S-J2+-rqhdgTI5S(JnWqg6h;o!KCej@sf^ zjC;$>ADCRhv9`snc)v<%*~V2=w8b%CN|A#*#Iay{FLvdirDl;r1_#hMp5Vo1(dmS= z0)URP#_qy%TZh`-FnYkUpn7WK!os^@3nw0aqvz30-SKQU|I28Dvu}yoH9b95B9Ule z!E8%ROhLbzS(!}8eAnmp!6Y?NM1n_MOv!fbs?EdW0rbWWeyFIxZ*VpiVHF)yd2C^y z)!xPt!RXjXR+>{qa~=DBrZ8kSC#o<+7!`jvI2Lswil1Y{agq!!IPJ(^IkU7%3k=nQ%UWj;TaQkLSEGWA}aybAQk4IJ4zmu2ZA% zeRNwykJVul+r@>0USJt>{8@6-;^YxswZ7N^_gu&_24d)uoYwBiU+!#B1La9 zxsSr=`4pb8Q&9ar@>5B6bz8i1OohkuFuY)|aYFqdErEPmT_xZe5?U#6x<5+0xjZOKSC zV{xVGVZO^@{no7HPLUg3 zN8$*sw0&VVBX8CdA4APh&Q40T(;od|u`tHfE`MYAkQFToSLb!LO^I+_G%`J#2dUmx`egUq}Kha}2SG7MwQLNh;KmC}MuTU86uIw~b z!aFxqlx0W{ZmM(h`OWvUL(jAJzF1KK{`N?xhUrYdpzi5NT-DuhL97E&U83ijL+7xQPhg)pV%oi1* zv%z$Hv4MsQ&XkYoS(tD0X>=}xPiZ@~Gffj*c_#mhm!>@3`qneSbG^lrpMz@Jq&w#I zVO86KOiy^{wrqq|E~M{`L`l9wak80auq+C2jxer4|d>OS%_y zGnqH`YI|$TN%_jc0WH&sVb#DUORhkn5H6mTy-=)pOvl1`;c&JoYr(;aM{Oz)xz3-P zcg^!ZlXr})Tw7WspiD+CB)OU-l{BaMy{ki6b{bl=VA5VfGAdI^q{grAlOdRCldJBj zW&WY2$$J^dj#;IZK$yB#elMsWIXU}cEk4&Om%loIG0CLr`i6HNZP%Ins#88Y|12U) z#h4vS{`?B-a<)Yk`QByNf@q)D9^vvui@E0FH>W&z{ajfhw>Am-HGQl_} zdcx|nE8|hBzJGQhe@MB?{!*aZ;mcRE&`$e9X47~J80WVgP9f@(zZTMu4E#izaXoT2 zmdm*Q>hpNa`H?`ktMsEoM@pMQSrSohm}?%#kZ&qn{Ue)z_!>cODb;%BX_@UUGoiER z$lX&8YR|4s3ww(rD#K0Vtb!c}OXM+n@R)KB9)GT|GjBR?%rn$7oz7^Aj#-y9u{k?8 zB{eduDHu^O76;X1gO8p^#cPDsIX^e Tic*6gEJ9i1_F?avA3ga$i{_o% literal 0 HcmV?d00001 diff --git a/magic/icons/ascii-typewriter.png b/magic/icons/ascii-typewriter.png new file mode 100644 index 0000000000000000000000000000000000000000..ec142bc07289c24a914e12729cd5b16cd867682e GIT binary patch literal 39397 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 y +#include +#include "tp_magic_api.h" +#include "SDL_image.h" +#include "SDL_mixer.h" + +enum { + TOOL_TYPEWRITER, + TOOL_COMPUTER, + NUM_TOOLS +}; + +char * ascii_tool_names[NUM_TOOLS] = { + "Typewriter", + "Computer", +}; + +char * ascii_tool_filenames[NUM_TOOLS] = { + "typewriter", + "computer", +}; + +static Mix_Chunk *ascii_snd[NUM_TOOLS]; + +/* For each variation, we'll have a bitmap with an arbitrary number + * of potentially-proportionally-spaced characters (which we'll treat + * as fixed-width), so we need to keep track of each character's X + * poistion, how many characters there are, and the maximum width. + */ +SDL_Surface * ascii_bitmap[NUM_TOOLS]; +int ascii_char_x[NUM_TOOLS][256]; +int ascii_num_chars[NUM_TOOLS]; +int ascii_char_maxwidth[NUM_TOOLS]; + +Uint32 ascii_api_version(void); +int ascii_init(magic_api * api, Uint8 disabled_features, Uint8 complexity_level); +int ascii_get_tool_count(magic_api * api); +SDL_Surface *ascii_get_icon(magic_api * api, int which); +char *ascii_get_name(magic_api * api, int which); +int ascii_get_group(magic_api * api, int which); +int ascii_get_order(int which); +char *ascii_get_description(magic_api * api, int which, int mode); + +void ascii_drag(magic_api * api, int which, SDL_Surface * canvas, + SDL_Surface * last, int ox, int oy, int x, int y, SDL_Rect * update_rect); + +void ascii_click(magic_api * api, int which, int mode, + SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect); + +void ascii_release(magic_api * api, int which, + SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect); + +void ascii_shutdown(magic_api * api); +void ascii_set_color(magic_api * api, int which, SDL_Surface * canvas, + SDL_Surface * last, Uint8 r, Uint8 g, Uint8 b, SDL_Rect * update_rect); +int ascii_requires_colors(magic_api * api, int which); +void ascii_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas); +void ascii_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas); +int ascii_modes(magic_api * api, int which); +Uint8 ascii_accepted_sizes(magic_api * api, int which, int mode); +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); + + +Uint32 ascii_api_version(void) +{ + return (TP_MAGIC_API_VERSION); +} + +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; + Uint32 clear_pixel, pixel; + Uint8 r, g, b; + + for (i = 0; i < NUM_TOOLS; i++) + { + ascii_snd[i] = NULL; + ascii_bitmap[i] = NULL; + } + + for (i = 0; i < NUM_TOOLS; i++) + { + /* FIXME */ + snprintf(fname, sizeof(fname), "%ssounds/magic/ascii-%s.ogg", api->data_directory, ascii_tool_filenames[i]); + snprintf(fname, sizeof(fname), "%ssounds/magic/xor.ogg", api->data_directory); + + ascii_snd[i] = Mix_LoadWAV(fname); + + snprintf(fname, sizeof(fname), "%simages/magic/ascii-%s.png", api->data_directory, ascii_tool_filenames[i]); + ascii_bitmap[i] = IMG_Load(fname); + + if (ascii_bitmap[i] == NULL) + { + fprintf(stderr, "Cannot load %s\n", fname); + return(0); + } + + clear_pixel = api->getpixel(ascii_bitmap[i], 0, 0); + printf("%s; clear pixel %d\n", fname, clear_pixel); + num_chars = 0; + for (x = 0; x < ascii_bitmap[i]->w; x++) + { + ascii_char_x[i][num_chars] = x; + + do + { + all_clear = 1; + for (y = 0; y < ascii_bitmap[i]->h /* && all_clear */; y++) { + pixel = api->getpixel(ascii_bitmap[i], x, y); + if (pixel != clear_pixel) + all_clear = 0; + } + if (all_clear) + x++; + } + while (all_clear && x < ascii_bitmap[i]->w); + + all_clear = 0; + for (xx = x; xx < ascii_bitmap[i]->w && !all_clear; xx++) + { + all_clear = 1; + for (y = 0; y < ascii_bitmap[i]->h /* && all_clear */; y++) + { + pixel = api->getpixel(ascii_bitmap[i], xx, y); + if (pixel != clear_pixel) + { + all_clear = 0; + SDL_GetRGB(pixel, ascii_bitmap[i]->format, &r, &g, &b); + if (r == 255 && g == 0 && b == 255) + { + /* 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"); + } + else + { + printf("#"); + } + } + else + { + printf("-"); + } + } + printf("\n"); + } + x = xx; + num_chars++; + printf(".......................................\n"); + } + ascii_num_chars[i] = num_chars; + printf("%s has %d characters\n", fname, num_chars); + + ascii_char_x[i][num_chars] = x; + ascii_char_maxwidth[i] = 0; + 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); + if (w > ascii_char_maxwidth[i]) + { + ascii_char_maxwidth[i] = w; + } + } + + printf("%s max char width is %d\n", fname, ascii_char_maxwidth[i]); + } + + return (1); +} + +int ascii_get_tool_count(magic_api * api ATTRIBUTE_UNUSED) +{ + return (1); +} + +SDL_Surface *ascii_get_icon(magic_api * api, int which) +{ + char fname[1024]; + + /* FIXME */ + snprintf(fname, sizeof(fname), "%ssounds/magic/ascii-icon-%s.ogg", api->data_directory, ascii_tool_filenames[which]); + snprintf(fname, sizeof(fname), "%simages/magic/xor.png", api->data_directory); + + return (IMG_Load(fname)); +} + +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]); + return(strdup(tmp)); +} + +int ascii_get_group(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return MAGIC_TYPE_DISTORTS; +} + +int ascii_get_order(int which) +{ + return 800 + which; // FIXME +} + +char *ascii_get_description(magic_api * api ATTRIBUTE_UNUSED, int which, int mode) +{ + char tmp[1024]; + + if (mode == MODE_PAINT) + snprintf(tmp, sizeof(tmp), gettext("Click and drag to transform parts of your drawing to ASCII art (%s style)."), ascii_tool_names[which]); + else + snprintf(tmp, sizeof(tmp), gettext("Click to transform your entire drawing to ASCII art (%s style)."), ascii_tool_names[which]); + + return(strdup(tmp)); +} + +void ascii_drag(magic_api * api, int which, SDL_Surface * canvas, + SDL_Surface * last, int ox, int oy, int x, int y, SDL_Rect * update_rect) +{ + api->line((void *)api, which, canvas, last, ox, oy, x, y, 1, do_ascii_effect); + + /* FIXME */ + update_rect->x = 0; + update_rect->y = 0; + update_rect->w = canvas->w; + update_rect->h = canvas->h; + + api->playsound(ascii_snd[which], (x * 255) / canvas->w, 255); +} + +void ascii_click(magic_api * api, int which, int mode, + SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect) +{ + if (mode == MODE_PAINT) + ascii_drag(api, which, canvas, last, x, y, x, y, update_rect); + else + { + int xx, yy; + + for (yy = 0; yy < canvas->h; yy++) + for (xx = 0; xx < canvas->w; xx++) + do_ascii_effect(api, which, canvas, last, xx, yy); + + update_rect->x = 0; + update_rect->y = 0; + update_rect->w = canvas->w; + update_rect->h = canvas->h; + api->playsound(ascii_snd[which], (x * 255) / canvas->w, 255); + } +} + +void ascii_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED, + SDL_Surface * last ATTRIBUTE_UNUSED, int x ATTRIBUTE_UNUSED, + int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED) +{ +} + +void ascii_shutdown(magic_api * api ATTRIBUTE_UNUSED) +{ + int i; + + for (i = 0; i < NUM_TOOLS; i++) + { + if (ascii_snd[i] != NULL) + Mix_FreeChunk(ascii_snd[i]); + if (ascii_bitmap[i] != NULL) + SDL_FreeSurface(ascii_bitmap[i]); + } +} + +void ascii_set_color(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, + SDL_Surface * last ATTRIBUTE_UNUSED, Uint8 r ATTRIBUTE_UNUSED, Uint8 g ATTRIBUTE_UNUSED, + Uint8 b ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED) +{ +} + +int ascii_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return 0; +} + +void ascii_switchin(magic_api * api ATTRIBUTE_UNUSED, + int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED) +{ +} + +void ascii_switchout(magic_api * api ATTRIBUTE_UNUSED, + int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED) +{ +} + +int ascii_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return (MODE_PAINT | MODE_FULLSCREEN); +} + + +Uint8 ascii_accepted_sizes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED) +{ + return 0; +} + +Uint8 ascii_default_size(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED) +{ + return 0; +} + +void ascii_set_size(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, + Uint8 size ATTRIBUTE_UNUSED, SDL_Rect * update_rect 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; +}