home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / gimpressionist / sizemap.c < prev   
Encoding:
C/C++ Source or Header  |  2000-08-31  |  16.6 KB  |  542 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <gtk/gtk.h>
  6. #include "gimpressionist.h"
  7. #include "ppmtool.h"
  8. #include "config.h"
  9. #include <libgimp/stdplugins-intl.h>
  10.  
  11. #define MAPFILE "data.out"
  12.  
  13. GtkWidget *smwindow = NULL;
  14.  
  15. GtkWidget *smvectorprev = NULL;
  16. GtkWidget *smpreviewprev = NULL;
  17.  
  18. GtkObject *smvectprevbrightadjust = NULL;
  19.  
  20. GtkObject *sizadjust = NULL;
  21. GtkObject *smstradjust = NULL;
  22. GtkObject *smstrexpadjust = NULL;
  23. GtkWidget *sizevoronoi = NULL;
  24.  
  25. #define OMWIDTH 150
  26. #define OMHEIGHT 150
  27.  
  28. char sbuffer[OMWIDTH*OMHEIGHT];
  29.  
  30. struct smvector_t smvector[MAXSIZEVECT];
  31. int numsmvect = 0;
  32.  
  33. double dist(double x, double y, double dx, double dy);
  34.  
  35.  
  36. double getsiz(double x, double y, int from)
  37. {
  38.   int i;
  39.   int n;
  40.   int voronoi;
  41.   double sum, ssum, dst;
  42.   struct smvector_t *vec;
  43.   double smstrexp;
  44.   int first = 0, last;
  45.  
  46.   if((x < 0.0) || (x > 1.0)) printf("HUH? x = %f\n",x);
  47.  
  48.   if(from == 0) {
  49.     n = numsmvect;
  50.     vec = smvector;
  51.     smstrexp = GTK_ADJUSTMENT(smstrexpadjust)->value;
  52.     voronoi = GTK_TOGGLE_BUTTON(sizevoronoi)->active;
  53.   } else {
  54.     n = pcvals.numsizevector;
  55.     vec = pcvals.sizevector;
  56.     smstrexp = pcvals.sizestrexp;
  57.     voronoi = pcvals.sizevoronoi;
  58.   }
  59.  
  60.   if(voronoi) {
  61.     double bestdist = -1.0;
  62.     for(i = 0; i < n; i++) {
  63.       dst = dist(x,y,vec[i].x,vec[i].y);
  64.       if((bestdist < 0.0) || (dst < bestdist)) {
  65.     bestdist = dst;
  66.     first = i;
  67.       }
  68.     }
  69.     last = first+1;
  70.   } else {
  71.     first = 0;
  72.     last = n;
  73.   }
  74.  
  75.   sum = ssum = 0.0;
  76.   for(i = first; i < last; i++) {
  77.     double s = vec[i].str;
  78.  
  79.     dst = dist(x,y,vec[i].x,vec[i].y);
  80.     dst = pow(dst, smstrexp);
  81.     if(dst < 0.0001) dst = 0.0001;
  82.     s = s / dst;
  83.  
  84.     sum += vec[i].siz * s;
  85.     ssum += 1.0/dst;
  86.   }
  87.   sum = sum / ssum / 100.0;
  88.   if(sum < 0.0) sum = 0.0;
  89.   else if(sum > 1.0) sum = 1.0;
  90.   return sum;
  91. }
  92.  
  93. void updatesmpreviewprev(void)
  94. {
  95.   int x, y;
  96.   static struct ppm nsbuffer = {0,0,NULL};
  97.   guchar black[3] = {0,0,0};
  98.   guchar gray[3] = {120,120,120};
  99.  
  100.   if(!nsbuffer.col) {
  101.     newppm(&nsbuffer,OMWIDTH,OMHEIGHT);
  102.   }
  103.   fill(&nsbuffer, black);
  104.  
  105.   for(y = 6; y < OMHEIGHT-4; y += 10)
  106.     for(x = 6; x < OMWIDTH-4; x += 10) {
  107.       double siz = 5 * getsiz(x/(double)OMWIDTH,y/(double)OMHEIGHT,0);
  108.       drawline(&nsbuffer, x-siz, y-siz, x+siz, y-siz, gray);
  109.       drawline(&nsbuffer, x+siz, y-siz, x+siz, y+siz, gray);
  110.       drawline(&nsbuffer, x+siz, y+siz, x-siz, y+siz, gray);
  111.       drawline(&nsbuffer, x-siz, y+siz, x-siz, y-siz, gray);
  112.     }
  113.  
  114.   for(y = 0; y < OMHEIGHT; y++)
  115.     gtk_preview_draw_row(GTK_PREVIEW(smpreviewprev), &nsbuffer.col[y*nsbuffer.width*3], 0, y, OMWIDTH);
  116.   gtk_widget_draw(smpreviewprev,NULL);
  117. }
  118.  
  119. int selectedsmvector = 0;
  120.  
  121. void updatesmvectorprev(void)
  122. {
  123.   static struct ppm backup = {0,0,NULL};
  124.   static struct ppm sbuffer = {0,0,NULL};
  125.   static int ok = 0;
  126.   int i, x, y;
  127.   double val;
  128.   static double lastval = 0.0;
  129.   guchar gray[3] = {120,120,120};
  130.   guchar red[3] = {255,0,0};
  131.   guchar white[3] = {255,255,255};
  132.  
  133.   if(smvectprevbrightadjust) val = 1.0 - GTK_ADJUSTMENT(smvectprevbrightadjust)->value / 100.0;
  134.   else val = 0.5;
  135.  
  136.   if(!ok || (val != lastval)) {
  137.     if(!infile.col)
  138.       updatepreviewprev(NULL, (void *)2); /* Force grabarea() */
  139.     copyppm(&infile, &backup);
  140.     ppmbrightness(&backup, val, 1,1,1);
  141.     if((backup.width != OMWIDTH) || (backup.height != OMHEIGHT))
  142.       resize_fast(&backup, OMWIDTH, OMHEIGHT);
  143.     ok = 1;
  144.   }
  145.   copyppm(&backup, &sbuffer);
  146.  
  147.   for(i = 0; i < numsmvect; i++) {
  148.     x = smvector[i].x * OMWIDTH;
  149.     y = smvector[i].y * OMHEIGHT;
  150.     if(i == selectedsmvector) {
  151.       drawline(&sbuffer, x-5, y, x+5, y, red);
  152.       drawline(&sbuffer, x, y-5, x, y+5, red);
  153.     } else {
  154.       drawline(&sbuffer, x-5, y, x+5, y, gray);
  155.       drawline(&sbuffer, x, y-5, x, y+5, gray);
  156.     }
  157.     putrgb(&sbuffer, x, y, white);
  158.   }
  159.  
  160.   for(y = 0; y < OMHEIGHT; y++)
  161.     gtk_preview_draw_row(GTK_PREVIEW(smvectorprev), &sbuffer.col[y*sbuffer.width*3], 0, y, OMWIDTH);
  162.   gtk_widget_draw(smvectorprev,NULL);
  163.  
  164. }
  165.  
  166.  
  167. int smadjignore = 0;
  168.  
  169. void updatesmsliders(void)
  170. {
  171.   smadjignore = 1;
  172.   gtk_adjustment_set_value(GTK_ADJUSTMENT(sizadjust),
  173.                smvector[selectedsmvector].siz);
  174.   gtk_adjustment_set_value(GTK_ADJUSTMENT(smstradjust),
  175.                smvector[selectedsmvector].str);
  176.   smadjignore = 0;
  177. }
  178.  
  179. void smprevclick(GtkWidget *w, gpointer data)
  180. {
  181.   selectedsmvector--;
  182.   if(selectedsmvector < 0) selectedsmvector = numsmvect-1;
  183.   updatesmsliders();
  184.   updatesmvectorprev();
  185. }
  186.  
  187. void smnextclick(GtkWidget *w, gpointer data)
  188. {
  189.   selectedsmvector++;
  190.   if(selectedsmvector == numsmvect) selectedsmvector = 0;
  191.   updatesmsliders();
  192.   updatesmvectorprev();
  193. }
  194.  
  195. void smaddclick(GtkWidget *w, gpointer data)
  196. {
  197.   if(numsmvect + 1 == MAXSIZEVECT) return;
  198.   smvector[numsmvect].x = 0.5;
  199.   smvector[numsmvect].y = 0.5;
  200.   smvector[numsmvect].siz = 50.0;
  201.   smvector[numsmvect].str = 1.0;
  202.   selectedsmvector = numsmvect;
  203.   numsmvect++;
  204.   updatesmsliders();
  205.   updatesmvectorprev();
  206.   updatesmpreviewprev();
  207. }
  208.  
  209. void smdeleteclick(GtkWidget *w, gpointer data)
  210. {
  211.   int i;
  212.  
  213.   if(numsmvect == 1) return;
  214.  
  215.   for(i = selectedsmvector; i < numsmvect-1; i++) {
  216.     memcpy(&smvector[i], &smvector[i+1], sizeof(struct smvector_t));
  217.   }
  218.   numsmvect--;
  219.   if(selectedsmvector >= numsmvect) selectedsmvector = 0;
  220.   updatesmsliders();
  221.   updatesmvectorprev();
  222.   updatesmpreviewprev();
  223. }
  224.  
  225.  
  226. void smmapclick(GtkWidget *w, GdkEventButton *event)
  227. {
  228.   if(event->button == 1) {
  229.     smvector[selectedsmvector].x = event->x / (double)OMWIDTH;
  230.     smvector[selectedsmvector].y = event->y / (double)OMHEIGHT;
  231.  
  232.   } else if(event->button == 2) {
  233.     if(numsmvect + 1 == MAXSIZEVECT) return;
  234.     smvector[numsmvect].x = event->x / (double)OMWIDTH;
  235.     smvector[numsmvect].y = event->y / (double)OMHEIGHT;
  236.     smvector[numsmvect].siz = 0.0;
  237.     smvector[numsmvect].str = 1.0;
  238.     selectedsmvector = numsmvect;
  239.     numsmvect++;
  240.     updatesmsliders();
  241.  
  242.     /*
  243.   } else if(event->button == 3) {
  244.     double d;
  245.     d = atan2(OMWIDTH * smvector[selectedsmvector].x - event->x,
  246.           OMHEIGHT * smvector[selectedsmvector].y - event->y);
  247.     smvector[selectedsmvector].dir = radtodeg(d);
  248.     updatesmsliders();
  249.     */
  250.   }
  251.   updatesmvectorprev();
  252.   updatesmpreviewprev();
  253. }
  254.  
  255. void angsmadjmove(GtkWidget *w, gpointer data)
  256. {
  257.   if(smadjignore) return;
  258.   smvector[selectedsmvector].siz = GTK_ADJUSTMENT(sizadjust)->value;
  259.   updatesmvectorprev();
  260.   updatesmpreviewprev();
  261. }
  262.  
  263. void strsmadjmove(GtkWidget *w, gpointer data)
  264. {
  265.   if(smadjignore) return;
  266.   smvector[selectedsmvector].str = GTK_ADJUSTMENT(smstradjust)->value;
  267.   updatesmvectorprev();
  268.   updatesmpreviewprev();
  269. }
  270.  
  271. void smstrexpsmadjmove(GtkWidget *w, gpointer data)
  272. {
  273.   if(smadjignore) return;
  274.   updatesmvectorprev();
  275.   updatesmpreviewprev();
  276. }
  277.  
  278.  
  279. void hidewin(GtkWidget *w, GtkWidget **win);
  280.  
  281. void smcancelclick(GtkWidget *w, GtkWidget *win)
  282. {
  283.   if(win)
  284.     gtk_widget_hide(win);
  285. }
  286.  
  287. void smokclick(GtkWidget *w, GtkWidget *win)
  288. {
  289.   int i;
  290.   for(i = 0; i < numsmvect; i++) {
  291.     memcpy(&pcvals.sizevector[i], &smvector[i], sizeof(struct smvector_t));
  292.   }
  293.   pcvals.numsizevector = numsmvect;
  294.   pcvals.sizestrexp = GTK_ADJUSTMENT(smstrexpadjust)->value;
  295.   pcvals.sizevoronoi = GTK_TOGGLE_BUTTON(sizevoronoi)->active;
  296.   if(win)
  297.     gtk_widget_hide(win);
  298. }
  299.  
  300. void initsmvectors(void)
  301. {
  302.   int i;
  303.  
  304.   if(pcvals.numsizevector) {
  305.     numsmvect = pcvals.numsizevector;
  306.     for(i = 0; i < numsmvect; i++) {
  307.       memcpy(&smvector[i], &pcvals.sizevector[i], sizeof(struct smvector_t));
  308.     }
  309.   } else {
  310.     /* Shouldn't happen */
  311.     numsmvect = 1;
  312.     smvector[0].x = 0.5;
  313.     smvector[0].y = 0.5;
  314.     smvector[0].siz = 0.0;
  315.     smvector[0].str = 1.0;
  316.   }
  317.   if(selectedsmvector >= numsmvect)
  318.     selectedsmvector = numsmvect-1;
  319. }
  320.  
  321. void update_sizemap_dialog(void)
  322. {
  323.   if(!smwindow) return;
  324.  
  325.   initsmvectors();
  326.  
  327.   gtk_adjustment_set_value(GTK_ADJUSTMENT(smstrexpadjust), pcvals.sizestrexp);
  328.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sizevoronoi), pcvals.sizevoronoi);
  329.  
  330.   updatesmvectorprev();
  331.   updatesmpreviewprev();
  332. }
  333.  
  334. void create_sizemap_dialog(void)
  335. {
  336.   GtkWidget *tmpw, *tmpw2;
  337.   GtkWidget *table1;
  338.   GtkWidget *table2;
  339.   GtkWidget *hbox;
  340.  
  341.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sizeradio[7]), TRUE);
  342.  
  343.   initsmvectors();
  344.  
  345.   if(smwindow) {
  346.     updatesmvectorprev();
  347.     updatesmpreviewprev();
  348.     gtk_widget_show(smwindow);
  349.     return;
  350.   }
  351.  
  352.   smwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  353.  
  354.   gtk_signal_connect (GTK_OBJECT(smwindow), "destroy",
  355.                       GTK_SIGNAL_FUNC(gtk_widget_destroyed),
  356.                       &smwindow);
  357.   gtk_signal_connect (GTK_OBJECT(smwindow), "delete_event",
  358.                       GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
  359.                       &smwindow);
  360.  
  361.   gtk_window_set_title(GTK_WINDOW(smwindow), _("Size Map Editor"));
  362.  
  363.   gtk_container_set_border_width (GTK_CONTAINER(smwindow), 5);
  364.  
  365.   tmpw = table1 = gtk_table_new(2,5,FALSE);
  366.   gtk_widget_show(tmpw);
  367.   gtk_container_add(GTK_CONTAINER(smwindow), tmpw);
  368.  
  369.   tmpw2 = tmpw = gtk_frame_new( _("Smvectors"));
  370.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  371.   gtk_table_attach(GTK_TABLE(table1), tmpw, 0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
  372.   gtk_widget_show(tmpw);
  373.  
  374.   tmpw = hbox = gtk_hbox_new(FALSE,0);
  375.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  376.   gtk_widget_show(tmpw);
  377.  
  378.   tmpw = gtk_event_box_new();
  379.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("The smvector-field. Left-click to move selected smvector, Right-click to point it towards mouse, Middle-click to add a new smvector."), NULL);
  380.   gtk_box_pack_start(GTK_BOX(hbox), tmpw, FALSE, FALSE, 0);
  381.   tmpw2 = tmpw;
  382.  
  383.   tmpw = smvectorprev = gtk_preview_new(GTK_PREVIEW_COLOR);
  384.   gtk_preview_size(GTK_PREVIEW(tmpw), OMWIDTH, OMHEIGHT);
  385.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  386.   gtk_widget_show(tmpw);
  387.   gtk_widget_set_events(tmpw2, GDK_BUTTON_PRESS_MASK);
  388.   gtk_signal_connect(GTK_OBJECT(tmpw2), "button_press_event",
  389.                      GTK_SIGNAL_FUNC(smmapclick), NULL);
  390.   gtk_widget_realize(tmpw2);
  391.   gtk_widget_show(tmpw2);
  392.  
  393.   smvectprevbrightadjust = gtk_adjustment_new(50.0, 0.0, 100.0, 1.0, 1.0, 1.0);
  394.   tmpw = gtk_vscale_new(GTK_ADJUSTMENT(smvectprevbrightadjust));
  395.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE);
  396.   gtk_box_pack_start(GTK_BOX(hbox), tmpw,FALSE,FALSE,0);
  397.   gtk_widget_show(tmpw);
  398.   gtk_signal_connect(GTK_OBJECT(smvectprevbrightadjust), "value_changed",
  399.                      (GtkSignalFunc)updatesmvectorprev, NULL);
  400.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Adjust the preview's brightness"), NULL);
  401.  
  402.   tmpw2 = tmpw = gtk_frame_new( _("Preview"));
  403.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  404.   gtk_table_attach(GTK_TABLE(table1), tmpw, 1,2,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
  405.   gtk_widget_show(tmpw);
  406.  
  407.   tmpw = smpreviewprev = gtk_preview_new(GTK_PREVIEW_COLOR);
  408.   gtk_preview_size(GTK_PREVIEW(tmpw), OMWIDTH, OMHEIGHT);
  409.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  410.   gtk_widget_show(tmpw);
  411.  
  412.   hbox = tmpw = gtk_hbox_new(TRUE,0);
  413.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  414.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 0,1,1,2);
  415.   gtk_widget_show(tmpw);
  416.  
  417.   tmpw = gtk_button_new_with_label("<<");
  418.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  419.   gtk_widget_show(tmpw);
  420.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  421.               GTK_SIGNAL_FUNC(smprevclick), NULL);
  422.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Select previous smvector"), NULL);
  423.  
  424.   tmpw = gtk_button_new_with_label(">>");
  425.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  426.   gtk_widget_show(tmpw);
  427.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  428.               GTK_SIGNAL_FUNC(smnextclick), NULL);
  429.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Select next smvector"), NULL);
  430.  
  431.   tmpw = gtk_button_new_with_label( _("Add"));
  432.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  433.   gtk_widget_show(tmpw);
  434.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  435.               GTK_SIGNAL_FUNC(smaddclick), NULL);
  436.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Add new smvector"), NULL);
  437.  
  438.   tmpw = gtk_button_new_with_label( _("Kill"));
  439.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  440.   gtk_widget_show(tmpw);
  441.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  442.               GTK_SIGNAL_FUNC(smdeleteclick), NULL);
  443.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Delete selected smvector"), NULL);
  444.  
  445.  
  446.   tmpw = table2 = gtk_table_new(2,2,FALSE);
  447.   gtk_widget_show(tmpw);
  448.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 0,1,2,3);
  449.   gtk_widget_show(tmpw);
  450.  
  451.   tmpw = gtk_label_new( _("Size:"));
  452.   gtk_widget_show(tmpw);
  453.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,0,1);
  454.  
  455.   sizadjust = gtk_adjustment_new(50.0, 0.0, 101.0, 1.0, 1.0, 1.0);
  456.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(sizadjust));
  457.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  458.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  459.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,0,1);
  460.   gtk_widget_show(tmpw);
  461.   gtk_signal_connect(GTK_OBJECT(sizadjust), "value_changed",
  462.              (GtkSignalFunc)angsmadjmove, NULL);
  463.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the angle of the selected smvector"), NULL);
  464.  
  465.   tmpw = gtk_label_new( _("Strength:"));
  466.   gtk_widget_show(tmpw);
  467.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,1,2);
  468.  
  469.   smstradjust = gtk_adjustment_new(1.0, 0.1, 6.0, 0.1, 1.0, 1.0);
  470.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(smstradjust));
  471.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  472.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  473.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,1,2);
  474.   gtk_widget_show(tmpw);
  475.   gtk_signal_connect(GTK_OBJECT(smstradjust), "value_changed",
  476.              (GtkSignalFunc)strsmadjmove, NULL);
  477.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the strength of the selected smvector"), NULL);
  478.  
  479.  
  480.   tmpw = hbox = gtk_hbox_new(TRUE,0);
  481.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 1,2,1,2);
  482.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  483.   gtk_widget_show(tmpw);
  484.  
  485.   tmpw = gtk_button_new_with_label( _("OK"));
  486.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  487.   gtk_widget_show(tmpw);
  488.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  489.               GTK_SIGNAL_FUNC(smokclick), smwindow);
  490.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Apply and exit the editor"), NULL);
  491.  
  492.   tmpw = gtk_button_new_with_label( _("Apply"));
  493.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  494.   gtk_widget_show(tmpw);
  495.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  496.               GTK_SIGNAL_FUNC(smokclick), NULL);
  497.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Apply, but stay inside the editor"), NULL);
  498.  
  499.   tmpw = gtk_button_new_with_label( _("Cancel"));
  500.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  501.   gtk_widget_show(tmpw);
  502.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  503.               GTK_SIGNAL_FUNC(smcancelclick), smwindow);
  504.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Cancel all changes and exit"), NULL);
  505.  
  506.  
  507.   tmpw = table2 = gtk_table_new(2,2,FALSE);
  508.   gtk_widget_show(tmpw);
  509.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 1,2,2,3);
  510.   gtk_widget_show(tmpw);
  511.  
  512.   tmpw = gtk_label_new( _("Strength exp.:"));
  513.   gtk_widget_show(tmpw);
  514.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,0,1);
  515.  
  516.   smstrexpadjust = gtk_adjustment_new(pcvals.sizestrexp, 0.1, 11.0, 0.1, 0.1, 0.1);
  517.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(smstrexpadjust));
  518.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  519.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  520.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,0,1);
  521.   gtk_widget_show(tmpw);
  522.   gtk_signal_connect(GTK_OBJECT(smstrexpadjust), "value_changed",
  523.              (GtkSignalFunc)smstrexpsmadjmove, NULL);
  524.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the exponent of the strength"), NULL);
  525.  
  526.  
  527.   sizevoronoi = tmpw = gtk_check_button_new_with_label( _("Voronoi"));
  528.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,2,3);
  529.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmpw), FALSE);
  530.   gtk_widget_show (tmpw);
  531.   if(pcvals.sizevoronoi)
  532.     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmpw), TRUE);
  533.   gtk_signal_connect(GTK_OBJECT(tmpw), "clicked",
  534.              (GtkSignalFunc)smstrexpsmadjmove, NULL);
  535.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Voronoi-mode makes only the smvector closest to the given point have any influence"), NULL);
  536.   
  537.   gtk_widget_show(smwindow);
  538.  
  539.   updatesmvectorprev();
  540.   updatesmpreviewprev();
  541. }
  542.