--- gimp-painter--2.4.6.old/app/dialogs/about-dialog.c Wed Jan 30 18:48:14 2008 +++ gimp-painter--2.4.6/app/dialogs/about-dialog.c Fri Jun 20 01:32:46 2008 @@ -599,9 +599,9 @@ static void about_dialog_add_message (GtkWidget *vbox) { -#ifdef GIMP_UNSTABLE GtkWidget *label; +#ifdef GIMP_UNSTABLE label = gtk_label_new (_("This is an unstable development release.")); gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_STYLE, PANGO_STYLE_ITALIC, @@ -610,5 +610,10 @@ gtk_box_reorder_child (GTK_BOX (vbox), label, 2); gtk_widget_show (label); #endif + + label = gtk_label_new (_("gimp-painter- (build 080620)")); + 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--2.4.6.old/app/paint/gimpmixbrush.c Fri Jun 20 12:33:52 2008 +++ gimp-painter--2.4.6/app/paint/gimpmixbrush.c Fri Jun 20 03:51:26 2008 @@ -16,7 +16,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*#define CHECK_TIME*/ #include "config.h" @@ -31,6 +30,8 @@ #include "base/pixel-region.h" #include "base/temp-buf.h" +#include "base/pixel-processor.h" + #include "paint-funcs/paint-funcs.h" #include "core/gimp.h" @@ -65,6 +66,34 @@ } CoordsHistory; +/* Params of composite functions */ + +typedef struct _CompositeDabParam +{ + GimpRGB paint_color; + GimpRGB _paint_color; + gdouble opacity; + gdouble adjusted_opacity; + gint x; + gint y; + gint drawable_x; + gint drawable_y; + gboolean fringe; + gdouble fringe_contrast; + gdouble fringe_contrast_offset; + gdouble grain; + gboolean is_rgb; + gboolean has_alpha; + gboolean active_components[MAX_CHANNELS]; + + guchar *texture_data; + gint texture_bytes; + gint texture_width; + gint texture_height; + gint texture_stride; +} CompositeDabParam; + + static void gimp_mixbrush_finalize (GObject *object); static void gimp_mixbrush_paint (GimpPaintCore *paint_core, @@ -146,29 +175,14 @@ gdouble grain, GimpUpdateFreqOptions *update_freq_options); -__inline__ void composite_dab (GimpRGB *paint_color, - gdouble opacity, - PixelRegion *srcPR, - PixelRegion *maskPR, - const gboolean is_rgb, - const gboolean has_alpha, - gboolean *active_components); - -__inline__ void composite_textured_dab (GimpRGB *paint_color, - gdouble opacity, - PixelRegion *srcPR, - PixelRegion *maskPR, - TempBuf *texture_buf, - gint x, - gint y, - gint drawable_x, - gint drawable_y, - gboolean fringe, - gdouble fringe_contrast, - gdouble grain, - const gboolean is_rgb, - const gboolean has_alpha, - gboolean *active_components); +static void composite_dab (CompositeDabParam *params, + PixelRegion *srcPR, + PixelRegion *maskPR); + +static void composite_textured_dab (CompositeDabParam *params, + PixelRegion *srcPR, + PixelRegion *maskPR); + #endif @@ -1026,13 +1040,13 @@ gdouble grain, GimpUpdateFreqOptions *update_freq_options) { + CompositeDabParam params; + TempBuf *brush_mask = gimp_brush_core_get_brush_mask (GIMP_BRUSH_CORE (core), GIMP_BRUSH_SOFT); TempBuf *canvas_buf = core->canvas_buf; gint c_x, c_y, c_w, c_h; PixelRegion srcPR, maskPR; - gint x, y, off_x, off_y; - gboolean is_rgb, has_alpha; - gboolean active_components[MAX_CHANNELS]; + gint off_x, off_y; if (!brush_mask || !canvas_buf || @@ -1050,11 +1064,11 @@ c_x, c_y, c_w, c_h); /* init the pixel regions */ - x = (gint) floor (core->cur_coords.x) - (brush_mask->width >> 1); - y = (gint) floor (core->cur_coords.y) - (brush_mask->height >> 1); + params.x = (gint) floor (core->cur_coords.x) - (brush_mask->width >> 1); + params.y = (gint) floor (core->cur_coords.y) - (brush_mask->height >> 1); - off_x = (x < 0) ? -x : 0; - off_y = (y < 0) ? -y : 0; + off_x = (params.x < 0) ? -params.x : 0; + off_y = (params.y < 0) ? -params.y : 0; pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable), c_x, c_y, c_w, c_h, @@ -1064,40 +1078,45 @@ off_x, off_y, brush_mask->width, brush_mask->height); - is_rgb = (srcPR.bytes > 2); - has_alpha = (srcPR.bytes == 2 || srcPR.bytes == 4); + params.is_rgb = (srcPR.bytes > 2); + params.has_alpha = (srcPR.bytes == 2 || srcPR.bytes == 4); /* configure the active channel array */ - gimp_drawable_get_active_components (drawable, active_components); + gimp_drawable_get_active_components (drawable, params.active_components); - if (texture) + /* setup the composite params */ + params.paint_color = *paint_color; + params._paint_color.r = paint_color->r * 255.0; + if (params.is_rgb) { - gint dx, dy; + params._paint_color.g = paint_color->g * 255.0; + params._paint_color.b = paint_color->b * 255.0; + } + params.opacity = opacity; + params.adjusted_opacity = pow (opacity, 1.0 / 1.5); - gimp_item_offsets (GIMP_ITEM (drawable), &dx, &dy); + if (texture) + { + gimp_item_offsets (GIMP_ITEM (drawable), ¶ms.drawable_x, ¶ms.drawable_y); - composite_textured_dab (paint_color, - opacity, - &srcPR, - &maskPR, - texture->mask, - x, y, - dx, dy, - fringe, - fringe_contrast, - grain, - is_rgb, - has_alpha, - active_components); + params.grain = grain; + params.fringe = fringe; + params.fringe_contrast = fringe_contrast; + params.fringe_contrast_offset = (fringe_contrast - 1.0) * 0.5; + + params.texture_data = temp_buf_data (texture->mask); + params.texture_bytes = texture->mask->bytes; + params.texture_width = texture->mask->width; + params.texture_height = texture->mask->height; + params.texture_stride = params.texture_width * params.texture_bytes; +//g_printerr("<---"); + pixel_regions_process_parallel ((PixelProcessorFunc) composite_textured_dab, + ¶ms, 2, &srcPR, &maskPR); +//g_printerr("--->\n"); } else - composite_dab (paint_color, - opacity, - &srcPR, - &maskPR, - is_rgb, - has_alpha, - active_components); + pixel_regions_process_parallel ((PixelProcessorFunc) composite_dab, + ¶ms, 2, &srcPR, &maskPR); #if 0 { @@ -1186,291 +1205,230 @@ } -__inline__ void -composite_dab (GimpRGB *paint_color, - gdouble opacity, - PixelRegion *srcPR, - PixelRegion *maskPR, - const gboolean is_rgb, - const gboolean has_alpha, - gboolean *active_components) -{ - { /* _composite_* () */ - gpointer iter; - gint width, height; - gint src_bytes; - gint src_stride, mask_stride; - guchar *src_data, *_src_data; - guchar *mask_data, *_mask_data; - GimpRGB _paint_color; - gdouble adjusted_opacity = pow (opacity, 1.0 / 1.5); - /*static GimpRGB error = {0.0, 0.0, 0.0, 0.0}; - GimpRGB _error = {0.0, 0.0, 0.0, 0.0};*/ - - src_bytes = srcPR->bytes; - - _paint_color.r = paint_color->r * 255.0; - if (is_rgb) - { - _paint_color.g = paint_color->g * 255.0; - _paint_color.b = paint_color->b * 255.0; - } +static void +composite_dab (CompositeDabParam *params, + PixelRegion *srcPR, + PixelRegion *maskPR) +{ + gint width, height, bytes; + gint src_bytes; + gint src_stride, mask_stride; + guchar *src_data, *_src_data; + guchar *mask_data, *_mask_data; - for (iter = pixel_regions_register (2, srcPR, maskPR); iter != NULL; iter = pixel_regions_process (iter)) - { - gint i, j; + gint i, j; - src_data = srcPR->data; - mask_data = maskPR->data; - width = maskPR->w; - height = maskPR->h; - src_stride = srcPR->rowstride; - mask_stride = maskPR->rowstride; + src_data = srcPR->data; + src_bytes = srcPR->bytes; + mask_data = maskPR->data; + width = maskPR->w; + height = maskPR->h; + bytes = maskPR->bytes; + src_stride = srcPR->rowstride; + mask_stride = maskPR->rowstride; - for (i = 0; i < height; i++) - { - _src_data = src_data; - _mask_data = mask_data; + for (i = 0; i < height; i++) + { + _src_data = src_data; + _mask_data = mask_data; - for (j = 0; j < width; j++) - { - gdouble op, mask_op, paint_color_op, canvas_color_op, src_op; - gdouble factor1, factor2; - gdouble component; + for (j = 0; j < width; j++) + { + gdouble op, mask_op, paint_color_op, canvas_color_op, src_op; + gdouble factor1, factor2; + gdouble component; #if 0 - if (j == c_w / 2 && i == c_h / 2) - { - g_printerr ( "\nPos : %d %d\n", j, i); - g_printerr ( "Paint color: %f %f %f %f\n", _paint_color.r, _paint_color.g, _paint_color.b, paint_color->a); - g_printerr ( "Canvas color: %d %d %d %d\n", _src_data[0], _src_data[1], _src_data[2], _src_data[3]); - g_printerr ( "Opacity : %f\n", opacity); - } -#endif - if (_mask_data[0]) - { - mask_op = _mask_data[0] / 255.0; - - if (has_alpha && active_components[src_bytes - 1]) - { - gfloat n; - guint32 _n; - - src_op = _src_data[src_bytes - 1] / 255.0; - - /* workaround against insufficiency of opacity */ - /*if (paint_color->a > src_op) - op = pow (opacity, 1.0 / 1.5) * mask_op;*/ - n = paint_color->a - src_op; - _n = (*(guint32 *) &n) >> 31; - op = (opacity * _n + adjusted_opacity * (1 - _n)) * mask_op; - - component = (paint_color->a * op + src_op * (1.0 - op)) * 255.0/* + error.a*/; - _src_data[src_bytes - 1] = component + .5; - /*_error.a += component - _src_data[src_bytes - 1];*/ - } - else - src_op = 1.0; - - op = opacity * mask_op; - paint_color_op = paint_color->a * op; - - if (paint_color_op > 0.0) - { - canvas_color_op = (1.0 - paint_color_op) * src_op; - - factor1 = paint_color_op / (paint_color_op + canvas_color_op); - factor2 = 1.0 - factor1; - - component = _paint_color.r * factor1 + _src_data[0] * factor2/* + error.r*/; - _src_data[0] = component + .5; - /*_error.r += component - _src_data[0];*/ - if (is_rgb) - { - component = _paint_color.g * factor1 + _src_data[1] * factor2/* + error.g*/; - _src_data[1] = component + .5; - /*_error.g += component - _src_data[1];*/ - - component = _paint_color.b * factor1 + _src_data[2] * factor2/* + error.b*/; - _src_data[2] = component + .5; - /*_error.b += component - _src_data[2];*/ - } - } - } -#if 0 - if (j == c_w / 2 && i == c_h / 2) - { - g_printerr ( "Result color: %d %d %d %d\n", _src_data[0], _src_data[1], _src_data[2], _src_data[3]); - } + if (j == c_w / 2 && i == c_h / 2) + { + g_printerr ( "\nPos : %d %d\n", j, i); + g_printerr ( "Paint color: %f %f %f %f\n", params->_paint_color.r, params->_paint_color.g, params->_paint_color.b, params->paint_color->a); + g_printerr ( "Canvas color: %d %d %d %d\n", _src_data[0], _src_data[1], _src_data[2], _src_data[3]); + g_printerr ( "Opacity : %f\n", params->opacity); + } #endif - _src_data += src_bytes; - _mask_data++; - } - src_data += src_stride; - mask_data += mask_stride; - } - } /* end of iteration */ - /*if (npixels) - { - error.r = (_error.r / npixels) / 255.0; - error.g = (_error.g / npixels) / 255.0; - error.b = (_error.b / npixels) / 255.0; - error.a = (_error.a / npixels) / 255.0; - g_printerr ("error : %f %f %f %f\n", error.r, error.g, error.b, error.a); - }*/ - } /* _composite_* () */ -} + if (_mask_data[0]) + { + mask_op = _mask_data[0] / 255.0; -__inline__ void -composite_textured_dab (GimpRGB *paint_color, - gdouble opacity, - PixelRegion *srcPR, - PixelRegion *maskPR, - TempBuf *texture_buf, - gint x, - gint y, - gint drawable_x, - gint drawable_y, - gboolean fringe, - gdouble fringe_contrast, - gdouble grain, - const gboolean is_rgb, - const gboolean has_alpha, - gboolean *active_components) -{ - gpointer iter; - gint width, height, texture_width, texture_height; - gint src_bytes, texture_bytes; - gint src_stride, mask_stride, texture_stride; - guchar *src_data, *_src_data; - guchar *mask_data, *_mask_data; - guchar *texture_data; - GimpRGB _paint_color; - gdouble adjusted_opacity = pow (opacity, 1.0 / 1.5); - gdouble fringe_contrast_offset = (fringe_contrast - 1.0) * 0.5; - /*static GimpRGB error = {0.0, 0.0, 0.0, 0.0}; - GimpRGB _error = {0.0, 0.0, 0.0, 0.0};*/ + if (params->has_alpha && params->active_components[src_bytes - 1]) + { + gfloat n; + guint32 _n; - src_bytes = srcPR->bytes; + src_op = _src_data[src_bytes - 1] / 255.0; - _paint_color.r = paint_color->r * 255.0; - if (is_rgb) - { - _paint_color.g = paint_color->g * 255.0; - _paint_color.b = paint_color->b * 255.0; + /* workaround against insufficiency of opacity */ + /*if (params->paint_color->a > src_op) + op = pow (params->opacity, 1.0 / 1.5) * mask_op;*/ + n = params->paint_color.a - src_op; + _n = (*(guint32 *) &n) >> 31; + op = (params->opacity * _n + params->adjusted_opacity * (1 - _n)) * mask_op; + + component = (params->paint_color.a * op + src_op * (1.0 - op)) * 255.0/* + error.a*/; + _src_data[src_bytes - 1] = component + .5; + /*_error.a += component - _src_data[src_bytes - 1];*/ + } + else + src_op = 1.0; + + op = params->opacity * mask_op; + paint_color_op = params->paint_color.a * op; + + if (paint_color_op > 0.0) + { + canvas_color_op = (1.0 - paint_color_op) * src_op; + + factor1 = paint_color_op / (paint_color_op + canvas_color_op); + factor2 = 1.0 - factor1; + + component = params->_paint_color.r * factor1 + _src_data[0] * factor2/* + error.r*/; + _src_data[0] = component + .5; + /*_error.r += component - _src_data[0];*/ + if (params->is_rgb) + { + component = params->_paint_color.g * factor1 + _src_data[1] * factor2/* + error.g*/; + _src_data[1] = component + .5; + /*_error.g += component - _src_data[1];*/ + + component = params->_paint_color.b * factor1 + _src_data[2] * factor2/* + error.b*/; + _src_data[2] = component + .5; + /*_error.b += component - _src_data[2];*/ + } + } + } +#if 0 + if (j == c_w / 2 && i == c_h / 2) + { + g_printerr ( "Result color: %d %d %d %d\n", _src_data[0], _src_data[1], _src_data[2], _src_data[3]); + } +#endif + _src_data += src_bytes; + _mask_data++; + } + src_data += src_stride; + mask_data += mask_stride; } +} /* end of iteration */ - texture_data = temp_buf_data (texture_buf); - texture_bytes = texture_buf->bytes; - texture_width = texture_buf->width; - texture_height = texture_buf->height; - texture_stride = texture_width * texture_bytes; - for (iter = pixel_regions_register (2, srcPR, maskPR); iter != NULL; iter = pixel_regions_process (iter)) - { - gint i, j; - gint texture_off_x, _texture_off_x, texture_off_y; - guchar *texture_row_data; +static void +composite_textured_dab (CompositeDabParam *params, + PixelRegion *srcPR, + PixelRegion *maskPR) +{ + gint width, height, bytes; + gint src_bytes; + gint src_stride, mask_stride; + guchar *src_data, *_src_data; + guchar *mask_data, *_mask_data; - /* calc origin of texture buffer */ - texture_off_x = drawable_x + x + maskPR->x; - texture_off_y = drawable_y + y + maskPR->y; + gint i, j; + gint texture_off_x, _texture_off_x, texture_off_y; + guchar *texture_row_data; + + /* calc origin of texture buffer */ + texture_off_x = params->drawable_x + params->x + maskPR->x; + texture_off_y = params->drawable_y + params->y + maskPR->y; - src_data = srcPR->data; - mask_data = maskPR->data; - width = maskPR->w; - height = maskPR->h; - src_stride = srcPR->rowstride; - mask_stride = maskPR->rowstride; + src_data = srcPR->data; + src_bytes = srcPR->bytes; + mask_data = maskPR->data; + width = maskPR->w; + height = maskPR->h; + bytes = maskPR->bytes; + src_stride = srcPR->rowstride; + mask_stride = maskPR->rowstride; + +//g_printerr("<<"); + for (i = 0; i < height; i++, texture_off_y++) + { + _src_data = src_data; + _mask_data = mask_data; + + texture_off_y = texture_off_y % params->texture_height; + _texture_off_x = texture_off_x; + texture_row_data = params->texture_data + texture_off_y * params->texture_stride; - for (i = 0; i < height; i++, texture_off_y++) + for (j = 0; j < width; j++, _texture_off_x++) { - _src_data = src_data; - _mask_data = mask_data; + gdouble op, mask_op, paint_color_op, canvas_color_op, src_op; + gdouble texture_op; + gdouble factor1, factor2; + gdouble component; - texture_off_y = texture_off_y % texture_height; - _texture_off_x = texture_off_x; - texture_row_data = texture_data + texture_off_y * texture_stride; - - for (j = 0; j < width; j++, _texture_off_x++) - { - gdouble op, mask_op, paint_color_op, canvas_color_op, src_op; - gdouble texture_op; - gdouble factor1, factor2; - gdouble component; + _texture_off_x = _texture_off_x % params->texture_width; - _texture_off_x = _texture_off_x % texture_width; + texture_op = *(texture_row_data + _texture_off_x * params->texture_bytes) / 255.0; + texture_op = CLAMP (texture_op + params->grain, 0.0, 1.0); - texture_op = *(texture_row_data + _texture_off_x * texture_bytes) / 255.0; - texture_op = CLAMP (texture_op + grain, 0.0, 1.0); + if (_mask_data[0]) + { + mask_op = _mask_data[0] / 255.0; - if (_mask_data[0]) + if (params->fringe) { - mask_op = _mask_data[0] / 255.0; + texture_op = (texture_op * (1.0 - mask_op) + mask_op); + mask_op = CLAMP (mask_op * texture_op * params->fringe_contrast - params->fringe_contrast_offset, 0.0, 1.0); + } + else + mask_op *= texture_op; - if (fringe) + if (mask_op) + { + if (params->has_alpha && params->active_components[src_bytes - 1]) { - texture_op = (texture_op * (1.0 - mask_op) + mask_op); - mask_op = CLAMP (mask_op * texture_op * fringe_contrast - fringe_contrast_offset, 0.0, 1.0); + gfloat n; + guint32 _n; + + src_op = _src_data[src_bytes - 1] / 255.0; + + /* workaround against insufficiency of opacity */ + /*if (params->paint_color.a > src_op) + op = pow (params->opacity, 1.0 / 1.5) * mask_op;*/ + n = params->paint_color.a - src_op; + _n = (*(guint32 *) &n) >> 31; + op = (params->opacity * _n + params->adjusted_opacity * (1 - _n)) * mask_op; + + component = (params->paint_color.a * op + src_op * (1.0 - op)) * 255.0/* + error.a*/; + _src_data[src_bytes - 1] = component + .5; + /*_error.a += component - _src_data[src_bytes - 1];*/ } else - mask_op *= texture_op; + src_op = 1.0; - if (mask_op) - { - if (has_alpha && active_components[src_bytes - 1]) - { - gfloat n; - guint32 _n; - - src_op = _src_data[src_bytes - 1] / 255.0; + op = params->opacity * mask_op; + paint_color_op = params->paint_color.a * op; - /* workaround against insufficiency of opacity */ - /*if (paint_color->a > src_op) - op = pow (opacity, 1.0 / 1.5) * mask_op;*/ - n = paint_color->a - src_op; - _n = (*(guint32 *) &n) >> 31; - op = (opacity * _n + adjusted_opacity * (1 - _n)) * mask_op; - - component = (paint_color->a * op + src_op * (1.0 - op)) * 255.0/* + error.a*/; - _src_data[src_bytes - 1] = component + .5; - /*_error.a += component - _src_data[src_bytes - 1];*/ - } - else - src_op = 1.0; + if (paint_color_op > 0.0) + { + canvas_color_op = (1.0 - paint_color_op) * src_op; - op = opacity * mask_op; - paint_color_op = paint_color->a * op; + factor1 = paint_color_op / (paint_color_op + canvas_color_op); + factor2 = 1.0 - factor1; - if (paint_color_op > 0.0) + component = params->_paint_color.r * factor1 + _src_data[0] * factor2/* + error.r*/; + _src_data[0] = component + .5; + /*_error.r += component - _src_data[0];*/ + if (params->is_rgb) { - canvas_color_op = (1.0 - paint_color_op) * src_op; - - factor1 = paint_color_op / (paint_color_op + canvas_color_op); - factor2 = 1.0 - factor1; - - component = _paint_color.r * factor1 + _src_data[0] * factor2/* + error.r*/; - _src_data[0] = component + .5; - /*_error.r += component - _src_data[0];*/ - if (is_rgb) - { - component = _paint_color.g * factor1 + _src_data[1] * factor2/* + error.g*/; - _src_data[1] = component + .5; - /*_error.g += component - _src_data[1];*/ - - component = _paint_color.b * factor1 + _src_data[2] * factor2/* + error.b*/; - _src_data[2] = component + .5; - /*_error.b += component - _src_data[2];*/ - } + component = params->_paint_color.g * factor1 + _src_data[1] * factor2/* + error.g*/; + _src_data[1] = component + .5; + /*_error.g += component - _src_data[1];*/ + + component = params->_paint_color.b * factor1 + _src_data[2] * factor2/* + error.b*/; + _src_data[2] = component + .5; + /*_error.b += component - _src_data[2];*/ } } - } - _src_data += src_bytes; - _mask_data++; - } - src_data += src_stride; - mask_data += mask_stride; + } + } + _src_data += src_bytes; + _mask_data++; } - } /* end of iteration */ -} + src_data += src_stride; + mask_data += mask_stride; + } +//g_printerr(">>"); +} /* end of iteration */ #endif