From 75de6f23eaabaacd7480144b5972b2eb4396a744 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Fri, 3 Mar 2023 01:34:22 -0800 Subject: [PATCH] Color grabbing icon for new cross-color-tool feature Also, update (c) year! (Skipped 2022, oops!) --- data/images/ui/color_grab.png | Bin 0 -> 1247 bytes src/tuxpaint.c | 135 ++++++++++++++++++++++++++++++---- 2 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 data/images/ui/color_grab.png diff --git a/data/images/ui/color_grab.png b/data/images/ui/color_grab.png new file mode 100644 index 0000000000000000000000000000000000000000..0097080201ae6c33b77bec97582843f41512af36 GIT binary patch literal 1247 zcmV<51R(o~P)EX>4Tx04R}tkv&MmKp2MKriw)>4t5Z62w0sgh>D1lR-p(LLaorMgUO|T(4-+r zad8w}3l9D)RvlcNb#-tR1i>E=R~IKm7b)?(q|hS9JC1vJ?|WbFz5|4MnQ2zX7@+C4 znM%aPOmmC8V-^F;Af8C#>N6lFb2#Cb9%rI@@4dSUy z+u*!U9AQOSB|aw}HR*!Hk6c$ge&bwlS>TxwGo6|zju4B5Hdfl06-|wJk~perI^_!) zk5$fFoV9Y5HSft^7|!V{%Uq{5hy)g~1PLM(R8c}1He$5vq*zGNdECc8;QA$UDdZ}F zkz)ZBXpmh$_#gc4t(Bh`_maYKp!3CXK8As=U7%5OobO}DX`BGTXW&Y2`73o``jhlp zON$->z1zUWbxTwBfXf}A|H+U|*_DE{gnS-&KcjET0)4kY_nOzY<~dFufHd_gc>^3A z0wV>=UiW!-sJ(Ch)-?O~1AMV^tL_6tc>n+a24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>F=2?7_CX>@2HM@dakSAh-}0008ENkl1gh6otRo1}hLqAQEJ0sK6DHA0WlP z08NC%Bcx43#|t1q4-KK9p(RKzaRXIAZmocVAYu_9Ai>y}I5vgPD5GUJ*)_YdN6L|| zyuX@rX70Un_Zsqp2Q1?#Jm5ai1@5^jViOnuKLOu0@(+Qw1Pp+hOCpwluNHY@0kGnN z?>~+pZ){_dMR>sa0pyLn*D6gER)Ez6RCS-b| zH?=oh2d>HA=7E>Ge^tMi^p0sd9mN;jjwbmAP){?XKKngMUo%i)zt0bFR)QBKZch8l zH$79*VATUZ~4a)oO;jA8G#&3y5g!{skUBMZ)DmWMcpT002ov JPDHLkV1kwD9o7H< literal 0 HcmV?d00001 diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 3387a2e55..7a1c7af19 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -1690,6 +1690,7 @@ static SDL_Surface *img_label_select, *img_label_apply; static SDL_Surface *img_color_picker, *img_color_picker_thumb, *img_color_picker_val; static SDL_Surface *img_paintwell, *img_color_sel, *img_color_mix; +static SDL_Surface *img_color_grab; static int color_picker_x, color_picker_y, color_picker_v; static int color_mixer_reset; @@ -2222,6 +2223,7 @@ static void draw_color_picker_crosshairs(int color_picker_left, int color_picker_val_top); static void set_color_picker_crosshair_size(void); static void draw_color_picker_values(int l, int t); +static void draw_color_grab_btn(SDL_Rect dest, int c); static void draw_color_picker_palette_and_values(int color_picker_left, int color_picker_top, int color_picker_val_left, @@ -25009,11 +25011,7 @@ static int do_color_picker(int prev_color) dest.w = img_back->w; dest.h = img_back->h; - SDL_FillRect(screen, &dest, - SDL_MapRGB(screen->format, - color_hexes[prev_color][0], - color_hexes[prev_color][1], - color_hexes[prev_color][2])); + draw_color_grab_btn(dest, prev_color); } @@ -25027,11 +25025,7 @@ static int do_color_picker(int prev_color) dest.w = img_back->w; dest.h = img_back->h; - SDL_FillRect(screen, &dest, - SDL_MapRGB(screen->format, - color_hexes[NUM_DEFAULT_COLORS][0], - color_hexes[NUM_DEFAULT_COLORS][1], - color_hexes[NUM_DEFAULT_COLORS][2])); + draw_color_grab_btn(dest, NUM_DEFAULT_COLORS); dest.x = pipette_left + (img_back->w - img_color_sel->w) / 2; dest.y = pipette_top + (img_back->h - img_color_sel->h) / 2; @@ -25049,11 +25043,7 @@ static int do_color_picker(int prev_color) dest.w = img_back->w; dest.h = img_back->h; - SDL_FillRect(screen, &dest, - SDL_MapRGB(screen->format, - color_hexes[NUM_DEFAULT_COLORS + 2][0], - color_hexes[NUM_DEFAULT_COLORS + 2][1], - color_hexes[NUM_DEFAULT_COLORS + 2][2])); + draw_color_grab_btn(dest, NUM_DEFAULT_COLORS + 2); dest.x = mixer_left + (img_back->w - img_color_mix->w) / 2; dest.y = mixer_top + (img_back->h - img_color_mix->h) / 2; @@ -25682,6 +25672,51 @@ static void draw_color_picker_values(int l, int t) } +static void draw_color_grab_btn(SDL_Rect dest, int c) { + int x, y; + Uint8 cr, cg, cb, r, g, b, a, tmp; + Uint32(*getpixel_btn) (SDL_Surface *, int, int); + Uint32(*getpixel_scrn) (SDL_Surface *, int, int); + void (*putpixel_scrn) (SDL_Surface *, int, int, Uint32); + SDL_Rect outline_dest; + + for (y = -1; y <= 1; y++) { + for (x = -1; x <= 1; x++) { + outline_dest.x = dest.x + x; + outline_dest.y = dest.y + y; + outline_dest.w = dest.w; + outline_dest.h = dest.h; + + SDL_BlitSurface(img_color_grab, NULL, screen, &outline_dest); + } + } + + cr = color_hexes[c][0]; + cg = color_hexes[c][1]; + cb = color_hexes[c][2]; + + getpixel_btn = getpixels[img_color_grab->format->BytesPerPixel]; + getpixel_scrn = getpixels[img_color_grab->format->BytesPerPixel]; + putpixel_scrn = putpixels[screen->format->BytesPerPixel]; + + SDL_LockSurface(screen); + SDL_LockSurface(img_color_grab); + for (y = 0; y < dest.h && y < img_color_grab->h; y++) { + for (x = 0; x < dest.w && x < img_color_grab->w; x++) { + SDL_GetRGBA(getpixel_btn(img_color_grab, x, y), img_color_grab->format, &tmp, &tmp, &tmp, &a); + SDL_GetRGBA(getpixel_scrn(screen, dest.x + x, dest.y + y), screen->format, &r, &g, &b, &tmp); + + r = ((cr * a) + (r * (255 - a))) / 255; + g = ((cg * a) + (g * (255 - a))) / 255; + b = ((cb * a) + (b * (255 - a))) / 255; + + putpixel_scrn(screen, x + dest.x, y + dest.y, SDL_MapRGB(screen->format, r, g, b)); + } + } + SDL_UnlockSurface(screen); + SDL_UnlockSurface(img_color_grab); +} + enum { COLOR_MIXER_BTN_RED, @@ -25696,6 +25731,9 @@ enum COLOR_MIXER_BTN_CLEAR, COLOR_MIXER_BTN_USE, COLOR_MIXER_BTN_BACK, + COLOR_MIXER_BTN_PREV_COLOR, + COLOR_MIXER_BTN_PIPETTE, + COLOR_MIXER_BTN_RAINBOW, NUM_COLOR_MIXER_BTNS }; @@ -25751,6 +25789,7 @@ int mixer_undo_buf[NUM_COLOR_MIX_UNDO_BUFS]; static int do_color_mix(int prev_color) { int i, btn_clicked; + SDL_Surface * img_color_picker_btn; #ifndef NO_PROMPT_SHADOWS SDL_Surface *alpha_surf; #endif @@ -25795,6 +25834,7 @@ static int do_color_mix(int prev_color) cell_w = img_back->w + 2; cell_h = img_back->h + 2; + /* Area for the dialog window */ r_final.x = r_canvas.x + (r_canvas.w - (cell_w * 6)) / 2 - 4; r_final.y = ((r_canvas.h - (cell_w * 4)) / 2) - 2; @@ -25961,6 +26001,64 @@ static int do_color_mix(int prev_color) SDL_BlitSurface(img_mixerlabel_clear, NULL, screen, &dest); + /* Draw buttons to pull colors from other sources: */ + + /* (Color buckets) */ + + color_mix_btn_lefts[COLOR_MIXER_BTN_PREV_COLOR] = r_final.x + (cell_w * 0) + 2; + color_mix_btn_tops[COLOR_MIXER_BTN_PREV_COLOR] = r_final.y + (cell_h * 2) + 2; + + if (prev_color != -1 && prev_color < NUM_DEFAULT_COLORS) { + dest.x = color_mix_btn_lefts[COLOR_MIXER_BTN_PREV_COLOR]; + dest.y = color_mix_btn_tops[COLOR_MIXER_BTN_PREV_COLOR]; + dest.w = cell_w - 2; + dest.h = cell_h - 2; + + draw_color_grab_btn(dest, prev_color); + } + + /* (Pipette) */ + + color_mix_btn_lefts[COLOR_MIXER_BTN_PIPETTE] = r_final.x + (cell_w * 1) + 2; + color_mix_btn_tops[COLOR_MIXER_BTN_PIPETTE] = r_final.y + (cell_h * 2) + 2; + + dest.x = color_mix_btn_lefts[COLOR_MIXER_BTN_PIPETTE]; + dest.y = color_mix_btn_tops[COLOR_MIXER_BTN_PIPETTE]; + dest.w = cell_w - 2; + dest.h = cell_h - 2; + + draw_color_grab_btn(dest, NUM_DEFAULT_COLORS); + + dest.x = color_mix_btn_lefts[COLOR_MIXER_BTN_PIPETTE] + (cell_w - img_color_sel->w) / 2; + dest.y = color_mix_btn_tops[COLOR_MIXER_BTN_PIPETTE] + (cell_h - img_color_sel->h) / 2; + + SDL_BlitSurface(img_color_sel, NULL, screen, &dest); + + /* (Rainbow) */ + + img_color_picker_btn = thumbnail(img_color_picker, cell_w - 2, cell_h - 2, 0); + + color_mix_btn_lefts[COLOR_MIXER_BTN_RAINBOW] = r_final.x + (cell_w * 2) + 2; + color_mix_btn_tops[COLOR_MIXER_BTN_RAINBOW] = r_final.y + (cell_h * 2) + 2; + + if (img_color_picker_btn != NULL) { + dest.x = color_mix_btn_lefts[COLOR_MIXER_BTN_RAINBOW]; + dest.y = color_mix_btn_tops[COLOR_MIXER_BTN_RAINBOW]; + SDL_BlitSurface(img_color_picker_btn, NULL, screen, &dest); + } + + dest.x = color_mix_btn_lefts[COLOR_MIXER_BTN_RAINBOW] + 4; + dest.y = color_mix_btn_tops[COLOR_MIXER_BTN_RAINBOW] + 4; + dest.w = cell_w - 10; + dest.h = cell_h - 10; + + SDL_FillRect(screen, &dest, + SDL_MapRGB(screen->format, + color_hexes[NUM_DEFAULT_COLORS + 2][0], + color_hexes[NUM_DEFAULT_COLORS + 2][1], + color_hexes[NUM_DEFAULT_COLORS + 2][2])); + + /* Show "Back" button */ color_mix_btn_lefts[COLOR_MIXER_BTN_BACK] = r_final.x + (cell_w * 4) + 2; @@ -26345,6 +26443,10 @@ static int do_color_mix(int prev_color) update_canvas(0, 0, canvas->w, canvas->h); + if (img_color_picker_btn != NULL) { + SDL_FreeSurface(img_color_picker_btn); + } + return (chose); } @@ -30643,7 +30745,7 @@ static void setup(void) DEBUG_PRINTF("%s\n", tmp_str); safe_snprintf(tmp_str, sizeof(tmp_str), - "© 2002–2021 Bill Kendrick et al."); + "© 2002–2023 Bill Kendrick, et al."); tmp_surf = render_text(medium_font, tmp_str, black); dest.x = 10; dest.y = WINDOW_HEIGHT - img_progress->h - (tmp_surf->h * 2); @@ -30929,6 +31031,7 @@ static void setup(void) loadimagerb(DATA_PREFIX "images/ui/scroll_down_off.png"); img_color_sel = loadimagerb(DATA_PREFIX "images/ui/csel.png"); img_color_mix = loadimagerb(DATA_PREFIX "images/ui/cmix.png"); + img_color_grab = loadimagerb(DATA_PREFIX "images/ui/color_grab.png"); #ifdef LOW_QUALITY_COLOR_SELECTOR img_paintcan = loadimage(DATA_PREFIX "images/ui/paintcan.png");