summaryrefslogtreecommitdiff
path: root/graphics/gimp-app/files/patch-ah
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/gimp-app/files/patch-ah')
-rw-r--r--graphics/gimp-app/files/patch-ah337
1 files changed, 337 insertions, 0 deletions
diff --git a/graphics/gimp-app/files/patch-ah b/graphics/gimp-app/files/patch-ah
new file mode 100644
index 000000000000..97c39b1d7058
--- /dev/null
+++ b/graphics/gimp-app/files/patch-ah
@@ -0,0 +1,337 @@
+Date: Mon, 28 Apr 1997 13:14:20 -0500
+Message-Id: <199704281814.NAA31815@nuclecu.unam.mx>
+From: Federico Mena <federico@nuclecu.unam.mx>
+To: gimp-developer@scam.xcf.berkeley.edu
+Subject: PATCH: repeat functions added to blend.c
+Reply-to: federico@nuclecu.unam.mx
+
+Hello, everyone
+
+This patch makes the necessary changes to blend.c so that the blend
+tool lets you select among three different repeat functions:
+
+- None: this is the default, and it is the way the blend tool always
+has worked. On either side of the direction vector, the gradient will
+use 0 and 1 values, respectively.
+
+- Sawtooth wave: the gradient will repeat 01->01->01->etc.
+
+- Triangular wave: the gradient will repeat 01->10->01->10->etc.
+
+I have thus added the constants REPEAT-NONE, REPEAT-SAWTOOTH and
+REPEAT-TRIANGULAR to Script-fu.
+
+My next patch to blend.c will be to add adaptive supersampling.
+
+ Quartic
+
+--- app/blend.dist.c Mon Apr 28 09:06:57 1997
++++ app/blend.c Mon Apr 28 12:51:22 1997
+@@ -65,6 +65,15 @@
+ CUSTOM_MODE
+ } BlendMode;
+
++typedef enum
++{
++ REPEAT_NONE,
++ REPEAT_SAWTOOTH,
++ REPEAT_TRIANGULAR,
++} RepeatMode;
++
++typedef double (*RepeatFunc)(double);
++
+ typedef struct _BlendTool BlendTool;
+ struct _BlendTool
+ {
+@@ -85,7 +94,7 @@
+ BlendMode blend_mode;
+ int paint_mode;
+ GradientType gradient_type;
+- int repeat;
++ RepeatMode repeat;
+ };
+
+ /* local function prototypes */
+@@ -93,7 +102,7 @@
+ static void gradient_type_callback (GtkWidget *, gpointer);
+ static void blend_mode_callback (GtkWidget *, gpointer);
+ static void paint_mode_callback (GtkWidget *, gpointer);
+-static void repeat_toggle_update (GtkWidget *widget, int *value);
++static void repeat_type_callback (GtkWidget *, gpointer);
+
+ static void blend_button_press (Tool *, GdkEventButton *, gpointer);
+ static void blend_button_release (Tool *, GdkEventButton *, gpointer);
+@@ -105,7 +114,7 @@
+ BlendMode blend_mode, int paint_mode,
+ GradientType gradient_type,
+ double opacity, double offset,
+- int repeat,
++ RepeatMode repeat,
+ double startx, double starty,
+ double endx, double endy);
+
+@@ -125,10 +134,14 @@
+ static double gradient_calc_shapeburst_spherical_factor (double x, double y);
+ static double gradient_calc_shapeburst_dimpled_factor (double x, double y);
+
++static double gradient_repeat_none(double val);
++static double gradient_repeat_sawtooth(double val);
++static double gradient_repeat_triangular(double val);
++
+ static void gradient_precalc_shapeburst (GImage *gimage, int, PixelRegion *PR, double dist);
+ static void gradient_fill_region (GImage *gimage, int, PixelRegion *PR,
+ BlendMode blend_mode, GradientType gradient_type,
+- double offset, int repeat, int sx, int sy, int ex, int ey);
++ double offset, RepeatMode repeat, int sx, int sy, int ex, int ey);
+
+ static BlendOptions *create_blend_options (void);
+ static Argument *blend_invoker (Argument *);
+@@ -173,6 +186,16 @@
+ /* blend options */
+ static BlendOptions *blend_options = NULL;
+
++/* repeat menu items */
++
++static MenuItem repeat_option_items[] =
++{
++ { "None", 0, 0, repeat_type_callback, (gpointer) REPEAT_NONE, NULL, NULL },
++ { "Sawtooth wave", 0, 0, repeat_type_callback, (gpointer) REPEAT_SAWTOOTH, NULL, NULL },
++ { "Triangular wave", 0, 0, repeat_type_callback, (gpointer) REPEAT_TRIANGULAR, NULL, NULL },
++ { NULL, 0, 0, NULL, NULL, NULL, NULL }
++};
++
+
+ static void
+ blend_scale_update (GtkAdjustment *adjustment,
+@@ -203,13 +226,10 @@
+ }
+
+ static void
+-repeat_toggle_update(GtkWidget *widget,
+- int *value)
++repeat_type_callback(GtkWidget *widget,
++ gpointer client_data)
+ {
+- if (GTK_TOGGLE_BUTTON(widget)->active)
+- *value = TRUE;
+- else
+- *value = FALSE;
++ blend_options->repeat = (RepeatMode) client_data;
+ }
+
+ static BlendOptions *
+@@ -225,7 +245,8 @@
+ GtkWidget *pm_menu;
+ GtkWidget *gt_option_menu;
+ GtkWidget *gt_menu;
+- GtkWidget *button;
++ GtkWidget *rt_option_menu;
++ GtkWidget *rt_menu;
+ GtkWidget *opacity_scale;
+ GtkWidget *table;
+ GtkWidget *offset_scale;
+@@ -239,7 +260,7 @@
+ options->blend_mode = FG_BG_RGB_MODE;
+ options->paint_mode = NORMAL;
+ options->gradient_type = Linear;
+- options->repeat = FALSE;
++ options->repeat = REPEAT_NONE;
+
+ /* the main vbox */
+ vbox = gtk_vbox_new (FALSE, 5);
+@@ -257,7 +278,7 @@
+ gtk_widget_show(frame);
+
+ /* the table */
+- table = gtk_table_new (5, 2, FALSE);
++ table = gtk_table_new (6, 2, FALSE);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+ gtk_container_add(GTK_CONTAINER(frame), table);
+
+@@ -336,16 +357,22 @@
+ gtk_widget_show (label);
+ gtk_widget_show (gt_option_menu);
+
+- gtk_widget_show (table);
+-
+ /* the repeat option */
+
+- button = gtk_check_button_new_with_label("Repeat gradient");
+- gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
+- gtk_signal_connect(GTK_OBJECT(button), "toggled",
+- (GtkSignalFunc) repeat_toggle_update,
+- &options->repeat);
+- gtk_widget_show(button);
++ label = gtk_label_new("Repeat:");
++ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
++ gtk_table_attach(GTK_TABLE(table), label, 0, 1, 5, 6,
++ GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 2);
++ rt_menu = build_menu(repeat_option_items, NULL);
++ rt_option_menu = gtk_option_menu_new();
++ gtk_table_attach(GTK_TABLE(table), rt_option_menu, 1, 2, 5, 6,
++ GTK_EXPAND | GTK_SHRINK | GTK_FILL, GTK_SHRINK, 4, 2);
++ gtk_widget_show(label);
++ gtk_widget_show(rt_option_menu);
++
++ /* show the whole table */
++
++ gtk_widget_show (table);
+
+ /* Register this selection options widget with the main tools options dialog */
+ tools_register_options (BLEND, vbox);
+@@ -354,6 +381,7 @@
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (bm_option_menu), bm_menu);
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (gt_option_menu), gt_menu);
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (pm_option_menu), pm_menu);
++ gtk_option_menu_set_menu (GTK_OPTION_MENU (rt_option_menu), rt_menu);
+
+ return options;
+ }
+@@ -561,7 +589,7 @@
+ GradientType gradient_type,
+ double opacity,
+ double offset,
+- int repeat,
++ RepeatMode repeat,
+ double startx,
+ double starty,
+ double endx,
+@@ -865,6 +893,36 @@
+ return value;
+ }
+
++static double
++gradient_repeat_none(double val)
++{
++ return BOUNDS(val, 0.0, 1.0);
++}
++
++static double
++gradient_repeat_sawtooth(double val)
++{
++ if (val >= 0.0)
++ return fmod(val, 1.0);
++ else
++ return 1.0 - fmod(-val, 1.0);
++}
++
++static double
++gradient_repeat_triangular(double val)
++{
++ int ival;
++
++ if (val < 0.0)
++ val = -val;
++
++ ival = (int) val;
++
++ if (ival & 1)
++ return 1.0 - fmod(val, 1.0);
++ else
++ return fmod(val, 1.0);
++}
+
+ /*****/
+ static void
+@@ -956,7 +1014,7 @@
+ BlendMode blend_mode,
+ GradientType gradient_type,
+ double offset,
+- int repeat,
++ RepeatMode repeat,
+ int sx,
+ int sy,
+ int ex,
+@@ -973,6 +1031,7 @@
+ double factor;
+ unsigned char *data;
+ void * pr;
++ RepeatFunc repeat_func;
+
+ /* Get foreground and background colors */
+ palette_get_foreground(&rf, &gf, &bf);
+@@ -1058,6 +1117,26 @@
+ break;
+ } /* switch */
+
++ /* Set repeat function */
++
++ switch (repeat)
++ {
++ case REPEAT_NONE:
++ repeat_func = gradient_repeat_none;
++ break;
++
++ case REPEAT_SAWTOOTH:
++ repeat_func = gradient_repeat_sawtooth;
++ break;
++
++ case REPEAT_TRIANGULAR:
++ repeat_func = gradient_repeat_triangular;
++ break;
++
++ default:
++ fatal_error("gradient_fill_region(): unknown repeat mode %d", (int) repeat);
++ break;
++ } /* switch */
+
+ /* Cycle through the affected tiles and fill */
+ for (pr = pixel_regions_register (1, PR); pr != NULL; pr = pixel_regions_process (pr))
+@@ -1116,10 +1195,7 @@
+
+ /* Adjust for repeat */
+
+- if (repeat)
+- factor = fmod(factor, 1.0);
+- else
+- factor = BOUNDS(factor, 0.0, 1.0);
++ factor = (*repeat_func)(factor);
+
+ /* Blend the colors */
+
+@@ -1250,7 +1326,7 @@
+ },
+ { PDB_INT32,
+ "repeat",
+- "Repeat the gradient indefinitely along the direction vector"
++ "Repeat mode: { NONE (0), REPEAT_SAWTOOTH (1), REPEAT_TRIANGULAR (2) }"
+ },
+ { PDB_FLOAT,
+ "x1",
+@@ -1303,7 +1379,7 @@
+ GradientType gradient_type;
+ double opacity;
+ double offset;
+- int repeat;
++ RepeatMode repeat;
+ double x1, y1;
+ double x2, y2;
+ int int_value;
+@@ -1387,7 +1463,13 @@
+ if (success)
+ {
+ int_value = args[7].value.pdb_int;
+- repeat = (int_value ? TRUE : FALSE);
++ switch (int_value)
++ {
++ case 0: repeat = REPEAT_NONE; break;
++ case 1: repeat = REPEAT_SAWTOOTH; break;
++ case 2: repeat = REPEAT_TRIANGULAR; break;
++ default: success = FALSE;
++ }
+ }
+ /* x1, y1, x2, y2 */
+ if (success)
+--- plug-ins/script-fu/script-fu.c~ Sun Apr 27 00:31:00 1997
++++ plug-ins/script-fu/script-fu.c Mon Apr 28 12:58:19 1997
+@@ -493,6 +493,10 @@
+ setvar (cintern ("SHAPEBURST-SPHERICAL"), flocons (7), NIL);
+ setvar (cintern ("SHAPEBURST-DIMPLED"), flocons (8), NIL);
+
++ setvar (cintern ("REPEAT-NONE"), flocons(0), NIL);
++ setvar (cintern ("REPEAT-SAWTOOTH"), flocons(1), NIL);
++ setvar (cintern ("REPEAT-TRIANGULAR"), flocons(2), NIL);
++
+ setvar (cintern ("FG-BUCKET-FILL"), flocons (0), NIL);
+ setvar (cintern ("BG-BUCKET-FILL"), flocons (1), NIL);
+ setvar (cintern ("PATTERN-BUCKET-FILL"), flocons (2), NIL);