home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / fp / fp_gtk.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-08  |  35.5 KB  |  1,169 lines

  1. #include "config.h"
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include <gtk/gtk.h>
  8.  
  9. #include <libgimp/gimp.h>
  10. #include <libgimp/gimpui.h>
  11.  
  12. #include "libgimp/stdplugins-intl.h"
  13.  
  14. #include "fp.h"
  15.  
  16. /* These values are translated for the GUI but also used internally
  17.    to figure out which button the user pushed, etc.
  18.    Not my design, please don't blame me -- njl */
  19.  
  20. static const gchar *hue_red     = N_("Red:");
  21. static const gchar *hue_green   = N_("Green:");
  22. static const gchar *hue_blue    = N_("Blue:");
  23. static const gchar *hue_cyan    = N_("Cyan:");
  24. static const gchar *hue_yellow  = N_("Yellow:");
  25. static const gchar *hue_magenta = N_("Magenta:");
  26.  
  27. static const gchar *val_darker  = N_("Darker:");
  28. static const gchar *val_lighter = N_("Lighter:");
  29.  
  30. static const gchar *sat_more    = N_("More Sat:");
  31. static const gchar *sat_less    = N_("Less Sat:");
  32.  
  33. static const gchar *current_val = N_("Current:");
  34.  
  35. AdvancedWindow AW = { NULL, NULL, NULL, NULL, NULL, NULL, NULL };
  36.  
  37. extern FP_Params Current;
  38.  
  39. extern GimpDrawable *drawable;
  40. extern GimpDrawable *mask;
  41.  
  42. FP_Intensity ShMidHi[]   = { SHADOWS, MIDTONES, HIGHLIGHTS };
  43. gint         HueSatVal[] = { BY_HUE, BY_SAT, BY_VAL };
  44.  
  45. gint nudgeArray[256];
  46.  
  47. GtkWidget *origPreview, *curPreview;
  48. GtkWidget *rPreview, *gPreview, *bPreview;
  49. GtkWidget *cPreview, *yPreview, *mPreview;
  50. GtkWidget *centerPreview;
  51. GtkWidget *darkerPreview, *lighterPreview, *middlePreview;
  52. GtkWidget *allOrSell, *dlg;
  53. GtkWidget *plusSatPreview, *SatPreview, *minusSatPreview;
  54.  
  55. struct
  56. {
  57.   GtkWidget *bna;
  58.   GtkWidget *palette;
  59.   GtkWidget *rough;
  60.   GtkWidget *range;
  61.   GtkWidget *show;
  62.   GtkWidget *lnd;
  63.   GtkWidget *pixelsBy;
  64.   GtkWidget *frameSelect;
  65.   GtkWidget *satur;
  66. } fpFrames;
  67.  
  68. fpInterface FPint =
  69. {
  70.   FALSE   /*  run  */
  71. };
  72.  
  73. ReducedImage *reduced;
  74.  
  75. /***********************************************************/
  76. /************   Main Dialog Window   ******************/
  77. /***********************************************************/
  78.  
  79. GtkWidget *
  80. fp_create_bna (void)
  81. {
  82.   GtkWidget *frame, *blabel, *alabel, *bframe, *aframe, *table;
  83.   
  84.   Create_A_Preview (&origPreview, &bframe, reduced->width, reduced->height);
  85.   Create_A_Preview (&curPreview, &aframe, reduced->width, reduced->height);
  86.   
  87.   frame = gtk_frame_new (_("Before and After"));
  88.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  89.  
  90.   /* All the previews */
  91.   alabel = gtk_label_new (_("Current:"));
  92.   gtk_widget_show (alabel);
  93.   gtk_misc_set_alignment (GTK_MISC (alabel), 0.0, 0.5);
  94.  
  95.   blabel = gtk_label_new (_("Original:"));
  96.   gtk_widget_show (blabel);
  97.   gtk_misc_set_alignment (GTK_MISC (blabel), 0.0, 0.5);
  98.  
  99.   table = gtk_table_new (2, 2, FALSE);
  100.   gtk_container_set_border_width (GTK_CONTAINER (table), 4);
  101.   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
  102.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  103.  
  104.   gtk_container_add (GTK_CONTAINER (frame), table);
  105.   
  106.   gtk_table_attach (GTK_TABLE (table), blabel, 0, 1, 0, 1,
  107.             0, GTK_EXPAND | GTK_FILL, 0, 0);
  108.  
  109.   gtk_table_attach (GTK_TABLE (table), alabel, 1, 2, 0, 1,
  110.             0, GTK_EXPAND | GTK_FILL, 0, 0);
  111.  
  112.   gtk_table_attach (GTK_TABLE (table), bframe, 0, 1, 1, 2,
  113.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  114.  
  115.   gtk_table_attach (GTK_TABLE (table), aframe, 1, 2, 1, 2,
  116.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  117.  
  118.   gtk_widget_show (table);
  119.   gtk_widget_show (frame);
  120.  
  121.   return frame;
  122. }
  123.  
  124. /* close a sub dialog (from window manager) by simulating toggle click */
  125. void
  126. sub_dialog_destroy (GtkWidget *dialog,
  127.             GdkEvent  *ev,
  128.             gpointer   dummy)
  129. {
  130.   GtkWidget *button =
  131.     GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (dialog), "ctrlButton"));
  132.  
  133.   gtk_signal_emit_by_name (GTK_OBJECT (button), "clicked", dialog);
  134. }
  135.  
  136. GtkWidget *
  137. fp_create_circle_palette (void)
  138. {
  139.   GtkWidget *frame, *table;
  140.   GtkWidget *rVbox, *rFrame;
  141.   GtkWidget *gVbox, *gFrame;
  142.   GtkWidget *bVbox, *bFrame;
  143.   GtkWidget *cVbox, *cFrame;
  144.   GtkWidget *yVbox, *yFrame;
  145.   GtkWidget *mVbox, *mFrame;
  146.   GtkWidget *centerVbox, *centerFrame;
  147.  
  148.   GtkWidget *win;
  149.  
  150.   frame = gtk_frame_new (NULL);
  151.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  152.   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
  153.   gtk_widget_show (frame);
  154.  
  155.   table = gtk_table_new (11, 11, FALSE);
  156.   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
  157.   gtk_widget_show (table);
  158.  
  159.   gtk_container_add (GTK_CONTAINER (frame), table);
  160.  
  161.   Create_A_Preview (&rPreview, &rFrame, reduced->width, reduced->height);
  162.   Create_A_Preview (&gPreview, &gFrame, reduced->width, reduced->height);
  163.   Create_A_Preview (&bPreview, &bFrame, reduced->width, reduced->height);
  164.   Create_A_Preview (&cPreview, &cFrame, reduced->width, reduced->height);
  165.   Create_A_Preview (&yPreview, &yFrame, reduced->width, reduced->height);
  166.   Create_A_Preview (&mPreview, &mFrame, reduced->width, reduced->height);
  167.   Create_A_Preview (¢erPreview, ¢erFrame,
  168.             reduced->width, reduced->height);
  169.  
  170.   Create_A_Table_Entry (&rVbox, rFrame, hue_red);
  171.   Create_A_Table_Entry (&gVbox, gFrame, hue_green);
  172.   Create_A_Table_Entry (&bVbox, bFrame, hue_blue);
  173.   Create_A_Table_Entry (&cVbox, cFrame, hue_cyan);
  174.   Create_A_Table_Entry (&yVbox, yFrame, hue_yellow);
  175.   Create_A_Table_Entry (&mVbox, mFrame, hue_magenta);
  176.   Create_A_Table_Entry (¢erVbox, centerFrame, current_val);
  177.   
  178.   gtk_table_attach (GTK_TABLE (table), rVbox, 8, 11 ,4 , 7,
  179.             GTK_EXPAND , GTK_EXPAND, 0 ,0);
  180.   gtk_table_attach (GTK_TABLE (table), gVbox, 2, 5, 0, 3,
  181.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  182.   gtk_table_attach (GTK_TABLE (table), bVbox, 2, 5, 8, 11,
  183.             GTK_EXPAND, GTK_EXPAND,0,0);
  184.   gtk_table_attach (GTK_TABLE (table), cVbox, 0, 3, 4, 7,
  185.             GTK_EXPAND, GTK_EXPAND, 0 ,0);
  186.   gtk_table_attach (GTK_TABLE (table), yVbox, 6, 9, 0, 3,
  187.             GTK_EXPAND, GTK_EXPAND, 0 ,0);
  188.   gtk_table_attach (GTK_TABLE (table), mVbox, 6, 9, 8, 11,
  189.             GTK_EXPAND, GTK_EXPAND, 0 ,0);
  190.   gtk_table_attach (GTK_TABLE (table), centerVbox, 4, 7, 4, 7,
  191.             GTK_EXPAND, GTK_EXPAND, 0 ,0);
  192.  
  193.   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  194.  
  195.   gimp_help_connect_help_accel (win, gimp_standard_help_func, "filters/fp.html");
  196.  
  197.   gtk_window_set_title (GTK_WINDOW (win), _("Hue Variations"));
  198.   gtk_container_add (GTK_CONTAINER (win), frame);
  199.   gtk_signal_connect (GTK_OBJECT (win), "delete_event",
  200.               GTK_SIGNAL_FUNC (sub_dialog_destroy),
  201.               NULL);
  202.  
  203.   return win;
  204. }
  205.  
  206. GtkWidget *
  207. fp_create_rough (void)
  208. {
  209.   GtkWidget *frame, *scale, *vbox;
  210.   GtkObject *data;
  211.  
  212.   frame = gtk_frame_new (_("Roughness"));
  213.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  214.   gtk_widget_show (frame);
  215.  
  216.   data = gtk_adjustment_new (Current.Rough, 0, 1.0, 0.05, 0.01, 0.0);
  217.   Current.roughnessScale = scale = gtk_hscale_new (GTK_ADJUSTMENT (data));
  218.  
  219.   gtk_widget_set_usize (scale, 60, 0);
  220.   gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
  221.   gtk_scale_set_digits (GTK_SCALE (scale), 2);
  222.   gtk_signal_connect (GTK_OBJECT (data), "value_changed",
  223.               GTK_SIGNAL_FUNC (fp_scale_update),
  224.               &Current.Rough);      
  225.   gtk_widget_show (scale);
  226.  
  227.   vbox = gtk_vbox_new (FALSE, 2);
  228.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  229.   gtk_widget_show (vbox);
  230.   gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
  231.   gtk_container_add (GTK_CONTAINER( frame), vbox);
  232.   
  233.   return frame;
  234. }
  235.  
  236. GtkWidget *
  237. fp_create_range (void)
  238. {
  239.   GtkWidget *frame, *vbox;
  240.   GSList *group=NULL;
  241.  
  242.   frame = gtk_frame_new (_("Affected Range"));
  243.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  244.    
  245.   gtk_widget_show (frame);
  246.  
  247.   vbox = gtk_vbox_new (FALSE, 2);
  248.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  249.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);  
  250.   gtk_widget_show (vbox);
  251.  
  252.   group = Button_In_A_Box (vbox, group, _("Shadows"), 
  253.                GTK_SIGNAL_FUNC (fp_change_current_range),
  254.                ShMidHi + SHADOWS,
  255.                Current.Range == SHADOWS);
  256.   group = Button_In_A_Box (vbox, group, _("Midtones"), 
  257.                GTK_SIGNAL_FUNC (fp_change_current_range),
  258.                ShMidHi + MIDTONES,
  259.                Current.Range == MIDTONES);
  260.   group = Button_In_A_Box (vbox, group, _("Highlights"), 
  261.                GTK_SIGNAL_FUNC (fp_change_current_range),
  262.                ShMidHi + HIGHLIGHTS,
  263.                Current.Range == HIGHLIGHTS);
  264.  
  265.   return frame;
  266. }
  267.  
  268. GtkWidget *
  269. fp_create_control (void)
  270. {
  271.   GtkWidget *frame, *box;
  272.  
  273.   frame = gtk_frame_new (_("Windows"));
  274.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  275.    
  276.   gtk_widget_show (frame);
  277.  
  278.   box = gtk_vbox_new (FALSE, 2);
  279.   gtk_container_add (GTK_CONTAINER (frame), box);
  280.   gtk_container_set_border_width (GTK_CONTAINER (box), 4);  
  281.   gtk_widget_show (box);
  282.  
  283.   Frames_Check_Button_In_A_Box (box, _("Hue"),
  284.                 GTK_SIGNAL_FUNC (fp_show_hide_frame),
  285.                 fpFrames.palette,
  286.                 Current.VisibleFrames & HUE);
  287.   Frames_Check_Button_In_A_Box (box, _("Saturation"),
  288.                 GTK_SIGNAL_FUNC (fp_show_hide_frame),
  289.                 fpFrames.satur,
  290.                 Current.VisibleFrames & SATURATION);
  291.   Frames_Check_Button_In_A_Box (box, _("Value"),
  292.                 GTK_SIGNAL_FUNC (fp_show_hide_frame),
  293.                 fpFrames.lnd,
  294.                 Current.VisibleFrames & VALUE);
  295.   Frames_Check_Button_In_A_Box (box, _("Advanced"),
  296.                 GTK_SIGNAL_FUNC (fp_show_hide_frame),
  297.                 AW.window,
  298.                 FALSE); 
  299.  
  300.   return frame;
  301. }
  302.  
  303. GtkWidget *
  304. fp_create_lnd (void)
  305. {
  306.   GtkWidget *frame, *table, *lighterFrame, *middleFrame, *darkerFrame;
  307.   GtkWidget *lighterVbox, *middleVbox, *darkerVbox;
  308.   GtkWidget *win;
  309.  
  310.   Create_A_Preview (&lighterPreview, &lighterFrame,
  311.             reduced->width, reduced->height);
  312.   Create_A_Preview (&middlePreview, &middleFrame,
  313.             reduced->width, reduced->height);
  314.   Create_A_Preview (&darkerPreview, &darkerFrame,
  315.             reduced->width, reduced->height);
  316.  
  317.   Create_A_Table_Entry (&lighterVbox, lighterFrame, val_lighter);
  318.   Create_A_Table_Entry (&middleVbox, middleFrame, current_val);
  319.   Create_A_Table_Entry (&darkerVbox, darkerFrame, val_darker);
  320.  
  321.   frame = gtk_frame_new (NULL);
  322.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  323.   gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
  324.   gtk_widget_show (frame);
  325.  
  326.   table = gtk_table_new (1, 11, FALSE);
  327.   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
  328.   gtk_widget_show (table);
  329.  
  330.     
  331.   gtk_table_attach (GTK_TABLE (table), lighterVbox, 0, 3, 0, 1,
  332.             GTK_EXPAND , GTK_EXPAND, 0, 0);
  333.   gtk_table_attach (GTK_TABLE (table), middleVbox, 4, 7, 0, 1,
  334.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  335.   gtk_table_attach (GTK_TABLE (table), darkerVbox, 8, 11, 0, 1,
  336.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  337.   gtk_container_add (GTK_CONTAINER (frame), table);
  338.  
  339.   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  340.  
  341.   gimp_help_connect_help_accel (win, gimp_standard_help_func, "filters/fp.html");
  342.  
  343.   gtk_window_set_title (GTK_WINDOW (win), _("Value Variations"));
  344.   gtk_container_add (GTK_CONTAINER (win), frame);
  345.   gtk_signal_connect (GTK_OBJECT (win), "delete_event",
  346.               GTK_SIGNAL_FUNC (sub_dialog_destroy),
  347.               NULL);
  348.  
  349.   return win;
  350. }
  351.  
  352. GtkWidget *
  353. fp_create_msnls (void)
  354. {
  355.   GtkWidget *frame, *table, *lessFrame, *middleFrame, *moreFrame;
  356.   GtkWidget *lessVbox, *middleVbox, *moreVbox;
  357.   GtkWidget *win;
  358.  
  359.   Create_A_Preview (&minusSatPreview, &lessFrame,
  360.             reduced->width, reduced->height);
  361.   Create_A_Preview (&SatPreview, &middleFrame,
  362.             reduced->width, reduced->height);
  363.   Create_A_Preview (&plusSatPreview, &moreFrame,
  364.             reduced->width, reduced->height);
  365.  
  366.   Create_A_Table_Entry (&moreVbox, moreFrame, sat_more);
  367.   Create_A_Table_Entry (&middleVbox, middleFrame, current_val);
  368.   Create_A_Table_Entry (&lessVbox, lessFrame, sat_less);
  369.  
  370.   frame = gtk_frame_new (NULL);
  371.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  372.   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
  373.   gtk_widget_show (frame);
  374.  
  375.   table = gtk_table_new (1, 11, FALSE);
  376.   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
  377.   gtk_widget_show (table);
  378.  
  379.   gtk_table_attach (GTK_TABLE (table), moreVbox, 0, 3, 0, 1,
  380.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  381.   gtk_table_attach (GTK_TABLE (table), middleVbox, 4, 7, 0, 1,
  382.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  383.   gtk_table_attach (GTK_TABLE (table), lessVbox, 8, 11, 0, 1,
  384.             GTK_EXPAND, GTK_EXPAND, 0, 0);
  385.   gtk_container_add (GTK_CONTAINER (frame), table);
  386.  
  387.   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  388.  
  389.   gimp_help_connect_help_accel (win, gimp_standard_help_func, "filters/fp.html");
  390.  
  391.   gtk_window_set_title (GTK_WINDOW (win), _("Saturation Variations"));
  392.   gtk_container_add (GTK_CONTAINER (win), frame);
  393.   gtk_signal_connect (GTK_OBJECT (win), "delete_event",
  394.               GTK_SIGNAL_FUNC (sub_dialog_destroy),
  395.               NULL);
  396.  
  397.   return win;
  398. }
  399.  
  400. GtkWidget *
  401. fp_create_pixels_select_by (void)
  402. {
  403.   GtkWidget *frame, *vbox;
  404.   GSList *group=NULL;
  405.  
  406.   frame = gtk_frame_new (_("Select Pixels by"));
  407.   gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
  408.   gtk_widget_show (frame);
  409.  
  410.   vbox = gtk_vbox_new (FALSE, 2);
  411.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  412.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);  
  413.   gtk_widget_show (vbox);
  414.  
  415.   group = Button_In_A_Box (vbox, group, _("Hue"), 
  416.                GTK_SIGNAL_FUNC (fp_change_current_pixels_by),
  417.                HueSatVal + 0,
  418.                Current.ValueBy == BY_HUE);
  419.   group = Button_In_A_Box (vbox,group, _("Saturation"), 
  420.                GTK_SIGNAL_FUNC (fp_change_current_pixels_by),
  421.                HueSatVal + 1,
  422.                Current.ValueBy == BY_SAT);
  423.   group = Button_In_A_Box (vbox,group, _("Value"), 
  424.                GTK_SIGNAL_FUNC (fp_change_current_pixels_by),
  425.                HueSatVal + 2,
  426.                Current.ValueBy == BY_VAL);
  427.   return frame;
  428. }
  429.  
  430. GtkWidget *
  431. fp_create_show (void)
  432. {
  433.   GtkWidget *frame, *vbox;
  434.   GSList *group = NULL;
  435.  
  436.   frame = gtk_frame_new(_("Show"));
  437.   gtk_widget_show (frame);
  438.  
  439.   vbox = gtk_vbox_new (FALSE, 2);
  440.   gtk_container_add (GTK_CONTAINER (frame), vbox);
  441.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);  
  442.   gtk_widget_show (vbox);
  443.  
  444.   group = Button_In_A_Box (vbox, group, _("Entire Image"),
  445.                GTK_SIGNAL_FUNC (fp_entire_image),
  446.                &Current.SlctnOnly,
  447.                FALSE);
  448.  
  449.   group = Button_In_A_Box (vbox, group, _("Selection Only"),
  450.                GTK_SIGNAL_FUNC (fp_selection_only),
  451.                &Current.SlctnOnly,
  452.                TRUE);
  453.  
  454.   group = Button_In_A_Box (vbox, group, _("Selection In Context"), 
  455.                GTK_SIGNAL_FUNC (fp_selection_in_context),
  456.                &Current.SlctnOnly,
  457.                FALSE);
  458.  
  459.   return frame;
  460. }
  461.  
  462. #ifdef __FP_UNUSED_STUFF__
  463. GtkWidget *
  464. fp_create_frame_select (void)
  465. {
  466.   GtkWidget *frame, *box;
  467.  
  468.   frame = gtk_frame_new (_("Display"));
  469.   gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
  470.   gtk_widget_show (frame);
  471.  
  472.   box = gtk_hbox_new (FALSE, 8);
  473.   gtk_container_add (GTK_CONTAINER (frame), box);
  474.   gtk_container_set_border_width (GTK_CONTAINER (box),4);  
  475.   gtk_widget_show (box);
  476.  
  477.   Check_Button_In_A_Box (box, _("CirclePalette"),
  478.              GTK_SIGNAL_FUNC (fp_show_hide_frame),
  479.              fpFrames.palette,TRUE);
  480.   Check_Button_In_A_Box (box, _("Lighter And Darker"),
  481.              GTK_SIGNAL_FUNC (fp_show_hide_frame),
  482.              fpFrames.lnd,TRUE);
  483.   Check_Button_In_A_Box (box, _("Saturation"),
  484.              GTK_SIGNAL_FUNC (fp_show_hide_frame),
  485.              fpFrames.satur,FALSE);
  486.  
  487.   return frame;
  488. }
  489. #endif
  490.  
  491. void Create_A_Preview (GtkWidget **preview,
  492.                GtkWidget **frame,
  493.                int         previewWidth,
  494.                int         previewHeight)
  495. {
  496.   *frame = gtk_frame_new (NULL);
  497.   gtk_frame_set_shadow_type (GTK_FRAME (*frame), GTK_SHADOW_IN);
  498.   gtk_widget_show (*frame);
  499.  
  500.   *preview = gtk_preview_new (Current.Color ?
  501.                   GTK_PREVIEW_COLOR : GTK_PREVIEW_GRAYSCALE);
  502.   gtk_preview_size (GTK_PREVIEW (*preview), previewWidth, previewHeight);
  503.   gtk_widget_show (*preview);
  504.   gtk_container_add (GTK_CONTAINER (*frame), *preview);
  505. }
  506.  
  507. GSList *
  508. Button_In_A_Box (GtkWidget     *vbox,
  509.          GSList        *group,
  510.          guchar        *label,
  511.          GtkSignalFunc  function,
  512.          gpointer       data,
  513.          gboolean       clicked)
  514. {
  515.   GtkWidget *button;
  516.  
  517.   button = gtk_radio_button_new_with_label (group, label);
  518.   gtk_signal_connect (GTK_OBJECT (button), "clicked",
  519.               GTK_SIGNAL_FUNC (function),
  520.               data);
  521.   gtk_widget_show (button);
  522.   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  523.   if (clicked)
  524.     gtk_button_clicked (GTK_BUTTON (button));
  525.  
  526.   return gtk_radio_button_group (GTK_RADIO_BUTTON (button));
  527. }
  528.  
  529. void
  530. Check_Button_In_A_Box (GtkWidget     *vbox,
  531.                guchar        *label,
  532.                GtkSignalFunc  function,
  533.                gpointer       data,
  534.                gboolean       clicked)
  535. {
  536.   GtkWidget *button;
  537.  
  538.   button = gtk_check_button_new_with_label (label);
  539.   gtk_signal_connect (GTK_OBJECT (button), "clicked",
  540.               GTK_SIGNAL_FUNC (function),
  541.               data);
  542.   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  543.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), clicked);
  544.  
  545.   gtk_widget_show (button);
  546. }
  547.  
  548. void
  549. Frames_Check_Button_In_A_Box (GtkWidget     *vbox,
  550.                   guchar        *label,
  551.                   GtkSignalFunc  function,
  552.                   GtkWidget     *frame,
  553.                   gboolean       clicked)
  554. {
  555.   GtkWidget *button;
  556.  
  557.   button = gtk_check_button_new_with_label (label);
  558.   gtk_signal_connect (GTK_OBJECT (button), "clicked",
  559.               GTK_SIGNAL_FUNC (function),
  560.               frame);
  561.   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  562.   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), clicked);
  563.   gtk_object_set_data (GTK_OBJECT (frame), "ctrlButton", (gpointer) button);
  564.  
  565.   gtk_widget_show (button);
  566. }
  567.  
  568. void
  569. Create_A_Table_Entry (GtkWidget   **box,
  570.               GtkWidget    *SmallerFrame,
  571.               const gchar  *description)
  572. {
  573.   GtkWidget *label, *button, *table;
  574.  
  575.   *box = gtk_vbox_new (FALSE, 1);
  576.   gtk_container_set_border_width (GTK_CONTAINER (*box), PR_BX_BRDR);
  577.   gtk_widget_show (*box);
  578.  
  579.   /* Delayed translation applied here */
  580.   label = gtk_label_new (gettext (description));
  581.  
  582.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  583.   gtk_widget_show (label);
  584.  
  585.   table = gtk_table_new (2, 1, FALSE);
  586.   gtk_widget_show (table);
  587.  
  588.   gtk_box_pack_start (GTK_BOX (*box), table, TRUE, TRUE, 0);
  589.  
  590.   gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
  591.             0, 0, 0, 0);
  592.  
  593.   if (description != current_val)
  594.     {
  595.       button = gtk_button_new ();
  596.       gtk_signal_connect (GTK_OBJECT (button), "clicked",
  597.               GTK_SIGNAL_FUNC (selectionMade),
  598.               (gchar *) description);
  599.  
  600.       gtk_container_add (GTK_CONTAINER (button), SmallerFrame);
  601.       gtk_widget_show (button);
  602.       gtk_table_attach (GTK_TABLE (table), button, 0, 1, 1, 2,
  603.             0, 0, 0, 4);
  604.     }
  605.   else
  606.     {
  607.       gtk_table_attach (GTK_TABLE (table), SmallerFrame, 0, 1, 1, 2,
  608.             0, 0, 0, 4);
  609.     }
  610. }
  611.  
  612. void
  613. fp_redraw_all_windows (void)
  614. {
  615.   reduced = Reduce_The_Image (drawable,mask,
  616.                   Current.PreviewSize,
  617.                   Current.SlctnOnly);
  618.   Adjust_Preview_Sizes (reduced->width, reduced->height);
  619.  
  620.   /*gtk_container_check_resize(GTK_CONTAINER(fpFrames.palette), NULL);*/
  621.   gtk_widget_draw (fpFrames.palette, NULL);
  622.  
  623.   /*gtk_container_check_resize(GTK_CONTAINER(fpFrames.satur), NULL);*/
  624.   gtk_widget_draw (fpFrames.satur, NULL);
  625.  
  626.   /*gtk_container_check_resize(GTK_CONTAINER(fpFrames.lnd), NULL);*/
  627.   gtk_widget_draw (fpFrames.lnd, NULL);
  628.  
  629.   /*gtk_container_check_resize(GTK_CONTAINER(dlg), NULL);*/
  630.   gtk_widget_draw (dlg, NULL);
  631.  
  632.   refreshPreviews (Current.VisibleFrames);
  633. }
  634.  
  635. void
  636. fp_entire_image (GtkWidget *button,
  637.          gpointer   data)
  638. {
  639.   if (!GTK_TOGGLE_BUTTON (button)->active)
  640.     return;
  641.   Current.SlctnOnly = 0;
  642.   fp_redraw_all_windows ();
  643.  
  644. void
  645. fp_selection_only (GtkWidget *button,
  646.            gpointer   data)
  647. {
  648.   static gint notFirstTime = 0;
  649.  
  650.   if (!(notFirstTime++))
  651.     return;
  652.  
  653.   if (!GTK_TOGGLE_BUTTON (button)->active)
  654.     return;
  655.   Current.SlctnOnly = 1;
  656.   fp_redraw_all_windows ();
  657. }
  658.  
  659. void
  660. fp_selection_in_context (GtkWidget *button,
  661.              gpointer   data)
  662. {
  663.   if (!GTK_TOGGLE_BUTTON (button)->active)
  664.     return;
  665.  
  666.   Current.SlctnOnly = 2;
  667.   fp_redraw_all_windows ();
  668. }
  669.  
  670. void
  671. fp_show_hide_frame (GtkWidget *button, 
  672.             GtkWidget *frame)
  673. {
  674.   gint prev = Current.VisibleFrames;
  675.  
  676.   if (frame == NULL)
  677.     return;
  678.  
  679.   if (GTK_TOGGLE_BUTTON (button)->active)
  680.     {
  681.       if (!GTK_WIDGET_VISIBLE (frame))
  682.     {
  683.       gtk_widget_show (frame);
  684.  
  685.       if (frame==fpFrames.palette) 
  686.         Current.VisibleFrames |= HUE;
  687.       else if (frame==fpFrames.satur)
  688.         Current.VisibleFrames |= SATURATION;
  689.       else if (frame==fpFrames.lnd)
  690.         Current.VisibleFrames |= VALUE;
  691.  
  692.       refreshPreviews (Current.VisibleFrames & ~prev);
  693.     }
  694.     }    
  695.   else
  696.     {
  697.       if (GTK_WIDGET_VISIBLE (frame))
  698.     {
  699.       gtk_widget_hide (frame);
  700.  
  701.       if (frame==fpFrames.palette) 
  702.         Current.VisibleFrames &= ~HUE;
  703.       else if (frame==fpFrames.satur)
  704.         Current.VisibleFrames &= ~SATURATION;
  705.       else if (frame==fpFrames.lnd)
  706.         Current.VisibleFrames &= ~VALUE;
  707.     }
  708.     }
  709. }
  710.  
  711. void
  712. Adjust_Preview_Sizes (gint width,
  713.               gint height)
  714. {
  715.   gtk_preview_size (GTK_PREVIEW (origPreview),     width, height);
  716.   gtk_preview_size (GTK_PREVIEW (curPreview),      width, height);
  717.   gtk_preview_size (GTK_PREVIEW (rPreview),        width, height);
  718.   gtk_preview_size (GTK_PREVIEW (gPreview),        width, height);
  719.   gtk_preview_size (GTK_PREVIEW (bPreview),        width, height);
  720.   gtk_preview_size (GTK_PREVIEW (cPreview),        width, height);
  721.   gtk_preview_size (GTK_PREVIEW (yPreview),        width, height);
  722.   gtk_preview_size (GTK_PREVIEW (mPreview),        width, height);
  723.   gtk_preview_size (GTK_PREVIEW (centerPreview),   width, height);
  724.   gtk_preview_size (GTK_PREVIEW (lighterPreview),  width, height);
  725.   gtk_preview_size (GTK_PREVIEW (darkerPreview),   width, height);
  726.   gtk_preview_size (GTK_PREVIEW (middlePreview),   width, height);
  727.   gtk_preview_size (GTK_PREVIEW (minusSatPreview), width, height);
  728.   gtk_preview_size (GTK_PREVIEW (SatPreview),      width, height);
  729.   gtk_preview_size (GTK_PREVIEW (plusSatPreview),  width, height);
  730. }
  731.  
  732. void      
  733. selectionMade (GtkWidget *widget,
  734.            gpointer   data)
  735. {
  736.   Current.Touched[Current.ValueBy] = 1;
  737.   
  738.   if (data == (gpointer) hue_red) {
  739.     Update_Current_FP (HUE, RED);
  740.   } else if (data == (gpointer) hue_green) {
  741.     Update_Current_FP (HUE, GREEN);
  742.   } else if (data == (gpointer) hue_blue) {
  743.     Update_Current_FP (HUE, BLUE);
  744.   } else if (data == (gpointer) hue_cyan) {
  745.     Update_Current_FP (HUE, CYAN);
  746.   } else if (data == (gpointer) hue_yellow) {
  747.     Update_Current_FP (HUE, YELLOW);
  748.   } else if (data == (gpointer) hue_magenta) {
  749.     Update_Current_FP (HUE, MAGENTA);
  750.   } else if (data == (gpointer) val_darker) {
  751.     Update_Current_FP (VALUE, DOWN);
  752.   } else if (data == (gpointer) val_lighter) {
  753.     Update_Current_FP (VALUE, UP);
  754.   } else if (data == (gpointer) sat_more) {
  755.     Update_Current_FP (SATURATION, UP);
  756.   } else if (data == (gpointer) sat_less) {
  757.     Update_Current_FP (SATURATION, DOWN);
  758.   }
  759.  
  760.   refreshPreviews (Current.VisibleFrames);
  761. }
  762.  
  763. void
  764. refreshPreviews (gint which)
  765. {
  766.   fp_Create_Nudge (nudgeArray);
  767.   fp_render_preview     (origPreview,     NONEATALL,  0);
  768.   fp_render_preview     (curPreview,      CURRENT,    0);
  769.   if (which & HUE)
  770.     {
  771.       fp_render_preview (rPreview,        HUE,        RED);
  772.       fp_render_preview (gPreview,        HUE,        GREEN);
  773.       fp_render_preview (bPreview,        HUE,        BLUE);
  774.       fp_render_preview (cPreview,        HUE,        CYAN);
  775.       fp_render_preview (yPreview,        HUE,        YELLOW);
  776.       fp_render_preview (mPreview,        HUE,        MAGENTA);
  777.       fp_render_preview (centerPreview,   CURRENT,    0);
  778.     }
  779.   if (which & VALUE)
  780.     {
  781.       fp_render_preview (lighterPreview,  VALUE,      UP);
  782.       fp_render_preview (middlePreview,   CURRENT,    0);
  783.       fp_render_preview (darkerPreview,   VALUE,      DOWN);
  784.     }
  785.   if (which & SATURATION)
  786.     {
  787.       fp_render_preview (plusSatPreview,  SATURATION, UP);
  788.       fp_render_preview (SatPreview,      CURRENT,    0);
  789.       fp_render_preview (minusSatPreview, SATURATION, DOWN);
  790.     }
  791. }
  792.  
  793. void
  794. fp_ok_callback (GtkWidget *widget,
  795.         gpointer   data)
  796. {
  797.   FPint.run = TRUE;
  798.  
  799.   gtk_widget_destroy (GTK_WIDGET (data));
  800. }
  801.  
  802. void
  803. fp_scale_update (GtkAdjustment *adjustment,
  804.          float         *scale_val)
  805. {
  806.   static gfloat prevValue = 0.25;
  807.  
  808.   *scale_val = adjustment->value;
  809.  
  810.   if (prevValue != adjustment->value)
  811.     {
  812.       fp_Create_Nudge (nudgeArray);
  813.       refreshPreviews (Current.VisibleFrames);
  814.       if (AW.window != NULL && GTK_WIDGET_VISIBLE (AW.window))
  815.     fp_create_smoothness_graph (AW.aliasingPreview);
  816.       prevValue = adjustment->value;
  817.     }
  818. }
  819.  
  820. void
  821. fp_change_current_range (GtkAdjustment *button,
  822.              gint          *Intensity)
  823. {
  824.   static FP_Intensity prevValue=MIDTONES;
  825.   static int notFirstTime=0;
  826.   
  827.   if (!(notFirstTime++))  return;
  828.   if (!GTK_TOGGLE_BUTTON (button)->active)  return;
  829.   if (*Intensity == prevValue) return;
  830.  
  831.   Current.Range = *Intensity;
  832.   refreshPreviews (Current.VisibleFrames);
  833.   if (AW.window != NULL && GTK_WIDGET_VISIBLE (AW.window))
  834.     fp_create_smoothness_graph (AW.aliasingPreview);
  835.   prevValue = *Intensity;
  836. }
  837.  
  838. void
  839. fp_change_current_pixels_by (GtkWidget *button,
  840.                  gint      *valueBy)
  841. {
  842.   gint prevValue = VALUE;
  843.   static gint notFirstTime = 0;
  844.   
  845.   if (!(notFirstTime++))
  846.     return;
  847.  
  848.   if (!GTK_TOGGLE_BUTTON(button)->active)
  849.     return;
  850.  
  851.   if (*valueBy == prevValue)
  852.     return;
  853.  
  854.   Current.ValueBy = *valueBy;
  855.   refreshPreviews (Current.VisibleFrames);
  856.   if (AW.window != NULL &&
  857.       GTK_WIDGET_VISIBLE (AW.window) &&
  858.       AW.rangePreview != NULL)
  859.     fp_range_preview_spill (AW.rangePreview,Current.ValueBy);
  860.  
  861.   prevValue = *valueBy;
  862. }
  863.  
  864. void
  865. fp_advanced_call (void)
  866.   if (AW.window!=NULL) 
  867.     if (GTK_WIDGET_VISIBLE (AW.window))
  868.       gtk_widget_hide (AW.window);
  869.     else 
  870.       gtk_widget_show (AW.window);
  871.   else 
  872.     fp_advanced_dialog ();
  873. }
  874.  
  875. gint
  876. fp_dialog (void)
  877. {
  878.   GtkWidget *bna;
  879.   GtkWidget *palette;
  880.   GtkWidget *lnd;
  881.   GtkWidget *show;
  882.   GtkWidget *rough;
  883.   GtkWidget *range;
  884.   GtkWidget *pixelsBy;
  885.   GtkWidget *satur;
  886.   GtkWidget *control;
  887.   GtkWidget *table;
  888.  
  889.   reduced = Reduce_The_Image (drawable,mask,
  890.                   Current.PreviewSize,
  891.                   Current.SlctnOnly);
  892.  
  893.   gimp_ui_init ("fp", TRUE);
  894.  
  895.   /********************************************************************/
  896.   /************************* All the Standard Stuff *******************/
  897.   dlg = gimp_dialog_new (_("Filter Pack Simulation"), "fp",
  898.              gimp_standard_help_func, "filters/fp.html",
  899.              GTK_WIN_POS_MOUSE,
  900.              FALSE, TRUE, FALSE,
  901.  
  902.              _("OK"), fp_ok_callback,
  903.              NULL, NULL, NULL, TRUE, FALSE,
  904.              _("Reset"), resetFilterPacks,
  905.              NULL, NULL, NULL, FALSE, FALSE,
  906.              _("Cancel"), gtk_widget_destroy,
  907.              NULL, 1, NULL, FALSE, TRUE,
  908.  
  909.              NULL);
  910.  
  911.   gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
  912.               GTK_SIGNAL_FUNC (gtk_main_quit),
  913.               NULL);
  914.  
  915.   /********************************************************************/
  916.   
  917.   fp_advanced_dialog ();
  918.  
  919.   fpFrames.bna          = bna          = fp_create_bna();
  920.   fpFrames.rough        = rough        = fp_create_rough();
  921.   fpFrames.range        = range        = fp_create_range();
  922.   fpFrames.palette      = palette      = fp_create_circle_palette();
  923.   fpFrames.lnd          = lnd          = fp_create_lnd();
  924.   fpFrames.show         = show         = fp_create_show();
  925.   fpFrames.satur        = satur        = fp_create_msnls();
  926.   fpFrames.pixelsBy     = pixelsBy     = fp_create_pixels_select_by();
  927.                           control      = fp_create_control();
  928.   /********************************************************************/
  929.   /********************   PUT EVRYTHING TOGETHER     ******************/
  930.   
  931.   table = gtk_table_new (4, 2, FALSE);
  932.   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  933.   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
  934.   gtk_container_set_border_width (GTK_CONTAINER (table), 6);
  935.  
  936.   gtk_table_attach (GTK_TABLE (table), bna, 0, 2, 0, 1,
  937.             GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  938.  
  939.   gtk_table_attach (GTK_TABLE (table), control, 1, 2, 1, 3,
  940.             GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  941.  
  942.   gtk_table_attach (GTK_TABLE (table), rough, 1, 2, 3, 4,
  943.             GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  944.  
  945.   gtk_table_attach (GTK_TABLE (table), show, 0, 1, 1, 2,
  946.             GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  947.  
  948.   gtk_table_attach (GTK_TABLE (table), range, 0, 1, 2, 3,
  949.             GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  950.  
  951.   gtk_table_attach (GTK_TABLE (table), pixelsBy, 0, 1, 3, 4,
  952.             GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
  953.           
  954.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
  955.   gtk_widget_show (table);
  956.   gtk_widget_show (dlg);
  957.  
  958.   refreshPreviews (Current.VisibleFrames);
  959.  
  960.   gtk_main ();
  961.   gdk_flush ();
  962.   
  963.   return FPint.run;
  964. }
  965.  
  966. /***********************************************************/
  967. /************   Advanced Options Window   ******************/
  968. /***********************************************************/
  969.  
  970. void
  971. fp_advanced_ok (void)
  972. {
  973.   gtk_widget_hide (AW.window);
  974. }
  975.  
  976. void     
  977. As_You_Drag (GtkWidget *button)
  978. {
  979.   static gboolean notFirstTime = FALSE;
  980.  
  981.   if (! notFirstTime)
  982.     return;
  983.  
  984.   notFirstTime = TRUE;
  985.  
  986.   if (GTK_TOGGLE_BUTTON (button)->active)
  987.     {
  988.       Current.RealTime=TRUE;
  989.       gtk_range_set_update_policy (GTK_RANGE (Current.roughnessScale),0);
  990.       gtk_range_set_update_policy (GTK_RANGE (Current.aliasingScale),0);
  991.       gtk_range_set_update_policy (GTK_RANGE (Current.previewSizeScale),0);
  992.     }
  993.   else
  994.     {
  995.       Current.RealTime=FALSE;
  996.       gtk_range_set_update_policy (GTK_RANGE (Current.roughnessScale),
  997.                    GTK_UPDATE_DELAYED);
  998.       gtk_range_set_update_policy (GTK_RANGE (Current.aliasingScale),
  999.                    GTK_UPDATE_DELAYED);
  1000.       gtk_range_set_update_policy (GTK_RANGE (Current.previewSizeScale),
  1001.                    GTK_UPDATE_DELAYED);
  1002.     }
  1003.  
  1004.   return;
  1005. }
  1006.  
  1007. void
  1008. preview_size_scale_update (GtkAdjustment *adjustment,
  1009.                float         *scale_val)
  1010. {
  1011.   Current.PreviewSize = adjustment->value;
  1012.   fp_redraw_all_windows();
  1013. }
  1014.  
  1015. gint
  1016. fp_advanced_dialog (void)
  1017. {
  1018.   guchar *rangeNames[] = { N_("Shadows:"), N_("Midtones:"), N_("Highlights:")};
  1019.   GtkWidget *frame, *mainvbox;
  1020.   GtkObject *smoothnessData;
  1021.   GtkWidget *graphFrame, *table, *scale;
  1022.   GtkWidget *vbox, *label, *labelTable;
  1023.   GtkWidget *optionsFrame;
  1024.   gint i;
  1025.  
  1026.   AW.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  1027.  
  1028.   gimp_help_connect_help_accel (AW.window, gimp_standard_help_func,
  1029.                 "filters/fp.html");
  1030.  
  1031.   gtk_window_set_title (GTK_WINDOW (AW.window),
  1032.             _("Advanced Filter Pack Options"));
  1033.   gtk_signal_connect (GTK_OBJECT (AW.window), "delete_event",
  1034.               GTK_SIGNAL_FUNC (sub_dialog_destroy),
  1035.               NULL);
  1036.  
  1037.   mainvbox = gtk_hbox_new (FALSE, 4);
  1038.   gtk_container_set_border_width (GTK_CONTAINER (mainvbox), 6);
  1039.   gtk_container_add (GTK_CONTAINER (AW.window), mainvbox);
  1040.   gtk_widget_show (mainvbox);
  1041.  
  1042.   frame = gtk_frame_new (_("Smoothness of Aliasing"));
  1043.   gtk_box_pack_start (GTK_BOX (mainvbox), frame, TRUE, TRUE, 0);
  1044.   gtk_widget_show (frame);
  1045.  
  1046.   table = gtk_table_new (3, 1, FALSE);
  1047.   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
  1048.   gtk_container_set_border_width (GTK_CONTAINER (table), 4);
  1049.   gtk_container_add (GTK_CONTAINER (frame), table);
  1050.   gtk_widget_show (table);
  1051.  
  1052.   graphFrame = gtk_frame_new (NULL);
  1053.   gtk_frame_set_shadow_type (GTK_FRAME (graphFrame), GTK_SHADOW_IN);
  1054.   gtk_container_set_border_width (GTK_CONTAINER (graphFrame),0);
  1055.   gtk_widget_show (graphFrame);
  1056.   gtk_table_attach (GTK_TABLE (table), graphFrame, 0, 1, 0, 1,
  1057.             GTK_EXPAND, 0, 0, 0);
  1058.  
  1059.   vbox = gtk_vbox_new (FALSE, 0);
  1060.   gtk_container_add (GTK_CONTAINER (graphFrame), vbox);
  1061.   gtk_widget_show (vbox);
  1062.  
  1063.   AW.aliasingPreview = gtk_preview_new (GTK_PREVIEW_COLOR);
  1064.   gtk_preview_size (GTK_PREVIEW (AW.aliasingPreview), 256, MAX_ROUGHNESS);
  1065.   gtk_box_pack_start (GTK_BOX (vbox),AW.aliasingPreview, TRUE, TRUE, 0);
  1066.   gtk_widget_show (AW.aliasingPreview);
  1067.  
  1068.   fp_create_smoothness_graph (AW.aliasingPreview);
  1069.  
  1070.   AW.rangePreview = gtk_preview_new (GTK_PREVIEW_COLOR);
  1071.   gtk_preview_size (GTK_PREVIEW (AW.rangePreview), 256, RANGE_HEIGHT);
  1072.   gtk_box_pack_start(GTK_BOX(vbox),AW.rangePreview, TRUE, TRUE, 0);
  1073.   gtk_widget_show (AW.rangePreview);
  1074.  
  1075.   fp_range_preview_spill (AW.rangePreview, Current.ValueBy);
  1076.  
  1077.   labelTable = gtk_table_new (3, 4, FALSE);
  1078.   gtk_table_set_col_spacings (GTK_TABLE (labelTable), 4);
  1079.   gtk_table_set_row_spacings (GTK_TABLE (labelTable), 2);
  1080.   gtk_widget_show (labelTable);
  1081.   gtk_table_attach (GTK_TABLE (table), labelTable, 0, 1, 1, 2,
  1082.             GTK_EXPAND, 0, 0, 0);
  1083.  
  1084.   for (i = 0; i < 12; i++)
  1085.     {
  1086.       label = Current.rangeLabels[i] = gtk_label_new ("-");
  1087.       if (!(i % 4))
  1088.     {
  1089.       gtk_label_set_text (GTK_LABEL(label), gettext (rangeNames[i/4]));
  1090.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
  1091.     }
  1092.       gtk_widget_show (label);
  1093.       gtk_table_attach (GTK_TABLE (labelTable), label, i%4, i%4+1, i/4, i/4+1,
  1094.             GTK_EXPAND | GTK_FILL, 0, 0, 0);
  1095.     }
  1096.  
  1097.   /************************************************************/
  1098.   
  1099.   AW.aliasingGraph = gtk_drawing_area_new ();
  1100.   gtk_drawing_area_size (GTK_DRAWING_AREA (AW.aliasingGraph),
  1101.                2 * MARGIN + 256,
  1102.               RANGE_HEIGHT);
  1103.   gtk_box_pack_start (GTK_BOX (vbox), AW.aliasingGraph, TRUE, TRUE, 0);
  1104.   gtk_widget_show (AW.aliasingGraph);
  1105.   gtk_widget_set_events (AW.aliasingGraph, RANGE_ADJUST_MASK);
  1106.   gtk_signal_connect (GTK_OBJECT (AW.aliasingGraph),"event",
  1107.               GTK_SIGNAL_FUNC (FP_Range_Change_Events),
  1108.              &Current);
  1109.  
  1110.   /************************************************************/
  1111.  
  1112.   smoothnessData = gtk_adjustment_new (Current.Alias, 0, 1.0, 0.05, 0.01, 0.0);
  1113.  
  1114.   Current.aliasingScale = scale =
  1115.     gtk_hscale_new (GTK_ADJUSTMENT (smoothnessData));
  1116.   gtk_widget_set_usize (scale, 200, 0);
  1117.   gtk_scale_set_digits (GTK_SCALE (scale), 2);
  1118.   gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
  1119.   gtk_range_set_update_policy (GTK_RANGE (scale), 0);
  1120.   gtk_signal_connect (GTK_OBJECT (smoothnessData), "value_changed",
  1121.               GTK_SIGNAL_FUNC (fp_scale_update),
  1122.               &Current.Alias);
  1123.   gtk_widget_show (scale);
  1124.   gtk_table_attach (GTK_TABLE (table), scale, 0, 1, 2, 3,
  1125.             0, 0, 0, 0);
  1126.  
  1127.   /******************* MISC OPTIONS ***************************/
  1128.  
  1129.   optionsFrame = gtk_frame_new (_("Miscellaneous Options"));
  1130.   gtk_widget_show (optionsFrame);
  1131.  
  1132.   gtk_box_pack_start (GTK_BOX (mainvbox), optionsFrame, TRUE, TRUE, 0);
  1133.  
  1134.  
  1135.   vbox = gtk_vbox_new (FALSE, 4);
  1136.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
  1137.   gtk_container_add (GTK_CONTAINER (optionsFrame), vbox);
  1138.   gtk_widget_show (vbox);
  1139.  
  1140.   Check_Button_In_A_Box (vbox, _("Preview as You Drag"),
  1141.              GTK_SIGNAL_FUNC (As_You_Drag),
  1142.              NULL, TRUE);
  1143.  
  1144.   frame = gtk_frame_new (_("Preview Size"));
  1145.   gtk_widget_show (frame);
  1146.  
  1147.   smoothnessData = gtk_adjustment_new (Current.PreviewSize, 
  1148.                        50, MAX_PREVIEW_SIZE, 
  1149.                        5, 5, 0.0);
  1150.       
  1151.   Current.previewSizeScale = scale =
  1152.     gtk_hscale_new (GTK_ADJUSTMENT (smoothnessData));
  1153.   gtk_container_add (GTK_CONTAINER (frame),scale);
  1154.   gtk_widget_set_usize (scale, 100, 0);
  1155.   gtk_scale_set_digits (GTK_SCALE (scale), 0);
  1156.   gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
  1157.   gtk_range_set_update_policy (GTK_RANGE (scale), 0);
  1158.   gtk_signal_connect (GTK_OBJECT (smoothnessData), "value_changed",
  1159.               GTK_SIGNAL_FUNC (preview_size_scale_update),
  1160.               &Current.PreviewSize);        
  1161.   gtk_widget_show (scale);
  1162.  
  1163.   gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
  1164.  
  1165.   return 1;
  1166. }
  1167.