Created a "Templates" feature (similar to "Starters").
SF.net Feature Req. #1820318
This commit is contained in:
parent
f4c25c5edc
commit
9fe17de7b3
4 changed files with 336 additions and 14 deletions
|
|
@ -37,6 +37,14 @@ $Id$
|
||||||
|
|
||||||
* Other Improvements:
|
* Other Improvements:
|
||||||
-------------------
|
-------------------
|
||||||
|
* Template images are now supported. Similar to Starters, they are
|
||||||
|
pre-drawn pictures to begin a new drawing with, accessed via the
|
||||||
|
"New" dialog. The "Eraser" tool will erase back to the original
|
||||||
|
picture (rather than a solid color).
|
||||||
|
|
||||||
|
Unlike Starters, they do not involve an immutable "layer" above the
|
||||||
|
drawing. They may be drawn over in their entirety.
|
||||||
|
|
||||||
* After switching into, or out of, a magic tool, the canvas is updated.
|
* After switching into, or out of, a magic tool, the canvas is updated.
|
||||||
|
|
||||||
* Starter images can be in SVG (Scalable Vector Graphics) format.
|
* Starter images can be in SVG (Scalable Vector Graphics) format.
|
||||||
|
|
|
||||||
|
|
@ -556,6 +556,50 @@ Fonts
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
'Templates'
|
||||||
|
|
||||||
|
'Template' images also appear in the 'New' dialog, along with solid
|
||||||
|
color background choices and 'Starters'. (Note: Tux Paint prior to
|
||||||
|
version 0.9.22 did not have the 'Template' feature.)
|
||||||
|
|
||||||
|
Unlike pictures drawn in Tux Paint by users and then opened later,
|
||||||
|
opening a 'template' creates a new drawing. When you save, the
|
||||||
|
'template' image is not overwritten. Unlike 'starters', there is no
|
||||||
|
immutable 'layer' above the canvas. You may draw over any part of it.
|
||||||
|
|
||||||
|
When the 'Eraser' tool is used on a picture based on a 'template',
|
||||||
|
rather than turning the canvas to a solid color, such as white, it
|
||||||
|
returns that part of the canvas to the original picture from the
|
||||||
|
'template'.
|
||||||
|
|
||||||
|
'Templates' are simply image files (in PNG, JPG, SVG or KPX format). No
|
||||||
|
preparation or conversion should be required.
|
||||||
|
|
||||||
|
The 'template' images should be the same size as Tux Paint's canvas.
|
||||||
|
(See the "Loading Other Pictures into Tux Paint" section of README for
|
||||||
|
details on sizing.) If they are not, they will be stretched, without
|
||||||
|
affecting the shape ("aspect ratio"); however some smudging may be
|
||||||
|
applied to the edges.
|
||||||
|
|
||||||
|
Place them in the "templates" directory. When the 'New' dialog is
|
||||||
|
accessed in Tux Paint, the 'template' images will appear in the screen
|
||||||
|
that appears, after the various solid color choices and 'starters'.
|
||||||
|
|
||||||
|
Note: 'Templates' can't be saved over from within Tux Paint, since
|
||||||
|
loading a 'template' is really like creating a new image. (Instead of
|
||||||
|
being blank, though there's already something there to work with.) The
|
||||||
|
'Save' command simply creates a new picture, like it would if the 'New'
|
||||||
|
command had been used.
|
||||||
|
|
||||||
|
Note: 'Templates' are 'attached' to saved pictures, via a small text
|
||||||
|
file that has the same name as the saved file, but with ".dat" as the
|
||||||
|
extension. This allows the background to continue to be available to the
|
||||||
|
drawing (e.g., when using the 'Eraser' tool) even after Tux Paint has
|
||||||
|
been quit, or another picture loaded or started. (In other words, if you
|
||||||
|
base a drawing on a 'template' image, it will always be affected by it.)
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
Translations
|
Translations
|
||||||
|
|
||||||
Tux Paint supports numerous languages, thanks to use of the "gettext"
|
Tux Paint supports numerous languages, thanks to use of the "gettext"
|
||||||
|
|
|
||||||
|
|
@ -713,6 +713,57 @@ effect.</p>
|
||||||
|
|
||||||
<hr size=1 noshade>
|
<hr size=1 noshade>
|
||||||
|
|
||||||
|
<h2>'Templates'</h2>
|
||||||
|
<blockquote>
|
||||||
|
<img src="images/open_open.png" width=48 height=48 alt="" align=right>
|
||||||
|
|
||||||
|
<p>'Template' images also appear in the 'New' dialog, along with solid
|
||||||
|
color background choices and 'Starters'. (Note: Tux Paint prior to
|
||||||
|
version 0.9.22 did not have the 'Template' feature.)</p>
|
||||||
|
|
||||||
|
<p>Unlike pictures drawn in Tux Paint by users and then opened
|
||||||
|
later, opening a 'template' creates a new drawing. When you save, the
|
||||||
|
'template' image is not overwritten. Unlike 'starters', there is no
|
||||||
|
immutable 'layer' above the canvas. You may draw over any part of it.</p>
|
||||||
|
|
||||||
|
<p>When the 'Eraser' tool is used on a picture based on a 'template',
|
||||||
|
rather than turning the canvas to a solid color, such as white, it
|
||||||
|
returns that part of the canvas to the original picture from the
|
||||||
|
'template'.</p>
|
||||||
|
|
||||||
|
<p>'Templates' are simply image files (in PNG, JPG, SVG or KPX format).
|
||||||
|
No preparation or conversion should be required.</p>
|
||||||
|
|
||||||
|
<p>The 'template' images should be the same size as Tux Paint's
|
||||||
|
canvas. (See the "Loading Other Pictures into Tux Paint" section of
|
||||||
|
<a href="README.html">README</a> for details on sizing.) If they are not,
|
||||||
|
they will be stretched, without affecting the shape ("aspect ratio");
|
||||||
|
however some smudging may be applied to the edges.</p>
|
||||||
|
|
||||||
|
<p>Place them in the "<code><b>templates</b></code>" directory.
|
||||||
|
When the 'New' dialog is accessed in Tux Paint, the 'template'
|
||||||
|
images will appear in the screen that appears, after the various solid color
|
||||||
|
choices and 'starters'.</p>
|
||||||
|
|
||||||
|
<p><b>Note:</b> 'Templates' can't be saved over from within Tux Paint,
|
||||||
|
since loading a 'template' is really like creating a new image.
|
||||||
|
(Instead of being blank, though there's already something there to work
|
||||||
|
with.) The 'Save' command simply creates a new picture, like it would
|
||||||
|
if the 'New' command had been used.</p>
|
||||||
|
|
||||||
|
<p><b>Note:</b> 'Templates' are 'attached' to saved pictures, via a
|
||||||
|
small text file that has the same name as the saved file, but with
|
||||||
|
"<code>.dat</code>" as the extension. This allows the background
|
||||||
|
to continue to be available to the drawing (e.g., when using the 'Eraser'
|
||||||
|
tool) even after Tux Paint has been quit, or another picture loaded
|
||||||
|
or started. (In other words, if you base a drawing on a 'template' image,
|
||||||
|
it will always be affected by it.)</p>
|
||||||
|
|
||||||
|
<br clear=all>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<hr size=1 noshade>
|
||||||
|
|
||||||
|
|
||||||
<h2>Translations</h2>
|
<h2>Translations</h2>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
|
|
|
||||||
247
src/tuxpaint.c
247
src/tuxpaint.c
|
|
@ -919,6 +919,7 @@ static int
|
||||||
disable_magic_controls;
|
disable_magic_controls;
|
||||||
|
|
||||||
static int starter_mirrored, starter_flipped, starter_personal;
|
static int starter_mirrored, starter_flipped, starter_personal;
|
||||||
|
static int template_personal;
|
||||||
static Uint8 canvas_color_r, canvas_color_g, canvas_color_b;
|
static Uint8 canvas_color_r, canvas_color_g, canvas_color_b;
|
||||||
Uint8 * touched;
|
Uint8 * touched;
|
||||||
|
|
||||||
|
|
@ -1441,6 +1442,7 @@ static int cur_label, cur_select;
|
||||||
static int been_saved;
|
static int been_saved;
|
||||||
static char file_id[NAME_MAX];
|
static char file_id[NAME_MAX];
|
||||||
static char starter_id[NAME_MAX];
|
static char starter_id[NAME_MAX];
|
||||||
|
static char template_id[NAME_MAX];
|
||||||
static int brush_scroll;
|
static int brush_scroll;
|
||||||
static int stamp_scroll[MAX_STAMP_GROUPS];
|
static int stamp_scroll[MAX_STAMP_GROUPS];
|
||||||
static int font_scroll, magic_scroll, tool_scroll;
|
static int font_scroll, magic_scroll, tool_scroll;
|
||||||
|
|
@ -1648,6 +1650,7 @@ static void anti_carriage_return(int left, int right, int cur_top,
|
||||||
#endif
|
#endif
|
||||||
static void load_starter_id(char *saved_id);
|
static void load_starter_id(char *saved_id);
|
||||||
static void load_starter(char *img_id);
|
static void load_starter(char *img_id);
|
||||||
|
static void load_template(char *img_id);
|
||||||
static SDL_Surface *duplicate_surface(SDL_Surface * orig);
|
static SDL_Surface *duplicate_surface(SDL_Surface * orig);
|
||||||
static void mirror_starter(void);
|
static void mirror_starter(void);
|
||||||
static void flip_starter(void);
|
static void flip_starter(void);
|
||||||
|
|
@ -12001,6 +12004,7 @@ static void load_starter_id(char *saved_id)
|
||||||
rname = get_fname(fname, DIR_SAVE);
|
rname = get_fname(fname, DIR_SAVE);
|
||||||
|
|
||||||
starter_id[0] = '\0';
|
starter_id[0] = '\0';
|
||||||
|
template_id[0] = '\0';
|
||||||
|
|
||||||
fi = fopen(rname, "r");
|
fi = fopen(rname, "r");
|
||||||
if (fi != NULL)
|
if (fi != NULL)
|
||||||
|
|
@ -12035,6 +12039,20 @@ static void load_starter_id(char *saved_id)
|
||||||
canvas_color_b = 255;
|
canvas_color_b = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
color_tag = fgetc(fi);
|
||||||
|
}
|
||||||
|
while ((color_tag == '\n' || color_tag == '\r') && !feof(fi));
|
||||||
|
|
||||||
|
if (!feof(fi) && color_tag == 'T')
|
||||||
|
{
|
||||||
|
fgets(template_id, sizeof(template_id), fi);
|
||||||
|
template_id[strlen(template_id) - 1] = '\0';
|
||||||
|
fscanf(fi, "%d", &template_personal);
|
||||||
|
printf("template = %s\n (Personal=%d)", template_id, template_personal);
|
||||||
|
}
|
||||||
|
|
||||||
fclose(fi);
|
fclose(fi);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -12096,11 +12114,15 @@ static void load_starter(char *img_id)
|
||||||
|
|
||||||
/* Try to load the a background image: */
|
/* Try to load the a background image: */
|
||||||
|
|
||||||
/* FIXME: Also support .jpg extension? -bjk 2007.03.22 */
|
|
||||||
|
|
||||||
/* (JPEG first) */
|
/* (JPEG first) */
|
||||||
snprintf(fname, sizeof(fname), "%s/%s-back.jpeg", dirname, img_id);
|
snprintf(fname, sizeof(fname), "%s/%s-back.jpeg", dirname, img_id);
|
||||||
tmp_surf = IMG_Load(fname);
|
tmp_surf = IMG_Load(fname);
|
||||||
|
if (tmp_surf == NULL)
|
||||||
|
{
|
||||||
|
/* (Then just JPG) */
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s-back.jpg", dirname, img_id);
|
||||||
|
tmp_surf = IMG_Load(fname);
|
||||||
|
}
|
||||||
|
|
||||||
/* (Failed? Try PNG next) */
|
/* (Failed? Try PNG next) */
|
||||||
if (tmp_surf == NULL)
|
if (tmp_surf == NULL)
|
||||||
|
|
@ -12220,6 +12242,84 @@ static void load_starter(char *img_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void load_template(char *img_id)
|
||||||
|
{
|
||||||
|
char *dirname;
|
||||||
|
char fname[256];
|
||||||
|
SDL_Surface *tmp_surf;
|
||||||
|
|
||||||
|
/* Determine path to starter files: */
|
||||||
|
|
||||||
|
if (template_personal == 0)
|
||||||
|
dirname = strdup(DATA_PREFIX "templates");
|
||||||
|
else
|
||||||
|
dirname = get_fname("templates", DIR_DATA);
|
||||||
|
|
||||||
|
/* Clear them to NULL first: */
|
||||||
|
img_starter = NULL;
|
||||||
|
img_starter_bkgd = NULL;
|
||||||
|
|
||||||
|
/* (Try loading a KPX) */
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s.kpx", dirname, img_id);
|
||||||
|
tmp_surf = myIMG_Load(fname);
|
||||||
|
|
||||||
|
/* (JPEG) */
|
||||||
|
if (tmp_surf == NULL)
|
||||||
|
{
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s.jpeg", dirname, img_id);
|
||||||
|
tmp_surf = IMG_Load(fname);
|
||||||
|
}
|
||||||
|
if (tmp_surf == NULL)
|
||||||
|
{
|
||||||
|
/* (Then just JPG) */
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s.jpg", dirname, img_id);
|
||||||
|
tmp_surf = IMG_Load(fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (Failed? Try PNG next) */
|
||||||
|
if (tmp_surf == NULL)
|
||||||
|
{
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s.png", dirname, img_id);
|
||||||
|
tmp_surf = IMG_Load(fname);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NOSVG
|
||||||
|
/* (Failed? Try SVG next) */
|
||||||
|
if (tmp_surf == NULL)
|
||||||
|
{
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s.svg", dirname, img_id);
|
||||||
|
tmp_surf = load_svg(fname);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tmp_surf != NULL)
|
||||||
|
{
|
||||||
|
img_starter_bkgd = SDL_DisplayFormat(tmp_surf);
|
||||||
|
SDL_FreeSurface(tmp_surf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Scale if needed... */
|
||||||
|
|
||||||
|
if (img_starter_bkgd != NULL &&
|
||||||
|
(img_starter_bkgd->w != canvas->w || img_starter_bkgd->h != canvas->h))
|
||||||
|
{
|
||||||
|
tmp_surf = img_starter_bkgd;
|
||||||
|
|
||||||
|
img_starter_bkgd = SDL_CreateRGBSurface(SDL_SWSURFACE,
|
||||||
|
canvas->w, canvas->h,
|
||||||
|
canvas->format->BitsPerPixel,
|
||||||
|
canvas->format->Rmask,
|
||||||
|
canvas->format->Gmask,
|
||||||
|
canvas->format->Bmask, 0);
|
||||||
|
|
||||||
|
autoscale_copy_smear_free(tmp_surf, img_starter_bkgd, SDL_BlitSurface);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Load current (if any) image: */
|
/* Load current (if any) image: */
|
||||||
|
|
||||||
static void load_current(void)
|
static void load_current(void)
|
||||||
|
|
@ -12243,6 +12343,7 @@ static void load_current(void)
|
||||||
"%s\n\n", fname, strerror(errno));
|
"%s\n\n", fname, strerror(errno));
|
||||||
file_id[0] = '\0';
|
file_id[0] = '\0';
|
||||||
starter_id[0] = '\0';
|
starter_id[0] = '\0';
|
||||||
|
template_id[0] = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -12297,6 +12398,7 @@ static void load_current(void)
|
||||||
|
|
||||||
file_id[0] = '\0';
|
file_id[0] = '\0';
|
||||||
starter_id[0] = '\0';
|
starter_id[0] = '\0';
|
||||||
|
template_id[0] = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -12312,6 +12414,10 @@ static void load_current(void)
|
||||||
if (starter_flipped)
|
if (starter_flipped)
|
||||||
flip_starter();
|
flip_starter();
|
||||||
}
|
}
|
||||||
|
else if (template_id[0] != '\0')
|
||||||
|
{
|
||||||
|
load_template(template_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(fname);
|
free(fname);
|
||||||
|
|
@ -13726,6 +13832,7 @@ static int do_save(int tool, int dont_show_success_results)
|
||||||
/* Write 'starter' and/or canvas color info, if it's useful to: */
|
/* Write 'starter' and/or canvas color info, if it's useful to: */
|
||||||
|
|
||||||
if (starter_id[0] != '\0' ||
|
if (starter_id[0] != '\0' ||
|
||||||
|
template_id[0] != '\0' ||
|
||||||
canvas_color_r != 255 ||
|
canvas_color_r != 255 ||
|
||||||
canvas_color_g != 255 ||
|
canvas_color_g != 255 ||
|
||||||
canvas_color_b != 255)
|
canvas_color_b != 255)
|
||||||
|
|
@ -13742,6 +13849,8 @@ static int do_save(int tool, int dont_show_success_results)
|
||||||
canvas_color_r,
|
canvas_color_r,
|
||||||
canvas_color_g,
|
canvas_color_g,
|
||||||
canvas_color_b);
|
canvas_color_b);
|
||||||
|
fprintf(fi, "T%s\n", template_id);
|
||||||
|
fprintf(fi, "%d\n", template_personal);
|
||||||
fclose(fi);
|
fclose(fi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13959,7 +14068,9 @@ static int do_quit(int tool)
|
||||||
#define PLACE_SAVED_DIR 0
|
#define PLACE_SAVED_DIR 0
|
||||||
#define PLACE_PERSONAL_STARTERS_DIR 1
|
#define PLACE_PERSONAL_STARTERS_DIR 1
|
||||||
#define PLACE_STARTERS_DIR 2
|
#define PLACE_STARTERS_DIR 2
|
||||||
#define NUM_PLACES_TO_LOOK 3
|
#define PLACE_PERSONAL_TEMPLATES_DIR 3
|
||||||
|
#define PLACE_TEMPLATES_DIR 4
|
||||||
|
#define NUM_PLACES_TO_LOOK 5
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: This, do_slideshow() and do_new_dialog() should be combined
|
/* FIXME: This, do_slideshow() and do_new_dialog() should be combined
|
||||||
|
|
@ -14017,20 +14128,31 @@ int do_open(void)
|
||||||
{
|
{
|
||||||
if (places_to_look == PLACE_SAVED_DIR)
|
if (places_to_look == PLACE_SAVED_DIR)
|
||||||
{
|
{
|
||||||
/* First, check for saved-images: */
|
/* Saved-images: */
|
||||||
|
|
||||||
dirname[places_to_look] = get_fname("saved", DIR_SAVE);
|
dirname[places_to_look] = get_fname("saved", DIR_SAVE);
|
||||||
}
|
}
|
||||||
else if (places_to_look == PLACE_PERSONAL_STARTERS_DIR)
|
else if (places_to_look == PLACE_PERSONAL_STARTERS_DIR)
|
||||||
{
|
{
|
||||||
|
/* Starters handled by New dialog... */
|
||||||
dirname[places_to_look] = NULL;
|
dirname[places_to_look] = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (places_to_look == PLACE_STARTERS_DIR)
|
else if (places_to_look == PLACE_STARTERS_DIR)
|
||||||
{
|
{
|
||||||
/* Finally, check for system-wide coloring-book style
|
/* Starters handled by New dialog... */
|
||||||
'starter' images: */
|
dirname[places_to_look] = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (places_to_look == PLACE_PERSONAL_TEMPLATES_DIR)
|
||||||
|
{
|
||||||
|
/* Templates handled by New dialog... */
|
||||||
|
dirname[places_to_look] = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (places_to_look == PLACE_TEMPLATES_DIR)
|
||||||
|
{
|
||||||
|
/* Templates handled by New dialog... */
|
||||||
dirname[places_to_look] = NULL;
|
dirname[places_to_look] = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -14972,6 +15094,7 @@ int do_open(void)
|
||||||
|
|
||||||
strcpy(file_id, d_names[which]);
|
strcpy(file_id, d_names[which]);
|
||||||
starter_id[0] = '\0';
|
starter_id[0] = '\0';
|
||||||
|
template_id[0] = '\0';
|
||||||
|
|
||||||
|
|
||||||
/* See if this saved image was based on a 'starter' */
|
/* See if this saved image was based on a 'starter' */
|
||||||
|
|
@ -14988,6 +15111,8 @@ int do_open(void)
|
||||||
if (starter_flipped)
|
if (starter_flipped)
|
||||||
flip_starter();
|
flip_starter();
|
||||||
}
|
}
|
||||||
|
else if (template_id[0] != '\0')
|
||||||
|
load_template(template_id);
|
||||||
|
|
||||||
reset_avail_tools();
|
reset_avail_tools();
|
||||||
|
|
||||||
|
|
@ -15794,7 +15919,7 @@ void play_slideshow(int * selected, int num_selected, char * dirname,
|
||||||
{
|
{
|
||||||
int i, which, next, done;
|
int i, which, next, done;
|
||||||
SDL_Surface * img;
|
SDL_Surface * img;
|
||||||
char * tmp_starter_id, * tmp_file_id;
|
char * tmp_starter_id, * tmp_template_id, * tmp_file_id;
|
||||||
int tmp_starter_mirrored, tmp_starter_flipped, tmp_starter_personal;
|
int tmp_starter_mirrored, tmp_starter_flipped, tmp_starter_personal;
|
||||||
char fname[1024];
|
char fname[1024];
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
@ -15807,6 +15932,7 @@ void play_slideshow(int * selected, int num_selected, char * dirname,
|
||||||
clobbered below! */
|
clobbered below! */
|
||||||
|
|
||||||
tmp_starter_id = strdup(starter_id);
|
tmp_starter_id = strdup(starter_id);
|
||||||
|
tmp_template_id = strdup(template_id);
|
||||||
tmp_file_id = strdup(file_id);
|
tmp_file_id = strdup(file_id);
|
||||||
tmp_starter_mirrored = starter_mirrored;
|
tmp_starter_mirrored = starter_mirrored;
|
||||||
tmp_starter_flipped = starter_flipped;
|
tmp_starter_flipped = starter_flipped;
|
||||||
|
|
@ -15839,6 +15965,8 @@ void play_slideshow(int * selected, int num_selected, char * dirname,
|
||||||
strcpy(file_id, d_names[which]);
|
strcpy(file_id, d_names[which]);
|
||||||
|
|
||||||
|
|
||||||
|
/* FIXME: is the starter even used??? -bjk 2009.10.16 */
|
||||||
|
|
||||||
/* See if this saved image was based on a 'starter' */
|
/* See if this saved image was based on a 'starter' */
|
||||||
|
|
||||||
load_starter_id(d_names[which]);
|
load_starter_id(d_names[which]);
|
||||||
|
|
@ -15853,6 +15981,8 @@ void play_slideshow(int * selected, int num_selected, char * dirname,
|
||||||
if (starter_flipped)
|
if (starter_flipped)
|
||||||
flip_starter();
|
flip_starter();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
load_template(template_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "Back" button: */
|
/* "Back" button: */
|
||||||
|
|
@ -15994,6 +16124,9 @@ void play_slideshow(int * selected, int num_selected, char * dirname,
|
||||||
strcpy(starter_id, tmp_starter_id);
|
strcpy(starter_id, tmp_starter_id);
|
||||||
free(tmp_starter_id);
|
free(tmp_starter_id);
|
||||||
|
|
||||||
|
strcpy(template_id, tmp_template_id);
|
||||||
|
free(tmp_template_id);
|
||||||
|
|
||||||
strcpy(file_id, tmp_file_id);
|
strcpy(file_id, tmp_file_id);
|
||||||
free(tmp_file_id);
|
free(tmp_file_id);
|
||||||
|
|
||||||
|
|
@ -18789,7 +18922,7 @@ int do_new_dialog(void)
|
||||||
DIR *d;
|
DIR *d;
|
||||||
struct dirent *f;
|
struct dirent *f;
|
||||||
struct dirent2 *fs;
|
struct dirent2 *fs;
|
||||||
int place;
|
int place, oldplace;
|
||||||
char *dirname[NUM_PLACES_TO_LOOK];
|
char *dirname[NUM_PLACES_TO_LOOK];
|
||||||
char **d_names = NULL, **d_exts = NULL;
|
char **d_names = NULL, **d_exts = NULL;
|
||||||
int *d_places;
|
int *d_places;
|
||||||
|
|
@ -18804,7 +18937,7 @@ int do_new_dialog(void)
|
||||||
int last_click_which, last_click_button;
|
int last_click_which, last_click_button;
|
||||||
int places_to_look;
|
int places_to_look;
|
||||||
int tot;
|
int tot;
|
||||||
int first_starter;
|
int first_starter, first_template;
|
||||||
int added;
|
int added;
|
||||||
Uint8 r, g, b;
|
Uint8 r, g, b;
|
||||||
int white_in_palette;
|
int white_in_palette;
|
||||||
|
|
@ -18848,6 +18981,18 @@ int do_new_dialog(void)
|
||||||
|
|
||||||
dirname[places_to_look] = strdup(DATA_PREFIX "starters");
|
dirname[places_to_look] = strdup(DATA_PREFIX "starters");
|
||||||
}
|
}
|
||||||
|
else if (places_to_look == PLACE_PERSONAL_TEMPLATES_DIR)
|
||||||
|
{
|
||||||
|
/* Check for 'template' images in our folder: */
|
||||||
|
|
||||||
|
dirname[places_to_look] = get_fname("templates", DIR_DATA);
|
||||||
|
}
|
||||||
|
else if (places_to_look == PLACE_TEMPLATES_DIR)
|
||||||
|
{
|
||||||
|
/* Finally, check for system-wide 'template' images: */
|
||||||
|
|
||||||
|
dirname[places_to_look] = strdup(DATA_PREFIX "templates");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read directory of images and build thumbnails: */
|
/* Read directory of images and build thumbnails: */
|
||||||
|
|
@ -18967,15 +19112,24 @@ int do_new_dialog(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
first_starter = num_files;
|
first_starter = num_files;
|
||||||
|
first_template = -1; /* In case there are none... */
|
||||||
|
|
||||||
|
|
||||||
/* Read directory of images and build thumbnails: */
|
/* Read directory of images and build thumbnails: */
|
||||||
|
|
||||||
|
oldplace = -1;
|
||||||
|
|
||||||
for (j = 0; j < num_files_in_dirs; j++)
|
for (j = 0; j < num_files_in_dirs; j++)
|
||||||
{
|
{
|
||||||
f = &(fs[j].f);
|
f = &(fs[j].f);
|
||||||
place = fs[j].place;
|
place = fs[j].place;
|
||||||
|
|
||||||
|
if (place == PLACE_PERSONAL_TEMPLATES_DIR && oldplace != place)
|
||||||
|
first_template = num_files;
|
||||||
|
|
||||||
|
oldplace = place;
|
||||||
|
|
||||||
|
|
||||||
show_progress_bar(screen);
|
show_progress_bar(screen);
|
||||||
|
|
||||||
if (f != NULL)
|
if (f != NULL)
|
||||||
|
|
@ -18990,6 +19144,7 @@ int do_new_dialog(void)
|
||||||
|| strcasestr(f->d_name, ".bmp") != NULL
|
|| strcasestr(f->d_name, ".bmp") != NULL
|
||||||
/* Support for KPX (Kid Pix templates; just a JPEG with resource fork header): */
|
/* Support for KPX (Kid Pix templates; just a JPEG with resource fork header): */
|
||||||
|| strcasestr(f->d_name, ".kpx") != NULL
|
|| strcasestr(f->d_name, ".kpx") != NULL
|
||||||
|
|| strcasestr(f->d_name, ".jpg") != NULL
|
||||||
#ifndef NOSVG
|
#ifndef NOSVG
|
||||||
|| strcasestr(f->d_name, ".svg") != NULL
|
|| strcasestr(f->d_name, ".svg") != NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -19038,6 +19193,12 @@ int do_new_dialog(void)
|
||||||
d_exts[num_files] = strdup(".kpx");
|
d_exts[num_files] = strdup(".kpx");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcasestr(fname, ".jpg") != NULL)
|
||||||
|
{
|
||||||
|
strcpy((char *) strcasestr(fname, ".jpg"), "");
|
||||||
|
d_exts[num_files] = strdup(".jpg");
|
||||||
|
}
|
||||||
|
|
||||||
d_names[num_files] = strdup(fname);
|
d_names[num_files] = strdup(fname);
|
||||||
d_places[num_files] = place;
|
d_places[num_files] = place;
|
||||||
|
|
||||||
|
|
@ -19141,7 +19302,6 @@ int do_new_dialog(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (img == NULL)
|
if (img == NULL)
|
||||||
{
|
{
|
||||||
/* Didn't load a starter background (or didn't try!),
|
/* Didn't load a starter background (or didn't try!),
|
||||||
|
|
@ -19194,7 +19354,7 @@ int do_new_dialog(void)
|
||||||
/* Let's save this thumbnail, so we don't have to
|
/* Let's save this thumbnail, so we don't have to
|
||||||
create it again next time 'Open' is called: */
|
create it again next time 'Open' is called: */
|
||||||
|
|
||||||
if (d_places[num_files] == PLACE_SAVED_DIR)
|
if (d_places[num_files] == PLACE_SAVED_DIR) /* <-- FIXME: This test should probably go...? -bjk 2009.10.15 */
|
||||||
{
|
{
|
||||||
debug("Saving thumbnail for this one!");
|
debug("Saving thumbnail for this one!");
|
||||||
|
|
||||||
|
|
@ -19670,7 +19830,7 @@ int do_new_dialog(void)
|
||||||
|
|
||||||
delete_label_list(&start_label_node);
|
delete_label_list(&start_label_node);
|
||||||
start_label_node = current_label_node = first_label_node_in_redo_stack = NULL;
|
start_label_node = current_label_node = first_label_node_in_redo_stack = NULL;
|
||||||
if (which >= first_starter)
|
if (which >= first_starter && (first_template == -1 || which < first_template))
|
||||||
{
|
{
|
||||||
/* Load a starter: */
|
/* Load a starter: */
|
||||||
|
|
||||||
|
|
@ -19713,6 +19873,7 @@ int do_new_dialog(void)
|
||||||
|
|
||||||
file_id[0] = '\0';
|
file_id[0] = '\0';
|
||||||
strcpy(starter_id, d_names[which]);
|
strcpy(starter_id, d_names[which]);
|
||||||
|
template_id[0] = '\0';
|
||||||
|
|
||||||
if (d_places[which] == PLACE_PERSONAL_STARTERS_DIR)
|
if (d_places[which] == PLACE_PERSONAL_STARTERS_DIR)
|
||||||
starter_personal = 1;
|
starter_personal = 1;
|
||||||
|
|
@ -19731,6 +19892,65 @@ int do_new_dialog(void)
|
||||||
SDL_BlitSurface(img_starter, NULL, canvas, NULL);
|
SDL_BlitSurface(img_starter, NULL, canvas, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (which >= first_template)
|
||||||
|
{
|
||||||
|
/* Load a template: */
|
||||||
|
|
||||||
|
/* Figure out filename: */
|
||||||
|
|
||||||
|
snprintf(fname, sizeof(fname), "%s/%s%s",
|
||||||
|
dirname[d_places[which]], d_names[which], d_exts[which]);
|
||||||
|
|
||||||
|
img = myIMG_Load(fname);
|
||||||
|
|
||||||
|
if (img == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"\nWarning: Couldn't load the saved image!\n"
|
||||||
|
"%s\n"
|
||||||
|
"The Simple DirectMedia Layer error that occurred "
|
||||||
|
"was:\n" "%s\n\n", fname, SDL_GetError());
|
||||||
|
|
||||||
|
do_prompt(PROMPT_OPEN_UNOPENABLE_TXT,
|
||||||
|
PROMPT_OPEN_UNOPENABLE_YES, "", 0 ,0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free_surface(&img_starter);
|
||||||
|
free_surface(&img_starter_bkgd);
|
||||||
|
template_personal = 0;
|
||||||
|
|
||||||
|
autoscale_copy_smear_free(img, canvas, SDL_BlitSurface);
|
||||||
|
|
||||||
|
cur_undo = 0;
|
||||||
|
oldest_undo = 0;
|
||||||
|
newest_undo = 0;
|
||||||
|
|
||||||
|
/* Immutable 'template' image;
|
||||||
|
we'll need to save a new image when saving...: */
|
||||||
|
|
||||||
|
been_saved = 1;
|
||||||
|
|
||||||
|
file_id[0] = '\0';
|
||||||
|
strcpy(template_id, d_names[which]);
|
||||||
|
starter_id[0] = '\0';
|
||||||
|
|
||||||
|
if (d_places[which] == PLACE_PERSONAL_TEMPLATES_DIR)
|
||||||
|
template_personal = 1;
|
||||||
|
else
|
||||||
|
template_personal = 0;
|
||||||
|
|
||||||
|
load_template(template_id);
|
||||||
|
|
||||||
|
canvas_color_r = 255;
|
||||||
|
canvas_color_g = 255;
|
||||||
|
canvas_color_b = 255;
|
||||||
|
|
||||||
|
SDL_FillRect(canvas, NULL,
|
||||||
|
SDL_MapRGB(canvas->format, 255, 255, 255));
|
||||||
|
SDL_BlitSurface(img_starter_bkgd, NULL, canvas, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* A color! */
|
/* A color! */
|
||||||
|
|
@ -20710,7 +20930,6 @@ static void myblit(SDL_Surface * src_surf, SDL_Rect * src_rect,
|
||||||
int x, y;
|
int x, y;
|
||||||
Uint8 src_r, src_g, src_b, src_a;
|
Uint8 src_r, src_g, src_b, src_a;
|
||||||
Uint8 dest_r, dest_g, dest_b, dest_a;
|
Uint8 dest_r, dest_g, dest_b, dest_a;
|
||||||
printf("myblit\n");
|
|
||||||
|
|
||||||
for (x = src_rect->x; x<src_rect->w + src_rect->x; x++)
|
for (x = src_rect->x; x<src_rect->w + src_rect->x; x++)
|
||||||
for (y = src_rect->y; y<src_rect->h + src_rect->y; y++)
|
for (y = src_rect->y; y<src_rect->h + src_rect->y; y++)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue