#ifdef HAVE_CONFIG_H #include "config.h" #else #define HAVE_DIRENT_H #define HAVE_UNISTD_H #endif #include #include #include #include #include #include #ifdef HAVE_DIRENT_H #include #endif #include #ifdef HAVE_UNISTD_H #include #endif #include "gimpressionist.h" #include "ppmtool.h" #include /* #include */ #ifndef GIMP_CHECK_VERSION #define GIMP_CHECK_VERSION(a,b,c) 0 #endif GtkWidget *window = NULL; GtkTooltips *tooltips = NULL; struct ppm infile = {0,0,NULL}; struct ppm inalpha = {0,0,NULL}; GList *parsepath(void) { GParam *return_vals; gint nreturn_vals; static GList *lastpath = NULL; char *gimpdatasubdir, *defaultpath, *tmps, *lastchr; struct stat st; if(lastpath) return lastpath; #if GIMP_CHECK_VERSION(1, 1, 0) gimpdatasubdir = g_strconcat (gimp_data_directory (), G_DIR_SEPARATOR_S, "gimpressionist", NULL); defaultpath = g_strconcat (gimp_directory (), G_DIR_SEPARATOR_S, "gimpressionist", G_SEARCHPATH_SEPARATOR_S, gimpdatasubdir, NULL); #else defaultpath = DEFAULTPATH; gimpdatasubdir = strchr (defaultpath, ':') + 1; #endif if(standalone) tmps = g_strdup(defaultpath); else { return_vals = gimp_run_procedure ("gimp_gimprc_query", &nreturn_vals, PARAM_STRING, "gimpressionist-path", PARAM_END); if(return_vals[0].data.d_status != STATUS_SUCCESS || return_vals[1].data.d_string == NULL) { if (stat (gimpdatasubdir, &st) != 0 || !S_ISDIR(st.st_mode)) { /* No gimpressionist-path parameter, and the default doesn't exist */ #if GIMP_CHECK_VERSION(1, 1, 0) g_message("*** Warning ***\n" "It is highly recommended to add\n" " (gimpressionist-path \"${gimp_dir}" G_DIR_SEPARATOR_S "gimpressionist" G_SEARCHPATH_SEPARATOR_S "${gimp_data_dir}" G_DIR_SEPARATOR_S "gimpressionist\")\n" "(or similar) to your gimprc file.\n"); #else g_message("*** Warning ***\nIt is highly recommended to add\n (gimpressionist-path \"%s\")\n(or similar) to your gimprc file.\n", defaultpath); #endif } tmps = g_strdup(defaultpath); } else { tmps = g_strdup(return_vals[1].data.d_string); } gimp_destroy_params (return_vals, nreturn_vals); } for(;;) { lastchr = strchr(tmps, G_SEARCHPATH_SEPARATOR); if(lastchr) *lastchr = '\0'; if(*tmps == '~') { char *tmps2, *home; home = g_get_home_dir (); if(!home) { g_message("*** Warning ***\nNo home directory!\n"); home = ""; } tmps2 = g_strconcat(home, tmps + 1, NULL); tmps = tmps2; } lastpath = g_list_append(lastpath, tmps); if(lastchr) tmps = lastchr + 1; else break; } return lastpath; } char *findfile(char *fn) { static GList *rcpath = NULL; GList *thispath; static char file[200]; struct stat st; if(!rcpath) rcpath = parsepath(); thispath = rcpath; while(rcpath && thispath) { sprintf(file, "%s" G_DIR_SEPARATOR_S "%s", (char *)thispath->data, fn); if(!stat(file, &st)) return file; thispath = thispath->next; } return NULL; } void storevals(void) { pcvals.orientnum = GTK_ADJUSTMENT(orientnumadjust)->value; pcvals.orientfirst = GTK_ADJUSTMENT(orientfirstadjust)->value; pcvals.orientlast = GTK_ADJUSTMENT(orientlastadjust)->value; pcvals.sizenum = GTK_ADJUSTMENT(sizenumadjust)->value; pcvals.sizefirst = GTK_ADJUSTMENT(sizefirstadjust)->value; pcvals.sizelast = GTK_ADJUSTMENT(sizelastadjust)->value; pcvals.brushrelief = GTK_ADJUSTMENT(brushreliefadjust)->value; pcvals.brushaspect = GTK_ADJUSTMENT(brushaspectadjust)->value; pcvals.brushdensity = GTK_ADJUSTMENT(brushdensityadjust)->value; pcvals.brushgamma = GTK_ADJUSTMENT(brushgammaadjust)->value; pcvals.generaldarkedge = GTK_ADJUSTMENT(generaldarkedgeadjust)->value; pcvals.paperrelief = GTK_ADJUSTMENT(paperreliefadjust)->value; pcvals.paperscale = GTK_ADJUSTMENT(paperscaleadjust)->value; pcvals.paperinvert = GTK_TOGGLE_BUTTON(paperinvert)->active; pcvals.generalpaintedges = GTK_TOGGLE_BUTTON(generalpaintedges)->active; pcvals.generaltileable = GTK_TOGGLE_BUTTON(generaltileable)->active; pcvals.generaldropshadow = GTK_TOGGLE_BUTTON(generaldropshadow)->active; pcvals.generalshadowdarkness = GTK_ADJUSTMENT(generalshadowadjust)->value; pcvals.generalshadowdepth = GTK_ADJUSTMENT(generalshadowdepth)->value; pcvals.generalshadowblur = GTK_ADJUSTMENT(generalshadowblur)->value; pcvals.devthresh = GTK_ADJUSTMENT(devthreshadjust)->value; pcvals.placecenter = GTK_TOGGLE_BUTTON(placecenter)->active; pcvals.paperoverlay = GTK_TOGGLE_BUTTON(paperoverlay)->active; } void restorevals(void) { reselect(brushlist, pcvals.selectedbrush); reselect(paperlist, pcvals.selectedpaper); gtk_adjustment_set_value(GTK_ADJUSTMENT(orientnumadjust), pcvals.orientnum); gtk_adjustment_set_value(GTK_ADJUSTMENT(orientfirstadjust), pcvals.orientfirst); gtk_adjustment_set_value(GTK_ADJUSTMENT(orientlastadjust), pcvals.orientlast); orientchange(NULL, NULL, pcvals.orienttype); gtk_adjustment_set_value(GTK_ADJUSTMENT(sizenumadjust), pcvals.sizenum); gtk_adjustment_set_value(GTK_ADJUSTMENT(sizefirstadjust), pcvals.sizefirst); gtk_adjustment_set_value(GTK_ADJUSTMENT(sizelastadjust), pcvals.sizelast); sizechange(NULL, NULL, pcvals.sizetype); placechange(NULL, NULL, pcvals.placetype); generalbgchange(NULL, NULL, pcvals.generalbgtype); gtk_adjustment_set_value(GTK_ADJUSTMENT(brushgammaadjust), pcvals.brushgamma); gtk_adjustment_set_value(GTK_ADJUSTMENT(brushreliefadjust), pcvals.brushrelief); gtk_adjustment_set_value(GTK_ADJUSTMENT(brushaspectadjust), pcvals.brushaspect); gtk_adjustment_set_value(GTK_ADJUSTMENT(brushdensityadjust), pcvals.brushdensity); gtk_adjustment_set_value(GTK_ADJUSTMENT(generaldarkedgeadjust), pcvals.generaldarkedge); gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowadjust), pcvals.generalshadowdarkness); gtk_adjustment_set_value(GTK_ADJUSTMENT(devthreshadjust), pcvals.devthresh); gtk_adjustment_set_value(GTK_ADJUSTMENT(paperreliefadjust), pcvals.paperrelief); gtk_adjustment_set_value(GTK_ADJUSTMENT(paperscaleadjust), pcvals.paperscale); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(paperinvert), pcvals.paperinvert); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(generalpaintedges), pcvals.generalpaintedges); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(generaltileable), pcvals.generaltileable); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(generaldropshadow), pcvals.generaldropshadow); gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowdepth), pcvals.generalshadowdepth); gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowblur), pcvals.generalshadowblur); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(placecenter), pcvals.placecenter); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(paperoverlay), pcvals.paperoverlay); drawcolor(NULL); update_orientmap_dialog(); } static void dialog_close_callback(GtkWidget *widget, gpointer data) { gtk_main_quit(); } static void dialog_ok_callback(GtkWidget *widget, gpointer data) { storevals(); pcvals.run = 1; gtk_widget_destroy(GTK_WIDGET(data)); if(omwindow) gtk_widget_destroy(GTK_WIDGET(omwindow)); } static void dialog_cancel_callback(GtkWidget *widget, gpointer data) { pcvals.run = 0; gtk_widget_destroy(GTK_WIDGET(data)); } void unselectall(GtkWidget *list) { GList *h; GtkWidget *tmpw; for(;;) { h = GTK_LIST(list)->selection; if(!h) break; tmpw = h->data; if(!tmpw) break; gtk_list_unselect_child(GTK_LIST(list), tmpw); } } void reselect(GtkWidget *list, char *fname) { GList *h; GtkWidget *tmpw; char *tmps, *tmpfile; tmpfile = strrchr(fname, G_DIR_SEPARATOR); if(tmpfile) fname = ++tmpfile; unselectall(list); /* for(;;) { h = GTK_LIST(list)->selection; if(!h) break; tmpw = h->data; if(!tmpw) break; gtk_list_unselect_child(GTK_LIST(list), tmpw); } */ h = GTK_LIST(list)->children; while(h) { tmpw = h->data; gtk_label_get(GTK_LABEL(GTK_BIN(tmpw)->child), &tmps); if(!strcmp(tmps, fname)) { gtk_list_select_child(GTK_LIST(list), tmpw); break; } h = g_list_next(h); } } void readdirintolist_real(char *subdir, GtkWidget *list, char *selected) { char *fpath; struct dirent *de; struct stat st; GtkWidget *selectedw = NULL, *tmpw; DIR *dir; GList *flist = NULL; if(selected) { if(!selected[0]) selected = NULL; else { char *nsel; nsel = strrchr(selected, G_DIR_SEPARATOR); if(nsel) selected = ++nsel; } } dir = opendir(subdir); if(!dir) return; for(;;) { if(!(de = readdir(dir))) break; fpath = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", subdir, de->d_name); stat(fpath, &st); g_free(fpath); if(!S_ISREG(st.st_mode)) continue; flist = g_list_insert_sorted(flist, g_strdup(de->d_name), (GCompareFunc)g_strcasecmp); } closedir(dir); while(flist) { tmpw = gtk_list_item_new_with_label(flist->data); if(selected) if(!strcmp(flist->data, selected)) selectedw = tmpw; gtk_container_add(GTK_CONTAINER(list), tmpw); gtk_widget_show(tmpw); g_free(flist->data); flist = g_list_remove(flist,flist->data); } if(selectedw) gtk_list_select_child(GTK_LIST(list), selectedw); else gtk_list_select_item(GTK_LIST(list), 0); } void readdirintolist(char *subdir, GtkWidget *list, char *selected) { char *tmpdir; GList *thispath = parsepath(); while(thispath) { tmpdir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", (char *)thispath->data, subdir); readdirintolist_real(tmpdir, list, selected); g_free(tmpdir); thispath = thispath->next; } } void showabout(void) { static GtkWidget *window = NULL; GtkWidget *tmpw, *tmpvbox, *tmphbox; GtkWidget *logobox, *tmpframe; int y; if(window) { gtk_widget_show(window); gdk_window_raise(window->window); return; } window = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(window), "The GIMPressionist!"); gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window); gtk_quit_add_destroy (1, GTK_OBJECT(window)); gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC (gtk_widget_hide_on_delete), &window); tmpw = gtk_button_new_with_label("OK"); GTK_WIDGET_SET_FLAGS(tmpw, GTK_CAN_DEFAULT); gtk_signal_connect_object (GTK_OBJECT(tmpw), "clicked", GTK_SIGNAL_FUNC (gtk_widget_hide), GTK_OBJECT(window)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->action_area), tmpw, TRUE, TRUE, 0); gtk_widget_grab_default(tmpw); gtk_widget_show(tmpw); tmpvbox = gtk_vbox_new(FALSE, 5); gtk_container_border_width(GTK_CONTAINER(tmpvbox), 5); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), tmpvbox); tmphbox = gtk_hbox_new(TRUE, 5); gtk_box_pack_start(GTK_BOX(tmpvbox), tmphbox, TRUE, TRUE, 0); gtk_widget_show(tmphbox); logobox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (tmphbox), logobox, FALSE, FALSE, 0); gtk_widget_show(logobox); tmpframe = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (tmpframe), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (logobox), tmpframe, TRUE, TRUE, 0); gtk_widget_show(tmpframe); tmpw = gtk_preview_new(GTK_PREVIEW_COLOR); gtk_preview_size (GTK_PREVIEW(tmpw), 177, 70); for(y = 0; y < 70; y++) { gtk_preview_draw_row (GTK_PREVIEW(tmpw), &logobuffer[y*177*3], 0, y, 177); } gtk_widget_draw(tmpw, NULL); gtk_container_add(GTK_CONTAINER(tmpframe), tmpw); gtk_widget_show(tmpw); tmphbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(tmpvbox), tmphbox, TRUE, TRUE, 0); tmpw = gtk_label_new("\xa9 1999 Vidar Madsen\n" "vidar@prosalg.no\n" "http://www.prosalg.no/~vidar/gimpressionist/\n" PLUG_IN_VERSION ); gtk_box_pack_start(GTK_BOX(tmphbox), tmpw, TRUE, FALSE, 0); gtk_widget_show(tmpw); gtk_widget_show(tmphbox); gtk_widget_show(tmpvbox); gtk_widget_show(window); } int create_dialog(void) { GtkWidget *notebook; GtkWidget *tmpw, *box1, *box2, *box3, *preview_box; gint argc; gchar **argv; guchar *color_cube; argc = 1; argv = g_new(char *, 1); argv[0] = "gimpressionist"; gtk_init(&argc, &argv); gtk_rc_parse (gimp_gtkrc ()); if(!standalone) { gdk_set_use_xshm(gimp_use_xshm()); gtk_preview_set_gamma(gimp_gamma()); gtk_preview_set_install_cmap(gimp_install_cmap()); color_cube = gimp_color_cube(); gtk_preview_set_color_cube(color_cube[0], color_cube[1], color_cube[2], color_cube[3]); } gtk_widget_set_default_visual(gtk_preview_get_visual()); gtk_widget_set_default_colormap(gtk_preview_get_cmap()); tooltips = gtk_tooltips_new(); gtk_tooltips_enable(tooltips); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", (GtkSignalFunc)dialog_close_callback, NULL); gtk_window_set_title (GTK_WINDOW (window), "The GIMPressionist!"); gtk_container_border_width (GTK_CONTAINER (window), 5); box1 = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); gtk_widget_show (box1); box2 = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0); gtk_widget_show (box2); notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_box_pack_start (GTK_BOX (box1), notebook, TRUE, TRUE, 5); gtk_container_border_width (GTK_CONTAINER (notebook), 0); gtk_widget_realize (notebook); gtk_widget_show(notebook); create_paperpage(GTK_NOTEBOOK (notebook)); create_brushpage(GTK_NOTEBOOK (notebook)); create_orientationpage(GTK_NOTEBOOK (notebook)); create_sizepage(GTK_NOTEBOOK (notebook)); create_placementpage(GTK_NOTEBOOK (notebook)); create_generalpage(GTK_NOTEBOOK (notebook)); create_presetpage(GTK_NOTEBOOK (notebook)); preview_box = create_preview(); gtk_box_pack_start (GTK_BOX (box2), preview_box, FALSE, FALSE, 0); gtk_widget_show (preview_box); box3 = gtk_hbox_new (TRUE, 0); gtk_box_pack_end (GTK_BOX (box2), box3, FALSE, FALSE, 0); gtk_widget_show (box3); tmpw = gtk_button_new_with_label(" OK "); gtk_signal_connect(GTK_OBJECT(tmpw), "clicked", (GtkSignalFunc)dialog_ok_callback, window); gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (tmpw, GTK_CAN_DEFAULT); gtk_widget_grab_default (tmpw); gtk_widget_show(tmpw); gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Run with the selected settings", NULL); tmpw = gtk_button_new_with_label(" Cancel "); gtk_signal_connect(GTK_OBJECT(tmpw), "clicked", (GtkSignalFunc)dialog_cancel_callback, window); gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0); gtk_widget_show(tmpw); gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Quit the program", NULL); tmpw = gtk_button_new_with_label(" About... "); gtk_signal_connect(GTK_OBJECT(tmpw), "clicked", (GtkSignalFunc)showabout, window); gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0); gtk_widget_show(tmpw); gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Show some information about program", NULL); gtk_widget_show(window); return 1; } int create_gimpressionist(void) { pcvals.run = 0; if(standalone) { memcpy(&pcvals, &defaultpcvals, sizeof(pcvals)); create_dialog(); restorevals(); } else { create_dialog(); } gtk_main(); gdk_flush(); return pcvals.run; } char *standalone = NULL; extern GPlugInInfo PLUG_IN_INFO; #ifdef NATIVE_WIN32 /* No standalone on win32. */ MAIN() #else int main(int argc, char **argv) { if(argc != 2) { /* Is this needed anymore? */ #ifdef __EMX__ set_gimp_PLUG_IN_INFO(&PLUG_IN_INFO); #endif return gimp_main(argc, argv); } standalone = argv[1]; grabarea(); /* Testing! */ /* copyppm(&infile, &inalpha); img_has_alpha = 1; */ if(create_gimpressionist()) { fprintf(stderr, "Painting"); fflush(stderr); repaint(&infile, &inalpha); saveppm(&infile, argv[1]); } return 0; } #endif