Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/tuxpaint.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tuxpaint.c')
-rw-r--r--src/tuxpaint.c263
1 files changed, 170 insertions, 93 deletions
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index b55ebde..d9f98d1 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -57,7 +57,6 @@
/*#define PRINTMETHOD_PNG_PNM_PS*/ /* Output PNG, assuming it gets printed */
-#define MAX_PATH 256
/* Compile-time options: */
@@ -464,6 +463,8 @@ extern WrapperData macosx;
#include "compiler.h"
+#include "tuxpaint.h"
+
#if VIDEO_BPP==32
#ifdef __GNUC__
@@ -584,6 +585,9 @@ static int NUM_COLORS;
static Uint8 * * color_hexes;
static char * * color_names;
+const char *DATA_PREFIX = DEFAULT_DATA_PREFIX;
+const char *MAGIC_PREFIX = DEFAULT_MAGIC_PREFIX;
+const char *LOCALEDIR = DEFAULT_LOCALEDIR;
/* Show debugging stuff: */
@@ -1623,7 +1627,7 @@ static SDL_Cursor *get_cursor(unsigned char *bits, unsigned char *mask_bits,
unsigned int x, unsigned int y);
static void seticon(void);
static SDL_Surface *loadimage(const char *const fname);
-static SDL_Surface *do_loadimage(const char *const fname, int abort_on_error);
+static SDL_Surface *do_loadimage(const char *fname, int abort_on_error);
static void draw_toolbar(void);
static void draw_magic(void);
static void draw_brushes(void);
@@ -1684,6 +1688,8 @@ static void playstampdesc(int chan);
#endif
static void do_wait(int counter);
static void load_current(void);
+static char * get_current_image_file(void);
+static void load_current_image(char * fname);
static void save_current(void);
static int do_prompt_image_flash(const char *const text,
const char *const btn_yes,
@@ -5678,9 +5684,7 @@ static void show_version(int details)
printf(" Data directory (DATA_PREFIX) = %s\n", DATA_PREFIX);
printf(" Plugin directory (MAGIC_PREFIX) = %s\n", MAGIC_PREFIX);
- printf(" Doc directory (DOC_PREFIX) = %s\n", DOC_PREFIX);
printf(" Locale directory (LOCALEDIR) = %s\n", LOCALEDIR);
- printf(" Input Method directory (IMDIR) = %s\n", IMDIR);
printf(" System config directory (CONFDIR) = %s\n", CONFDIR);
@@ -5905,9 +5909,20 @@ static void loadbrush_callback(SDL_Surface * screen,
static void load_brush_dir(SDL_Surface * screen, const char *restrict const dir)
{
char buf[TP_FTW_PATHSIZE];
- unsigned dirlen = strlen(dir);
+ unsigned dirlen;
+
+ if (dir[0] != '/')
+ {
+ snprintf(buf, sizeof(buf), "%s/%s", DATA_PREFIX, dir);
+ dirlen = strlen(buf);
+ }
+ else
+ {
+ dirlen = strlen(dir);
+ memcpy(buf, dir, dirlen);
+ buf[dirlen] = '\0';
+ }
- memcpy(buf, dir, dirlen);
tp_ftw(screen, buf, dirlen, 0, loadbrush_callback, NULL);
}
@@ -6776,8 +6791,20 @@ static void loadstamp_callback(SDL_Surface * screen,
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);
+ unsigned dirlen;
+
+ if (dir[0] != '/')
+ {
+ snprintf(buf, sizeof(buf), "%s/%s", DATA_PREFIX, dir);
+ dirlen = strlen(buf);
+ }
+ else
+ {
+ dirlen = strlen(dir);
+ memcpy(buf, dir, dirlen);
+ buf[dirlen] = '\0';
+ }
+
load_stamp_basedir = dir;
tp_ftw(screen, buf, dirlen, 0, loadstamp_callback, NULL);
}
@@ -6790,7 +6817,7 @@ static void load_stamps(SDL_Surface * screen)
default_stamp_size = compute_default_scale_factor(1.0);
load_stamp_dir(screen, homedirdir);
- load_stamp_dir(screen, DATA_PREFIX "stamps");
+ load_stamp_dir(screen, "stamps");
#ifdef __APPLE__
load_stamp_dir(screen, "/Library/Application Support/TuxPaint/stamps");
#endif
@@ -6803,8 +6830,8 @@ static void load_stamps(SDL_Surface * screen)
if (num_stamps[0] == 0)
{
fprintf(stderr,
- "\nWarning: No stamps found in " DATA_PREFIX "stamps/\n"
- "or %s\n\n", homedirdir);
+ "\nWarning: No stamps found in %s/stamps/\n"
+ "or %s\n\n", DATA_PREFIX, homedirdir);
}
num_stamp_groups = stamp_group + 1;
@@ -6954,21 +6981,23 @@ static void seticon(void)
Uint8 *mask;
#endif
SDL_Surface *icon;
+ char fname_buf[MAX_PATH];
/* Load icon into a surface: */
#ifndef WIN32
- icon = IMG_Load(DATA_PREFIX "images/icon.png");
+ snprintf(fname_buf, sizeof(fname_buf), "%s/images/icon.png", DATA_PREFIX);
#else
- icon = IMG_Load(DATA_PREFIX "images/icon32x32.png");
+ snprintf(fname_buf, sizeof(fname_buf), "%s/images/icon32x32.png", DATA_PREFIX);
#endif
+ icon = IMG_Load(fname_buf);
if (icon == NULL)
{
fprintf(stderr,
"\nWarning: I could not load the icon image: %s\n"
"The Simple DirectMedia error that occurred was:\n"
- "%s\n\n", DATA_PREFIX "images/icon.png", SDL_GetError());
+ "%s/images/icon.png", SDL_GetError(), DATA_PREFIX);
return;
}
@@ -7056,10 +7085,16 @@ static SDL_Surface *loadimage(const char *const fname)
/* Load an image: */
-static SDL_Surface *do_loadimage(const char *const fname, int abort_on_error)
+static SDL_Surface *do_loadimage(const char *fname, int abort_on_error)
{
SDL_Surface *s, *disp_fmt_s;
+ char fname_buf[MAX_PATH];
+ if (fname[0] != '/')
+ {
+ snprintf(fname_buf, sizeof(fname_buf), "%s/%s", DATA_PREFIX, fname);
+ fname = fname_buf;
+ }
/* Load the image file: */
@@ -9847,12 +9882,18 @@ static void playstampdesc(int chan)
#ifndef NOSOUND
-static Mix_Chunk *loadsound_extra(const char *const fname, const char *extra)
+static Mix_Chunk *loadsound_extra(const char *fname, const char *extra)
{
char *snd_fname;
char tmp_str[MAX_PATH], ext[5];
Mix_Chunk *tmp_snd;
+ char fname_buf[MAX_PATH];
+ if (fname[0] != '/')
+ {
+ snprintf(fname_buf, "%s/%s", DATA_PREFIX, fname);
+ fname = fname_buf;
+ }
if (strcasestr(fname, ".png") != NULL)
{
@@ -10412,13 +10453,16 @@ static void load_starter_id(char *saved_id, FILE *fil)
static void load_starter(char *img_id)
{
char *dirname;
- char fname[256];
+ char fname[MAX_PATH];
SDL_Surface *tmp_surf;
/* Determine path to starter files: */
if (starter_personal == 0)
- dirname = strdup(DATA_PREFIX "starters");
+ {
+ snprintf(fname, sizeof(fname), "%s/starters", DATA_PREFIX);
+ dirname = strdup(fname);
+ }
else
dirname = get_fname("starters", DIR_DATA);
@@ -10587,13 +10631,16 @@ static void load_starter(char *img_id)
static void load_template(char *img_id)
{
char *dirname;
- char fname[256];
+ char fname[MAX_PATH];
SDL_Surface *tmp_surf;
/* Determine path to starter files: */
if (template_personal == 0)
- dirname = strdup(DATA_PREFIX "templates");
+ {
+ snprintf(fname, sizeof(fname), "%s/templates", DATA_PREFIX);
+ dirname = strdup(fname);
+ }
else
dirname = get_fname("templates", DIR_DATA);
@@ -17191,8 +17238,8 @@ static int do_new_dialog(void)
{
/* Finally, check for system-wide coloring-book style
'starter' images: */
-
- dirname[places_to_look] = strdup(DATA_PREFIX "starters");
+ snprintf(fname, sizeof(fname), "%s/starters", DATA_PREFIX);
+ dirname[places_to_look] = strdup(fname);
}
else if (places_to_look == PLACE_PERSONAL_TEMPLATES_DIR)
{
@@ -17203,8 +17250,8 @@ static int do_new_dialog(void)
else if (places_to_look == PLACE_TEMPLATES_DIR)
{
/* Finally, check for system-wide 'template' images: */
-
- dirname[places_to_look] = strdup(DATA_PREFIX "templates");
+ snprintf(fname, sizeof(fname), "%s/templates", DATA_PREFIX);
+ dirname[places_to_look] = strdup(fname);
}
@@ -20899,7 +20946,17 @@ static void setup(void)
i = NUM_SOUNDS;
while (use_sound && i--)
{
- sounds[i] = Mix_LoadWAV(sound_fnames[i]);
+ if (sound_fnames[i][0] != '/')
+ {
+ char fname_buf[MAX_PATH];
+ snprintf(fname_buf, sizeof(fname_buf), "%s/%s", DATA_PREFIX,
+ sound_fnames[i]);
+ sounds[i] = Mix_LoadWAV(fname_buf);
+ }
+ else
+ {
+ sounds[i] = Mix_LoadWAV(sound_fnames[i]);
+ }
if (sounds[i] == NULL)
{
@@ -21043,9 +21100,9 @@ static void setup(void)
/* quickly: title image, version, progress bar, and watch cursor */
- img_title = loadimage(DATA_PREFIX "images/title.png");
- img_title_credits = loadimage(DATA_PREFIX "images/title-credits.png");
- img_progress = loadimage(DATA_PREFIX "images/ui/progress.png");
+ img_title = loadimage("images/title.png");
+ img_title_credits = loadimage("images/title-credits.png");
+ img_progress = loadimage("images/ui/progress.png");
if (screen->w - img_title->w >= 410 && screen->h - img_progress->h - img_title_credits->h - 40) /* FIXME: Font */
big_title = 1;
@@ -21054,9 +21111,9 @@ static void setup(void)
if (big_title)
- img_title_tuxpaint = loadimage(DATA_PREFIX "images/title-tuxpaint-2x.png");
+ img_title_tuxpaint = loadimage("images/title-tuxpaint-2x.png");
else
- img_title_tuxpaint = loadimage(DATA_PREFIX "images/title-tuxpaint.png");
+ img_title_tuxpaint = loadimage("images/title-tuxpaint.png");
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
@@ -21154,16 +21211,16 @@ static void setup(void)
#endif
medium_font = TuxPaint_Font_OpenFont(PANGO_DEFAULT_FONT,
- DATA_PREFIX "fonts/default_font.ttf",
+ "fonts/default_font.ttf",
18 - (only_uppercase * 3));
if (medium_font == NULL)
{
fprintf(stderr,
"\nError: Can't load font file: "
- DATA_PREFIX "fonts/default_font.ttf\n"
+ "%s/fonts/default_font.ttf\n"
"The Simple DirectMedia Layer error that occurred was:\n"
- "%s\n\n", SDL_GetError());
+ "%s\n\n", DATA_PREFIX, SDL_GetError());
cleanup();
exit(1);
@@ -21334,20 +21391,20 @@ static void setup(void)
for (i = 0; i < NUM_TOOLS; i++)
img_tools[i] = loadimage(tool_img_fnames[i]);
- img_title_on = loadimage(DATA_PREFIX "images/ui/title.png");
- img_title_large_on = loadimage(DATA_PREFIX "images/ui/title_large.png");
- img_title_off = loadimage(DATA_PREFIX "images/ui/no_title.png");
- img_title_large_off = loadimage(DATA_PREFIX "images/ui/no_title_large.png");
+ img_title_on = loadimage("images/ui/title.png");
+ img_title_large_on = loadimage("images/ui/title_large.png");
+ img_title_off = loadimage("images/ui/no_title.png");
+ img_title_large_off = loadimage("images/ui/no_title_large.png");
- img_btn_up = loadimage(DATA_PREFIX "images/ui/btn_up.png");
- img_btn_down = loadimage(DATA_PREFIX "images/ui/btn_down.png");
- img_btn_off = loadimage(DATA_PREFIX "images/ui/btn_off.png");
+ img_btn_up = loadimage("images/ui/btn_up.png");
+ img_btn_down = loadimage("images/ui/btn_down.png");
+ img_btn_off = loadimage("images/ui/btn_off.png");
- img_btnsm_up = loadimage(DATA_PREFIX "images/ui/btnsm_up.png");
- img_btnsm_off = loadimage(DATA_PREFIX "images/ui/btnsm_off.png");
+ img_btnsm_up = loadimage("images/ui/btnsm_up.png");
+ img_btnsm_off = loadimage("images/ui/btnsm_off.png");
- img_sfx = loadimage(DATA_PREFIX "images/tools/sfx.png");
- img_speak = loadimage(DATA_PREFIX "images/tools/speak.png");
+ img_sfx = loadimage("images/tools/sfx.png");
+ img_speak = loadimage("images/tools/speak.png");
img_black = SDL_CreateRGBSurface(SDL_SRCALPHA | SDL_SWSURFACE,
img_btn_off->w, img_btn_off->h,
@@ -21370,54 +21427,54 @@ static void setup(void)
show_progress_bar(screen);
- img_yes = loadimage(DATA_PREFIX "images/ui/yes.png");
- img_no = loadimage(DATA_PREFIX "images/ui/no.png");
+ img_yes = loadimage("images/ui/yes.png");
+ img_no = loadimage("images/ui/no.png");
- img_prev = loadimage(DATA_PREFIX "images/ui/prev.png");
- img_next = loadimage(DATA_PREFIX "images/ui/next.png");
+ img_prev = loadimage("images/ui/prev.png");
+ img_next = loadimage("images/ui/next.png");
- img_mirror = loadimage(DATA_PREFIX "images/ui/mirror.png");
- img_flip = loadimage(DATA_PREFIX "images/ui/flip.png");
+ img_mirror = loadimage("images/ui/mirror.png");
+ img_flip = loadimage("images/ui/flip.png");
- img_open = loadimage(DATA_PREFIX "images/ui/open.png");
- img_erase = loadimage(DATA_PREFIX "images/ui/erase.png");
- img_back = loadimage(DATA_PREFIX "images/ui/back.png");
- img_trash = loadimage(DATA_PREFIX "images/ui/trash.png");
+ img_open = loadimage("images/ui/open.png");
+ img_erase = loadimage("images/ui/erase.png");
+ img_back = loadimage("images/ui/back.png");
+ img_trash = loadimage("images/ui/trash.png");
- img_slideshow = loadimage(DATA_PREFIX "images/ui/slideshow.png");
- img_play = loadimage(DATA_PREFIX "images/ui/play.png");
- img_select_digits = loadimage(DATA_PREFIX "images/ui/select_digits.png");
+ img_slideshow = loadimage("images/ui/slideshow.png");
+ img_play = loadimage("images/ui/play.png");
+ img_select_digits = loadimage("images/ui/select_digits.png");
- img_popup_arrow = loadimage(DATA_PREFIX "images/ui/popup_arrow.png");
+ img_popup_arrow = loadimage("images/ui/popup_arrow.png");
- img_dead40x40 = loadimage(DATA_PREFIX "images/ui/dead40x40.png");
+ img_dead40x40 = loadimage("images/ui/dead40x40.png");
- img_printer = loadimage(DATA_PREFIX "images/ui/printer.png");
- img_printer_wait = loadimage(DATA_PREFIX "images/ui/printer_wait.png");
+ img_printer = loadimage("images/ui/printer.png");
+ img_printer_wait = loadimage("images/ui/printer_wait.png");
- img_save_over = loadimage(DATA_PREFIX "images/ui/save_over.png");
+ img_save_over = loadimage("images/ui/save_over.png");
- img_grow = loadimage(DATA_PREFIX "images/ui/grow.png");
- img_shrink = loadimage(DATA_PREFIX "images/ui/shrink.png");
+ img_grow = loadimage("images/ui/grow.png");
+ img_shrink = loadimage("images/ui/shrink.png");
- img_magic_paint = loadimage(DATA_PREFIX "images/ui/magic_paint.png");
- img_magic_fullscreen = loadimage(DATA_PREFIX "images/ui/magic_fullscreen.png");
+ img_magic_paint = loadimage("images/ui/magic_paint.png");
+ img_magic_fullscreen = loadimage("images/ui/magic_fullscreen.png");
- img_bold = loadimage(DATA_PREFIX "images/ui/bold.png");
- img_italic = loadimage(DATA_PREFIX "images/ui/italic.png");
+ img_bold = loadimage("images/ui/bold.png");
+ img_italic = loadimage("images/ui/italic.png");
- img_label = loadimage(DATA_PREFIX "images/tools/label.png");
- img_label_select = loadimage(DATA_PREFIX "images/tools/label_select.png");
+ img_label = loadimage("images/tools/label.png");
+ img_label_select = loadimage("images/tools/label_select.png");
show_progress_bar(screen);
- tmp_imgcurup = loadimage(DATA_PREFIX "images/ui/cursor_up_large.png");
- tmp_imgcurdown = loadimage(DATA_PREFIX "images/ui/cursor_down_large.png");
+ tmp_imgcurup = loadimage("images/ui/cursor_up_large.png");
+ tmp_imgcurdown = loadimage("images/ui/cursor_down_large.png");
img_cursor_up = thumbnail(tmp_imgcurup, THUMB_W, THUMB_H, 0);
img_cursor_down = thumbnail(tmp_imgcurdown, THUMB_W, THUMB_H, 0);
- tmp_imgcurup = loadimage(DATA_PREFIX "images/ui/cursor_starter_up.png");
- tmp_imgcurdown = loadimage(DATA_PREFIX "images/ui/cursor_starter_down.png");
+ tmp_imgcurup = loadimage("images/ui/cursor_starter_up.png");
+ tmp_imgcurdown = loadimage("images/ui/cursor_starter_down.png");
img_cursor_starter_up = thumbnail(tmp_imgcurup, THUMB_W, THUMB_H, 0);
img_cursor_starter_down = thumbnail(tmp_imgcurdown, THUMB_W, THUMB_H, 0);
SDL_FreeSurface(tmp_imgcurup);
@@ -21425,22 +21482,22 @@ static void setup(void)
show_progress_bar(screen);
- img_scroll_up = loadimage(DATA_PREFIX "images/ui/scroll_up.png");
- img_scroll_down = loadimage(DATA_PREFIX "images/ui/scroll_down.png");
+ img_scroll_up = loadimage("images/ui/scroll_up.png");
+ img_scroll_down = loadimage("images/ui/scroll_down.png");
- img_scroll_up_off = loadimage(DATA_PREFIX "images/ui/scroll_up_off.png");
+ img_scroll_up_off = loadimage("images/ui/scroll_up_off.png");
img_scroll_down_off =
- loadimage(DATA_PREFIX "images/ui/scroll_down_off.png");
+ loadimage("images/ui/scroll_down_off.png");
#ifdef LOW_QUALITY_COLOR_SELECTOR
- img_paintcan = loadimage(DATA_PREFIX "images/ui/paintcan.png");
+ img_paintcan = loadimage("images/ui/paintcan.png");
#endif
show_progress_bar(screen);
/* Load brushes: */
- load_brush_dir(screen, DATA_PREFIX "brushes");
+ load_brush_dir(screen, "brushes");
homedirdir = get_fname("brushes", DIR_DATA);
load_brush_dir(screen, homedirdir);
#ifdef WIN32
@@ -21452,8 +21509,8 @@ static void setup(void)
if (num_brushes == 0)
{
fprintf(stderr,
- "\nError: No brushes found in " DATA_PREFIX "brushes/\n"
- "or %s\n\n", homedirdir);
+ "\nError: No brushes found in %s/brushes/\n"
+ "or %s\n\n", DATA_PREFIX, homedirdir);
cleanup();
exit(1);
}
@@ -21464,16 +21521,16 @@ static void setup(void)
/* Load system fonts: */
large_font = TuxPaint_Font_OpenFont(PANGO_DEFAULT_FONT,
- DATA_PREFIX "fonts/default_font.ttf",
+ "fonts/default_font.ttf",
30 - (only_uppercase * 3));
if (large_font == NULL)
{
fprintf(stderr,
"\nError: Can't load font file: "
- DATA_PREFIX "fonts/default_font.ttf\n"
+ "%s/fonts/default_font.ttf\n"
"The Simple DirectMedia Layer error that occurred was:\n"
- "%s\n\n", SDL_GetError());
+ "%s\n\n", DATA_PREFIX, SDL_GetError());
cleanup();
exit(1);
@@ -21481,7 +21538,7 @@ static void setup(void)
small_font = TuxPaint_Font_OpenFont(PANGO_DEFAULT_FONT,
- DATA_PREFIX "fonts/default_font.ttf",
+ "fonts/default_font.ttf",
#ifdef __APPLE__
12 - (only_uppercase * 2));
#else
@@ -21492,9 +21549,9 @@ static void setup(void)
{
fprintf(stderr,
"\nError: Can't load font file: "
- DATA_PREFIX "fonts/default_font.ttf\n"
+ "%s/fonts/default_font.ttf\n"
"The Simple DirectMedia Layer error that occurred was:\n"
- "%s\n\n", SDL_GetError());
+ "%s\n\n", DATA_PREFIX, SDL_GetError());
cleanup();
exit(1);
@@ -21536,12 +21593,12 @@ static void setup(void)
show_progress_bar(screen);
- img_mouse = loadimage(DATA_PREFIX "images/ui/mouse.png");
- img_mouse_click = loadimage(DATA_PREFIX "images/ui/mouse_click.png");
+ img_mouse = loadimage("images/ui/mouse.png");
+ img_mouse_click = loadimage("images/ui/mouse_click.png");
show_progress_bar(screen);
- img_color_picker = loadimage(DATA_PREFIX "images/ui/color_picker.png");
+ img_color_picker = loadimage("images/ui/color_picker.png");
/* Create toolbox and selector labels: */
@@ -21575,7 +21632,7 @@ static void setup(void)
#ifndef LOW_QUALITY_COLOR_SELECTOR
/* Create appropriately-shaped buttons: */
- img1 = loadimage(DATA_PREFIX "images/ui/paintwell.png");
+ img1 = loadimage("images/ui/paintwell.png");
img_paintwell = thumbnail(img1, color_button_w, color_button_h, 0);
tmp_btn_up = thumbnail(img_btn_up, color_button_w, color_button_h, 0);
tmp_btn_down = thumbnail(img_btn_down, color_button_w, color_button_h, 0);
@@ -21832,7 +21889,22 @@ int main(int argc, char *argv[])
CLOCK_TYPE time2;
CLOCK_TYPE time3;
- (void)argc;
+ char *data_prefix_realpath = NULL;
+ char *magic_prefix_realpath = NULL;
+ char *localedir_realpath = NULL;
+ const char *envdir = NULL;
+
+ envdir = getenv("TUXPAINT_DATA_PREFIX");
+ if (envdir)
+ DATA_PREFIX = data_prefix_realpath = realpath(envdir, NULL);
+
+ envdir = getenv("TUXPAINT_MAGIC_PREFIX");
+ if (envdir)
+ MAGIC_PREFIX = magic_prefix_realpath = realpath(envdir, NULL);
+
+ envdir = getenv("TUXPAINT_LOCALEDIR");
+ if (envdir)
+ LOCALEDIR = localedir_realpath = realpath(envdir, NULL);
CLOCK_ASM(time1);
@@ -21876,5 +21948,10 @@ int main(int argc, char *argv[])
save_current();
wait_for_sfx();
cleanup();
+
+ free(data_prefix_realpath);
+ free(magic_prefix_realpath);
+ free(localedir_realpath);
+
return 0;
}