From 1f2c6c3c4ecbc0286f9d0fb06bfbb194a02465ec Mon Sep 17 00:00:00 2001
From: Pere Pujal i Carabantes
Date: Sat, 22 Jun 2019 00:20:45 +0200
Subject: [PATCH 01/20] Starter frame_heart.png was wrongly discarded as being
the .png version of frame_hearts.svg.
---
src/tuxpaint.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index abf25a7fc..dca48fae3 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -18820,7 +18820,7 @@ static int do_new_dialog(void)
f2 = &(fs[k].f);
strcpy(fname2, f2->d_name);
- if (strstr(fname2, fname) == fname2 && strcasestr(fname2, ".svg") != NULL)
+ if (strstr(fname, fname2) == fname2 && strcasestr(fname2, ".svg") != NULL)
{
/* SVG of this bitmap exists; we'll skip it */
skip = 1;
From 79384801742ad513cf9c8ecb87467936cdbe7b0d Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Fri, 30 Aug 2019 00:00:18 -0700
Subject: [PATCH 02/20] Clean up GCC warnings (2019-08-29 edition)
Updated most parts of the code that were throwing warnings in GCC.
---
docs/CHANGES.txt | 2 ++
magic/src/alien.c | 9 ++----
magic/src/calligraphy.c | 24 ++-------------
magic/src/emboss.c | 7 ++---
magic/src/fold.c | 26 +++++++++++-----
magic/src/fretwork.c | 10 ++++--
magic/src/perspective.c | 10 +++---
magic/src/rails.c | 5 ++-
magic/src/string.c | 20 +++---------
src/i18n.c | 18 ++---------
src/im.c | 20 ++++++------
src/macos.c | 8 +++--
src/macos.h | 6 ++--
src/onscreen_keyboard.c | 15 ++++++---
src/parse.gperf | 4 +++
src/tuxpaint.c | 67 +++++++++++++++++------------------------
16 files changed, 110 insertions(+), 141 deletions(-)
diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt
index ebbb44d66..9d407601a 100644
--- a/docs/CHANGES.txt
+++ b/docs/CHANGES.txt
@@ -42,6 +42,8 @@ $Id$
(Thanks to Flavio Airundo for the idea; closes
https://sourceforge.net/p/tuxpaint/feature-requests/188/)
+ * Updated most parts of the code that were throwing warnings in GCC.
+
* Documentation updates
---------------------
* Mended link to MinGW/MSYS instructions at John Popplewell's website.
diff --git a/magic/src/alien.c b/magic/src/alien.c
index 360dd57c5..013629797 100644
--- a/magic/src/alien.c
+++ b/magic/src/alien.c
@@ -1,12 +1,12 @@
/*
alien.c
-//
+
alien, Modifies the colours of the image.
Tux Paint - A simple drawing program for children.
Credits: Andrew Corcoran inspired by the Alien Map GIMP plugin
- Copyright (c) 2002-2007 by Bill Kendrick and others; see AUTHORS.txt
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -25,7 +25,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- Last updated: June 6, 2008
+ Last updated: August 29, 2019
$Id$
*/
@@ -168,9 +168,6 @@ static void do_alien_pixel(void *ptr, int which ATTRIBUTE_UNUSED,
// Do the effect for the full image
static void do_alien_full(void *ptr, SDL_Surface * canvas, SDL_Surface * last, int which)
{
-
- magic_api *api = (magic_api *) ptr;
-
int x, y;
for (y = 0; y < last->h; y++)
diff --git a/magic/src/calligraphy.c b/magic/src/calligraphy.c
index ae2a455d3..d2a529386 100644
--- a/magic/src/calligraphy.c
+++ b/magic/src/calligraphy.c
@@ -4,7 +4,7 @@
Calligraphy Magic Tool Plugin
Tux Paint - A simple drawing program for children.
- Copyright (c) 2002-2008 by Bill Kendrick and others; see AUTHORS.txt
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -23,7 +23,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- Last updated: July 8, 2008
+ Last updated: August 29, 2019
$Id$
*/
@@ -137,7 +137,6 @@ void calligraphy_drag(magic_api * api, int which ATTRIBUTE_UNUSED, SDL_Surface *
{
Point2D *curve;
int i, n_points, thick, new_thick;
- Uint32 colr;
SDL_Rect src, dest;
// if (SDL_GetTicks() < calligraphy_last_time + 5)
@@ -184,8 +183,6 @@ void calligraphy_drag(magic_api * api, int which ATTRIBUTE_UNUSED, SDL_Surface *
calligraphy_ComputeBezier(calligraphy_control_points, n_points, curve);
- colr = SDL_MapRGB(canvas->format, calligraphy_r, calligraphy_g, calligraphy_b);
-
new_thick = 40 - min((n_points /* / 2 */ ), 32);
for (i = 0; i < n_points - 1; i++)
@@ -218,23 +215,6 @@ void calligraphy_drag(magic_api * api, int which ATTRIBUTE_UNUSED, SDL_Surface *
dest.y = y;
SDL_BlitSurface(calligraphy_colored_brush, &src, canvas, &dest);
-
- /* Old way; using putpixel:
- SDL_LockSurface(canvas);
-
- for (j = -(thick / 2); j < (thick / 2) + 1; j++)
- {
- x = curve[i].x + j;
- y = curve[i].y - (j / 2); // 30 degrees
-
- api->putpixel(canvas, x, y, colr);
- api->putpixel(canvas, x + 1, y, colr);
- api->putpixel(canvas, x, y + 1, colr);
- api->putpixel(canvas, x + 1, y + 1, colr);
- }
-
- SDL_UnlockSurface(canvas);
- */
}
calligraphy_old_thick = (calligraphy_old_thick + new_thick) / 2;
diff --git a/magic/src/emboss.c b/magic/src/emboss.c
index 0ffcbf43c..ec3127252 100644
--- a/magic/src/emboss.c
+++ b/magic/src/emboss.c
@@ -4,7 +4,7 @@
Emboss Magic Tool Plugin
Tux Paint - A simple drawing program for children.
- Copyright (c) 2002-2008 by Bill Kendrick and others; see AUTHORS.txt
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -23,7 +23,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- Last updated: July 8, 2008
+ Last updated: August 29, 2019
$Id$
*/
@@ -114,7 +114,7 @@ static void do_emboss(void *ptr, int which ATTRIBUTE_UNUSED, SDL_Surface * canva
magic_api *api = (magic_api *) ptr;
int xx, yy;
Uint8 r1, g1, b1, r2, g2, b2;
- int r, g, b;
+ int r;
float h, s, v;
int avg1, avg2;
@@ -139,7 +139,6 @@ static void do_emboss(void *ptr, int which ATTRIBUTE_UNUSED, SDL_Surface * canva
r = 0;
if (r > 255)
r = 255;
- g = b = r;
v = (r / 255.0);
diff --git a/magic/src/fold.c b/magic/src/fold.c
index 125ed0391..87dfab482 100644
--- a/magic/src/fold.c
+++ b/magic/src/fold.c
@@ -1,3 +1,9 @@
+/*
+ * Folds the picture down from the corners.
+ *
+ * Last updated: 2019-08-29
+ */
+
//optimized version soon :)
//when "folding" same corner many times it gives strange results. Now it's allowed. Let me know
//if you think it shouldn't be.
@@ -138,25 +144,29 @@ void fold_draw(magic_api * api, int which,
right_step_y = (float)(y - left_arm_y) / (float)(left_arm_x - fold_ox);
left_step_x = (float)(x - right_arm_x) / (float)(right_arm_y - fold_oy);
left_step_y = (float)(y - right_arm_y) / (float)(right_arm_y - fold_oy);
+
+ left_y = (float)right_arm_y / left_arm_x * (left_arm_x - canvas->w);
+ right_x = (float)left_arm_x / right_arm_y * (right_arm_y - canvas->h);
+
for (w = 0; w < canvas->w; w += 0.5)
- for (h = 0; h < canvas->h; h += 0.5)
- {
- dist_x = right_step_x * w + left_step_x * h;
- dist_y = right_step_y * w + left_step_y * h;
- api->putpixel(canvas, x - dist_x, y - dist_y, api->getpixel(temp, w, h));
- }
+ {
+ for (h = 0; h < canvas->h; h += 0.5)
+ {
+ dist_x = right_step_x * w + left_step_x * h;
+ dist_y = right_step_y * w + left_step_y * h;
+ api->putpixel(canvas, x - dist_x, y - dist_y, api->getpixel(temp, w, h));
+ }
+ }
// Erasing the triangle.
// The 1 pixel in plus is a workaround for api-line not getting the end in some lines.
if (left_arm_x > canvas->w)
{
- left_y = (float)right_arm_y / left_arm_x * (left_arm_x - canvas->w);
for (h = 0; h <= right_arm_y; h++)
api->line((void *)api, which, canvas, snapshot, canvas->w, left_y - h, -1, right_arm_y - h, 1, fold_erase);
}
else if (right_arm_y > canvas->h)
{
- right_x = (float)left_arm_x / right_arm_y * (right_arm_y - canvas->h);
for (w = 0; w <= left_arm_x; w++)
api->line((void *)api, which, canvas, snapshot, left_arm_x - w, 0, right_x - w, canvas->h + 1, 1, fold_erase);
}
diff --git a/magic/src/fretwork.c b/magic/src/fretwork.c
index f6d555527..45aac5a33 100644
--- a/magic/src/fretwork.c
+++ b/magic/src/fretwork.c
@@ -1,3 +1,9 @@
+/*
+ * Draws fretwork
+ *
+ * Last updated: 2019-08-29
+ */
+
#include "tp_magic_api.h"
#include "SDL_image.h"
#include "SDL_mixer.h"
@@ -25,7 +31,7 @@
Mix_Chunk *fretwork_snd;
unsigned int img_w, img_h;
unsigned int fretwork_segments_x, fretwork_segments_y; //how many segments do we have?
-static int fretwork_math_ceil(int x, int y); //ceil() in cstdlib returns float and is relative slow, so we'll use our one
+inline int fretwork_math_ceil(int x, int y); //ceil() in cstdlib returns float and is relative slow, so we'll use our one
static Uint8 *fretwork_status_of_segments; //a place to store an info about bitmap used for selected segment
static char **fretwork_images; //the pathes to all the images needed
static unsigned int fretwork_segment_modified; //which segment was modified this time?
@@ -239,7 +245,7 @@ void fretwork_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UN
// Interactivity functions
-static int fretwork_math_ceil(int x, int y)
+inline int fretwork_math_ceil(int x, int y)
{
int temp;
diff --git a/magic/src/perspective.c b/magic/src/perspective.c
index 2143eecc6..b8d087d4a 100644
--- a/magic/src/perspective.c
+++ b/magic/src/perspective.c
@@ -8,7 +8,7 @@
Credits: Andrew Corcoran
- Copyright (c) 2002-2009 by Bill Kendrick and others; see AUTHORS.txt
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -27,7 +27,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- Last updated: May 6, 2009
+ Last updated: August 29, 2019
$Id$
*/
@@ -86,9 +86,11 @@ void perspective_line(void *ptr_to_api, int which, SDL_Surface * canvas, SDL_Sur
+/* Unused?
static const int perspective_AMOUNT = 300;
static const int perspective_RADIUS = 16;
static const double perspective_SHARPEN = 1.0;
+*/
Uint8 perspective_r, perspective_g, perspective_b;
int corner;
int dash;
@@ -396,12 +398,10 @@ void perspective_release(magic_api * api, int which,
}
else
{
- int aux_x, aux_y, aux_h, aux_w;
+ int aux_h, aux_w;
aux_h = canvas->h * canvas->h / new_h;
aux_w = canvas->w * aux_h / canvas->h;
- aux_x = canvas->w / 2 - aux_w / 2;
- aux_y = canvas->h / 2 - aux_h / 2;
update_rect->x = canvas->w / 2 - aux_w / 2;
update_rect->y = canvas->h / 2 - aux_h / 2;
diff --git a/magic/src/rails.c b/magic/src/rails.c
index 1f7895f65..d203f8227 100644
--- a/magic/src/rails.c
+++ b/magic/src/rails.c
@@ -24,7 +24,7 @@
Mix_Chunk *rails_snd;
unsigned int img_w, img_h;
unsigned int rails_segments_x, rails_segments_y; //how many segments do we have?
-static int rails_math_ceil(int x, int y); //ceil() in cstdlib returns float and is relative slow, so we'll use our one
+inline int rails_math_ceil(int x, int y); //ceil() in cstdlib returns float and is relative slow, so we'll use our one
static Uint8 *rails_status_of_segments; //a place to store an info about bitmap used for selected segment
static char **rails_images; //the pathes to all the images needed
static unsigned int rails_segment_modified; //which segment was modified this time?
@@ -51,7 +51,6 @@ void rails_release(magic_api * api, int which,
void rails_shutdown(magic_api * api);
void rails_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas);
void rails_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas);
-static int rails_math_ceil(int x, int y);
inline unsigned int rails_get_segment(int x, int y);
inline void rails_extract_coords_from_segment(unsigned int segment, Sint16 * x, Sint16 * y);
static void rails_flip(void *ptr, SDL_Surface * dest, SDL_Surface * src);
@@ -193,7 +192,7 @@ void rails_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSE
// Interactivity functions
-static int rails_math_ceil(int x, int y)
+inline int rails_math_ceil(int x, int y)
{
int temp;
diff --git a/magic/src/string.c b/magic/src/string.c
index 09a8a0f0f..24b3c16c6 100644
--- a/magic/src/string.c
+++ b/magic/src/string.c
@@ -1,3 +1,8 @@
+/*
+ * Strings -- draws string art.
+ *
+ * Last modified: 2019-08-29
+ */
#include "tp_magic_api.h"
#include "SDL_image.h"
#include "SDL_mixer.h"
@@ -353,20 +358,9 @@ void string_draw_triangle_preview(magic_api * api, int which,
SDL_Rect * update_rect)
{
int middle_x, middle_y;
- int w, h;
scale_coords(&ox, &oy, &x, &y);
- w = max(string_ox, x) - min(string_ox, x);
- h = max(string_oy, y) - min(string_oy, y);
- /*
- This is enouth if you move the mouse slowly, but if you move the mouse fast,
- there are rests of old previews left around.
- update_rect->w=max(max(string_ox,x),max(ox,x))-min(min(string_ox,x),min(ox,x)) +80;
- update_rect->h=max(max(string_oy,y),max(oy,y))-min(min(string_oy,y),min(oy,y)) +80;
- update_rect->x=min(string_ox,x) -40;
- update_rect->y=min(string_oy,y) -40;
- */
update_rect->x = 0;
update_rect->y = 0;
update_rect->w = canvas->w;
@@ -387,13 +381,9 @@ void string_draw_angle_preview(magic_api * api, int which,
int ox, __attribute__ ((unused))
int oy, int x, int y, SDL_Rect * update_rect)
{
- int w, h;
int middle_x, middle_y;
int dx, dy;
- w = max(string_ox, x) - min(string_ox, x);
- h = max(string_oy, y) - min(string_oy, y);
-
update_rect->x = 0;
update_rect->y = 0;
update_rect->w = canvas->w;
diff --git a/src/i18n.c b/src/i18n.c
index 37c95c1c9..df6fb1a03 100644
--- a/src/i18n.c
+++ b/src/i18n.c
@@ -4,7 +4,7 @@
For Tux Paint
Language-related functions
- Copyright (c) 2002-2014 by Bill Kendrick and others
+ Copyright (c) 2002-2019 by Bill Kendrick and others
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -25,7 +25,7 @@
$Id$
- June 14, 2002 - December 11, 2016
+ June 14, 2002 - August 29, 2019
*/
#include
@@ -986,7 +986,6 @@ static int set_current_language(const char *restrict locale_choice) MUST_CHECK;
static int set_current_language(const char *restrict loc)
{
int i;
- int y_nudge = 0;
char *oldloc;
char *env_language;
@@ -1104,7 +1103,6 @@ static int set_current_language(const char *restrict loc)
if (lang_y_nudge[i][0] == langint)
{
wished_langs[j].lang_y_nudge = lang_y_nudge[i][1];
- //printf("y_nudge = %d\n", y_nudge);
break;
}
}
@@ -1130,18 +1128,6 @@ static int set_current_language(const char *restrict loc)
need_right_to_left = wished_langs[0].need_right_to_left;
need_right_to_left_word = wished_langs[0].need_right_to_left_word;
-#if 0
- for (i = 0; lang_y_nudge[i][0] != -1; i++)
- {
- // printf("lang_y_nudge[%d][0] = %d\n", i, lang_y_nudge[i][0]);
- if (lang_y_nudge[i][0] == langint)
- {
- y_nudge = lang_y_nudge[i][1];
- //printf("y_nudge = %d\n", y_nudge);
- break;
- }
- }
-#endif
#ifdef DEBUG
fprintf(stderr, "DEBUG: Language is %s (%d) %s/%s\n",
lang_prefix, langint, need_right_to_left ? "(RTL)" : "", need_right_to_left_word ? "(RTL words)" : "");
diff --git a/src/im.c b/src/im.c
index f30b653fc..7808a336e 100644
--- a/src/im.c
+++ b/src/im.c
@@ -2,7 +2,7 @@
im.c
Input method handling
- Copyright (c)2007 by Mark K. Kim and others
+ Copyright (c) 2007-2019 by Mark K. Kim and others
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -905,12 +905,12 @@ static int im_event_zh_tw(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- /* go onto full reset */
+ __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- /* go onto soft reset */
+ __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1124,12 +1124,12 @@ static int im_event_th(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- /* go onto full reset */
+ __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- /* go onto soft reset */
+ __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1343,12 +1343,12 @@ static int im_event_ja(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- /* go onto full reset */
+ __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- /* go onto soft reset */
+ __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1590,12 +1590,12 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- /* go onto full reset */
+ __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- /* go onto soft reset */
+ __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1681,7 +1681,7 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
im->redraw--;
ks.unicode = L'\0';
}
- /* continue processing: */
+ __attribute__ ((fallthrough)); /* continue processing: */
/* Actual character processing */
default:
diff --git a/src/macos.c b/src/macos.c
index ae405aba5..148661f5b 100644
--- a/src/macos.c
+++ b/src/macos.c
@@ -1,7 +1,9 @@
/*
* FIXME
*/
+#include
#include
+#include
#include "macos.h"
#define MACOS_FONTS_PATH "%s/Library/Fonts"
@@ -12,7 +14,7 @@
/**
* FIXME
*/
-const char *macos_fontsPath()
+const char *macos_fontsPath(void)
{
static char *p = NULL;
@@ -35,7 +37,7 @@ const char *macos_fontsPath()
/**
* FIXME
*/
-const char *macos_preferencesPath()
+const char *macos_preferencesPath(void)
{
static char *p = NULL;
@@ -58,7 +60,7 @@ const char *macos_preferencesPath()
/**
* FIXME
*/
-const char *macos_globalPreferencesPath()
+const char *macos_globalPreferencesPath(void)
{
return MACOS_GLOBAL_PREFERENCES_PATH;
}
diff --git a/src/macos.h b/src/macos.h
index 1fe467bee..db965d61b 100644
--- a/src/macos.h
+++ b/src/macos.h
@@ -1,9 +1,9 @@
#ifndef __MACOS_H__
#define __MACOS_H__
-const char *macos_fontsPath();
-const char *macos_preferencesPath();
-const char *macos_globalPreferencesPath();
+const char *macos_fontsPath(void);
+const char *macos_preferencesPath(void);
+const char *macos_globalPreferencesPath(void);
#endif /* __MACOS_H__ */
diff --git a/src/onscreen_keyboard.c b/src/onscreen_keyboard.c
index 08fe7341b..c0674cebe 100644
--- a/src/onscreen_keyboard.c
+++ b/src/onscreen_keyboard.c
@@ -155,6 +155,7 @@ static struct osk_layout *load_layout(on_screen_keyboard * keyboard, char *layou
char *filename;
char *key, *value;
osk_layout *layout;
+ char * __attribute__((unused)) tmp_ptr;
layout = malloc(sizeof(osk_layout));
layout->name = NULL;
@@ -205,7 +206,7 @@ static struct osk_layout *load_layout(on_screen_keyboard * keyboard, char *layou
while (!feof(fi))
{
- fgets(line, 1023, fi);
+ tmp_ptr = fgets(line, 1023, fi);
if (is_blank_or_comment(line))
continue;
@@ -277,6 +278,7 @@ void load_hlayout(osk_layout * layout, char *hlayout_name)
char *key, *fontpath;
char *plain_label, *top_label, *altgr_label, *shift_altgr_label;
FILE *fi;
+ char * __attribute__((unused)) tmp_ptr;
key_number = line_number = 0;
width = height = 0;
@@ -342,7 +344,7 @@ void load_hlayout(osk_layout * layout, char *hlayout_name)
allocated = 1;
}
- fgets(line, 1023, fi);
+ tmp_ptr = fgets(line, 1023, fi);
if (is_blank_or_comment(line))
continue;
@@ -466,6 +468,7 @@ void load_keymap(osk_layout * layout, char *keymap_name)
char *ksname1, *ksname2, *ksname3, *ksname4;
char *line;
FILE *fi;
+ char * __attribute__((unused)) tmp_ptr;
filename = malloc(sizeof(char) * 255);
@@ -502,7 +505,7 @@ void load_keymap(osk_layout * layout, char *keymap_name)
while (!feof(fi))
{
- fgets(line, 1023, fi);
+ tmp_ptr = fgets(line, 1023, fi);
if (is_blank_or_comment(line))
continue;
@@ -652,6 +655,7 @@ static void load_composemap(osk_layout * layout, char *composemap_name)
char **pointer;
char *line;
FILE *fi;
+ char * __attribute__((unused)) tmp_ptr;
pointer = malloc(sizeof(wchar_t *));
filename = malloc(sizeof(char) * 255);
@@ -684,7 +688,7 @@ static void load_composemap(osk_layout * layout, char *composemap_name)
while (!feof(fi))
{
- fgets(line, 1023, fi);
+ tmp_ptr = fgets(line, 1023, fi);
if (is_blank_or_comment(line))
continue;
@@ -760,6 +764,7 @@ static void load_keysymdefs(osk_layout * layout, char *keysymdefs_name)
char *filename;
char *line;
FILE *fi;
+ char * __attribute__((unused)) tmp_ptr;
filename = malloc(sizeof(char) * 255);
@@ -789,7 +794,7 @@ static void load_keysymdefs(osk_layout * layout, char *keysymdefs_name)
while (!feof(fi))
{
- fgets(line, 1023, fi);
+ tmp_ptr = fgets(line, 1023, fi);
if (strncmp("#define XK_", line, 11) != 0)
continue;
diff --git a/src/parse.gperf b/src/parse.gperf
index 25b4fb014..7780d75b6 100644
--- a/src/parse.gperf
+++ b/src/parse.gperf
@@ -37,6 +37,10 @@ struct cfg
#define NEGBOOL(x) (void*)(offsetof(struct cfginfo,x)|NEG)
#define IMM(x) imm_##x
+/* Prototypes of what's in tuxpaint.c: */
+void show_version(int details);
+void show_usage(int exitcode);
+
static void imm_version(void)
{
show_version(0);
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index dca48fae3..2cf755bf6 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -22,7 +22,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- June 14, 2002 - April 3, 2019
+ June 14, 2002 - August 29, 2019
*/
@@ -457,9 +457,7 @@ static void mtw(wchar_t * wtok, char *tok)
#else
#include
-#include
-/* #include "rsvg.h" */
-/* #include "rsvg-cairo.h" */
+
#if !defined(RSVG_H) || !defined(RSVG_CAIRO_H)
#error "---------------------------------------------------"
#error "If you installed libRSVG from packages, be sure"
@@ -2040,17 +2038,19 @@ static char *debug_gettext(const char *str);
static int charsize(Uint16 c);
#endif
-static SDL_Surface *load_kpx(char *file);
+static SDL_Surface *load_kpx(const char *file);
#ifndef NOSVG
-static SDL_Surface *load_svg(char *file);
+static SDL_Surface *load_svg(const char *file);
static float pick_best_scape(unsigned int orig_w, unsigned int orig_h, unsigned int max_w, unsigned int max_h);
#endif
-static SDL_Surface *myIMG_Load_RWops(char *file);
-static SDL_Surface *myIMG_Load(char *file);
+static SDL_Surface *myIMG_Load_RWops(const char *file);
+static SDL_Surface *myIMG_Load(const char *file);
static int trash(char *path);
int file_exists(char *path);
+int generate_fontconfig_cache_spinner(SDL_Surface * screen);
+
#define MAX_UTF8_CHAR_LENGTH 6
@@ -7731,7 +7731,7 @@ static int generate_fontconfig_cache_real(void)
/**
* FIXME
*/
-static int generate_fontconfig_cache(void *vp)
+static int generate_fontconfig_cache(__attribute__((unused)) void *vp)
{
return generate_fontconfig_cache_real();
}
@@ -9344,13 +9344,6 @@ static SDL_Surface *thumbnail2(SDL_Surface * src, int max_x, int max_y, int keep
for (x = 0; x < max_x; x++)
{
#ifndef LOW_QUALITY_THUMBNAILS
-
-#ifdef GAMMA_CORRECTED_THUMBNAILS
- /* per: http://www.4p8.com/eric.brasseur/gamma.html */
- float gamma = 2.2;
- float gamma_invert = 1.0 / gamma;
-#endif
-
tr = 0;
tg = 0;
tb = 0;
@@ -9365,9 +9358,8 @@ 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
-// tr = tr + pow((float)r, gamma);
-// tb = tb + pow((float)b, gamma);
-// tg = tg + pow((float)g, gamma);
+ /* per: http://www.4p8.com/eric.brasseur/gamma.html */
+
tr = tr + sRGB_to_linear_table[r];
tg = tg + sRGB_to_linear_table[g];
tb = tb + sRGB_to_linear_table[b];
@@ -9390,9 +9382,6 @@ static SDL_Surface *thumbnail2(SDL_Surface * src, int max_x, int max_y, int keep
ta = ta / tmp;
#ifdef GAMMA_CORRECTED_THUMBNAILS
-// tr = ceil(pow(tr, gamma_invert));
-// tg = ceil(pow(tg, gamma_invert));
-// tb = ceil(pow(tb, gamma_invert));
tr = linear_to_sRGB(tr);
tg = linear_to_sRGB(tg);
tb = linear_to_sRGB(tb);
@@ -11285,7 +11274,8 @@ static void load_starter_id(char *saved_id, FILE * fil)
char fname[FILENAME_MAX];
FILE *fi;
char color_tag;
- int r, g, b, tmp;
+ int r, g, b, __attribute__((unused))tmp;
+ char * __attribute__((unused)) tmp_ptr;
rname = NULL;
@@ -11343,7 +11333,7 @@ static void load_starter_id(char *saved_id, FILE * fil)
if (!feof(fi) && color_tag == 'T')
{
- tmp = fgets(template_id, sizeof(template_id), fi);
+ tmp_ptr = fgets(template_id, sizeof(template_id), fi);
template_id[strlen(template_id) - 1] = '\0';
tmp = fscanf(fi, "%d", &template_personal);
/* FIXME: Debug only? */
@@ -11371,12 +11361,12 @@ static void load_starter_id(char *saved_id, FILE * fil)
/**
* FIXME
*/
-static SDL_Surface *load_starter_helper(char *path_and_basename, char *extension, SDL_Surface * (*load_func) (char *))
+static SDL_Surface *load_starter_helper(char *path_and_basename, const char *extension, SDL_Surface * (*load_func) (const char *))
{
char *ext;
char fname[256];
SDL_Surface *surf;
- int i;
+ unsigned int i;
ext = strdup(extension);
snprintf(fname, sizeof(fname), "%s.%s", path_and_basename, ext);
@@ -11890,7 +11880,7 @@ static int do_prompt_image_flash_snd(const char *const text,
int i;
SDL_Surface *alpha_surf;
#endif
- int img1_w, img2_w, img3_w, max_img_w, img_x, img_y, offset;
+ int img1_w, img2_w, img3_w, max_img_w, img_y, offset;
SDL_Surface *img1b;
int free_img1b;
int txt_left, txt_right, img_left, btn_left, txt_btn_left, txt_btn_right;
@@ -12071,7 +12061,6 @@ static int do_prompt_image_flash_snd(const char *const text,
/* Draw the images (if any, and if not animated): */
- img_x = img_left;
img_y = 100 + PROMPTOFFSETY + 4;
if (img1b != NULL)
@@ -13236,9 +13225,9 @@ static void set_chunk_data(unsigned char **chunk_data, size_t * chunk_data_len,
strcat(headers, "Tuxpaint\n");
strcat(headers, "Tuxpaint_" VER_VERSION "\n");
- sprintf(line, "%d%s", uncompressed_size, "\n");
+ sprintf(line, "%lu%s", uncompressed_size, "\n");
strcat(headers, line);
- sprintf(line, "%d%s", dataLen, "\n");
+ sprintf(line, "%lu%s", dataLen, "\n");
strcat(headers, line);
headersLen = strlen(headers);
@@ -17210,7 +17199,7 @@ static void handle_active(SDL_Event * event)
SDL_Flip(screen);
}
}
- if (event->active.state & SDL_APPINPUTFOCUS | SDL_APPACTIVE)
+ if (event->active.state & (SDL_APPINPUTFOCUS | SDL_APPACTIVE))
{
if (event->active.gain == 1)
{
@@ -17477,7 +17466,7 @@ static int paintsound(int size)
/* Old libcairo1, svg and svg-cairo based code
Based on cairo-demo/sdl/main.c from Cairo (GPL'd, (c) 2004 Eric Windisch):
*/
-static SDL_Surface *load_svg(char *file)
+static SDL_Surface *load_svg(const char *file)
{
svg_cairo_t *scr;
int bpp, btpp, stride;
@@ -17636,7 +17625,7 @@ static SDL_Surface *load_svg(char *file)
* FIXME
*/
/* New libcairo2, rsvg and rsvg-cairo based code */
-static SDL_Surface *load_svg(char *file)
+static SDL_Surface *load_svg(const char *file)
{
cairo_surface_t *cairo_surf;
cairo_t *cr;
@@ -17887,7 +17876,7 @@ static float pick_best_scape(unsigned int orig_w, unsigned int orig_h, unsigned
*/
/* FIXME: we can remove this after SDL folks fix their bug at http://bugzilla.libsdl.org/show_bug.cgi?id=1485 */
/* Try to load an image with IMG_Load(), if it fails, then try with RWops() */
-static SDL_Surface *myIMG_Load_RWops(char *file)
+static SDL_Surface *myIMG_Load_RWops(const char *file)
{
SDL_Surface *surf;
FILE *fi;
@@ -17921,7 +17910,7 @@ static SDL_Surface *myIMG_Load_RWops(char *file)
if we notice it's an SVG file (if available!);
call load_kpx() if we notice it's a KPX file (JPEG with wrapper);
otherwise call SDL_Image lib's IMG_Load() (for PNGs, JPEGs, BMPs, etc.) */
-static SDL_Surface *myIMG_Load(char *file)
+static SDL_Surface *myIMG_Load(const char *file)
{
if (strlen(file) > 4 && strcasecmp(file + strlen(file) - 4, ".kpx") == 0)
{
@@ -17942,7 +17931,7 @@ static SDL_Surface *myIMG_Load(char *file)
/**
* FIXME
*/
-static SDL_Surface *load_kpx(char *file)
+static SDL_Surface *load_kpx(const char *file)
{
SDL_RWops *data;
FILE *fi;
@@ -19819,7 +19808,7 @@ static int do_color_sel(void)
int i, dx, dy;
int done, chose;
int back_left, back_top;
- int color_sel_x, color_sel_y;
+ int color_sel_x = 0, color_sel_y = 0;
SDL_Surface *tmp_btn_up, *tmp_btn_down;
Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int);
@@ -21130,7 +21119,7 @@ static void render_all_nodes_starting_at(struct label_node **node)
* FIXME
*/
/* FIXME: This should search for the top-down of the overlaping labels and only re-render from it */
-static void derender_node(struct label_node **ref_head)
+static void derender_node(__attribute__((unused)) struct label_node **ref_head)
{
SDL_Rect r_tmp_derender;
@@ -22890,7 +22879,7 @@ static void setup_config(char *argv[])
{
char *token;
- token = strtok(tmpcfg.joystick_buttons_ignore, ",");
+ token = strtok((char *) tmpcfg.joystick_buttons_ignore, ",");
while (token != NULL)
{
if (strtof(token, NULL) < 0 || strtof(token, NULL) > 254)
From e5c3cdfcf5e16a9b0fc3e7766bfea1d9c326b3ae Mon Sep 17 00:00:00 2001
From: begasus
Date: Fri, 6 Sep 2019 13:45:56 +0200
Subject: [PATCH 03/20] Haiku fixes
---
Makefile | 2 --
src/fonts.c | 4 +++-
src/i18n.c | 4 ++--
src/im.c | 18 +++++++++---------
src/tuxpaint.c | 4 ++--
5 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/Makefile b/Makefile
index e3fc13b3e..2a6449e04 100644
--- a/Makefile
+++ b/Makefile
@@ -131,7 +131,6 @@ ARCH_HEADERS:=$($(OS)_ARCH_HEADERS)
# For macOS, the prefix is relative to DESTDIR.
windows_PREFIX:=/usr/local
osx_PREFIX:=Resources
-beos_PREFIX=$(shell finddir B_APPS_DIRECTORY)/TuxPaint
linux_PREFIX:=/usr/local
PREFIX:=$($(OS)_PREFIX)
@@ -462,7 +461,6 @@ trans:
windows_ARCH_INSTALL:=
osx_ARCH_INSTALL:=install-macbundle TuxPaint.dmg
-beos_ARCH_INSTALL:=install-haiku
linux_ARCH_INSTALL:=install-kde install-kde-icons
ARCH_INSTALL:=$($(OS)_ARCH_INSTALL)
diff --git a/src/fonts.c b/src/fonts.c
index d6a5ad525..f7290e95b 100644
--- a/src/fonts.c
+++ b/src/fonts.c
@@ -970,10 +970,12 @@ static void loadfonts(SDL_Surface * screen, const char *const dir)
result = find_directory(B_SYSTEM_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer));
loadfonts(screen, buffer);
- result = find_directory(B_COMMON_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer));
+ result = find_directory(B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer));
loadfonts(screen, buffer);
result = find_directory(B_USER_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer));
loadfonts(screen, buffer);
+ result = find_directory(B_USER_NONPACKAGED_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer));
+ loadfonts(screen, buffer);
#elif defined(__APPLE__)
loadfonts(screen, "/System/Library/Fonts");
loadfonts(screen, "/Library/Fonts");
diff --git a/src/i18n.c b/src/i18n.c
index df6fb1a03..ce94092dc 100644
--- a/src/i18n.c
+++ b/src/i18n.c
@@ -986,8 +986,10 @@ static int set_current_language(const char *restrict locale_choice) MUST_CHECK;
static int set_current_language(const char *restrict loc)
{
int i;
+ int j = 0;
char *oldloc;
char *env_language;
+ char *env_language_lang;
if (strlen(loc) > 0)
@@ -1082,8 +1084,6 @@ static int set_current_language(const char *restrict loc)
mysetenv("LANGUAGE", "C");
}
env_language = strdup(getenv("LANGUAGE"));
- int j = 0;
- char *env_language_lang;
if (*env_language)
{
diff --git a/src/im.c b/src/im.c
index 7808a336e..138cfad4f 100644
--- a/src/im.c
+++ b/src/im.c
@@ -905,12 +905,12 @@ static int im_event_zh_tw(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- __attribute__ ((fallthrough)); /* go onto full reset */
+ // // __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- __attribute__ ((fallthrough)); /* go onto soft reset */
+ // __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1124,12 +1124,12 @@ static int im_event_th(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- __attribute__ ((fallthrough)); /* go onto full reset */
+ // __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- __attribute__ ((fallthrough)); /* go onto soft reset */
+ // __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1343,12 +1343,12 @@ static int im_event_ja(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- __attribute__ ((fallthrough)); /* go onto full reset */
+ // __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- __attribute__ ((fallthrough)); /* go onto soft reset */
+ // __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1590,12 +1590,12 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- __attribute__ ((fallthrough)); /* go onto full reset */
+ // __attribute__ ((fallthrough)); /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- __attribute__ ((fallthrough)); /* go onto soft reset */
+ // __attribute__ ((fallthrough)); /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1681,7 +1681,7 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
im->redraw--;
ks.unicode = L'\0';
}
- __attribute__ ((fallthrough)); /* continue processing: */
+ // __attribute__ ((fallthrough)); /* continue processing: */
/* Actual character processing */
default:
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index 2cf755bf6..2435b4884 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -19809,6 +19809,7 @@ static int do_color_sel(void)
int done, chose;
int back_left, back_top;
int color_sel_x = 0, color_sel_y = 0;
+ int want_animated_popups = 1;
SDL_Surface *tmp_btn_up, *tmp_btn_down;
Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int);
@@ -19829,7 +19830,6 @@ static int do_color_sel(void)
/* FIXME this is the first step to make animated popups optional,
to be removed from here when implemented in a more general way */
- int want_animated_popups = 1;
hide_blinking_cursor();
@@ -22438,7 +22438,7 @@ static void setup_config(char *argv[])
char buffer[B_PATH_NAME_LENGTH + B_FILE_NAME_LENGTH];
status_t result;
- result = find_directory(B_USER_DIRECTORY, volume, false, buffer, sizeof(buffer));
+ result = find_directory(B_USER_SETTINGS_DIRECTORY, volume, false, buffer, sizeof(buffer));
asprintf((char **)&savedir, "%s/%s", buffer, "TuxPaint");
#elif __APPLE__
savedir = strdup(macos_preferencesPath());
From df49986fab4fbae49c44d9c1ea69dadaf4dff74c Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Thu, 12 Sep 2019 20:27:03 -0700
Subject: [PATCH 04/20] Add a FALL_THROUGH macro to compiler.h
Older gcc's don't support `__attribute__ ((fallthrough))`
(see https://sourceforge.net/u/begasus/tuxpaint/ci/e5c3cdfcf5e16a9b0fc3e7766bfea1d9c326b3ae/
"Haiku Fixes" by Luc), so adding a new macro to compiler.h
that is defined as "((void)0)" on older compilers.
---
src/compiler.h | 14 ++++++++++++--
src/im.c | 19 +++++++++----------
2 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/compiler.h b/src/compiler.h
index 5afeec307..82efd7a9c 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -5,7 +5,7 @@
for Tux Paint
Mostly by Albert Cahalan
- Copyright (c) 2002-2006
+ Copyright (c) 2002-2019
http://www.newbreedsoftware.com/tuxpaint/
@@ -24,7 +24,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- June 14, 2002 - December 30, 2017
+ June 14, 2002 - September 12, 2019
$Id$
*/
@@ -127,3 +127,13 @@
#undef CLOCK_ASM
#define CLOCK_ASM(x) x=42
#endif
+
+/* h/t https://tutel.me/c/programming/questions/45349079/how+to+use+__attribute__fallthrough+correctly+in+gcc */
+#ifndef FALLTHROUGH
+#if defined(__GNUC__) && __GNUC__ >= 7
+ #define FALL_THROUGH __attribute__ ((fallthrough))
+#else
+ #define FALL_THROUGH ((void)0)
+#endif /* __GNUC__ >= 7 */
+#endif
+
diff --git a/src/im.c b/src/im.c
index 138cfad4f..ac7d5862b 100644
--- a/src/im.c
+++ b/src/im.c
@@ -45,7 +45,6 @@
#include "im.h"
-
/* ***************************************************************************
* I18N GETTEXT
*/
@@ -905,12 +904,12 @@ static int im_event_zh_tw(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- // // __attribute__ ((fallthrough)); /* go onto full reset */
+ FALL_THROUGH; /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- // __attribute__ ((fallthrough)); /* go onto soft reset */
+ FALL_THROUGH; /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1124,12 +1123,12 @@ static int im_event_th(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- // __attribute__ ((fallthrough)); /* go onto full reset */
+ FALL_THROUGH; /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- // __attribute__ ((fallthrough)); /* go onto soft reset */
+ FALL_THROUGH; /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1343,12 +1342,12 @@ static int im_event_ja(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- // __attribute__ ((fallthrough)); /* go onto full reset */
+ FALL_THROUGH; /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- // __attribute__ ((fallthrough)); /* go onto soft reset */
+ FALL_THROUGH; /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1590,12 +1589,12 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
case IM_REQ_FREE: /* Free allocated resources */
charmap_free(&cm);
- // __attribute__ ((fallthrough)); /* go onto full reset */
+ FALL_THROUGH; /* go onto full reset */
case IM_REQ_RESET_FULL: /* Full reset */
cm.section = SEC_ENGLISH;
im->tip_text = im_tip_text[IM_TIP_ENGLISH];
- // __attribute__ ((fallthrough)); /* go onto soft reset */
+ FALL_THROUGH; /* go onto soft reset */
case IM_REQ_RESET_SOFT: /* Soft reset */
im->s[0] = L'\0';
@@ -1681,7 +1680,7 @@ static int im_event_ko(IM_DATA * im, SDL_keysym ks)
im->redraw--;
ks.unicode = L'\0';
}
- // __attribute__ ((fallthrough)); /* continue processing: */
+ FALL_THROUGH; /* continue processing: */
/* Actual character processing */
default:
From d79173eae47c57c65b8f66cba8694700ad70077a Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Thu, 12 Sep 2019 21:16:45 -0700
Subject: [PATCH 05/20] Doc'ing Luc's Haiku updates
---
docs/AUTHORS.txt | 6 +++---
docs/CHANGES.txt | 7 ++++++-
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/docs/AUTHORS.txt b/docs/AUTHORS.txt
index a95ba2d9d..673ade41f 100644
--- a/docs/AUTHORS.txt
+++ b/docs/AUTHORS.txt
@@ -2,12 +2,12 @@ AUTHORS.txt for Tux Paint
Tux Paint - A simple drawing program for children.
-Copyright (c) 2002-2018
+Copyright (c) 2002-2019
Various contributors (see below, and CHANGES.txt)
http://www.tuxpaint.org/
-June 17, 2002 - August 30, 2018
+June 17, 2002 - September 12, 2019
$Id$
@@ -1069,7 +1069,7 @@ $Id$
Alessandro Pasotti
* BeOS coding and builds
- Luc 'Begasus' Schrijvers
+ Luc 'Begasus' Schrijvers
Scott McCreary
Marcin 'Shard' Konicki [retired]
diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt
index 9d407601a..0e5bcd52b 100644
--- a/docs/CHANGES.txt
+++ b/docs/CHANGES.txt
@@ -8,7 +8,12 @@ http://www.tuxpaint.org/
$Id$
-2019.Apr.3 (0.9.24)
+2019.Sep.12 (0.9.24)
+ * Ports & Building
+ ----------------
+ * Updates to build on Haiku.
+ Luc 'Begasus' Schrijvers
+
* Bug Fixes
---------
* Correct issue that prevented Tux Paint from lauching on Mac OS X 10.7.
From 2911b35a50664f187971daa09324c80d836d9c18 Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Thu, 12 Sep 2019 23:04:13 -0700
Subject: [PATCH 06/20] Elevate "Fill" from Magic Tool to real Tool
Replace the somewhat-recently-added "nothing" item in the tool bar
with the "Fill" tool, which has been converted back from a Magic tool
to a regular tool.
Also, change bash "==" to sh "=" in "if [ ... ]" tests in Makefile.
Also, link to math library (via "-lm") to make sure "max()" is available to
magic tools.
Also, add missing mention of "--newcolorslast" and "--newcolorsfirst" to manpage.
---
Makefile | 23 +-
{magic/icons => data/images/tools}/fill.png | Bin
{magic => data}/sounds/fill.wav | Bin
docs/CHANGES.txt | 6 +
docs/en/README.txt | 12 +-
docs/en/html/README.html | 13 +-
docs/html/images/tool_fill.png | Bin 0 -> 3049 bytes
magic/magic-docs/src/magic-docs.php | 6 +-
magic/src/fill.c | 268 --------------------
src/fill.c | 160 ++++++++++++
src/fill.h | 37 +++
src/manpage/tuxpaint.1 | 13 +-
src/sounds.h | 8 +-
src/tools.h | 16 +-
src/tuxpaint.c | 37 ++-
15 files changed, 295 insertions(+), 304 deletions(-)
rename {magic/icons => data/images/tools}/fill.png (100%)
rename {magic => data}/sounds/fill.wav (100%)
create mode 100644 docs/html/images/tool_fill.png
delete mode 100644 magic/src/fill.c
create mode 100644 src/fill.c
create mode 100644 src/fill.h
diff --git a/Makefile b/Makefile
index 2a6449e04..75c3300d8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,10 @@
# Tux Paint - A simple drawing program for children.
-# Copyright (c) 2002-2018
+# Copyright (c) 2002-2019
# Various contributors (see AUTHORS.txt)
# http://www.tuxpaint.org/
-# June 14, 2002 - December 18, 2018
+# June 14, 2002 - September 12, 2019
# The version number, for release:
@@ -481,7 +481,7 @@ install: install-bin install-data install-man install-doc \
@echo
@echo "--------------------------------------------------------------"
@echo
- @if [ "x$(OS)" == "xosx" ]; then \
+ @if [ "x$(OS)" = "xosx" ]; then \
echo "All done! Now you can double click $(BUNDLE) to run the"; \
echo "program!!! TuxPaint.dmg has also been created for"; \
echo "distribution."; \
@@ -876,7 +876,7 @@ install-dlls:
@cp `which libstdc++-6.dll` $(BIN_PREFIX)
@cp `which libfribidi-0.dll` $(BIN_PREFIX)
@cp `which libpthread-2.dll` $(BIN_PREFIX)
- @if [ "x$(BDIST_WIN9X)" == "x" ]; then \
+ @if [ "x$(BDIST_WIN9X)" = "x" ]; then \
cp `which libxml2-2.dll` $(BIN_PREFIX); \
cp `which libcairo-2.dll` $(BIN_PREFIX); \
cp `which libfontconfig-1.dll` $(BIN_PREFIX); \
@@ -898,7 +898,7 @@ install-dlls:
cp `which bz2-1.dll` $(BIN_PREFIX); \
fi
@strip -s $(BIN_PREFIX)/*.dll
- @if [ "x$(BDIST_WIN9X)" == "x" ]; then \
+ @if [ "x$(BDIST_WIN9X)" = "x" ]; then \
echo; \
echo "...Installing Configuration Files..."; \
cp -R win32/etc/ $(BIN_PREFIX); \
@@ -1021,7 +1021,7 @@ TuxPaint.dmg:
# Build the program!
tuxpaint: obj/tuxpaint.o obj/i18n.o obj/im.o obj/cursor.o obj/pixels.o \
- obj/rgblinear.o obj/playsound.o obj/fonts.o obj/parse.o \
+ obj/rgblinear.o obj/playsound.o obj/fonts.o obj/parse.o obj/fill.o \
obj/progressbar.o obj/dirwalk.o obj/get_fname.o obj/onscreen_keyboard.o \
$(ARCH_LIBS)
@echo
@@ -1037,7 +1037,7 @@ tuxpaint: obj/tuxpaint.o obj/i18n.o obj/im.o obj/cursor.o obj/pixels.o \
obj/tuxpaint.o: src/tuxpaint.c \
src/i18n.h src/im.h src/cursor.h src/pixels.h \
- src/rgblinear.h src/playsound.h src/fonts.h \
+ src/rgblinear.h src/playsound.h src/fonts.h src/fill.h \
src/progressbar.h src/dirwalk.h src/get_fname.h \
src/compiler.h src/debug.h \
src/tools.h src/titles.h src/colors.h src/shapes.h \
@@ -1136,6 +1136,13 @@ obj/playsound.o: src/playsound.c src/playsound.h \
@$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(SDL_CFLAGS) $(DEFS) \
-c src/playsound.c -o obj/playsound.o
+obj/fill.o: src/fill.c src/fill.h \
+ src/rgblinear.h src/playsound.h src/pixels.h
+ @echo
+ @echo "...Compiling flood fill tool..."
+ @$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(SDL_CFLAGS) $(DEFS) \
+ -c src/fill.c -o obj/fill.o
+
obj/progressbar.o: src/progressbar.c src/progressbar.h \
src/compiler.h src/debug.h
@echo
@@ -1226,7 +1233,7 @@ PLUGIN_LIBS:=$($(OS)_PLUGIN_LIBS)
#MAGIC_CFLAGS:=-g3 -O2 -fvisibility=hidden -fno-common -W -Wstrict-prototypes -Wmissing-prototypes -Wall $(MAGIC_SDL_CPPFLAGS) -Isrc/
MAGIC_CFLAGS:=-g3 -O2 -fno-common -W -Wstrict-prototypes -Wmissing-prototypes -Wall $(MAGIC_SDL_CPPFLAGS) -Isrc/ $(ARCH_CFLAGS)
-SHARED_FLAGS:=-shared -fpic
+SHARED_FLAGS:=-shared -fpic -lm
MAGIC_C:=$(wildcard magic/src/*.c)
MAGIC_SO:=$(patsubst magic/src/%.c,magic/%.$(SO_TYPE),$(MAGIC_C))
diff --git a/magic/icons/fill.png b/data/images/tools/fill.png
similarity index 100%
rename from magic/icons/fill.png
rename to data/images/tools/fill.png
diff --git a/magic/sounds/fill.wav b/data/sounds/fill.wav
similarity index 100%
rename from magic/sounds/fill.wav
rename to data/sounds/fill.wav
diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt
index 0e5bcd52b..bf18dc769 100644
--- a/docs/CHANGES.txt
+++ b/docs/CHANGES.txt
@@ -9,6 +9,12 @@ http://www.tuxpaint.org/
$Id$
2019.Sep.12 (0.9.24)
+ * New tools
+ ---------
+ * Fill
+ Not actually a new tool, but promoted from a "Magic" tool
+ to a full-fledge tool in the "Tools" bar.
+
* Ports & Building
----------------
* Updates to build on Haiku.
diff --git a/docs/en/README.txt b/docs/en/README.txt
index e87dff5d1..28b30d1f3 100644
--- a/docs/en/README.txt
+++ b/docs/en/README.txt
@@ -6,7 +6,7 @@
Copyright 2002-2019 by various contributors; see AUTHORS.txt
http://www.tuxpaint.org/
- June 14, 2002 - April 3, 2019
+ June 14, 2002 - September 12, 2019
----------------------------------------------------------------------
@@ -375,6 +375,16 @@ Available Tools
left [Alt]
* Thai — right [Alt]
+ ----------------------------------------------------------------------
+
+ Fill
+
+ The 'Fill' tool 'flood-fills' a contiguous area of your
+ drawing with a solid color of your choice.
+
+ Note: Prior to Tux Paint 0.9.24, this was a "Magic" tool
+ (see below).
+
----------------------------------------------------------------------
Magic (Special Effects)
diff --git a/docs/en/html/README.html b/docs/en/html/README.html
index 049cd4c96..5ac5e6efc 100644
--- a/docs/en/html/README.html
+++ b/docs/en/html/README.html
@@ -22,7 +22,7 @@ version
June 14, 2002 -
- April 3, 2019
+ September 12, 2019
@@ -507,6 +507,17 @@ version
+ Fill
+
+
+
+ The 'Fill' tool 'flood-fills' a contiguous area of your drawing
+ with a solid color of your choice.
+
+ Note: Prior to Tux Paint 0.9.24, this was a "Magic" tool (see below).
+
+
+
Magic (Special Effects)
diff --git a/docs/html/images/tool_fill.png b/docs/html/images/tool_fill.png
new file mode 100644
index 0000000000000000000000000000000000000000..5507f67af2f273005e9c9627ac0d800211c3f08f
GIT binary patch
literal 3049
zcmVs)f)@}5H0^P_po%^&+0-}8R>;~jmK#Y02;7wXngy0Xs2>-&2PnRKGZo;ego
zJP)8h9XwWT1h$R<=bY6i0w);y4^QpM=L;J)Uh?Iye=iJzBS%JFBc>?gb5>MR+o
zKOH>Q3CJ)HK7TYtQ|iukWgI_<{BXfyjBzs=Ka4Kecrg+E*&R
zEkHwm9Z%`WI4bLEKa3FO39BpK_9m~{002@-Ykk9Y@7a9$RRF-u!O7mC^)eu&FrRbk
z%}^2mEkHqN4v$Wyz4KkJ9~!jiW@Gxir*H7!L?QA?MbcaTYi{Iu(S*brg!o3&WESKK_?<^2Oys
zKIZ^}WvD&-{Nptj*Qzsbeft%SM*a6s?7r;_-?`+ncLBiFmkpeI{>I~Dqs>O0h3nNB
z5fKq0(vF+UbpgQI^EST!`faNQ&P@?{L3DJy3ILX*_rC4ymCMQ+0EWkAT5}>GLTDHf
zFa?$H6h)ENPFJBPmoH{>U3cE`)r&5@+}`^5tzW5}c1Al7dw$!f&4gjF
z=kZ_v?zfKs010)&8G5CH;Oi!sFyHR{!+%U9$J
z-OLOEVc|Qm6z$1OWsAwNh+^iLG-1
zK&=_*rWeNU46*lUtsF)CPH-lW(|>)>34T0}=JNsI(#`Lz*JdmRvbabgS;9~$
zWu>%rOB5naPELr(jW>TPj3A0sNQRKDTLq!f#;}brL{za}`pFr6@u~Kmjm@HH+AE
z7)QIKTt|O;`$v@4Q5bfhN%3W}*;T98)T=W{n6i@kFDWZqs#>BQ5s?}lei;B9SGy4h
zPNae)+aa)sMgSYvR(!41Lag+xtA}^~7!gx?
z9LIU`xfhkfr-lyMbTu-3h+q}Y}%o<*4l9v^;K4{Sz9O+Em@B|aDNc^&mMl&
z4^5*PR_k81+N{-@o)<)+Awr#TRnw0UFzHMsKP7e?x~euKOCHoX7+O
zKm=ICFa(kD0#k4J)oOEQrrxM~z8@~>D^MZl+HFvpN^ZIROGwmgGyvePU5_}fYX|yU
z3#0`F;>}k&sl`ypxw<=_fjI2ZUcdJGfBMkYf7S}E@3Wi&b`p+S;F9fNYhD28&S!LQ
zF^lOAnh*)oCmDnwZk`Io020X(Om_c;i9v5MOXZ$iLSMYA7X$%d0FLz*7C3R)ykX$E
zy@T^s+KXXf5f)(k&X^n~VurBXlhfty98r9@NRMJMu~sjH*~=@uZ_|bsp5LD~@B7u0
zH{bf1)0Zwc0sz1Q9hF%;NlQ3@S@RNMxjUyFP34|k-8X<>&pYWeY*&>Q-!1mP@U0(Q
z@xBk*mYc~8oO>Psun2(VpuMsHpyW55qui5oG!X!t(N~=Nm{mFvZdSYifYOfRW^56G
zcV9TLZ||T8K-yI?F*S^DEVUT$%?Zpn&lFY&a5dcNF
ztWp5`^~2F>X{9((4~0cq&=Z?4;y-@d=Qm$*H2`SGiQ_p9>^YSVXMk3k6?<+Jk)@TQ
zqZOpzhgL4@eP!slJv7B#5k#;f#8PaE`(X+e_t7pio?5`k1PW?>OwS-Gs&-i?oQ
z{gq9ii1&svuVV^8M}h%Zu+k9_tzoU8EXBDGM1&!p%<$^|Qu_HkIm7})hIj8h3R-7#8OPDeX3vvugN&3fQ<1L$ZA0u(Z|v^P`f&deRHlOg+zV;XsH
rTzQ@6=u={dn3b$!Dj+V*iJAWg@^aP+9^G@j00000NkvXXu0mjf9_Y6C
literal 0
HcmV?d00001
diff --git a/magic/magic-docs/src/magic-docs.php b/magic/magic-docs/src/magic-docs.php
index ef3d98765..00c9a7991 100644
--- a/magic/magic-docs/src/magic-docs.php
+++ b/magic/magic-docs/src/magic-docs.php
@@ -5,7 +5,7 @@ individual HTML files for each of them, and an index.html that links to
them all. */
/* Bill Kendrick */
-/* Oct. 8, 2009 - August 30, 2018 */
+/* Oct. 8, 2009 - September 12, 2019 */
/* Authors of the Magic tools: */
@@ -114,10 +114,6 @@ $tools = array(
'author'=>$AUTHOR_KENDRICK,
'see'=>array('Edges', 'Silhouette')),
- array('name'=>'Fill',
- 'desc'=>'This floods the picture with a color. It lets you quickly fill parts of the picture, as if it were a coloring book.',
- 'author'=>$AUTHOR_KENDRICK),
-
array('name'=>'Fisheye',
'desc'=>'Warp parts of your picture like it\'s being seen through a fisheye lens.',
'author'=>$AUTHOR_ADAMR),
diff --git a/magic/src/fill.c b/magic/src/fill.c
deleted file mode 100644
index 75f4fda12..000000000
--- a/magic/src/fill.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- fill.c
-
- Fill Magic Tool Plugin
- Tux Paint - A simple drawing program for children.
-
- Copyright (c) 2002-2008 by Bill Kendrick and others; see AUTHORS.txt
- bill@newbreedsoftware.com
- http://www.tuxpaint.org/
-
- Flood fill code based on Wikipedia example:
- http://www.wikipedia.org/wiki/Flood_fill/C_example
- by Damian Yerrick - http://www.wikipedia.org/wiki/Damian_Yerrick
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- (See COPYING.txt)
-
- Last updated: July 8, 2008
- $Id$
-*/
-
-#include
-#include
-#include "tp_magic_api.h"
-#include "SDL_image.h"
-
-
-/* Our globals: */
-
-static Mix_Chunk *fill_snd;
-static Uint8 fill_r, fill_g, fill_b;
-
-/* Local function prototypes: */
-
-static int colors_close(magic_api * api, SDL_Surface * canvas, Uint32 c1, Uint32 c2);
-static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr);
-int fill_modes(magic_api * api, int which);
-void fill_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas);
-void fill_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas);
-int fill_requires_colors(magic_api * api, int which);
-void fill_set_color(magic_api * api, Uint8 r, Uint8 g, Uint8 b);
-void fill_shutdown(magic_api * api);
-void fill_release(magic_api * api, int which,
- SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect);
-void fill_click(magic_api * api, int which, int mode,
- SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect);
-void fill_drag(magic_api * api, int which, SDL_Surface * canvas,
- SDL_Surface * last, int ox, int oy, int x, int y, SDL_Rect * update_rect);
-char *fill_get_description(magic_api * api, int which, int mode);
-char *fill_get_name(magic_api * api, int which);
-int fill_get_tool_count(magic_api * api);
-SDL_Surface *fill_get_icon(magic_api * api, int which);
-Uint32 fill_api_version(void);
-int fill_init(magic_api * api);
-
-
-// No setup required:
-int fill_init(magic_api * api)
-{
- char fname[1024];
-
- snprintf(fname, sizeof(fname), "%s/sounds/magic/fill.wav", api->data_directory);
- fill_snd = Mix_LoadWAV(fname);
-
- return (1);
-}
-
-Uint32 fill_api_version(void)
-{
- return (TP_MAGIC_API_VERSION);
-}
-
-// We have multiple tools:
-int fill_get_tool_count(magic_api * api ATTRIBUTE_UNUSED)
-{
- return (1);
-}
-
-// Load our icons:
-SDL_Surface *fill_get_icon(magic_api * api, int which ATTRIBUTE_UNUSED)
-{
- char fname[1024];
-
- snprintf(fname, sizeof(fname), "%s/images/magic/fill.png", api->data_directory);
-
- return (IMG_Load(fname));
-}
-
-// Return our names, localized:
-char *fill_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
-{
- return (strdup(gettext_noop("Fill")));
-}
-
-// Return our descriptions, localized:
-char *fill_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED)
-{
- return (strdup(gettext_noop("Click in the picture to fill that area with color.")));
-}
-
-
-// Affect the canvas on drag:
-void fill_drag(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED,
- SDL_Surface * last ATTRIBUTE_UNUSED, int ox ATTRIBUTE_UNUSED, int oy ATTRIBUTE_UNUSED,
- int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED)
-{
-}
-
-// Affect the canvas on click:
-void fill_click(magic_api * api, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
- SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED,
- int x, int y, SDL_Rect * update_rect)
-{
- do_flood_fill(api, canvas, x, y, SDL_MapRGB(canvas->format, fill_r, fill_g, fill_b), api->getpixel(canvas, x, y));
-
- update_rect->x = 0;
- update_rect->y = 0;
- update_rect->w = canvas->w;
- update_rect->h = canvas->h;
-}
-
-void fill_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 fill_shutdown(magic_api * api ATTRIBUTE_UNUSED)
-{
- Mix_FreeChunk(fill_snd);
-}
-
-// Record the color from Tux Paint:
-void fill_set_color(magic_api * api ATTRIBUTE_UNUSED, Uint8 r, Uint8 g, Uint8 b)
-{
- fill_r = r;
- fill_g = g;
- fill_b = b;
-}
-
-// Use colors:
-int fill_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
-{
- return 1;
-}
-
-
-static int colors_close(magic_api * api, SDL_Surface * canvas, Uint32 c1, Uint32 c2)
-{
- Uint8 r1, g1, b1, r2, g2, b2;
-
- if (c1 == c2)
- {
- /* Get it over with quick, if possible! */
-
- return 1;
- }
- else
- {
- double r, g, b;
-
- SDL_GetRGB(c1, canvas->format, &r1, &g1, &b1);
- SDL_GetRGB(c2, canvas->format, &r2, &g2, &b2);
-
- // use distance in linear RGB space
- r = api->sRGB_to_linear(r1) - api->sRGB_to_linear(r2);
- r *= r;
- g = api->sRGB_to_linear(g1) - api->sRGB_to_linear(g2);
- g *= g;
- b = api->sRGB_to_linear(b1) - api->sRGB_to_linear(b2);
- b *= b;
-
- // easy to confuse:
- // dark grey, brown, purple
- // light grey, tan
- // red, orange
- return r + g + b < 0.04;
- }
-}
-
-
-static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr)
-{
- int fillL, fillR, i, in_line;
- static unsigned char prog_anim;
-
-
- if (cur_colr == old_colr || colors_close(api, canvas, cur_colr, old_colr))
- return;
-
-
- fillL = x;
- fillR = x;
-
- prog_anim++;
- if ((prog_anim % 4) == 0)
- {
- api->update_progress_bar();
- api->playsound(fill_snd, (x * 255) / canvas->w, 255);
- }
-
-
- /* Find left side, filling along the way */
-
- in_line = 1;
-
- while (in_line)
- {
- api->putpixel(canvas, fillL, y, cur_colr);
- fillL--;
-
- in_line = (fillL < 0) ? 0 : colors_close(api, canvas, api->getpixel(canvas, fillL, y), old_colr);
- }
-
- fillL++;
-
- /* Find right side, filling along the way */
-
- in_line = 1;
- while (in_line)
- {
- api->putpixel(canvas, fillR, y, cur_colr);
- fillR++;
-
- in_line = (fillR >= canvas->w) ? 0 : colors_close(api, canvas, api->getpixel(canvas, fillR, y), old_colr);
- }
-
- fillR--;
-
-
- /* Search top and bottom */
-
- for (i = fillL; i <= fillR; i++)
- {
- if (y > 0 && colors_close(api, canvas, api->getpixel(canvas, i, y - 1), old_colr))
- do_flood_fill(api, canvas, i, y - 1, cur_colr, old_colr);
-
- if (y < canvas->h && colors_close(api, canvas, api->getpixel(canvas, i, y + 1), old_colr))
- do_flood_fill(api, canvas, i, y + 1, cur_colr, old_colr);
- }
-}
-
-void fill_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
- SDL_Surface * canvas ATTRIBUTE_UNUSED)
-{
-}
-
-void fill_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
- SDL_Surface * canvas ATTRIBUTE_UNUSED)
-{
-}
-
-int fill_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
-{
- return (MODE_PAINT);
-}
diff --git a/src/fill.c b/src/fill.c
new file mode 100644
index 000000000..2fce7d215
--- /dev/null
+++ b/src/fill.c
@@ -0,0 +1,160 @@
+/*
+ fill.c
+
+ Fill tool
+ Tux Paint - A simple drawing program for children.
+
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
+ bill@newbreedsoftware.com
+ http://www.tuxpaint.org/
+
+ Flood fill code based on Wikipedia example:
+ http://www.wikipedia.org/wiki/Flood_fill/C_example
+ by Damian Yerrick - http://www.wikipedia.org/wiki/Damian_Yerrick
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ (See COPYING.txt)
+
+ Last updated: September 12, 2019
+ $Id$
+*/
+
+#include
+#include
+#include "fill.h"
+#include "rgblinear.h"
+#include "playsound.h"
+#include "pixels.h"
+
+
+/* Local function prototypes: */
+
+int colors_close(SDL_Surface * canvas, Uint32 c1, Uint32 c2);
+
+
+int colors_close(SDL_Surface * canvas, Uint32 c1, Uint32 c2)
+{
+ Uint8 r1, g1, b1, r2, g2, b2;
+
+ if (c1 == c2)
+ {
+ /* Get it over with quick, if possible! */
+
+ return 1;
+ }
+ else
+ {
+ double r, g, b;
+
+ SDL_GetRGB(c1, canvas->format, &r1, &g1, &b1);
+ SDL_GetRGB(c2, canvas->format, &r2, &g2, &b2);
+
+ // use distance in linear RGB space
+ r = sRGB_to_linear_table[r1] - sRGB_to_linear_table[r2];
+ r *= r;
+ g = sRGB_to_linear_table[g1] - sRGB_to_linear_table[g2];
+ g *= g;
+ b = sRGB_to_linear_table[b1] - sRGB_to_linear_table[b2];
+ b *= b;
+
+ // easy to confuse:
+ // dark grey, brown, purple
+ // light grey, tan
+ // red, orange
+ return r + g + b < 0.04;
+ }
+}
+
+
+void do_flood_fill(SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr, int * x1, int * y1, int * x2, int * y2)
+{
+ int fillL, fillR, i, in_line;
+ static unsigned char prog_anim;
+
+
+ if (cur_colr == old_colr || colors_close(canvas, cur_colr, old_colr))
+ return;
+
+ if (y < *y1)
+ {
+ *y1 = y;
+ }
+ if (y > *y2)
+ {
+ *y2 = y;
+ }
+
+
+ fillL = x;
+ fillR = x;
+
+ prog_anim++;
+ if ((prog_anim % 4) == 0)
+ {
+ /* FIXME: api->update_progress_bar(); */
+ playsound(canvas, 1, SND_FILL, 1, x, SNDDIST_NEAR);
+ }
+
+
+ /* Find left side, filling along the way */
+
+ in_line = 1;
+
+ while (in_line)
+ {
+ putpixels[canvas->format->BytesPerPixel] (canvas, fillL, y, cur_colr);
+ fillL--;
+
+ in_line = (fillL < 0) ? 0 : colors_close(canvas, getpixels[canvas->format->BytesPerPixel] (canvas, fillL, y), old_colr);
+ }
+
+ if (fillL < *x1)
+ {
+ *x1 = fillL;
+ }
+
+ fillL++;
+
+ /* Find right side, filling along the way */
+
+ in_line = 1;
+ while (in_line)
+ {
+ putpixels[canvas->format->BytesPerPixel] (canvas, fillR, y, cur_colr);
+ fillR++;
+
+ in_line = (fillR >= canvas->w) ? 0 : colors_close(canvas, getpixels[canvas->format->BytesPerPixel] (canvas, fillR, y), old_colr);
+ }
+
+ if (fillR > *x2)
+ {
+ *x2 = fillR;
+ }
+
+ fillR--;
+
+
+ /* Search top and bottom */
+
+ for (i = fillL; i <= fillR; i++)
+ {
+ if (y > 0 && colors_close(canvas, getpixels[canvas->format->BytesPerPixel] (canvas, i, y - 1), old_colr))
+ do_flood_fill(canvas, i, y - 1, cur_colr, old_colr, x1, y1, x2, y2);
+
+ if (y < canvas->h && colors_close(canvas, getpixels[canvas->format->BytesPerPixel] (canvas, i, y + 1), old_colr))
+ do_flood_fill(canvas, i, y + 1, cur_colr, old_colr, x1, y1, x2, y2);
+ }
+}
+
diff --git a/src/fill.h b/src/fill.h
new file mode 100644
index 000000000..2e37a09aa
--- /dev/null
+++ b/src/fill.h
@@ -0,0 +1,37 @@
+/*
+ fill.h
+
+ Fill tool
+ Tux Paint - A simple drawing program for children.
+
+ Copyright (c) 2002-2019 by Bill Kendrick and others; see AUTHORS.txt
+ bill@newbreedsoftware.com
+ http://www.tuxpaint.org/
+
+ Flood fill code based on Wikipedia example:
+ http://www.wikipedia.org/wiki/Flood_fill/C_example
+ by Damian Yerrick - http://www.wikipedia.org/wiki/Damian_Yerrick
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ (See COPYING.txt)
+
+ Last updated: September 12, 2019
+ $Id$
+*/
+
+#include "SDL.h"
+
+void do_flood_fill(SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr, int * x1, int * y1, int * x2, int * y2);
+
diff --git a/src/manpage/tuxpaint.1 b/src/manpage/tuxpaint.1
index 6c1df5f09..0c4a2535a 100644
--- a/src/manpage/tuxpaint.1
+++ b/src/manpage/tuxpaint.1
@@ -1,5 +1,5 @@
-.\" tuxpaint.1 - 2018.09.24
-.TH TUXPAINT 1 "24 September 2018" "0.9.23c" "Tux Paint"
+.\" tuxpaint.1 - 2019.09.12
+.TH TUXPAINT 1 "12 September 2019" "0.9.24" "Tux Paint"
.SH NAME
tuxpaint -- "Tux Paint", a drawing program for young children.
@@ -61,6 +61,8 @@ tuxpaint -- "Tux Paint", a drawing program for young children.
.br
[\-\-nolabel]
.br
+[\-\-newcolorslast]
+.br
[\-\-mirrorstamps]
.br
[\-\-mouse-accessibility]
@@ -187,6 +189,8 @@ tuxpaint -- "Tux Paint", a drawing program for young children.
.br
[\-\-label]
.br
+[\-\-newcolorsfirst]
+.br
[\-\-dontmirrorstamps]
.br
[\-\-stampsize=default]
@@ -408,6 +412,11 @@ controllable.)
Disable or enable (default) the \fILabel\fP tool, which lets you create
text which can be altered or moved later.
+.TP 8
+.B \-\-newcolorslast \-\-newcolorsfirst
+List solid (blank) colors at the end, or beginning (default) of the
+options displayed when using the \fINew\fP tool to start a new picture.
+
.TP 8
.B \-\-mirrorstamps \-\-dontmirrorstamps
With \fImirrorstamps\fP set, stamps which can be mirrored will appear
diff --git a/src/sounds.h b/src/sounds.h
index ed850f74c..bdbde6e2c 100644
--- a/src/sounds.h
+++ b/src/sounds.h
@@ -4,7 +4,7 @@
For Tux Paint
List of sound effects.
- Copyright (c) 2002-2007 by Bill Kendrick and others
+ Copyright (c) 2002-2019 by Bill Kendrick and others
bill@newbreedsoftware.com
http://www.tuxpaint.org/
@@ -23,7 +23,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- June 15, 2002 - July 5, 2007
+ June 15, 2002 - September 12, 2019
$Id$
*/
@@ -67,6 +67,7 @@ enum
SND_TUXOK, /* "Ok" */
SND_THICK,
SND_THIN,
+ SND_FILL,
NUM_SOUNDS
};
@@ -107,7 +108,8 @@ static const char *sound_fnames[NUM_SOUNDS] = {
DATA_PREFIX "sounds/youcannot.wav",
DATA_PREFIX "sounds/tuxok.wav",
DATA_PREFIX "sounds/thick.wav",
- DATA_PREFIX "sounds/thin.wav"
+ DATA_PREFIX "sounds/thin.wav",
+ DATA_PREFIX "sounds/fill.wav"
};
#endif
diff --git a/src/tools.h b/src/tools.h
index 0336e27fc..99d55c1cd 100644
--- a/src/tools.h
+++ b/src/tools.h
@@ -19,11 +19,11 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
- Copyright (c) 2002-2009 by Bill Kendrick
+ Copyright (c) 2002-2019 by Bill Kendrick
bill@newbreedsoftware.com
http://www.tuxpaint.org/
- June 14, 2002 - October 9, 2009
+ June 14, 2002 - September 12, 2019
$Id$
*/
@@ -41,7 +41,7 @@ enum
TOOL_SHAPES,
TOOL_TEXT,
TOOL_LABEL,
- TOOL_NA,
+ TOOL_FILL,
TOOL_MAGIC,
TOOL_UNDO,
TOOL_REDO,
@@ -76,8 +76,8 @@ const char *const tool_names[NUM_TOOLS] = {
// Label tool
gettext_noop("Label"),
- // Reserved...
- " ",
+ // Fill tool
+ gettext_noop("Fill"),
// "Magic" effects tools (blur, flip image, etc.)
gettext_noop("Magic"),
@@ -132,8 +132,8 @@ const char *const tool_tips[NUM_TOOLS] = {
gettext_noop
("Choose a style of text. Click on your drawing and you can start typing. Press [Enter] or [Tab] to complete the text. By using the selector button and clicking an existing label, you can move it, edit it and change its text style."),
- // Reserved...
- " ",
+ // Fill tool instructions
+ gettext_noop("Click in the picture to fill that area with color."),
// Magic tool instruction
gettext_noop("Pick a magical effect to use on your drawing!"),
@@ -185,7 +185,7 @@ const char *const tool_img_fnames[NUM_TOOLS] = {
DATA_PREFIX "images/tools/shapes.png",
DATA_PREFIX "images/tools/text.png",
DATA_PREFIX "images/tools/label.png",
- DATA_PREFIX "images/ui/dead40x40.png",
+ DATA_PREFIX "images/tools/fill.png",
DATA_PREFIX "images/tools/magic.png",
DATA_PREFIX "images/tools/undo.png",
DATA_PREFIX "images/tools/redo.png",
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index 2435b4884..7976db2f6 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -503,6 +503,8 @@ static void mtw(wchar_t * wtok, char *tok)
#include "tip_tux.h"
#include "great.h"
+#include "fill.h"
+
#include "im.h"
@@ -3065,6 +3067,12 @@ static void mainloop(void)
draw_brushes();
draw_colors(COLORSEL_ENABLE);
}
+ else if (cur_tool == TOOL_FILL)
+ {
+ keybd_flag = 0;
+ draw_none();
+ draw_colors(COLORSEL_ENABLE);
+ }
else if (cur_tool == TOOL_SHAPES)
{
keybd_flag = 0;
@@ -4376,6 +4384,24 @@ static void mainloop(void)
if (mouseaccessibility)
emulate_button_pressed = !emulate_button_pressed;
}
+ else if (cur_tool == TOOL_FILL)
+ {
+ int x1, y1, x2, y2;
+
+ /* Fill */
+ x1 = x2 = old_x;
+ y1 = y2 = old_y;
+
+ do_flood_fill(canvas, old_x, old_y,
+ SDL_MapRGB(canvas->format,
+ color_hexes[cur_color][0],
+ color_hexes[cur_color][1],
+ color_hexes[cur_color][2]),
+ getpixels[canvas->format->BytesPerPixel] (canvas, old_x, old_y),
+ &x1, &y1, &x2, &y2);
+
+ update_canvas(x1, y1, x2, y2);
+ }
else if (cur_tool == TOOL_TEXT || cur_tool == TOOL_LABEL)
{
/* Text and Label Tools! */
@@ -4549,7 +4575,8 @@ static void mainloop(void)
if (cur_tool == TOOL_BRUSH || cur_tool == TOOL_STAMP ||
cur_tool == TOOL_SHAPES || cur_tool == TOOL_LINES ||
- cur_tool == TOOL_MAGIC || cur_tool == TOOL_TEXT || cur_tool == TOOL_ERASER || cur_tool == TOOL_LABEL)
+ cur_tool == TOOL_MAGIC || cur_tool == TOOL_TEXT ||
+ cur_tool == TOOL_ERASER || cur_tool == TOOL_LABEL)
{
/* Left tools scroll */
@@ -5151,7 +5178,7 @@ static void mainloop(void)
do_setcursor(cursor_brush);
else if (cur_tool == TOOL_STAMP)
do_setcursor(cursor_tiny);
- else if (cur_tool == TOOL_LINES)
+ else if (cur_tool == TOOL_LINES || cur_tool == TOOL_FILL)
do_setcursor(cursor_crosshair);
else if (cur_tool == TOOL_SHAPES)
{
@@ -5182,7 +5209,6 @@ static void mainloop(void)
do_setcursor(cursor_arrow);
}
}
-
else if (cur_tool == TOOL_MAGIC)
do_setcursor(cursor_wand);
else if (cur_tool == TOOL_ERASER)
@@ -10110,11 +10136,6 @@ static void reset_avail_tools(void)
tool_avail[TOOL_LABEL] = 0;
- /* TBD... */
-
- tool_avail[TOOL_NA] = 0;
-
-
/* Disable save? */
if (disable_save)
From 2117db234ef45448cedcb4b863fc33373f5b4e7c Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Sat, 14 Sep 2019 09:33:22 -0700
Subject: [PATCH 07/20] Generate & install starter thumbnails again
I cannot recall[*] why we disabled the steps to generate thumbnails of
starters (".thumbs/STARTERNAME-t.png") and install them in the system
directory (e.g., /usr/local/share/tuxpaint/starters/.thumbs/),
but every time one goes to create a new image ("New"), it took a very
long time to show.
[*] If anyone remembers ~a decade ago, and has a good reason, let me know!
Also, remove "Makefile" as a prerequisite for some targets; if anything
major changes in there, it's expected one will run "make clean" or
remove the binary/etc. target and rebuild. (Rebuilding "tuxpaint.o"
every time I edited something unrelated in Makefile was really annoying :) )
---
Makefile | 15 ++++++---------
src/tuxpaint.c | 5 ++---
2 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/Makefile b/Makefile
index 75c3300d8..f497ad8e2 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
# Various contributors (see AUTHORS.txt)
# http://www.tuxpaint.org/
-# June 14, 2002 - September 12, 2019
+# June 14, 2002 - September 14, 2019
# The version number, for release:
@@ -285,8 +285,7 @@ MOUSE_CFLAGS:=-Isrc/$(MOUSEDIR) -D$(CURSOR_SHAPES)_CURSOR_SHAPES
# "make" with no arguments builds the program and man page from sources:
#
.PHONY: all
-all: tuxpaint translations magic-plugins tp-magic-config
-# thumb-starters
+all: tuxpaint translations magic-plugins tp-magic-config thumb-starters
@echo
@echo "--------------------------------------------------------------"
@echo
@@ -475,9 +474,8 @@ install: install-bin install-data install-man install-doc \
install-default-config install-example-stamps \
install-example-starters install-example-templates \
install-bash-completion \
- install-osk \
+ install-osk install-thumb-starters \
$(ARCH_INSTALL)
-#install-thumb-starters
@echo
@echo "--------------------------------------------------------------"
@echo
@@ -1056,8 +1054,7 @@ obj/tuxpaint.o: src/tuxpaint.c \
src/$(MOUSEDIR)/watch.xbm src/$(MOUSEDIR)/watch-mask.xbm \
src/$(MOUSEDIR)/up.xbm src/$(MOUSEDIR)/up-mask.xbm \
src/$(MOUSEDIR)/down.xbm src/$(MOUSEDIR)/down-mask.xbm \
- $(ARCH_HEADERS) \
- Makefile
+ $(ARCH_HEADERS)
@echo
@echo "...Compiling Tux Paint from source..."
$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(SDL_CFLAGS) $(FRIBIDI_CFLAGS) $(SVG_CFLAGS) $(MOUSE_CFLAGS) $(DEFS) \
@@ -1170,7 +1167,7 @@ obj/win32_print.o: src/win32_print.c src/win32_print.h src/debug.h
@$(CC) $(CFLAGS) $(DEBUG_FLAGS) $(SDL_CFLAGS) $(DEFS) \
-c src/win32_print.c -o obj/win32_print.o
-obj/postscript_print.o: src/postscript_print.c Makefile \
+obj/postscript_print.o: src/postscript_print.c \
src/postscript_print.h src/debug.h
@echo
@echo "...Compiling PostScript print support..."
@@ -1201,7 +1198,7 @@ src/tp_magic_api.h: src/tp_magic_api.h.in
@(echo "/*\n\n\n\n\n\n\n\nDO NOT EDIT ME!\n\n\n\n\n\n\n\n*/" ; cat src/tp_magic_api.h.in) | sed -e s/__APIVERSION__/$(MAGIC_API_VERSION)/ > src/tp_magic_api.h
-tp-magic-config: src/tp-magic-config.sh.in Makefile
+tp-magic-config: src/tp-magic-config.sh.in
@echo
@echo "...Generating 'Magic' tool API configuration script..."
@sed -e s/__VERSION__/$(VER_VERSION)/ \
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index 7976db2f6..75f338763 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -18777,7 +18777,8 @@ static int do_new_dialog(void)
/* Support legacy BMP files for load: */
|| strcasestr(f->d_name, ".bmp") != NULL
/* Support for KPX (Kid Pix templates; just a JPEG with resource fork header): */
- || strcasestr(f->d_name, ".kpx") != NULL || strcasestr(f->d_name, ".jpg") != NULL
+ || strcasestr(f->d_name, ".kpx") != NULL
+ || strcasestr(f->d_name, ".jpg") != NULL
#ifndef NOSVG
|| strcasestr(f->d_name, ".svg") != NULL
#endif
@@ -18916,8 +18917,6 @@ static int do_new_dialog(void)
If it exists, it should give a better idea of what the
starter looks like, compared to the overlay image... */
- /* FIXME: Add .jpg support -bjk 2007.03.22 */
-
/* (Try JPEG first) */
snprintf(fname, sizeof(fname), "%s/%s-back",
dirname[d_places[num_files]], d_names[num_files]);
From 73dc07b608a0ae82e291e800620c46411ff19717 Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Sat, 14 Sep 2019 10:11:05 -0700
Subject: [PATCH 08/20] Way better scaling of Starter thumbnails
Providing better command-line args to ImageMagick `convert` to
produce nice-looking thumbnail PNGs of Starter images.
(N.B. - I'm using "ImageMagick" Version: 8:6.9.7.4+dfsg-16ubuntu6.7)
---
Makefile | 6 ++++--
docs/CHANGES.txt | 5 ++++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
index f497ad8e2..344e354e0 100644
--- a/Makefile
+++ b/Makefile
@@ -694,16 +694,18 @@ STARTER_BACK_NAME=$(or $(wildcard $(subst starters/.thumbs,starters,$(@:-t.png=-
$(wildcard $(subst starters/.thumbs,starters,$(@:-t.png=-back.png))),\
$(wildcard $(subst starters/.thumbs,starters,$(@:-t.png=-back.jpeg))))
+CONVERT_OPTS:=-alpha Background -alpha Off -gamma 0.454545 +depth -resize !132x80 -background white -interlace none
+
$(THUMB_STARTERS):
@echo -n "."
@mkdir -p starters/.thumbs
@if [ "x" != "x"$(STARTER_BACK_NAME) ] ; \
then \
composite $(STARTER_NAME) $(STARTER_BACK_NAME) obj/tmp.png ; \
- convert -scale !132x80 -background white -alpha Background -alpha Off obj/tmp.png $@ ; \
+ convert $(CONVERT_OPTS) obj/tmp.png $@ ; \
rm obj/tmp.png ; \
else \
- convert -scale !132x80 -background white -alpha Background -alpha Off $(STARTER_NAME) $@ ; \
+ convert $(CONVERT_OPTS) $(STARTER_NAME) $@ ; \
fi
$(INSTALLED_THUMB_STARTERS): $(DATA_PREFIX)/%: %
diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt
index bf18dc769..b125790a8 100644
--- a/docs/CHANGES.txt
+++ b/docs/CHANGES.txt
@@ -8,7 +8,7 @@ http://www.tuxpaint.org/
$Id$
-2019.Sep.12 (0.9.24)
+2019.Sep.14 (0.9.24)
* New tools
---------
* Fill
@@ -55,6 +55,9 @@ $Id$
* Updated most parts of the code that were throwing warnings in GCC.
+ * Build process generates thumbnails of included Starter images.
+ When installed, this greatly increases the speed of the "New" dialog.
+
* Documentation updates
---------------------
* Mended link to MinGW/MSYS instructions at John Popplewell's website.
From 2eebe7347fa238eac7c3ded90d4932d36dc1ec80 Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Sat, 14 Sep 2019 10:14:45 -0700
Subject: [PATCH 09/20] Rename Jigsaw* Starters to jigsaw*
Using lowercase filenames in these parts, for consistency.
(Err, except "Makefile")
---
starters/{Jigsaw_3x3.png => jigsaw_3x3.png} | Bin
starters/{Jigsaw_5x5.png => jigsaw_5x5.png} | Bin
2 files changed, 0 insertions(+), 0 deletions(-)
rename starters/{Jigsaw_3x3.png => jigsaw_3x3.png} (100%)
rename starters/{Jigsaw_5x5.png => jigsaw_5x5.png} (100%)
diff --git a/starters/Jigsaw_3x3.png b/starters/jigsaw_3x3.png
similarity index 100%
rename from starters/Jigsaw_3x3.png
rename to starters/jigsaw_3x3.png
diff --git a/starters/Jigsaw_5x5.png b/starters/jigsaw_5x5.png
similarity index 100%
rename from starters/Jigsaw_5x5.png
rename to starters/jigsaw_5x5.png
From dd8b60a6fb0fa5f69be0211b95fd2e78971156bc Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Sat, 14 Sep 2019 10:15:45 -0700
Subject: [PATCH 10/20] Adding '.thumbs' dirs to .gitignore
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index 3f829341b..e555a90e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,4 @@ TuxPaint.dmg
*.dylib
*.dylib.dSYM
.DS_Store
+*.thumbs
From 98a1002356805a5e342a95f06e5c1e352e0e9ab0 Mon Sep 17 00:00:00 2001
From: Bill Kendrick
Date: Sat, 14 Sep 2019 10:21:44 -0700
Subject: [PATCH 11/20] Resaved some starters to make `convert` happy
---
starters/frame_gold.png | Bin 15112 -> 48403 bytes
starters/frame_picture.png | Bin 3937 -> 5340 bytes
starters/frame_television.png | Bin 10109 -> 18815 bytes
starters/jigsaw_3x3.png | Bin 3578 -> 6279 bytes
starters/jigsaw_5x5.png | Bin 3177 -> 7727 bytes
starters/rocket.png | Bin 1968 -> 2693 bytes
starters/shipwreck.png | Bin 27658 -> 35930 bytes
7 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/starters/frame_gold.png b/starters/frame_gold.png
index 7ae3d00bd8bdd5c9ea5643769d4f38748addeb48..e1f267103ab54f3e5961a41f2ade13dcb7a5b9cd 100644
GIT binary patch
literal 48403
zcmZU)2S5|+)-@b@fB*q0ksgYG(xplZp`!?*D7}O9-a8VSR1pE`AfQsEBOR$q2kBBH
z0@9`TZ^H51d*A=h$;reaGtbOZ_F8-GHIW(*l}Lzai9jF_iHfqkCJ2PX3<6=BgYkhq
zYXb@ezy{y+zLGrX3iDrf)BD%J9zrK&9aj)Y=nV5e7J~>e9FN8!K%@d}{9(C!H}l
zJ9|~^t8RAn#W!5N*s=IP@BVrCl~@!r3+6Tbij#%clJRQLsP=^F@!@QJgAP|JYeRKY^AkLpHwHJKSy$gD!eb)!&&iEgU
z!7n!kuc$va`3Im?K__cfT{0){ukc3N=qC3`%5Ghs#h|E!FWdZu%-P=6&xe75w(>Wb
zu4scgI>TF*sMs-Q$}M@hR?GhtD^F$nTzq2S)#N^u!0{4S#(yvH&$sI<84hzfW%x6k
z%yi)`y8VKkeePm|Y2jzX6`hR#mEI)V@|#>9Dx}Uj_pOot=lbJyG3RA
zji>UMS6NS+w(R{#G7b{c#(9U&O#Y-jj#vEM&$n;<{M?b8<*Gt`-BI`7+@i<|OjC`Elnns)2#e+))w0Yn8oRacOoJe6@FVd6p4i
zaPcuqo6-QAmh5qKcse2c`ewL(kFb8N$+Em$z5fYwOvLK4&FsOV8I2I1z;(Z#K*{A$
z!@p(Me|Y2nY<|pB_9%0uxQ+I|@7+F|M#YjnC=#(ggO;s(&b>fUOt62zbb&MOWg#4J
z*?mQ8`w9P_w~=j@cgzG#I{In+QfwAIYPS2OHw|G$yk!HqU+8_XD>0u
z)EMB?l4RWY`n_PgdADRY6$KWfVf6btW9
zn@zgWdEkF8%NkOxTckTPl$<{&bf{Uh3hEQx;SswI(QBX`9@%b#d7D{CHDl-Wy~V
zb5WR+*V?uyfr2?X9h1uVy<70qM+s|(VBUs?B+cVn&tfK6ya>!7NN`qF`tRn6ivg^k
zb7vR4*b&gBPSGkR#@HMb(v4A-lb$iwIY8PZhDIN~x(cG881`0Hre|PS*xyh8dqVAy
zvg*MPT}5CfIKuWKZ*lWc?IINt0mk~swnQ9Td~#eA6aOZz<%{_r;HF;Kn!hU(wE;fh
zp678afBUnsk=Czdwv3ifC7K)=5wieC1!?~N%7K&llRh4e_T>C^$`m0r2mjk$_`-%1+ft^{8ilsJo&yIHHXMuS
z%m!mA70_F?!QCjCQ_)9>Hy%6;44EqS5)eJ#*?|T%y1BBGl94%kcy!V7ed@CE``$9@
zbaFKKQ2n3I13r&+&mcC9i3`J3q@eg))JU+`wn_9<5p{$FLA*g}iVbb}cFRf2PAA_b
zIsQAd?_-psmGfrz#M@lS%5R-P1Wrp@`1p9W(Rky^e>Q~^&hPf@-TgZ?jDdlX4xt^C
z_7YN)p))TDO*Akb)!ml#lhnO&TH0@kCw;y{*Lbm!{7IyHw?U?@ZI{oBY}m(AK{EjHS=Ca>LWNz(F^A4e5f|IaNnbPH$RS;78Yps-W4
zZFHL?pRy`xM|x}dmwH?c@wf=h`+4U6F4#|k2mz#O%sbJn#f2S)UzK;CR60JIIH>fd
zFb_e;xJTGOZl5$q53Y=60rxYe{3p$p?L;8`EckyWhOa(a2S2WUj<&IQ_|wzvgVM@V
zuBdL9^C?Cc`_XyRT84(P-APrTxN`iW3jRmllUa_gvHvb8u)l|*1KK**v`|ljv{bK{P-eMz30LP_NaNj%P
zWWx{H(D9Q|ug5J?uTa49K9wSkowM(I!F|=Dm&yKWSxLE4?ul0Lkl$p{LBL4kRGnf@
z20}G*=pod;e)lNv?3J(~g2W_t`-xnNSrMlf4+erJzSR?)6I;1?9i>`7wzZg&3F2DHHDBCcV6YY2FYheE2AuyizB)(4jQ_
zb53>GIIWge33kdzPsPvS0r}6{!Am}6y!$8H+4GmQ$ije=H%01?9;!3%V?{IUt5^3jTd3Ax`AsXrSkjny|u@;L3K61)%^*AYPfRxZ|BpcwKb#)XS&DOnbmC7&`$r{
zDK-BmP{uqn0>aAK6EnW&lE2trR@75S=8eGOT(oU>7u(mmvSO4@Do>>kq@`dh^e?}*
z$V*>(GYO8g`97(XVXh|@+QLR!Ky8LX$%-GkQu^R>xiX6&I2lDFdf=Zt1UZmcT+3Z$
zSPi>J`F1*J@d*tk9XS%XT>oDzC~LwuvOOy5Vr(KeqQtv3x-`A;%EBP9yR*~HtbkQ*
zlt6qP-PIkXl#1nD>{!TsAE6e%{I0p+;ru(Ez*P#z4^TP06>jFo$`+z?B|$?$v~tH&
zzg{0Mju7OH(2a&fsAUZ_%-e|+5ay474gEXNW-(1g@a68YcnaCS=+aeG);2LMRanlH
z)Mj?U9k;w^E6K>xTQOFwKI2izdVlc4?)hu%9y6P7OgS;3ngudU@~f<^SvZpqn&D4^
zs%%?Yyhc=rJCv+6Y0~sEI)^;qt1dyrJk0&mmA5x7ZT}MoFkjHSwj04y`}D8BZm90S
zV(?)Q{Gx4dfjfe42ShBD@x8~hye?UAl)XCmZ<@(VU6HQs6pi5sQ}Y%etU&OFIEz(n
ze3Bd*QTF|{&u6}5HxX_v!unU*HRnOh_d1wGrMCwNGyW3}Fkd|M(2;nx+Ad=<9+4rt
zppeD3Uq`eI%sholerBTFCBncGQu(4(x1uWAR3_T#8&`9Vb_%>R#jVHd_vec
z1(b_F7Gxyb)nD@uaI)9KDGVCc}>YY{aGhViFmI_^j0SrgfAzO!#QE5rta
zj(-aa
zLb1sypyE(k)WT_5&N<`@y;LjflZeu3zdyZhX31eNvx$ZZ>J*gV|Lrw%;mod|`|o1}
zHrm=gFum(qfamFu?8vz<_r(DtrTUS>UNY`aD80Ow9+*4;yT|VhMD$eZ>8Sn1L(nhq
zhrr+O3#Mzr9tkJTT|Bigv|=u{kEF)=IZYPixoN4L;Ni+-JMI-AoQLPv}A1WK9GvD;XD)BtCCw>Dz9(%2Vx{30tJS8>>
zgI!F&=9&4?4TKyclDEutYqPdJ|I#81i}8JmF3(6m|FpY4ILE|?e2s#V&sB34%zKcm
zBtJccnK`++1tlAAld?3P$kr*ug*R3~iX_OT>Td?!%;wJS;=hIU1?uiS97tw=g0sK6
zo*^w;{nSdY{2q6==V&mJvtyOquktYN4Qf0|*ifFNTKAWy8Ogsvrx>&1i+58Br#i)u0Btie+w{4d
zuK53~O(59nqRCMUJEQ6xbS<98hshweZ)@9_X!~XX{-$fO4Qd@wccOSs>~s_YK03%$
zC2mE23tC-qav1ZPtKl)-Lo13!3YdzdnS3D1o7(b#@_V2P^e;lFrd@mNqK7gaC3B(~
z{QsQFk587-irmcQlKG+AeoO9uLC!j++sXM)EnVEv@iDkus;zcDbKh(t!0Hab$-0&I
zL}v@LV&rO!@Gk_LNv4DuKSC61gR-)%pH{LY<0u126(!R;DHANvFvTOQN@xa2El4A^
zo1u0$aM;+jD`|QrH9pxwJFffP-QPZjO=WA$wc~HV=c~j7{P$gQcV6Bc7!awQm6FJE
zNMA1}m&DKFdl5b}vp~Kz^>!DD-80?)m>St4XTys0jV(-vqdt)%kswn@O8O;!ch*Hl
z=S`L)jy?h8f!fu&%V~cXtvG<@22sL?pA=6B{^w4m(X?c@@Y64k(~5AsTD-lM(%uP-
zEGAz#ln(kQ7d@jvJmu1q%ilI0@w8eee$vVHyM8u>kgJ!r^CuaM@xp~ec(2V19d3#a
zmjnL{*=>4Hpku~lTP)mDG8V7N!t^6h?e@RK`a6bLC)1Kycw7=Z(Q;R-ND#Y6Z{oBg
zocBFqSSD>@*NcE$dX()J3X#A7@1M`MzWse~n?H@ppkBV?>l)z`m*}>g%b8Rau2&W}
zEi0$q$k367OH5rR3m+EYgYu@Jm1`&Cf&6bY{}V}oGzGtGrQz2!{(Ruo#kh=wB)ys2
zJ~5|-VP|wV2SI!?vzlw(RF<*VWNxOXUWWL}&Zy@V_Sdq@%ZKA+zxQ1`)>J3cC|C{EJ>Gv5h8H!6fauE&|=5y4OZS&K}@LlDJvu{
zXzHg@dX`@lQ_Bgl-$7B}#hj5ZzhvtP0oKY>H96h;kT3#?Gb|Gfxg+Zmdq$*Id8*W<
z8v|q#Q?5yW*Tlbxk^wo=Sh}G#{Ph@Qx~&aN(B1Mv&4oGaj^38EsQwH0EW6w6q_NGd
zZNq~={5J)de%moaZp4w#2#J!TlgH`fE8q6vw2V?UbD%XW(8&(Z@7LQR0Zr?HP@U_9
zOdD-624sboO_|%@;^r^ep*US=I4MA>tdm-P-;7fyW#*f;@`DggU9?j;mjxRC*-aJ`
zKQTd1P)IQDRCF1R!5IBwUz5$-ou~fKY91`=;&@##V@cKeHGCc$6mY2&NCqTNrqP1|
zUFfga%8)XSa>9IQQ@Bu8(x8i!qAAI@3dJOLiHuT!@)p1P4X+St^D{K%@A2^IVgGkF
z{rD$M%Sw?3;mRwc7P2>?Eyo8ky60295XPg7udlKv!%3N`58~BqH{;H~F8Key)Q)49?jIAxQhiBo@?oNX(rm
z3t?3KA%$wZ`n@gVc;GK$R+Oq+KlD-JW7z!fU9~UY|0w&AS
zagqNS4$K$Eaa%Hmh7Qo5avE+ACTSl-2q0VJJ`=*vQzB&!rnyi(J^=V
zd#HQzDMvi*aoT+U$!k^My!+UYaEkWe&g}ph?;TyZnAe0y8%w>`=_(;g999fg&qCwrDLaqHE(Uhw3T}H^dg)CWSva~TU
z7AW=?-POrPXGV8}FSV}BluiQ&T+W~8>}`=hTyBIaGt1K`L+ZIcF5GFQnXQ^g($Lf*
zd6|psAT*7DY8uBsSFRLz-~+%6NatStC<%=I9D8)MrERsJY4818p!2N;s}JxVxHzq}
z7$raMdro6jbmPe~?q2RjcN}(6`Ff3WVKrB_i}D*o8}S{z?w%PO^(Yt}3Oe+3)=S5h
zq=)_+B%bZ26W0b99&ai4a|#x3v@|=2i(J=u`Z#f!zWI{y^;d|+$*JVbJ`R%^!>r3QPTb>y^A9^%pz#9bkzzWITZ9z0TiU$LsLs0Y4O>^9+3TK$u{k8D
zMt^z+Ir(+l@9u%G%iZ+SH1-th{LisItsEdVv+p-{s_?}kCvB4H0nUs<-7
zG(5I8%c)k3#_519HW~F97W1^doFIsRv6@;vi&@PHJt`9NHqai@W$6`Ec8y?TfHOtY
z#QZLr#ZR)`-l9c-jQKBbPFuc=dfgKIh%m4RGrbQ{6*nt}X*5L6RtKrR8S_gbrN!jI
zMra0XKp*bo_)x?Ju$>C-+UDKa8XlA@)RdG1H&GKhvVZ@Rlb%t<5L8nROkBd9C^$Qz
zT}oYF5Z?M3UrRisXzNr5)BJb6T
zc%C?_90z7rs?QI{O%#mR#8EyodJ0qmSmsBP0gd}~FS*@>;mnHg7-gr&hmE;K|*>zP%WIB?IooI^sh
zs@cs~r;ImQ!k+s;O=f%^+`0=E2-lqLtQ`L`3DGdKDxqmZ+XO`*%QA2%93D6r6g~jG
zl}n=>*9CtR@wvZ+en_aHdYOn>o=t*XFf0EcsAANcdyHzMt<_Xeq7DrsnI!$KL!v2y
z*Xvy+1HuM%yEm%TA`7gkiz1gY&QuvkfjG{z7+h;lyh5Ls{!RxMx5U2XZqSojDSg5o
zhu^B-%msW|L_Hay5FE_p+s8$rs?&G?P0DMYCG2$EBV;+HQKpXniBsv?bCIO0Sx=uV
zCjDsg0pa)&_xI91<+^mW&C(B*5kD{b6pwPYq#AZL+WJ_R?3RYVOIF1L-MN}`lV|6b
zvYhP3teIX7y*$@5|K2tnZQcpp;$t0$V#?Vr0qQ}xlVlO7!oP!Q+@WXs-e-=~spG^s
z7+x?MC-iDD(B^~>8|Z*xoU@}V=lbMD^yw3pV9xTndB5bTS4woT^LO{1q(*Mcg2?gs
z7%@L&^?JI9rmAxV5x$~Xhf^>E`^blFbG->OzhBiaA6=#=hhhf${pEeb7qg$YJ8*G&
zq-I_5f6mYS@x3A~yN&rhPS0FyAcHR=^AJDiZ%M#|5iz;$)bDQM3b{UG#^#tT%9G{i
zm@6VlFOjfQ0t0{YgEKDcv&)mUS$8MnO1$1R8u3o9GeY4VOtbc~p0mCu7i--Ya
zw8VOuHFB`+Rba+eqH;FU>G3hF;qkBqb`Sk@-ly>`w*nLv3b?z7EfFV(RVsdINstC}
z7_GCoAr&@VxSf$47|WhJh!RQPN)!yGPj>}UAbV9IwRTX2lpW_!Z&GVglMPT;O6SKo
z6SUV!3C`u}kotYBsKFV-Zr`}oUlGn>^${sJL%MSRSxhHCw?lZCF*i}AHdFKODlt&j
zMnx=lyF5kPjA&n8x^%|LN6$Pvva&aMfDI43@T#}htLmrEky3g@X+>LGxqat{E7fEM
zj&fbM*;7qpAzDB|9{LI&u>QTaHIQ)&f)Ha`zQ_ign9niqy@B8-JSW<@@mL8N8VlD=&Q{y2;R;Poc@%m0!5-Ifu7>F%7F%fYipl3#H`0
zEt_B-BrTs>puB-D22Gzply#CgdnsDgd$&nLB-_0tQB{tw3dHRa96y7JRPKQiiq!)K
zgq=2BPR2|L$9d`*D)f(z0Dbg_VrnCAdHzR*|FRmSa&_wMhSEXQ-Rr4XrkddH-ysk%
zTuqJ}SD2c^T>$RqDl9}8)arGAbT>do6dKLGtKRbT3mx*DZqri6fph158tOvYHt6!O
z{TweNHwzdaf@eiX_tp|9m|Qx*p2l9C=Rj6OeThE2PR*s`EHx?Vc&s_zgj9`3-O8XurZyZn
za#Q3&sddvX`M(6D-7TM~p~=KSV&=6c{EcGjFECsoTInLTY_8gN6Tg-(^3NPAuaEQ#
zqiT9?&o{G2yK9D7sI4X?Fkarq_*Vt^cnznXM4keGHc-tHd-npybIN_*Y{4L436T$T
zgi(BiMIxK9eW2>$T`tT#xnq{WtdL5@m3X3ZM>e!ZCQia`0L
zhU4HvF*iO9hXbG@dG+pUJJT*;-)d&Z<>RnN&a&`zL4VpCbX_QBF$H;>rr*RIkUPOv
zcjhmR)8mg5VgAowfnO0y?)dtG79rqkh}gmb6HHIw-ZiAg9O0vo>y>Bl>5xxUYIeK<
z(+%=*xiV*4%hA3^m-J9Bi$L0YsIWu|IBJaipx6JETqq|S3mY?cB0kFN*fH)eQnc*m
z8D)gUc8YmkEZFB@y*)%5lQYPF06p26lQ~5ci2gPQs9_re33x9fN0Dcj0w%FcqiwCD`#!
zhc-)BgrFj4es(q9cbLjOM1m#s#Xqp*ai=Sy{`RA1uC3||`Z(KCDCk9aq6@inDMKh<
zGpq*x1{ZtP0JA(Pe9n}a4Tz-nw(_3A^{MZ;*PCc7rKceg)zko?{l*AaQHly~sS~#A
zSY1qCFUUhy))OMjG?z?u3yE)$YCpJdf95kFE~FL$d!J&^aalfP4$h!w=~en9vZ8(s
z-~NeRTAWc_`u?#6nK{;}4wF9jC!xswP5f5VH7&Q*WHX+w+S$@70F8kOyk5dX&~+=S
z{P2;?+}4XB%4YF)w|h!jqDMqeeQ6L$CahmcjYma$2+TMwf}l{5Bu)DP9
zv6=2)z)q&IE?J^GI$@s+u~ATsdsybA_L{KQ2u}Zx1<0hhc(SheW7_S&TZ{ft03JTh
z$mQh&5bdmWe+b|=itn%#39{M>X6;^--wX=!>ZL7RVEATAgu2;SBwFxZ`VEw*%L>~
zlScWOn%O$7IZ1~%nqLagyxdmAT+5qM1GQjy>jYk6VQ_qFwVe40SaUi}E~p&F)T}fU
ztwH^mZA!d=M#lJF#^Lpsphbt)$14pl>VIjL-5o{7K)W}|0isv=zKD`~|=LPO?
zZec63UsniuSeY7D-;RdNVQ~g)v^CTl&AE?~JXJO3hqba1d|HG5X@gDY6@3(h)7WlH
zZ`NPOkluKb*!X3Fh}{X`lB&l{MHcDp{eue&Yf2Lc;n}==%pJI!rYcWGeP3Y%dCTm_
zW+)NTM%fImCAwZNZP~O%;e0k*`2`y*HFxZ2Mn&1gEofD8A}M*>Sky2>K%rK
zZh!?0aAO?K4D4Nia`J-;Z8A^cMCE+)7maSD%5~0R@?3ZyxtYUU;Q5pkAEx8P-ReFX<~+q?AX
zSf3q1uOQbfM!tcJSzyNo1103cO{*(sL(BQBzq1sLd0BxT$PH&<`}CaHVar#tyAsT-
z`Fl&=&E#3myLkfd&wMT+;7CpYJF2Kb-`nRwTQ9DgJ)&4>A~3BK>6(??CKcT5ZpBDN
zNN|7Uxx+R+f^j_~phP&jA4oxO&xFQx#^_}3!)l~bV4%8AoQxcMR+L6iRZw3}b!fH6
zkvh#UGR!cXf(OLKCO|nLWC-kH39)%F{YAm&s?y3
z+EFBt+`ZWwScwD1_R|@cb<{$oGKQCjubJhXz@@U$kA(zsLG@4;SI)bL1XAPZ&l5+j
zH?Q%zp3Cn07=3dFP7Y$!trBp~fZ^0R$R9$v23>J?0$ET&0mArg#ddQK<+U|77x&1}+F%d9}XA|Wm0dMLU{`^Yu4?k09p?yLa(b?)qr
ziJ9$!cI@+Hvmec4#-G2vN9+_imp!3XHSlLOP#%kUz6?Y9#fl=c?Pqv#$2d59#Vsqb
zy}pPJGu;XTM@rrop#L?r=KC{5pu&7;K4q*}aWa)+rbcm}9r`jRtwvnfz517ns%iul
z3JQh;Nkl#6YWj@s_LAvK7>C%!M_);6n^!AxtNT1aP_q{4a&Jrg%YxOT$+g5~1+rST
zm^3KwKG70wD2LE$n%YiksLHNE;@5JQ5r=4WKzgG+!L-G^YkGS%`Q}o;TMs?bg8x>q
z$TL0CXcg)^F>^~^yNbR#gEVm$N&xr(hKjS&+M^!~&jR}tnxlrTf_Br4OvUcWCy<`v
z(#SQIzhd(WuMm^7;_%m)gfKGQM{?nn@C3md9dq;}3nXXf$?
ztZV$Zn%|;9nhN#t)5c^cc=r4uk5;KMBFKM5Hjlll7ARn#hgJSN&2{TGDhM|1!1a`q
zTJ+Z3kot%UMTq1ed{YkqDIJj)BL&2W3A(hY+ipVoIy!q3Ci1o630cRVJd`hJTDDN%nY8DS01aT
zGiPP?n`?TtWecPnHE&s}ZhUudI#6@MC`CLkLJ+784=1YR@YUWDuLhaB_3Jluwt1$y
z#KQ}C7g7nQeO^u#2f3Egv3B!9{Z)_awzulynu(K+7)RIWO`jqnm@x7<46rkN5U5h2
z=`ASLRD~->LiYjI{iRUcf98f6xgY8q^LIez@;Q(tuPsSJ{p~AeGR1^Y-=Qp_!}zKBg>Nm~|9Hj%Zujd0Ah)|9RwjC)fiY=>VhalcBhFxs+jp4JsEzNAEnR^jKpqzk;ZlC$_
z=q8B>4KS8159%8LC|r1O%B1kp4j4JI?%s|O<3NQNyC63y2kHU*O{l=v_8*|XaMJS$
zpv^BFgEUG==^EX74u3K0AXN$B5L6GA^6Khh69F=K_5OGF3vLf9|39DvHhk+;92@&J0NV~
zj@U{)l{AtYsc>{P5$9RU*Pfs$$A!b?3dsF9P6Ijisz9Me3$L)ydlpOHHfE7OTqVwU
z1FVuNtNNK-1X|0$$Fz`+V_KQIwmQ1V0w;W^V2lV3
z$Fny7*3;syu}|gc2`=`dY8;^sx2@eP#|sKXO6v^IGpbrX&iVFeVC6In&DgxLh~(!Z
zM;`%<7Zxfxn6n`OfQU{2$bREsBJ{>TVoHK1&$lJ)PCxAV^lVO|s*>%Hu*6APG2q&|
zK!OD3MEOr-L^iv>4jVAU5D;V|qsi57Oq}MqT8&oI>ko*iasj~Bu>(T-#SFrSPwRg=Mq!k{$Y?8iWWDGj@Mk;oDqcqX7`YDs}(|w^c<0y>=F?6
z^{WxOJ$$tP9|YlG<6^fv#P5nd)j|}-#cgjK&au{uo2KXR);kxe#KmI(+av!yZy1Trr10PA~DH8pw{D&iX@M9116Hc{&M
zT9uWl84uqPuu0Oo>SLjPzjIWs%_~xX@Bn4VXP%;~T>%NaF{FPWD)(Nf#JwU5QyzJA
zloENM%xyAh>;QcNHs2XSnWCcy>NQ7tXzn&(!jHnxKbV65^I
zW{XPQg6h@ny3*O~b^jU-RXJ7v{8#>IK=wbuZtDBu#4k2?HOa|6>h%{62CiMelGLD?
zB>cNR6iO5I^A_M3NxX^p4F`ak_p`2p1ob<^2JN(!pkiA0PX~L|H9@ohbc%ez?W;pnkL%0D>h-r)X@#f#>&+vrjIJv
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