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 / orientmap.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-31  |  21.6 KB  |  718 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.  
  12. #define MAPFILE "data.out"
  13.  
  14. #define NUMVECTYPES 4
  15.  
  16. GtkWidget *omwindow = NULL;
  17.  
  18. GtkWidget *vectorprev = NULL;
  19. GtkWidget *ompreviewprev = NULL;
  20.  
  21. GtkObject *vectprevbrightadjust = NULL;
  22.  
  23. GtkObject *angadjust = NULL;
  24. GtkObject *stradjust = NULL;
  25. GtkObject *strexpadjust = NULL;
  26. GtkObject *angoffadjust = NULL;
  27. GtkWidget *vectypes[NUMVECTYPES];
  28. GtkWidget *orientvoronoi = NULL;
  29.  
  30. #define OMWIDTH 150
  31. #define OMHEIGHT 150
  32.  
  33. char buffer[OMWIDTH*OMHEIGHT];
  34.  
  35. struct vector_t vector[MAXORIENTVECT];
  36. int numvect = 0;
  37.  
  38. double degtorad(double d)
  39. {
  40.   return d/180.0*G_PI;
  41. }
  42.  
  43. double radtodeg(double d)
  44. {
  45.   double v = d/G_PI*180.0;
  46.   if(v < 0.0) v += 360;
  47.   return v;
  48. }
  49.  
  50. char *skipnum(char *s)
  51. {
  52.   while((*s == ' ') || (*s == '\t')) s++;
  53.   while(((*s >= '0') && (*s <= '9')) || (*s == '.')) s++;
  54.   while((*s == ' ') || (*s == '\t')) s++;
  55.   return s;
  56. }
  57.  
  58. double dist(double x, double y, double dx, double dy)
  59. {
  60.   double ax = fabs(dx-x);
  61.   double ay = fabs(dy-y);
  62.   return sqrt((ax*ax)+(ay*ay));
  63. }
  64.  
  65. int pixval(double dir)
  66. {
  67.   while(dir < 0.0) dir += 360.0;
  68.   while(dir >= 360.0) dir -= 360.0;
  69.   return dir * 255.0 / 360.0;
  70. }
  71.  
  72. double getdir(double x, double y, int from)
  73. {
  74.   int i;
  75.   int n;
  76.   int voronoi;
  77.   double sum, dx, dy, dst;
  78.   struct vector_t *vec;
  79.   double angoff, strexp;
  80.   int first = 0, last;
  81.  
  82.   if(from == 0) {
  83.     n = numvect;
  84.     vec = vector;
  85.     angoff = GTK_ADJUSTMENT(angoffadjust)->value;
  86.     strexp = GTK_ADJUSTMENT(strexpadjust)->value;
  87.     voronoi = GTK_TOGGLE_BUTTON(orientvoronoi)->active;
  88.   } else {
  89.     n = pcvals.numorientvector;
  90.     vec = pcvals.orientvector;
  91.     angoff = pcvals.orientangoff;
  92.     strexp = pcvals.orientstrexp;
  93.     voronoi = pcvals.orientvoronoi;
  94.   }
  95.  
  96.   if(voronoi) {
  97.     double bestdist = -1.0;
  98.     for(i = 0; i < n; i++) {
  99.       dst = dist(x,y,vec[i].x,vec[i].y);
  100.       if((bestdist < 0.0) || (dst < bestdist)) {
  101.     bestdist = dst;
  102.     first = i;
  103.       }
  104.     }
  105.     last = first+1;
  106.   } else {
  107.     first = 0;
  108.     last = n;
  109.   }
  110.  
  111.   dx = dy = 0.0;
  112.   sum = 0.0;
  113.   for(i = first; i < last; i++) {
  114.     double s = vec[i].str;
  115.     double tx = 0.0, ty = 0.0;
  116.     
  117.     if(vec[i].type == 0) {
  118.       tx = vec[i].dx;
  119.       ty = vec[i].dy;
  120.     } else if(vec[i].type == 1) {
  121.       double a = atan2(vec[i].dy, vec[i].dx);
  122.       a -= atan2(y-vec[i].y, x-vec[i].x);
  123.       tx = sin(a+G_PI_2);
  124.       ty = cos(a+G_PI_2);
  125.     } else if(vec[i].type == 2) {
  126.       double a = atan2(vec[i].dy, vec[i].dx);
  127.       a += atan2(y-vec[i].y, x-vec[i].x);
  128.       tx = sin(a+G_PI_2);
  129.       ty = cos(a+G_PI_2);
  130.     } else if(vec[i].type == 3) {
  131.       double a = atan2(vec[i].dy, vec[i].dx);
  132.       a -= atan2(y-vec[i].y, x-vec[i].x)*2;
  133.       tx = sin(a+G_PI_2);
  134.       ty = cos(a+G_PI_2);
  135.     }
  136.  
  137.     dst = dist(x,y,vec[i].x,vec[i].y);
  138.     dst = pow(dst, strexp);
  139.     if(dst < 0.0001) dst = 0.0001;
  140.     s = s / dst;
  141.  
  142.     dx += tx * s;
  143.     dy += ty * s;
  144.     sum += s;
  145.   }
  146.   dx = dx / sum;
  147.   dy = dy / sum;
  148.   return 90-(radtodeg(atan2(dy,dx))+angoff);
  149. }
  150.  
  151. void updateompreviewprev(void)
  152. {
  153.   int x, y;
  154.   static struct ppm nbuffer = {0,0,NULL};
  155.   guchar black[3] = {0,0,0};
  156.   guchar gray[3] = {120,120,120};
  157.   guchar white[3] = {255,255,255};
  158.  
  159.   if(!nbuffer.col) {
  160.     newppm(&nbuffer,OMWIDTH,OMHEIGHT);
  161.   }
  162.   fill(&nbuffer, black);
  163.  
  164.   for(y = 6; y < OMHEIGHT-4; y += 10)
  165.     for(x = 6; x < OMWIDTH-4; x += 10) {
  166.       double dir = degtorad(getdir(x/(double)OMWIDTH,y/(double)OMHEIGHT,0));
  167.       double xo = sin(dir)*4.0;
  168.       double yo = cos(dir)*4.0;
  169.       drawline(&nbuffer, x-xo, y-yo, x+xo, y+yo, gray);
  170.       putrgb(&nbuffer, x-xo, y-yo, white);
  171.     }
  172.  
  173.   for(y = 0; y < OMHEIGHT; y++)
  174.     gtk_preview_draw_row(GTK_PREVIEW(ompreviewprev), (guchar *)nbuffer.col + y * OMWIDTH * 3, 0, y, OMWIDTH);
  175.   gtk_widget_draw(ompreviewprev,NULL);
  176. }
  177.  
  178. int selectedvector = 0;
  179.  
  180. void updatevectorprev(void)
  181. {
  182.   static struct ppm backup = {0,0,NULL};
  183.   static struct ppm buffer = {0,0,NULL};
  184.   static int ok = 0;
  185.   int i, x, y;
  186.   double dir, xo, yo;
  187.   double val;
  188.   static double lastval = 0.0;
  189.   guchar gray[3] = {120,120,120};
  190.   guchar red[3] = {255,0,0};
  191.   guchar white[3] = {255,255,255};
  192.  
  193.   if(vectprevbrightadjust) val = 1.0 - GTK_ADJUSTMENT(vectprevbrightadjust)->value / 100.0;
  194.   else val = 0.5;
  195.  
  196.   if(!ok || (val != lastval)) {
  197.     if(!infile.col)
  198.       updatepreviewprev(NULL, (void *)2); /* Force grabarea() */
  199.     copyppm(&infile, &backup);
  200.     ppmbrightness(&backup, val, 1,1,1);
  201.     if((backup.width != OMWIDTH) || (backup.height != OMHEIGHT))
  202.       resize_fast(&backup, OMWIDTH, OMHEIGHT);
  203.     ok = 1;
  204.   }
  205.   copyppm(&backup, &buffer);
  206.  
  207.   for(i = 0; i < numvect; i++) {
  208.     double s;
  209.     x = vector[i].x * OMWIDTH;
  210.     y = vector[i].y * OMHEIGHT;
  211.     dir = degtorad(vector[i].dir);
  212.     s = degtorad(vector[i].str);
  213.     xo = sin(dir)*(6.0+100*s);
  214.     yo = cos(dir)*(6.0+100*s);
  215.     if(i == selectedvector)
  216.       drawline(&buffer, x-xo, y-yo, x+xo, y+yo, red);
  217.     else
  218.       drawline(&buffer, x-xo, y-yo, x+xo, y+yo, gray);
  219.     putrgb(&buffer, x-xo, y-yo, white);
  220.   }
  221.  
  222.   for(y = 0; y < OMHEIGHT; y++)
  223.     gtk_preview_draw_row(GTK_PREVIEW(vectorprev), (guchar *)buffer.col + y * OMWIDTH * 3, 0, y, OMWIDTH);
  224.   gtk_widget_draw(vectorprev,NULL);
  225.  
  226. }
  227.  
  228.  
  229. int adjignore = 0;
  230.  
  231. void updatesliders(void)
  232. {
  233.   int i;
  234.   adjignore = 1;
  235.   gtk_adjustment_set_value(GTK_ADJUSTMENT(angadjust),
  236.                vector[selectedvector].dir);
  237.   gtk_adjustment_set_value(GTK_ADJUSTMENT(stradjust),
  238.                vector[selectedvector].str);
  239.   for(i = 0; i < NUMVECTYPES; i++) {
  240.     if(i == vector[selectedvector].type)
  241.       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vectypes[i]), TRUE);
  242.     else
  243.       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vectypes[i]), FALSE);
  244.   }
  245.   adjignore = 0;
  246. }
  247.  
  248. void prevclick(GtkWidget *w, gpointer data)
  249. {
  250.   selectedvector--;
  251.   if(selectedvector < 0) selectedvector = numvect-1;
  252.   updatesliders();
  253.   updatevectorprev();
  254. }
  255.  
  256. void nextclick(GtkWidget *w, gpointer data)
  257. {
  258.   selectedvector++;
  259.   if(selectedvector == numvect) selectedvector = 0;
  260.   updatesliders();
  261.   updatevectorprev();
  262. }
  263.  
  264. void addclick(GtkWidget *w, gpointer data)
  265. {
  266.   if(numvect + 1 == MAXORIENTVECT) return;
  267.   vector[numvect].x = 0.5;
  268.   vector[numvect].y = 0.5;
  269.   vector[numvect].dir = 0.0;
  270.   vector[numvect].dx = sin(degtorad(0.0));
  271.   vector[numvect].dy = cos(degtorad(0.0));
  272.   vector[numvect].str = 1.0;
  273.   vector[numvect].type = 0;
  274.   selectedvector = numvect;
  275.   numvect++;
  276.   updatesliders();
  277.   updatevectorprev();
  278.   updateompreviewprev();
  279. }
  280.  
  281. void deleteclick(GtkWidget *w, gpointer data)
  282. {
  283.   int i;
  284.  
  285.   if(numvect == 1) return;
  286.  
  287.   for(i = selectedvector; i < numvect-1; i++) {
  288.     memcpy(&vector[i], &vector[i+1], sizeof(struct vector_t));
  289.   }
  290.   numvect--;
  291.   if(selectedvector >= numvect) selectedvector = 0;
  292.   updatesliders();
  293.   updatevectorprev();
  294.   updateompreviewprev();
  295. }
  296.  
  297.  
  298. void mapclick(GtkWidget *w, GdkEventButton *event)
  299. {
  300.   if(event->button == 1) {
  301.     vector[selectedvector].x = event->x / (double)OMWIDTH;
  302.     vector[selectedvector].y = event->y / (double)OMHEIGHT;
  303.  
  304.   } else if(event->button == 2) {
  305.     if(numvect + 1 == MAXORIENTVECT) return;
  306.     vector[numvect].x = event->x / (double)OMWIDTH;
  307.     vector[numvect].y = event->y / (double)OMHEIGHT;
  308.     vector[numvect].dir = 0.0;
  309.     vector[numvect].dx = sin(degtorad(0.0));
  310.     vector[numvect].dy = cos(degtorad(0.0));
  311.     vector[numvect].str = 1.0;
  312.     selectedvector = numvect;
  313.     numvect++;
  314.     updatesliders();
  315.  
  316.   } else if(event->button == 3) {
  317.     double d;
  318.     d = atan2(OMWIDTH * vector[selectedvector].x - event->x,
  319.           OMHEIGHT * vector[selectedvector].y - event->y);
  320.     vector[selectedvector].dir = radtodeg(d);
  321.     vector[selectedvector].dx = sin(d);
  322.     vector[selectedvector].dy = cos(d);
  323.     updatesliders();
  324.   }
  325.   updatevectorprev();
  326.   updateompreviewprev();
  327. }
  328.  
  329. void angadjmove(GtkWidget *w, gpointer data)
  330. {
  331.   if(adjignore) return;
  332.   vector[selectedvector].dir = GTK_ADJUSTMENT(angadjust)->value;
  333.   vector[selectedvector].dx = sin(degtorad(vector[selectedvector].dir));
  334.   vector[selectedvector].dy = cos(degtorad(vector[selectedvector].dir));
  335.   updatevectorprev();
  336.   updateompreviewprev();
  337. }
  338.  
  339. void stradjmove(GtkWidget *w, gpointer data)
  340. {
  341.   if(adjignore) return;
  342.   vector[selectedvector].str = GTK_ADJUSTMENT(stradjust)->value;
  343.   updatevectorprev();
  344.   updateompreviewprev();
  345. }
  346.  
  347. void strexpadjmove(GtkWidget *w, gpointer data)
  348. {
  349.   if(adjignore) return;
  350.   updatevectorprev();
  351.   updateompreviewprev();
  352. }
  353.  
  354. void angoffadjmove(GtkWidget *w, gpointer data)
  355. {
  356.   if(adjignore) return;
  357.   updatevectorprev();
  358.   updateompreviewprev();
  359. }
  360.  
  361. void vectypeclick(GtkWidget *w, gpointer data)
  362. {
  363.   int i;
  364.   if(adjignore) return;
  365.   for(i = 0; i < NUMVECTYPES; i++) {
  366.     if(GTK_TOGGLE_BUTTON(vectypes[i])->active)
  367.       vector[selectedvector].type = i;
  368.   }
  369.   updatevectorprev();
  370.   updateompreviewprev();
  371. }
  372.  
  373. void hidewin(GtkWidget *w, GtkWidget **win)
  374. {
  375.   gtk_widget_hide(*win);
  376. }
  377.  
  378. void omcancelclick(GtkWidget *w, GtkWidget *win)
  379. {
  380.   if(win)
  381.     gtk_widget_hide(win);
  382. }
  383.  
  384. void omokclick(GtkWidget *w, GtkWidget *win)
  385. {
  386.   int i;
  387.   for(i = 0; i < numvect; i++) {
  388.     memcpy(&pcvals.orientvector[i], &vector[i], sizeof(struct vector_t));
  389.   }
  390.   pcvals.numorientvector = numvect;
  391.   pcvals.orientstrexp = GTK_ADJUSTMENT(strexpadjust)->value;
  392.   pcvals.orientangoff = GTK_ADJUSTMENT(angoffadjust)->value;
  393.   pcvals.orientvoronoi = GTK_TOGGLE_BUTTON(orientvoronoi)->active;
  394.   if(win)
  395.     gtk_widget_hide(win);
  396. }
  397.  
  398. void initvectors(void)
  399. {
  400.   int i;
  401.  
  402.   if(pcvals.numorientvector) {
  403.     numvect = pcvals.numorientvector;
  404.     for(i = 0; i < numvect; i++) {
  405.       memcpy(&vector[i], &pcvals.orientvector[i], sizeof(struct vector_t));
  406.     }
  407.   } else {
  408.     /* Shouldn't happen */
  409.     numvect = 1;
  410.     vector[0].x = 0.5;
  411.     vector[0].y = 0.5;
  412.     vector[0].dir = 0.0;
  413.     vector[0].str = 1.0;
  414.     vector[0].type = 0;
  415.   }
  416.   if(selectedvector >= numvect)
  417.     selectedvector = numvect-1;
  418. }
  419.  
  420. void update_orientmap_dialog(void)
  421. {
  422.   if(!omwindow) return;
  423.  
  424.   initvectors();
  425.  
  426.   gtk_adjustment_set_value(GTK_ADJUSTMENT(strexpadjust), pcvals.orientstrexp);
  427.   gtk_adjustment_set_value(GTK_ADJUSTMENT(angoffadjust), pcvals.orientangoff);
  428.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(orientvoronoi), pcvals.orientvoronoi);
  429.  
  430.   updatevectorprev();
  431.   updateompreviewprev();
  432. }
  433.  
  434. void create_orientmap_dialog(void)
  435. {
  436.   GtkWidget *tmpw, *tmpw2;
  437.   GtkWidget *table1;
  438.   GtkWidget *table2;
  439.   GtkWidget *hbox;
  440.  
  441.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (orientradio[7]), TRUE);
  442.  
  443.   initvectors();
  444.  
  445.   if(omwindow) {
  446.     updatevectorprev();
  447.     updateompreviewprev();
  448.     gtk_widget_show(omwindow);
  449.     return;
  450.   }
  451.  
  452.   omwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  453.  
  454.   gtk_signal_connect (GTK_OBJECT(omwindow), "destroy",
  455.                       GTK_SIGNAL_FUNC(gtk_widget_destroyed),
  456.                       &omwindow);
  457.   gtk_signal_connect (GTK_OBJECT(omwindow), "delete_event",
  458.                       GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
  459.                       &omwindow);
  460.  
  461.   gtk_window_set_title(GTK_WINDOW(omwindow), _("Orientation Map Editor"));
  462.  
  463.   gtk_container_set_border_width (GTK_CONTAINER(omwindow), 5);
  464.  
  465.   tmpw = table1 = gtk_table_new(2,5,FALSE);
  466.   gtk_widget_show(tmpw);
  467.   gtk_container_add(GTK_CONTAINER(omwindow), tmpw);
  468.  
  469.   tmpw2 = tmpw = gtk_frame_new( _("Vectors"));
  470.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  471.   gtk_table_attach(GTK_TABLE(table1), tmpw, 0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
  472.   gtk_widget_show(tmpw);
  473.  
  474.   tmpw = hbox = gtk_hbox_new(FALSE,0);
  475.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  476.   gtk_widget_show(tmpw);
  477.  
  478.   tmpw = gtk_event_box_new();
  479.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("The vector-field. Left-click to move selected vector, Right-click to point it towards mouse, Middle-click to add a new vector."), NULL);
  480.   gtk_box_pack_start(GTK_BOX(hbox), tmpw, FALSE, FALSE, 0);
  481.   tmpw2 = tmpw;
  482.  
  483.   tmpw = vectorprev = gtk_preview_new(GTK_PREVIEW_COLOR);
  484.   gtk_preview_size(GTK_PREVIEW(tmpw), OMWIDTH, OMHEIGHT);
  485.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  486.   gtk_widget_show(tmpw);
  487.   gtk_widget_set_events(tmpw2, GDK_BUTTON_PRESS_MASK);
  488.   gtk_signal_connect(GTK_OBJECT(tmpw2), "button_press_event",
  489.                      GTK_SIGNAL_FUNC(mapclick), NULL);
  490.   gtk_widget_realize(tmpw2);
  491.   gtk_widget_show(tmpw2);
  492.  
  493.   vectprevbrightadjust = gtk_adjustment_new(50.0, 0.0, 100.0, 1.0, 1.0, 1.0);
  494.   tmpw = gtk_vscale_new(GTK_ADJUSTMENT(vectprevbrightadjust));
  495.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE);
  496.   gtk_box_pack_start(GTK_BOX(hbox), tmpw,FALSE,FALSE,0);
  497.   gtk_widget_show(tmpw);
  498.   gtk_signal_connect(GTK_OBJECT(vectprevbrightadjust), "value_changed",
  499.                      (GtkSignalFunc)updatevectorprev, NULL);
  500.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Adjust the preview's brightness"), NULL);
  501.  
  502.   tmpw2 = tmpw = gtk_frame_new( _("Preview"));
  503.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  504.   gtk_table_attach(GTK_TABLE(table1), tmpw, 1,2,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
  505.   gtk_widget_show(tmpw);
  506.  
  507.   tmpw = ompreviewprev = gtk_preview_new(GTK_PREVIEW_COLOR);
  508.   gtk_preview_size(GTK_PREVIEW(tmpw), OMWIDTH, OMHEIGHT);
  509.   gtk_container_add(GTK_CONTAINER(tmpw2), tmpw);
  510.   gtk_widget_show(tmpw);
  511.  
  512.   hbox = tmpw = gtk_hbox_new(TRUE,0);
  513.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  514.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 0,1,1,2);
  515.   gtk_widget_show(tmpw);
  516.  
  517.   tmpw = gtk_button_new_with_label("<<");
  518.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  519.   gtk_widget_show(tmpw);
  520.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  521.               GTK_SIGNAL_FUNC(prevclick), NULL);
  522.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Select previous vector"), NULL);
  523.  
  524.   tmpw = gtk_button_new_with_label(">>");
  525.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  526.   gtk_widget_show(tmpw);
  527.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  528.               GTK_SIGNAL_FUNC(nextclick), NULL);
  529.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Select next vector"), NULL);
  530.  
  531.   tmpw = gtk_button_new_with_label( _("Add"));
  532.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  533.   gtk_widget_show(tmpw);
  534.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  535.               GTK_SIGNAL_FUNC(addclick), NULL);
  536.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Add new vector"), NULL);
  537.  
  538.   tmpw = gtk_button_new_with_label( _("Kill"));
  539.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  540.   gtk_widget_show(tmpw);
  541.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  542.               GTK_SIGNAL_FUNC(deleteclick), NULL);
  543.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Delete selected vector"), NULL);
  544.  
  545.  
  546.   tmpw = table2 = gtk_table_new(2,2,FALSE);
  547.   gtk_widget_show(tmpw);
  548.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 0,1,2,3);
  549.   gtk_widget_show(tmpw);
  550.  
  551.   tmpw = gtk_label_new( _("Angle:"));
  552.   gtk_widget_show(tmpw);
  553.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,0,1);
  554.  
  555.   angadjust = gtk_adjustment_new(0.0, 0.0, 361.0, 1.0, 1.0, 1.0);
  556.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(angadjust));
  557.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  558.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  559.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,0,1);
  560.   gtk_widget_show(tmpw);
  561.   gtk_signal_connect(GTK_OBJECT(angadjust), "value_changed",
  562.              (GtkSignalFunc)angadjmove, NULL);
  563.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the angle of the selected vector"), NULL);
  564.  
  565.   tmpw = gtk_label_new( _("Strength:"));
  566.   gtk_widget_show(tmpw);
  567.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,1,2);
  568.  
  569.   stradjust = gtk_adjustment_new(1.0, 0.1, 6.0, 0.1, 1.0, 1.0);
  570.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(stradjust));
  571.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  572.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  573.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,1,2);
  574.   gtk_widget_show(tmpw);
  575.   gtk_signal_connect(GTK_OBJECT(stradjust), "value_changed",
  576.              (GtkSignalFunc)stradjmove, NULL);
  577.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the strength of the selected vector"), NULL);
  578.  
  579.  
  580.   tmpw = gtk_label_new( _("Type:"));
  581.   gtk_widget_show(tmpw);
  582.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,2,3);
  583.  
  584.  
  585.   tmpw = hbox = gtk_hbox_new(TRUE,0);
  586.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,2,3);
  587.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  588.   gtk_widget_show(tmpw);
  589.  
  590.   vectypes[0] = tmpw = gtk_radio_button_new_with_label(NULL, _("Normal"));
  591.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  592.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  593.               GTK_SIGNAL_FUNC(vectypeclick), NULL);
  594.   gtk_widget_show(tmpw);
  595.  
  596.   vectypes[1] = tmpw = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(vectypes[0])), _("Vortex"));
  597.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  598.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  599.               GTK_SIGNAL_FUNC(vectypeclick), NULL);
  600.   gtk_widget_show(tmpw);
  601.  
  602.  
  603.   tmpw = hbox = gtk_hbox_new(TRUE,0);
  604.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,3,4);
  605.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  606.   gtk_widget_show(tmpw);
  607.  
  608.   vectypes[2] = tmpw = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(vectypes[0])), _("Vortex2"));
  609.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  610.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  611.               GTK_SIGNAL_FUNC(vectypeclick), NULL);
  612.   gtk_widget_show(tmpw);
  613.  
  614.   vectypes[3] = tmpw = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(vectypes[0])), _("Vortex3"));
  615.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  616.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  617.               GTK_SIGNAL_FUNC(vectypeclick), NULL);
  618.   gtk_widget_show(tmpw);
  619.  
  620.  
  621.   tmpw = hbox = gtk_hbox_new(TRUE,0);
  622.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 1,2,1,2);
  623.   gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
  624.   gtk_widget_show(tmpw);
  625.  
  626.   tmpw = gtk_button_new_with_label( _("OK"));
  627.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  628.   gtk_widget_show(tmpw);
  629.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  630.               GTK_SIGNAL_FUNC(omokclick), omwindow);
  631.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Apply and exit the editor"), NULL);
  632.  
  633.   tmpw = gtk_button_new_with_label( _("Apply"));
  634.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  635.   gtk_widget_show(tmpw);
  636.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  637.               GTK_SIGNAL_FUNC(omokclick), NULL);
  638.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Apply, but stay inside the editor"), NULL);
  639.  
  640.   tmpw = gtk_button_new_with_label( _("Cancel"));
  641.   gtk_box_pack_start(GTK_BOX(hbox),tmpw,FALSE,TRUE,0);
  642.   gtk_widget_show(tmpw);
  643.   gtk_signal_connect (GTK_OBJECT(tmpw), "clicked",
  644.               GTK_SIGNAL_FUNC(omcancelclick), omwindow);
  645.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Cancel all changes and exit"), NULL);
  646.  
  647.  
  648.   tmpw = table2 = gtk_table_new(2,2,FALSE);
  649.   gtk_widget_show(tmpw);
  650.   gtk_table_attach_defaults(GTK_TABLE(table1), tmpw, 1,2,2,3);
  651.   gtk_widget_show(tmpw);
  652.  
  653.   tmpw = gtk_label_new( _("Strength exp.:"));
  654.   gtk_widget_show(tmpw);
  655.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,0,1);
  656.  
  657.   strexpadjust = gtk_adjustment_new(pcvals.orientstrexp, 0.1, 11.0, 0.1, 0.1, 0.1);
  658.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(strexpadjust));
  659.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  660.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  661.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,0,1);
  662.   gtk_widget_show(tmpw);
  663.   gtk_signal_connect(GTK_OBJECT(strexpadjust), "value_changed",
  664.              (GtkSignalFunc)strexpadjmove, NULL);
  665.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Change the exponent of the strength"), NULL);
  666.  
  667.   tmpw = gtk_label_new( _("Angle offset:"));
  668.   gtk_widget_show(tmpw);
  669.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,1,2);
  670.  
  671.   angoffadjust = gtk_adjustment_new(pcvals.orientangoff, 0.0, 361.0, 1.0, 1.0, 1.0);
  672.   tmpw = gtk_hscale_new(GTK_ADJUSTMENT(angoffadjust));
  673.   gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE);
  674.   gtk_scale_set_digits(GTK_SCALE (tmpw), 1);
  675.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 1,2,1,2);
  676.   gtk_widget_show(tmpw);
  677.   gtk_signal_connect(GTK_OBJECT(angoffadjust), "value_changed",
  678.              (GtkSignalFunc)angoffadjmove, NULL);
  679.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Offset all vectors with a given angle"), NULL);
  680.  
  681.   orientvoronoi = tmpw = gtk_check_button_new_with_label( _("Voronoi"));
  682.   gtk_table_attach_defaults(GTK_TABLE(table2), tmpw, 0,1,2,3);
  683.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmpw), FALSE);
  684.   gtk_widget_show (tmpw);
  685.   if(pcvals.orientvoronoi)
  686.     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tmpw), TRUE);
  687.   gtk_signal_connect(GTK_OBJECT(tmpw), "clicked",
  688.              (GtkSignalFunc)angoffadjmove, NULL);
  689.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Voronoi-mode makes only the vector closest to the given point have any influence"), NULL);
  690.   
  691.   gtk_widget_show(omwindow);
  692.  
  693.   updatevectorprev();
  694.   updateompreviewprev();
  695. }
  696.  
  697. /*
  698. void main(int argc, char **argv)
  699. {
  700.   gtk_set_locale ();
  701.   gtk_init (&argc, &argv);
  702.   gtk_rc_parse ("./rc");
  703.  
  704.   if(argc > 1)
  705.     readdata(argv[1]);
  706.   else {
  707.     numvect++;
  708.     vector[0].x = 0.5;
  709.     vector[0].y = 0.5;
  710.     vector[0].dir = 0.0;
  711.     vector[0].str = 1.0;
  712.   }
  713.     
  714.   create_orientmap_dialog();
  715.   gtk_main();
  716. }
  717. */
  718.