diff options
Diffstat (limited to 'src/tuxpaint.c')
-rw-r--r-- | src/tuxpaint.c | 261 |
1 files changed, 166 insertions, 95 deletions
diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 74d991a..8ddcea3 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: */ @@ -103,6 +102,10 @@ #define TPAINT_AMASK 0x000000ff #endif +char *DATA_PREFIX; +char *MAGIC_PREFIX; +char *LOCALEDIR; + static unsigned draw_colors(unsigned action); /* hide all scale-related values here */ @@ -465,6 +468,7 @@ extern WrapperData macosx; #include "compiler.h" #include "sugar.h" +#include "tuxpaint.h" #if VIDEO_BPP==32 @@ -1580,7 +1584,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); @@ -5618,9 +5622,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); @@ -5845,9 +5847,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); } @@ -6716,8 +6729,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); } @@ -6730,7 +6755,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 @@ -6743,8 +6768,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; @@ -6894,21 +6919,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; } @@ -6996,10 +7023,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: */ @@ -9787,12 +9820,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) { @@ -10352,13 +10391,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/templates", DATA_PREFIX); + dirname = strdup(fname); + } else dirname = get_fname("starters", DIR_DATA); @@ -10527,13 +10569,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); @@ -11393,8 +11438,11 @@ static void cleanup(void) #ifdef LOW_QUALITY_COLOR_SELECTOR free_surface(&img_paintcan); #else - free_surface_array(img_color_btns, NUM_COLORS * 2); - free(img_color_btns); + if (img_color_btns) + { + free_surface_array(img_color_btns, NUM_COLORS * 2); + free(img_color_btns); + } #endif free_surface(&screen); @@ -17124,8 +17172,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) { @@ -17136,8 +17184,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); } @@ -20273,6 +20321,8 @@ static void setup_config(char *argv[]) if(tmpcfg_cmd.savedir) savedir = strdup(tmpcfg_cmd.savedir); + else if (sugar_detected()) + savedir = sugar_get_savedir(); else { #ifdef _WIN32 @@ -20836,7 +20886,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) { @@ -20980,9 +21040,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; @@ -20991,9 +21051,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)); @@ -21091,16 +21151,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); @@ -21271,20 +21331,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, @@ -21307,54 +21367,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); @@ -21362,22 +21422,21 @@ 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_down_off = - loadimage(DATA_PREFIX "images/ui/scroll_down_off.png"); + img_scroll_up_off = loadimage("images/ui/scroll_up_off.png"); + img_scroll_down_off = 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 @@ -21389,8 +21448,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); } @@ -21401,16 +21460,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); @@ -21418,7 +21477,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 @@ -21429,9 +21488,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); @@ -21473,12 +21532,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: */ @@ -21512,7 +21571,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); @@ -21774,6 +21833,18 @@ int main(int argc, char *argv[]) CLOCK_TYPE time2; CLOCK_TYPE time3; + DATA_PREFIX = getenv("TUXPAINT_DATA_PREFIX"); + if (DATA_PREFIX == NULL) + DATA_PREFIX = DEFAULT_DATA_PREFIX; + + MAGIC_PREFIX = getenv("TUXPAINT_MAGIC_PREFIX"); + if (MAGIC_PREFIX == NULL) + MAGIC_PREFIX = DEFAULT_MAGIC_PREFIX; + + LOCALEDIR = getenv("TUXPAINT_LOCALEDIR"); + if (LOCALEDIR == NULL) + LOCALEDIR = DEFAULT_LOCALEDIR; + sugar_init(&argc, &argv); CLOCK_ASM(time1); |