Created a "Templates" feature (similar to "Starters").

SF.net Feature Req. #1820318
This commit is contained in:
William Kendrick 2009-10-16 09:00:41 +00:00
parent f4c25c5edc
commit 9fe17de7b3
4 changed files with 336 additions and 14 deletions

View file

@ -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.

View file

@ -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"

View file

@ -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&nbsp;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&nbsp;Paint's
canvas. (See the "Loading Other Pictures into Tux&nbsp;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&nbsp;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&nbsp;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&nbsp;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>

View file

@ -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++)