Began grouping stamps (show one directory tree at a time). INCOMPLETE.

This commit is contained in:
William Kendrick 2007-05-03 16:28:27 +00:00
parent dc15cbdcb1
commit f370445e02
2 changed files with 174 additions and 111 deletions

View file

@ -25,6 +25,9 @@ $Id$
(Experimental; build with "make nosvg" to disable SVG support and
Cairo dependency.)
* Stamps now shown in groups.
FIXME: Finish!
* Bilinear interpolation (smoothing) is done to small bitmap (PNG)
stamps when they are scaled up.
(Based on example code by Christian Graus:

View file

@ -162,11 +162,11 @@ static scaleparams scaletable[] = {
#define HARD_MIN_STAMP_SIZE 0 // bottom of scaletable
#define HARD_MAX_STAMP_SIZE (sizeof scaletable / sizeof scaletable[0] - 1)
#define MIN_STAMP_SIZE (stamp_data[cur_stamp]->min)
#define MAX_STAMP_SIZE (stamp_data[cur_stamp]->max)
#define MIN_STAMP_SIZE (stamp_data[stamp_group][cur_stamp[stamp_group]]->min)
#define MAX_STAMP_SIZE (stamp_data[stamp_group][cur_stamp[stamp_group]]->max)
// to scale some offset, in pixels, like the current stamp is scaled
#define SCALE_LIKE_STAMP(x) ( ((x) * scaletable[stamp_data[cur_stamp]->size].numer + scaletable[stamp_data[cur_stamp]->size].denom-1) / scaletable[stamp_data[cur_stamp]->size].denom )
#define SCALE_LIKE_STAMP(x) ( ((x) * scaletable[stamp_data[stamp_group][cur_stamp[stamp_group]]->size].numer + scaletable[stamp_data[stamp_group][cur_stamp[stamp_group]]->size].denom-1) / scaletable[stamp_data[stamp_group][cur_stamp[stamp_group]]->size].denom )
// pixel dimensions of the current stamp, as scaled
#define CUR_STAMP_W SCALE_LIKE_STAMP(active_stamp->w)
#define CUR_STAMP_H SCALE_LIKE_STAMP(active_stamp->h)
@ -965,22 +965,30 @@ typedef struct stamp_type
unsigned max:5;
} stamp_type;
static int num_stamps;
static int max_stamps;
static stamp_type **stamp_data;
#define MAX_STAMP_GROUPS 256
static unsigned int stamp_group_dir_depth = 1; // How deep (how many slashes in a subdirectory path) we think a new stamp group should be
static int stamp_group = 0;
const char *load_stamp_basedir;
static int num_stamp_groups = 0;
static int num_stamps[MAX_STAMP_GROUPS];
static int max_stamps[MAX_STAMP_GROUPS];
static stamp_type **stamp_data[MAX_STAMP_GROUPS];
static SDL_Surface *active_stamp;
/* Returns whether a particular stamp can be colored: */
static int stamp_colorable(int stamp)
{
return stamp_data[stamp]->colorable;
return stamp_data[stamp_group][stamp]->colorable;
}
/* Returns whether a particular stamp can be tinted: */
static int stamp_tintable(int stamp)
{
return stamp_data[stamp]->tintable;
return stamp_data[stamp_group][stamp]->tintable;
}
@ -1035,14 +1043,19 @@ static int brush_counter, rainbow_color, brush_frame;
#define ERASER_MAX 128
static unsigned cur_color;
static int cur_tool, cur_brush, cur_stamp, cur_shape, cur_magic;
static int cur_tool, cur_brush;
static int cur_stamp[MAX_STAMP_GROUPS];
static int cur_shape, cur_magic;
static int cur_font, cur_eraser;
static int cursor_left, cursor_x, cursor_y, cursor_textwidth; // canvas-relative
static int been_saved;
static char file_id[32];
static char starter_id[32];
static int brush_scroll, stamp_scroll, font_scroll, magic_scroll;
static int brush_scroll;
static int stamp_scroll[MAX_STAMP_GROUPS];
static int font_scroll, magic_scroll;
static int eraser_scroll, shape_scroll; // dummy variables for now
static int eraser_sound;
@ -1373,6 +1386,7 @@ int main(int argc, char *argv[])
CLOCK_TYPE time2;
SDL_Rect dest;
SDL_Rect src;
int i;
CLOCK_ASM(time1);
@ -1445,7 +1459,8 @@ int main(int argc, char *argv[])
cur_color = COLOR_BLACK;
colors_are_selectable = 1;
cur_brush = 0;
cur_stamp = 0;
for (i = 0; i < MAX_STAMP_GROUPS; i++)
cur_stamp[i] = 0;
cur_shape = SHAPE_SQUARE;
cur_magic = 0;
cur_font = 0;
@ -1471,7 +1486,9 @@ int main(int argc, char *argv[])
render_sparkles();
brush_scroll = 0;
stamp_scroll = 0;
for (i = 0; i < MAX_STAMP_GROUPS; i++)
stamp_scroll[i] = 0;
stamp_group = 0; // reset!
font_scroll = 0;
magic_scroll = 0;
@ -2014,12 +2031,12 @@ static void mainloop(void)
}
else if (cur_tool == TOOL_STAMP)
{
cur_thing = cur_stamp;
num_things = num_stamps;
thing_scroll = &stamp_scroll;
cur_thing = cur_stamp[stamp_group];
num_things = num_stamps[stamp_group];
thing_scroll = &(stamp_scroll[stamp_group]);
draw_stamps();
draw_colors(stamp_colorable(cur_stamp) ||
stamp_tintable(cur_stamp));
draw_colors(stamp_colorable(cur_stamp[stamp_group]) ||
stamp_tintable(cur_stamp[stamp_group]));
set_active_stamp();
update_stamp_xor();
}
@ -2298,7 +2315,11 @@ static void mainloop(void)
if (!disable_stamp_controls)
gd_controls = (grid_dims)
{
2, 2};
3, 3}; // was 2,2 before adding left/right stamp group buttons -bjk 2007.05.03
else
gd_controls = (grid_dims)
{
1, 1}; // was left 0,0 before adding left/right stamp group buttons -bjk 2007.05.03
}
else if (cur_tool == TOOL_TEXT)
{
@ -2348,7 +2369,7 @@ static void mainloop(void)
{
toolopt_changed = 1;
#ifndef NOSOUND
if (cur_tool != TOOL_STAMP || stamp_data[which]->ssnd == NULL)
if (cur_tool != TOOL_STAMP || stamp_data[stamp_group][which]->ssnd == NULL)
{
playsound(screen, 1, SND_BLEEP, 0, SNDPOS_RIGHT,
SNDDIST_NEAR);
@ -2374,35 +2395,35 @@ static void mainloop(void)
if (which & 1)
{
/* Bottom right button: Grow: */
if (stamp_data[cur_stamp]->size < MAX_STAMP_SIZE)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size < MAX_STAMP_SIZE)
{
stamp_data[cur_stamp]->size++;
stamp_data[stamp_group][cur_stamp[stamp_group]]->size++;
control_sound = SND_GROW;
}
}
else
{
/* Bottom left button: Shrink: */
if (stamp_data[cur_stamp]->size > MIN_STAMP_SIZE)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size > MIN_STAMP_SIZE)
{
stamp_data[cur_stamp]->size--;
stamp_data[stamp_group][cur_stamp[stamp_group]]->size--;
control_sound = SND_SHRINK;
}
}
#else
int old_size;
old_size = stamp_data[cur_stamp]->size;
old_size = stamp_data[stamp_group][cur_stamp[stamp_group]]->size;
stamp_data[cur_stamp]->size =
stamp_data[stamp_group][cur_stamp[stamp_group]]->size =
(((MAX_STAMP_SIZE - MIN_STAMP_SIZE) * (event.button.x -
(WINDOW_WIDTH -
96))) / 96) +
MIN_STAMP_SIZE;
if (stamp_data[cur_stamp]->size < old_size)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size < old_size)
control_sound = SND_SHRINK;
else if (stamp_data[cur_stamp]->size > old_size)
else if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size > old_size)
control_sound = SND_GROW;
#endif
}
@ -2412,20 +2433,20 @@ static void mainloop(void)
if (which & 1)
{
/* Top right button: Flip: */
if (stamp_data[cur_stamp]->flipable)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->flipable)
{
stamp_data[cur_stamp]->flipped =
!stamp_data[cur_stamp]->flipped;
stamp_data[stamp_group][cur_stamp[stamp_group]]->flipped =
!stamp_data[stamp_group][cur_stamp[stamp_group]]->flipped;
control_sound = SND_FLIP;
}
}
else
{
/* Top left button: Mirror: */
if (stamp_data[cur_stamp]->mirrorable)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->mirrorable)
{
stamp_data[cur_stamp]->mirrored =
!stamp_data[cur_stamp]->mirrored;
stamp_data[stamp_group][cur_stamp[stamp_group]]->mirrored =
!stamp_data[stamp_group][cur_stamp[stamp_group]]->mirrored;
control_sound = SND_MIRROR;
}
}
@ -2630,15 +2651,15 @@ static void mainloop(void)
{
// If there's an SFX, play it!
if (stamp_data[cur_thing]->ssnd != NULL)
if (stamp_data[stamp_group][cur_thing]->ssnd != NULL)
{
Mix_ChannelFinished(NULL); // Prevents multiple clicks from toggling between SFX and desc sound, rather than always playing SFX first, then desc sound...
Mix_PlayChannel(2, stamp_data[cur_thing]->ssnd, 0);
Mix_PlayChannel(2, stamp_data[stamp_group][cur_thing]->ssnd, 0);
// If there's a description sound, play it after the SFX!
if (stamp_data[cur_thing]->sdesc != NULL)
if (stamp_data[stamp_group][cur_thing]->sdesc != NULL)
{
Mix_ChannelFinished(playstampdesc);
}
@ -2647,17 +2668,17 @@ static void mainloop(void)
{
// No SFX? If there's a description sound, play it now!
if (stamp_data[cur_thing]->sdesc != NULL)
if (stamp_data[stamp_group][cur_thing]->sdesc != NULL)
{
Mix_PlayChannel(2, stamp_data[cur_thing]->sdesc, 0);
Mix_PlayChannel(2, stamp_data[stamp_group][cur_thing]->sdesc, 0);
}
}
}
#endif
if (cur_thing != cur_stamp)
if (cur_thing != cur_stamp[stamp_group])
{
cur_stamp = cur_thing;
cur_stamp[stamp_group] = cur_thing;
set_active_stamp();
update_stamp_xor();
}
@ -2665,21 +2686,21 @@ static void mainloop(void)
if (do_draw)
draw_stamps();
if (stamp_data[cur_stamp]->stxt != NULL)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->stxt != NULL)
{
#ifdef DEBUG
printf("stamp_data[cur_stamp]->stxt = %s\n",
stamp_data[cur_stamp]->stxt);
printf("stamp_data[stamp_group][cur_stamp[stamp_group]]->stxt = %s\n",
stamp_data[stamp_group][cur_stamp[stamp_group]]->stxt);
#endif
draw_tux_text_ex(TUX_GREAT, stamp_data[cur_stamp]->stxt, 1, stamp_data[cur_stamp]->locale_text);
draw_tux_text_ex(TUX_GREAT, stamp_data[stamp_group][cur_stamp[stamp_group]]->stxt, 1, stamp_data[stamp_group][cur_stamp[stamp_group]]->locale_text);
}
else
draw_tux_text(TUX_GREAT, "", 0);
/* Enable or disable color selector: */
draw_colors(stamp_colorable(cur_stamp)
|| stamp_tintable(cur_stamp));
draw_colors(stamp_colorable(cur_stamp[stamp_group])
|| stamp_tintable(cur_stamp[stamp_group]));
}
else if (cur_tool == TOOL_SHAPES)
{
@ -2773,7 +2794,7 @@ static void mainloop(void)
/* FIXME: Make delay configurable: */
control_drawtext_timer(1000, stamp_data[cur_stamp]->stxt, stamp_data[cur_stamp]->locale_text);
control_drawtext_timer(1000, stamp_data[stamp_group][cur_stamp[stamp_group]]->stxt, stamp_data[stamp_group][cur_stamp[stamp_group]]->locale_text);
}
else if (cur_tool == TOOL_LINES)
{
@ -3065,10 +3086,10 @@ static void mainloop(void)
if (event.user.data1 != NULL)
{
if ((int) event.user.data1 == cur_stamp) // Don't play old stamp's sound...
if ((int) event.user.data1 == cur_stamp[stamp_group]) // Don't play old stamp's sound...
{
if (!mute && stamp_data[(int) event.user.data1]->sdesc != NULL)
Mix_PlayChannel(2, stamp_data[(int) event.user.data1]->sdesc,
if (!mute && stamp_data[stamp_group][(int) event.user.data1]->sdesc != NULL)
Mix_PlayChannel(2, stamp_data[stamp_group][(int) event.user.data1]->sdesc,
0);
}
}
@ -3215,7 +3236,7 @@ static void mainloop(void)
max = 14;
if (cur_tool == TOOL_STAMP && !disable_stamp_controls)
max = 10;
max = 8; // was 10 before left/right group buttons -bjk 2007.05.03
if (cur_tool == TOOL_TEXT && !disable_stamp_controls)
max = 10;
@ -3927,7 +3948,7 @@ static multichan *find_most_saturated(double initial_hue, multichan * work,
double upper_hue_2;
multichan *mc;
switch (stamp_data[cur_stamp]->tinter)
switch (stamp_data[stamp_group][cur_stamp[stamp_group]]->tinter)
{
default:
case TINTER_NORMAL:
@ -4098,7 +4119,7 @@ static void stamp_draw(int x, int y)
/* Create a temp surface to play with: */
if (stamp_colorable(cur_stamp) || stamp_tintable(cur_stamp))
if (stamp_colorable(cur_stamp[stamp_group]) || stamp_tintable(cur_stamp[stamp_group]))
{
amask = ~(surf_ptr->format->Rmask |
surf_ptr->format->Gmask | surf_ptr->format->Bmask);
@ -4140,7 +4161,7 @@ static void stamp_draw(int x, int y)
/* Alter the stamp's color, if needed: */
if (stamp_colorable(cur_stamp) && tmp_surf != NULL)
if (stamp_colorable(cur_stamp[stamp_group]) && tmp_surf != NULL)
{
/* Render the stamp in the chosen color: */
@ -4170,9 +4191,9 @@ static void stamp_draw(int x, int y)
SDL_UnlockSurface(tmp_surf);
SDL_UnlockSurface(surf_ptr);
}
else if (stamp_tintable(cur_stamp))
else if (stamp_tintable(cur_stamp[stamp_group]))
{
if (stamp_data[cur_stamp]->tinter == TINTER_VECTOR)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->tinter == TINTER_VECTOR)
vector_tint_surface(tmp_surf, surf_ptr);
else
tint_surface(tmp_surf, surf_ptr);
@ -5574,7 +5595,7 @@ static void loadstamp_finisher(stamp_type * sd, unsigned w, unsigned h,
// Note: must have read the *.dat file before calling this
static void set_active_stamp(void)
{
stamp_type *sd = stamp_data[cur_stamp];
stamp_type *sd = stamp_data[stamp_group][cur_stamp[stamp_group]];
unsigned len = strlen(sd->stampname);
char *buf = alloca(len + strlen("_mirror.EXT") + 1);
@ -5777,6 +5798,36 @@ static void loadstamp_callback(SDL_Surface * screen,
unsigned dirlen, tp_ftw_str * files,
unsigned i)
{
if (num_stamps[stamp_group] > 0)
{
/* If previous group had any stamps... */
unsigned int i, slashcount;
/* See if the current directory is shallow enough to be
important for making a new stamp group: */
slashcount = 0;
for (i = strlen(load_stamp_basedir) + 1; i < strlen(dir); i++)
{
if (dir[i] == '/' || dir[i] == '\\')
slashcount++;
}
if (slashcount <= stamp_group_dir_depth)
{
stamp_group++;
#ifdef DEBUG
printf("%s counts as a new group!\n", dir);
#endif
}
}
/* Sort and iterate the file list: */
qsort(files, i, sizeof *files, compare_ftw_str);
while (i--)
{
@ -5827,19 +5878,21 @@ static void loadstamp_callback(SDL_Surface * screen,
&& !strcasestr(files[i].str, mirror_ext))
{
snprintf(fname, sizeof fname, "%s/%s", dir, files[i].str);
if (num_stamps == max_stamps)
if (num_stamps[stamp_group] == max_stamps[stamp_group])
{
max_stamps = max_stamps * 5 / 4 + 15;
stamp_data = realloc(stamp_data, max_stamps * sizeof *stamp_data);
max_stamps[stamp_group] = max_stamps[stamp_group] * 5 / 4 + 15;
stamp_data[stamp_group] = realloc(stamp_data[stamp_group],
max_stamps[stamp_group] * sizeof(*stamp_data[stamp_group]));
}
stamp_data[num_stamps] = calloc(1, sizeof *stamp_data[num_stamps]);
stamp_data[num_stamps]->stampname =
stamp_data[stamp_group][num_stamps[stamp_group]] =
calloc(1, sizeof *stamp_data[stamp_group][num_stamps[stamp_group]]);
stamp_data[stamp_group][num_stamps[stamp_group]]->stampname =
malloc(dotext - files[i].str + 1 + dirlen + 1);
memcpy(stamp_data[num_stamps]->stampname, fname,
memcpy(stamp_data[stamp_group][num_stamps[stamp_group]]->stampname, fname,
dotext - files[i].str + 1 + dirlen);
stamp_data[num_stamps]->stampname[dotext - files[i].str + 1 + dirlen] =
'\0';
num_stamps++;
stamp_data[stamp_group][num_stamps[stamp_group]]->stampname[dotext - files[i].str +
1 + dirlen] = '\0';
num_stamps[stamp_group]++;
}
free(files[i].str);
}
@ -5853,6 +5906,7 @@ static void load_stamp_dir(SDL_Surface * screen, const char *const dir)
char buf[TP_FTW_PATHSIZE];
unsigned dirlen = strlen(dir);
memcpy(buf, dir, dirlen);
load_stamp_basedir = dir;
tp_ftw(screen, buf, dirlen, 0, loadstamp_callback);
}
@ -5874,7 +5928,7 @@ static void load_stamps(SDL_Surface * screen)
load_stamp_dir(screen, homedirdir);
#endif
if (num_stamps == 0)
if (num_stamps[0] == 0)
{
fprintf(stderr,
"\nWarning: No stamps found in " DATA_PREFIX "stamps/\n"
@ -8216,14 +8270,14 @@ static void draw_stamps(void)
/* How many can we show? */
most = 10;
most = 8; // was 10 and 14, before left/right controls -bjk 2007.05.03
if (disable_stamp_controls)
most = 14;
most = 12;
/* Do we need scrollbars? */
if (num_stamps > most + TOOLOFFSET)
if (num_stamps[stamp_group] > most + TOOLOFFSET)
{
off_y = 24;
max = (most - 2) + TOOLOFFSET;
@ -8231,7 +8285,7 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 96;
dest.y = 40;
if (stamp_scroll > 0)
if (stamp_scroll[stamp_group] > 0)
{
SDL_BlitSurface(img_scroll_up, NULL, screen, &dest);
}
@ -8242,12 +8296,13 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 96;
dest.y = 40 + 24 + ((6 + TOOLOFFSET / 2) * 48);
dest.y = 40 + 24 + ((5 + TOOLOFFSET / 2) * 48); // was 6, before left/right controls -bjk 2007.05.03
if (!disable_stamp_controls)
dest.y = dest.y - (48 * 2);
if (stamp_scroll < num_stamps - (most - 2) - TOOLOFFSET)
if (stamp_scroll[stamp_group] <
num_stamps[stamp_group] - (most - 2) - TOOLOFFSET)
{
SDL_BlitSurface(img_scroll_down, NULL, screen, &dest);
}
@ -8265,19 +8320,21 @@ static void draw_stamps(void)
/* Draw each of the shown stamps: */
for (stamp = stamp_scroll; stamp < stamp_scroll + max; stamp++)
for (stamp = stamp_scroll[stamp_group];
stamp < stamp_scroll[stamp_group] + max;
stamp++)
{
i = stamp - stamp_scroll;
i = stamp - stamp_scroll[stamp_group];
dest.x = ((i % 2) * 48) + (WINDOW_WIDTH - 96);
dest.y = ((i / 2) * 48) + 40 + off_y;
if (stamp == cur_stamp)
if (stamp == cur_stamp[stamp_group])
{
SDL_BlitSurface(img_btn_down, NULL, screen, &dest);
}
else if (stamp < num_stamps)
else if (stamp < num_stamps[stamp_group])
{
SDL_BlitSurface(img_btn_up, NULL, screen, &dest);
}
@ -8286,10 +8343,10 @@ static void draw_stamps(void)
SDL_BlitSurface(img_btn_off, NULL, screen, &dest);
}
if (stamp < num_stamps)
if (stamp < num_stamps[stamp_group])
{
get_stamp_thumb(stamp_data[stamp]);
img = stamp_data[stamp]->thumbnail;
get_stamp_thumb(stamp_data[stamp_group][stamp]);
img = stamp_data[stamp_group][stamp]->thumbnail;
base_x = ((i % 2) * 48) + (WINDOW_WIDTH - 96) + ((48 - (img->w)) / 2);
@ -8315,9 +8372,9 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 96;
dest.y = 40 + ((5 + TOOLOFFSET / 2) * 48);
if (stamp_data[cur_stamp]->mirrorable)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->mirrorable)
{
if (stamp_data[cur_stamp]->mirrored)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->mirrored)
{
button_color = img_black;
button_body = img_btn_down;
@ -8348,9 +8405,9 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 48;
dest.y = 40 + ((5 + TOOLOFFSET / 2) * 48);
if (stamp_data[cur_stamp]->flipable)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->flipable)
{
if (stamp_data[cur_stamp]->flipped)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->flipped)
{
button_color = img_black;
button_body = img_btn_down;
@ -8382,7 +8439,7 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 96;
dest.y = 40 + ((6 + TOOLOFFSET / 2) * 48);
if (stamp_data[cur_stamp]->size > MIN_STAMP_SIZE)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size > MIN_STAMP_SIZE)
{
button_color = img_black;
button_body = img_btn_up;
@ -8406,7 +8463,7 @@ static void draw_stamps(void)
dest.x = WINDOW_WIDTH - 48;
dest.y = 40 + ((6 + TOOLOFFSET / 2) * 48);
if (stamp_data[cur_stamp]->size < MAX_STAMP_SIZE)
if (stamp_data[stamp_group][cur_stamp[stamp_group]]->size < MAX_STAMP_SIZE)
{
button_color = img_black;
button_body = img_btn_up;
@ -8426,7 +8483,7 @@ static void draw_stamps(void)
#else
sizes = MAX_STAMP_SIZE - MIN_STAMP_SIZE;
size_at = (stamp_data[cur_stamp]->size - MIN_STAMP_SIZE);
size_at = (stamp_data[stamp_group][cur_stamp[stamp_group]]->size - MIN_STAMP_SIZE);
x_per = 96.0 / sizes;
y_per = 48.0 / sizes;
@ -9482,7 +9539,7 @@ static void reset_avail_tools(void)
/* Unavailable in rare circumstances: */
if (num_stamps == 0)
if (num_stamps[0] == 0)
tool_avail[TOOL_STAMP] = 0;
@ -9957,7 +10014,7 @@ static void playstampdesc(int chan)
playsound_event.type = SDL_USEREVENT;
playsound_event.user.code = USEREVENT_PLAYDESCSOUND;
playsound_event.user.data1 = (void *) cur_stamp;
playsound_event.user.data1 = (void *) cur_stamp[stamp_group];
SDL_PushEvent(&playsound_event);
}
@ -11115,34 +11172,37 @@ static int do_prompt_image_flash_snd(const char *const text,
static void cleanup(void)
{
int i;
int i, j;
for (i = 0; i < num_stamps; i++)
for (j = 0; j < num_stamp_groups; j++)
{
for (i = 0; i < num_stamps[j]; i++)
{
#ifndef NOSOUND
if (stamp_data[i]->ssnd)
{
Mix_FreeChunk(stamp_data[i]->ssnd);
stamp_data[i]->ssnd = NULL;
}
if (stamp_data[i]->sdesc)
{
Mix_FreeChunk(stamp_data[i]->sdesc);
stamp_data[i]->sdesc = NULL;
}
if (stamp_data[j][i]->ssnd)
{
Mix_FreeChunk(stamp_data[j][i]->ssnd);
stamp_data[j][i]->ssnd = NULL;
}
if (stamp_data[j][i]->sdesc)
{
Mix_FreeChunk(stamp_data[j][i]->sdesc);
stamp_data[j][i]->sdesc = NULL;
}
#endif
if (stamp_data[i]->stxt)
{
free(stamp_data[i]->stxt);
stamp_data[i]->stxt = NULL;
}
free_surface(&stamp_data[i]->thumbnail);
if (stamp_data[j][i]->stxt)
{
free(stamp_data[j][i]->stxt);
stamp_data[j][i]->stxt = NULL;
}
free_surface(&stamp_data[j][i]->thumbnail);
free(stamp_data[i]->stampname);
free(stamp_data[i]);
stamp_data[i] = NULL;
free(stamp_data[j][i]->stampname);
free(stamp_data[j][i]);
stamp_data[j][i] = NULL;
}
free(stamp_data[j]);
}
free(stamp_data);
free_surface(&active_stamp);
free_surface_array(img_brushes, num_brushes);