diff options
Diffstat (limited to 'src/tuxpaint.c')
-rw-r--r-- | src/tuxpaint.c | 263 |
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; } |