--- gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrush.c.orig Fri Dec 7 09:34:13 2007 +++ gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrush.c Sun Dec 9 13:07:19 2007 @@ -231,7 +231,7 @@ image = gimp_item_get_image (GIMP_ITEM (drawable)); mixbrush->use_alt_alpha_op = - (mixbrush_options->use_alt_composite_op && gimp_drawable_has_alpha (drawable)); + (mixbrush_options->alpha_channel_mixing && gimp_drawable_has_alpha (drawable)); /* Init the pressure params */ calc_pressure_params (&mixbrush->pr_main_density, @@ -329,17 +329,6 @@ } } - /* Init the mask buffer */ - if (mixbrush_options->use_alt_composite_op) - { - gint w, h; - const guchar opaque_value = OPAQUE_OPACITY; - - gimp_brush_scale_size (GIMP_BRUSH_CORE (paint_core)->brush, - paint_options->brush_scale, &w, &h); - mixbrush->mask = temp_buf_new (w, h, 1, 0, 0, &opaque_value); - } - /* Reset the rounding error */ gimp_rgba_set (&mixbrush->error, 0, 0, 0, 0); } @@ -460,7 +449,7 @@ calc_pressure (paint_core->cur_coords.pressure, &mixbrush->pr_main_rate), 0.0, 1.0); - /*if (mixbrush_options->use_alt_composite_op) + /*if (mixbrush_options->alpha_channel_mixing) blend_rgba (&main_color, main_op, last_color, 1.0 - main_op, &main_color, FALSE); @@ -484,7 +473,7 @@ calc_pressure (paint_core->cur_coords.pressure, &mixbrush->pr_canvas_rate), 0.0, 1.0); - /*if (mixbrush_options->use_alt_composite_op) + /*if (mixbrush_options->alpha_channel_mixing) blend_rgba (&canvas_color, canvas_op, &history->color, 1.0 - canvas_op, &canvas_color, FALSE); @@ -492,16 +481,12 @@ composite_rgba (&canvas_color, canvas_op, &history->color, 1.0, &canvas_color, FALSE);*/ -//g_printerr ("m:%f, %f, %f %f\n",canvas_color.r,canvas_color.g,canvas_color.b,canvas_color.a); -//g_printerr ("l:%f, %f, %f %f\n",history->color.r,history->color.g,history->color.b,history->color.a); blend_rgba (&canvas_color, canvas_op, &history->color, 1.0 - canvas_op, &canvas_color, TRUE/*FALSE*/); -//g_printerr ("r:%f, %f, %f %f\n\n",canvas_color.r,canvas_color.g,canvas_color.b,canvas_color.a); /* Correct the rounding error came from the last process */ gimp_rgba_add (&canvas_color, &mixbrush->error); - //g_printerr ("error:%f %f %f %f\n",mixbrush->error.r,mixbrush->error.g,mixbrush->error.b,mixbrush->error.a); /* Put the hidden color below the canvas color */ if (mixbrush->hidden_color.a > 0.0) @@ -528,12 +513,15 @@ main_op = CLAMP (main_op, 0.0, 1.0); canvas_op = CLAMP (canvas_op, 0.0, 1.0); +//g_printerr ("m:%f, %f, %f %f\n",canvas_color.r,canvas_color.g,canvas_color.b,canvas_color.a); +//g_printerr ("l:%f, %f, %f %f\n",history->color.r,history->color.g,history->color.b,history->color.a); if (mixbrush_options->pigment) composite_rgba (&main_color, main_op, &canvas_color, canvas_op, last_color, /*FALSE*/mixbrush->use_alt_alpha_op); else blend_rgba (&main_color, main_op, &canvas_color, canvas_op, last_color, /*FALSE*/mixbrush->use_alt_alpha_op); +//g_printerr ("r:%f, %f, %f %f\n\n",canvas_color.r,canvas_color.g,canvas_color.b,canvas_color.a); #if 0 if (mixbrush_options->remove_color && @@ -575,7 +563,6 @@ &color_uchar[1], &color_uchar[2], &color_uchar[3]); - //g_printerr ("color_uchar %d %d %d %d\n\n",color_uchar[0],color_uchar[1],color_uchar[2],color_uchar[3]); /* Set the rounding error to mixbrush->error */ mixbrush->error.r = last_color->r - color_uchar[0] / 255.0; @@ -591,7 +578,7 @@ history->opacity *= PRESSURE_SCALE * history->coords.pressure; /* finally, let the brush core paste the colored area on the canvas */ - if (mixbrush_options->use_alt_composite_op && + if (mixbrush_options->alpha_channel_mixing && paint_appl_mode == GIMP_PAINT_INCREMENTAL) { gdouble op = MIN (history->opacity, GIMP_OPACITY_OPAQUE) * gimp_context_get_opacity (context); @@ -788,12 +775,14 @@ if (use_alt_alpha_op) { op1 = pow (op1, 1.35); /* workaround against opacity inflation */ + op2 = pow (op2, 1.15); rgb1.a = op1 + op2; if (rgb1.a != 0) { rgb1.a = op1 / rgb1.a; /* factor */ rgb1.a = color1->a * rgb1.a + color2->a * (1.0 - rgb1.a); + rgb1.a *= op1 + (1.0 - op1) *op2; } } @@ -947,11 +936,10 @@ GimpMixbrush *mixbrush = GIMP_MIXBRUSH (core); TempBuf *brush_mask = gimp_brush_core_get_brush_mask (GIMP_BRUSH_CORE (core), GIMP_BRUSH_SOFT); TempBuf *canvas_buf = core->canvas_buf; - //TempBuf *opaque_mask = NULL; PixelRegion srcPR, destPR, maskPR; gpointer iter; gint x, y, off_x, off_y; - //const guchar opaque_value = OPAQUE_OPACITY; + const guchar opaque_value = OPAQUE_OPACITY; if (!brush_mask || !canvas_buf || opacity == 0.0) return; @@ -1044,7 +1032,7 @@ if (gimp_drawable_has_alpha (drawable)) /*dest_color.a = paint_color->a + ((src_color.a - paint_color->a) * (1.0 - op));*/ { - /* workaround */ + /* workaround against insufficiency of opacity */ if (paint_color->a > src_color.a) op = pow (opacity, 1.0 / 1.5) * (_mask_data[0] / 255.0); dest_color.a = paint_color->a * op + src_color.a * (1.0 - op); @@ -1070,14 +1058,10 @@ switch (srcPR.bytes) { case 1: - /*_dest_data[0] = _dest_data[1] = _dest_data[2] = MIN (dest_color.r * 255.0 + 0.5, 255); - _dest_data[3] = 255;*/ _dest_data[0] = MIN (dest_color.r * 255.0 + 0.5, 255); _dest_data[1] = 255; break; case 2: - /*_dest_data[0] = _dest_data[1] = _dest_data[2] = MIN (dest_color.r * 255.0 + 0.5, 255); - _dest_data[3] = MIN (dest_color.a * 255.0 + 0.5, 255);*/ _dest_data[0] = MIN (dest_color.r * 255.0 + 0.5, 255); _dest_data[1] = MIN (dest_color.a * 255.0 + 0.5, 255); break; @@ -1117,13 +1101,22 @@ } #endif - //mixbrush->mask->x = canvas_buf->x; - //mixbrush->mask->y = canvas_buf->y; + if (! mixbrush->mask) + mixbrush->mask = temp_buf_new (canvas_buf->width, + canvas_buf->height, + 1, 0, 0, &opaque_value); + else if (mixbrush->mask->width < canvas_buf->width || + mixbrush->mask->height < canvas_buf->height) + { + temp_buf_free (mixbrush->mask); + mixbrush->mask = temp_buf_new (canvas_buf->width, + canvas_buf->height, + 1, 0, 0, &opaque_value); + } pixel_region_init_temp_buf (&maskPR, mixbrush->mask, - off_x, off_y, - mixbrush->mask->width, mixbrush->mask->height); + 0, 0,/*off_x, off_y,*/ + canvas_buf->width, canvas_buf->height); gimp_paint_core_replace (core, &maskPR, drawable, 1.0, 1.0, GIMP_PAINT_INCREMENTAL); - //temp_buf_free (opaque_mask); } --- gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrushoptions.c.orig Sun Dec 2 15:20:05 2007 +++ gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrushoptions.c Sun Dec 9 13:05:49 2007 @@ -24,26 +24,30 @@ #include "paint-types.h" +#include "gimppaintoptions.h" #include "gimpmixbrushoptions.h" #define MIXBRUSH_DEFAULT_MAIN_COLOR_DENSITY 0.5 -#define MIXBRUSH_DEFAULT_MAIN_COLOR_RATE 0.1 -#define MIXBRUSH_DEFAULT_CANVAS_COLOR_DENSITY 0.5 -#define MIXBRUSH_DEFAULT_CANVAS_COLOR_RATE 0.9 +#define MIXBRUSH_DEFAULT_MAIN_COLOR_RATE 0.2 +#define MIXBRUSH_DEFAULT_CANVAS_COLOR_DENSITY 1.0 +#define MIXBRUSH_DEFAULT_CANVAS_COLOR_RATE 1.0 #define MIXBRUSH_DEFAULT_PRESSURE_IN1 0.0 #define MIXBRUSH_DEFAULT_PRESSURE_IN2 1.0 #define MIXBRUSH_DEFAULT_PRESSURE_OUT1 0.5 #define MIXBRUSH_DEFAULT_PRESSURE_OUT2 1.0 +#define MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT1 1.0 +#define MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT2 1.0 #define MIXBRUSH_DEFAULT_DRYOUT 0.0 -#define MIXBRUSH_DEFAULT_DELAY 3 -#define MIXBRUSH_DEFAULT_TAIL TRUE +#define MIXBRUSH_DEFAULT_DELAY 0 +#define MIXBRUSH_DEFAULT_TAIL FALSE #define MIXBRUSH_DEFAULT_MERGED FALSE #define MIXBRUSH_DEFAULT_PIGMENT TRUE -#define MIXBRUSH_DEFAULT_HIDDEN_COLOR GIMP_HIDDEN_COLOR_WHITE +#define MIXBRUSH_DEFAULT_HIDDEN_COLOR GIMP_HIDDEN_COLOR_NORMAL #define MIXBRUSH_DEFAULT_REMOVE_COLOR FALSE #define MIXBRUSH_DEFAULT_SAMPLE_SIZE_LIMIT 1 -#define MIXBRUSH_DEFAULT_USE_ALT_COMPOSITE_OP FALSE +#define MIXBRUSH_DEFAULT_ALPHA_CHANNEL_MIXING TRUE +#define MIXBRUSH_DEFAULT_APPLICATION_MODE GIMP_PAINT_INCREMENTAL enum @@ -77,7 +81,8 @@ PROP_HIDDEN_COLOR, PROP_REMOVE_COLOR, PROP_SAMPLE_SIZE_LIMIT, - PROP_USE_ALT_COMPOSITE_OP + PROP_ALPHA_CHANNEL_MIXING, + PROP_APPLICATION_MODE }; @@ -177,12 +182,12 @@ GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CANVAS_COLOR_DENSITY_PRESSURE_OUT1, "canvas-color-density-pressure-out1", NULL, - 0.0, 1.0, MIXBRUSH_DEFAULT_PRESSURE_OUT1, + 0.0, 1.0, MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT1, GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CANVAS_COLOR_DENSITY_PRESSURE_OUT2, "canvas-color-density-pressure-out2", NULL, - 0.0, 1.0, MIXBRUSH_DEFAULT_PRESSURE_OUT2, + 0.0, 1.0, MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT2, GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CANVAS_COLOR_PRESSURE_IN1, @@ -197,12 +202,12 @@ GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CANVAS_COLOR_PRESSURE_OUT1, "canvas-color-pressure-out1", NULL, - 0.0, 1.0, MIXBRUSH_DEFAULT_PRESSURE_OUT1, + 0.0, 1.0, MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT1, GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CANVAS_COLOR_PRESSURE_OUT2, "canvas-color-pressure-out2", NULL, - 0.0, 1.0, MIXBRUSH_DEFAULT_PRESSURE_OUT2, + 0.0, 1.0, MIXBRUSH_DEFAULT_CANVAS_PRESSURE_OUT2, GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_UINT (object_class, PROP_DRYOUT, @@ -246,10 +251,18 @@ 1, 50, MIXBRUSH_DEFAULT_SAMPLE_SIZE_LIMIT, GIMP_PARAM_STATIC_STRINGS); - GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_USE_ALT_COMPOSITE_OP, - "use-alt-composite-op", NULL, - MIXBRUSH_DEFAULT_USE_ALT_COMPOSITE_OP, + GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_ALPHA_CHANNEL_MIXING, + "alpha-channel-mixing", NULL, + MIXBRUSH_DEFAULT_ALPHA_CHANNEL_MIXING, GIMP_PARAM_STATIC_STRINGS); + + GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_APPLICATION_MODE, + "mixbrush-application-mode", NULL, + GIMP_TYPE_PAINT_APPLICATION_MODE, + MIXBRUSH_DEFAULT_APPLICATION_MODE, + GIMP_PARAM_STATIC_STRINGS); + + g_object_class_override_property (object_class, PROP_APPLICATION_MODE, "application-mode"); } static void @@ -351,8 +364,11 @@ case PROP_SAMPLE_SIZE_LIMIT: options->sample_size_limit = g_value_get_uint (value); break; - case PROP_USE_ALT_COMPOSITE_OP: - options->use_alt_composite_op = g_value_get_boolean (value); + case PROP_ALPHA_CHANNEL_MIXING: + options->alpha_channel_mixing = g_value_get_boolean (value); + break; + case PROP_APPLICATION_MODE: + GIMP_PAINT_OPTIONS (options)->application_mode = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -454,8 +470,11 @@ case PROP_SAMPLE_SIZE_LIMIT: g_value_set_uint (value, options->sample_size_limit); break; - case PROP_USE_ALT_COMPOSITE_OP: - g_value_set_boolean (value, options->use_alt_composite_op); + case PROP_ALPHA_CHANNEL_MIXING: + g_value_set_boolean (value, options->alpha_channel_mixing); + break; + case PROP_APPLICATION_MODE: + g_value_set_enum (value, GIMP_PAINT_OPTIONS (options)->application_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); --- gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrushoptions.h.orig Sun Dec 2 05:36:45 2007 +++ gimp-2.4.2_gpen_mixbrush/app/paint/gimpmixbrushoptions.h Sat Dec 8 07:24:20 2007 @@ -80,7 +80,7 @@ GimpHiddenColor hidden_color; gboolean remove_color; guint sample_size_limit; - gboolean use_alt_composite_op; + gboolean alpha_channel_mixing; }; struct _GimpMixbrushOptionsClass --- gimp-2.4.2_gpen_mixbrush/app/tools/gimpmixbrushtool.c.orig Sun Dec 2 15:29:23 2007 +++ gimp-2.4.2_gpen_mixbrush/app/tools/gimpmixbrushtool.c Sat Dec 8 13:21:18 2007 @@ -95,7 +95,7 @@ gtk_widget_show (table); - mixbrush_button = gimp_prop_check_button_new (config, "use-alt-composite-op", _("Alpha channel mixing")); + mixbrush_button = gimp_prop_check_button_new (config, "alpha-channel-mixing", _("Alpha channel mixing")); gtk_box_pack_start (GTK_BOX (vbox), mixbrush_button, FALSE, TRUE, 0); gtk_widget_show (mixbrush_button);