--- gimp-painter-_old/app/core/core-enums.h Fri Sep 26 03:00:06 2008 +++ gimp-painter--2.6.1/app/core/core-enums.h Fri Oct 24 23:49:16 2008 @@ -603,15 +603,16 @@ GIMP_CONTEXT_PROP_FOREGROUND = 6, GIMP_CONTEXT_PROP_BACKGROUND = 7, GIMP_CONTEXT_PROP_OPACITY = 8, - GIMP_CONTEXT_PROP_PAINT_MODE = 9, - GIMP_CONTEXT_PROP_BRUSH = 10, - GIMP_CONTEXT_PROP_PATTERN = 11, - GIMP_CONTEXT_PROP_GRADIENT = 12, - GIMP_CONTEXT_PROP_PALETTE = 13, - GIMP_CONTEXT_PROP_FONT = 14, - GIMP_CONTEXT_PROP_BUFFER = 15, - GIMP_CONTEXT_PROP_IMAGEFILE = 16, - GIMP_CONTEXT_PROP_TEMPLATE = 17, + GIMP_CONTEXT_PROP_FLOW = 9, + GIMP_CONTEXT_PROP_PAINT_MODE = 10, + GIMP_CONTEXT_PROP_BRUSH = 11, + GIMP_CONTEXT_PROP_PATTERN = 12, + GIMP_CONTEXT_PROP_GRADIENT = 13, + GIMP_CONTEXT_PROP_PALETTE = 14, + GIMP_CONTEXT_PROP_FONT = 15, + GIMP_CONTEXT_PROP_BUFFER = 16, + GIMP_CONTEXT_PROP_IMAGEFILE = 17, + GIMP_CONTEXT_PROP_TEMPLATE = 18, GIMP_CONTEXT_LAST_PROP = GIMP_CONTEXT_PROP_TEMPLATE } GimpContextPropType; @@ -626,20 +627,22 @@ GIMP_CONTEXT_FOREGROUND_MASK = 1 << 6, GIMP_CONTEXT_BACKGROUND_MASK = 1 << 7, GIMP_CONTEXT_OPACITY_MASK = 1 << 8, - GIMP_CONTEXT_PAINT_MODE_MASK = 1 << 9, - GIMP_CONTEXT_BRUSH_MASK = 1 << 10, - GIMP_CONTEXT_PATTERN_MASK = 1 << 11, - GIMP_CONTEXT_GRADIENT_MASK = 1 << 12, - GIMP_CONTEXT_PALETTE_MASK = 1 << 13, - GIMP_CONTEXT_FONT_MASK = 1 << 14, - GIMP_CONTEXT_BUFFER_MASK = 1 << 15, - GIMP_CONTEXT_IMAGEFILE_MASK = 1 << 16, - GIMP_CONTEXT_TEMPLATE_MASK = 1 << 17, + GIMP_CONTEXT_FLOW_MASK = 1 << 9, + GIMP_CONTEXT_PAINT_MODE_MASK = 1 << 10, + GIMP_CONTEXT_BRUSH_MASK = 1 << 11, + GIMP_CONTEXT_PATTERN_MASK = 1 << 12, + GIMP_CONTEXT_GRADIENT_MASK = 1 << 13, + GIMP_CONTEXT_PALETTE_MASK = 1 << 14, + GIMP_CONTEXT_FONT_MASK = 1 << 15, + GIMP_CONTEXT_BUFFER_MASK = 1 << 16, + GIMP_CONTEXT_IMAGEFILE_MASK = 1 << 17, + GIMP_CONTEXT_TEMPLATE_MASK = 1 << 18, /* aliases */ GIMP_CONTEXT_PAINT_PROPS_MASK = (GIMP_CONTEXT_FOREGROUND_MASK | GIMP_CONTEXT_BACKGROUND_MASK | GIMP_CONTEXT_OPACITY_MASK | + GIMP_CONTEXT_FLOW_MASK | GIMP_CONTEXT_PAINT_MODE_MASK | GIMP_CONTEXT_BRUSH_MASK | GIMP_CONTEXT_PATTERN_MASK | --- gimp-painter-_old/app/core/gimpcontext.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/core/gimpcontext.c Fri Oct 24 23:50:35 2008 @@ -145,6 +145,10 @@ static void gimp_context_real_set_opacity (GimpContext *context, gdouble opacity); +/* flow */ +static void gimp_context_real_set_flow (GimpContext *context, + gdouble flow); + /* paint mode */ static void gimp_context_real_set_paint_mode (GimpContext *context, GimpLayerModeEffects paint_mode); @@ -266,6 +270,7 @@ FOREGROUND_CHANGED, BACKGROUND_CHANGED, OPACITY_CHANGED, + FLOW_CHANGED, PAINT_MODE_CHANGED, BRUSH_CHANGED, PATTERN_CHANGED, @@ -289,6 +294,7 @@ "foreground", "background", "opacity", + "flow", "paint-mode", "brush", "pattern", @@ -312,6 +318,7 @@ G_TYPE_NONE, G_TYPE_NONE, G_TYPE_NONE, + G_TYPE_NONE, 0, 0, 0, @@ -421,6 +428,16 @@ G_TYPE_NONE, 1, G_TYPE_DOUBLE); + gimp_context_signals[FLOW_CHANGED] = + g_signal_new ("flow-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpContextClass, flow_changed), + NULL, NULL, + gimp_marshal_VOID__DOUBLE, + G_TYPE_NONE, 1, + G_TYPE_DOUBLE); + gimp_context_signals[PAINT_MODE_CHANGED] = g_signal_new ("paint-mode-changed", G_TYPE_FROM_CLASS (klass), @@ -526,6 +543,7 @@ klass->foreground_changed = NULL; klass->background_changed = NULL; klass->opacity_changed = NULL; + klass->flow_changed = NULL; klass->paint_mode_changed = NULL; klass->brush_changed = NULL; klass->pattern_changed = NULL; @@ -597,6 +615,14 @@ GIMP_OPACITY_OPAQUE, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, GIMP_CONTEXT_PROP_FLOW, + gimp_context_prop_names[GIMP_CONTEXT_PROP_FLOW], + NULL, + GIMP_OPACITY_TRANSPARENT, + GIMP_OPACITY_OPAQUE, + GIMP_OPACITY_OPAQUE, + GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, GIMP_CONTEXT_PROP_PAINT_MODE, gimp_context_prop_names[GIMP_CONTEXT_PROP_PAINT_MODE], NULL, @@ -972,6 +998,9 @@ case GIMP_CONTEXT_PROP_OPACITY: gimp_context_set_opacity (context, g_value_get_double (value)); break; + case GIMP_CONTEXT_PROP_FLOW: + gimp_context_set_flow (context, g_value_get_double (value)); + break; case GIMP_CONTEXT_PROP_PAINT_MODE: gimp_context_set_paint_mode (context, g_value_get_enum (value)); break; @@ -1049,6 +1078,9 @@ case GIMP_CONTEXT_PROP_OPACITY: g_value_set_double (value, gimp_context_get_opacity (context)); break; + case GIMP_CONTEXT_PROP_FLOW: + g_value_set_double (value, gimp_context_get_flow (context)); + break; case GIMP_CONTEXT_PROP_PAINT_MODE: g_value_set_enum (value, gimp_context_get_paint_mode (context)); break; @@ -1478,6 +1510,10 @@ gimp_context_real_set_opacity (dest, src->opacity); break; + case GIMP_CONTEXT_PROP_FLOW: + gimp_context_real_set_flow (dest, src->flow); + break; + case GIMP_CONTEXT_PROP_PAINT_MODE: gimp_context_real_set_paint_mode (dest, src->paint_mode); break; @@ -2231,6 +2267,50 @@ g_object_notify (G_OBJECT (context), "opacity"); gimp_context_opacity_changed (context); +} + +/*****************************************************************************/ +/* flow ********************************************************************/ + +gdouble +gimp_context_get_flow (GimpContext *context) +{ + g_return_val_if_fail (GIMP_IS_CONTEXT (context), GIMP_OPACITY_OPAQUE); + + return context->flow; +} + +void +gimp_context_set_flow (GimpContext *context, + gdouble flow) +{ + g_return_if_fail (GIMP_IS_CONTEXT (context)); + context_find_defined (context, GIMP_CONTEXT_PROP_FLOW); + + gimp_context_real_set_flow (context, flow); +} + +void +gimp_context_flow_changed (GimpContext *context) +{ + g_return_if_fail (GIMP_IS_CONTEXT (context)); + + g_signal_emit (context, + gimp_context_signals[FLOW_CHANGED], 0, + context->flow); +} + +static void +gimp_context_real_set_flow (GimpContext *context, + gdouble flow) +{ + if (context->flow == flow) + return; + + context->flow = flow; + + g_object_notify (G_OBJECT (context), "flow"); + gimp_context_flow_changed (context); } --- gimp-painter-_old/app/core/gimpcontext.h Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/core/gimpcontext.h Fri Oct 24 23:52:32 2008 @@ -65,6 +65,7 @@ GimpRGB background; gdouble opacity; + gdouble flow; GimpLayerModeEffects paint_mode; GimpBrush *brush; @@ -112,6 +113,8 @@ GimpRGB *color); void (* opacity_changed) (GimpContext *context, gdouble opacity); + void (* flow_changed) (GimpContext *context, + gdouble flow); void (* paint_mode_changed) (GimpContext *context, GimpLayerModeEffects paint_mode); void (* brush_changed) (GimpContext *context, @@ -247,6 +250,13 @@ void gimp_context_set_opacity (GimpContext *context, gdouble opacity); void gimp_context_opacity_changed (GimpContext *context); + + +/* flow */ +gdouble gimp_context_get_flow (GimpContext *context); +void gimp_context_set_flow (GimpContext *context, + gdouble flow); +void gimp_context_flow_changed (GimpContext *context); /* paint mode */ --- gimp-painter-_old/app/dialogs/about-dialog.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/dialogs/about-dialog.c Fri Oct 24 21:33:28 2008 @@ -609,7 +609,7 @@ gtk_widget_show (label); #endif - label = gtk_label_new (_("gimp-painter- (release 081007)")); + label = gtk_label_new (_("gimp-painter- (release 20081024)")); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (vbox), label, 2); gtk_widget_show (label); --- gimp-painter-_old/app/paint/gimpmixbrush.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/paint/gimpmixbrush.c Fri Oct 24 23:54:17 2008 @@ -702,7 +702,8 @@ history->opacity *= last_color->a; gimp_brush_core_paste_canvas (brush_core, drawable, - MIN (history->opacity, GIMP_OPACITY_OPAQUE), + MIN (history->opacity * gimp_context_get_flow (context), + GIMP_OPACITY_OPAQUE), gimp_context_get_opacity (context), gimp_context_get_paint_mode (context), gimp_paint_options_get_brush_mode (paint_options), --- gimp-painter-_old/app/paint/gimppaintbrush.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/paint/gimppaintbrush.c Fri Oct 24 20:41:16 2008 @@ -182,7 +182,8 @@ /* finally, let the brush core paste the colored area on the canvas */ gimp_brush_core_paste_canvas (brush_core, drawable, - MIN (opacity, GIMP_OPACITY_OPAQUE), + MIN (opacity * gimp_context_get_flow (context), + GIMP_OPACITY_OPAQUE), gimp_context_get_opacity (context), gimp_context_get_paint_mode (context), gimp_paint_options_get_brush_mode (paint_options), --- gimp-painter-_old/app/paint/gimppaintcore.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/paint/gimppaintcore.c Fri Oct 24 23:22:26 2008 @@ -458,6 +458,26 @@ tile_manager_unref (core->saved_proj_tiles); core->saved_proj_tiles = NULL; } +#if 0 /* DEBUG */ + if (core->canvas_tiles) + { + TileManager *tm = core->canvas_tiles; + gint w = tile_manager_width (tm); + gint h = tile_manager_height (tm); + gint bytes = tile_manager_bpp (tm); + gint len = w * h * bytes; + guchar *buf = g_new (guchar, len); + + read_pixel_data (tm, 0, 0, w - 1, h - 1, buf, w * bytes ); + + g_file_set_contents ("out.raw", buf, len, NULL); + + g_free (buf); + g_printerr ("wrote out.raw w:%d h:%d bpp:%d\n",w,h,bytes); + } + else + g_printerr ("has no color tiles!\n"); +#endif gimp_viewable_preview_thaw (GIMP_VIEWABLE (drawable)); } @@ -922,31 +942,27 @@ { guchar ct = canvas_tiles[j]; guchar pm = paint_mask[j]; + gint color_offset = j * color_tilesPR.bytes; + gint canvas_offset = j * canvas_bufPR.bytes; - if (ct == 0 || pm == 255) - { - for (k = 0; k < color_tilesPR.bytes; k++) - color_tiles[j * color_tilesPR.bytes + k] = - canvas_buf[j * canvas_bufPR.bytes + k]; - } - else if (ct == 255 && pm == 0) - { - for (k = 0; k < color_tilesPR.bytes; k++) - canvas_buf[j * canvas_bufPR.bytes + k] = - color_tiles[j * color_tilesPR.bytes + k]; - } - else + gint tmp, blend_op; + guchar value; + + if ((blend_op = pm + ct)) { - gint tmp; - guchar value; + blend_op = CLAMP (pm * 255 / blend_op, 0, 255); for (k = 0; k < color_tilesPR.bytes; k++) { - value = INT_BLEND (canvas_buf[j * canvas_bufPR.bytes + k], - color_tiles[j * color_tilesPR.bytes + k], + value = INT_BLEND (canvas_buf[canvas_offset + k], + color_tiles[color_offset + k], + blend_op, tmp); + value = INT_BLEND (canvas_buf[canvas_offset + k], + value, pm, tmp); - canvas_buf[j * canvas_bufPR.bytes + k] = value; - color_tiles[j * color_tilesPR.bytes + k] = value; + + canvas_buf[canvas_offset + k] = value; + color_tiles[color_offset + k] = value; } } } @@ -1152,7 +1168,7 @@ /* combine the mask to the canvas tiles */ combine_mask_and_region (&srcPR, paint_maskPR, - paint_opacity * 255.999, GIMP_IS_AIRBRUSH (core)); + paint_opacity * 255.999, GIMP_IS_PAINTBRUSH (core)); } static void --- gimp-painter-_old/app/tools/gimppaintoptions-gui.c Fri Oct 10 03:55:45 2008 +++ gimp-painter--2.6.1/app/tools/gimppaintoptions-gui.c Fri Oct 24 23:58:01 2008 @@ -132,6 +132,11 @@ gimp_prop_opacity_entry_new (config, "opacity", GTK_TABLE (table), 0, table_row++, _("Opacity:")); + /* the flow scale */ + if (g_type_is_a (tool_type, GIMP_TYPE_PAINTBRUSH_TOOL)) + gimp_prop_opacity_entry_new (config, "flow", + GTK_TABLE (table), 0, table_row++, + _("Flow:")); /* coords smoothing */ if (tool_type != GIMP_TYPE_INK2_TOOL && tool_type != GIMP_TYPE_BLEND_TOOL &&