[gimp/goat-invasion] app: port gimp_drawable_real_apply_buffer() to GEGL
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/goat-invasion] app: port gimp_drawable_real_apply_buffer() to GEGL
- Date: Fri, 6 Apr 2012 19:58:41 +0000 (UTC)
commit 0cc8a96a2d49a4e685dbc957c4ae93e89d7ece4d
Author: Michael Natterer <mitch gimp org>
Date: Fri Apr 6 21:56:55 2012 +0200
app: port gimp_drawable_real_apply_buffer() to GEGL
but leave the old code there and use it for FS compositing (when
dest_buffer is != NULL) because we need the legacy projection as
reference.
app/core/gimpdrawable-combine.c | 201 +++++++++++++++++++++++----------------
1 files changed, 118 insertions(+), 83 deletions(-)
---
diff --git a/app/core/gimpdrawable-combine.c b/app/core/gimpdrawable-combine.c
index 514e09b..d22692d 100644
--- a/app/core/gimpdrawable-combine.c
+++ b/app/core/gimpdrawable-combine.c
@@ -28,8 +28,11 @@
#include "paint-funcs/paint-funcs.h"
+#include "gegl/gimp-gegl-nodes.h"
#include "gegl/gimp-gegl-utils.h"
+#include "gimp.h"
+#include "gimp-apply-operation.h"
#include "gimpchannel.h"
#include "gimpdrawable-combine.h"
#include "gimpdrawableundo.h"
@@ -52,58 +55,25 @@ gimp_drawable_real_apply_buffer (GimpDrawable *drawable,
gint dest_x,
gint dest_y)
{
- GimpItem *item = GIMP_ITEM (drawable);
- GimpImage *image = gimp_item_get_image (item);
- GimpChannel *mask = gimp_image_get_mask (image);
- TempBuf *temp_buf;
- PixelRegion src1PR, src2PR, destPR;
- gint x, y, width, height;
- gint offset_x, offset_y;
- CombinationMode operation;
- gboolean active_components[MAX_CHANNELS];
-
- temp_buf = gimp_gegl_buffer_get_temp_buf (buffer);
-
- if (temp_buf)
- {
- pixel_region_init_temp_buf (&src2PR, temp_buf,
- buffer_region->x, buffer_region->y,
- buffer_region->width, buffer_region->height);
- }
- else
- {
- pixel_region_init (&src2PR, gimp_gegl_buffer_get_tiles (buffer),
- buffer_region->x, buffer_region->y,
- buffer_region->width, buffer_region->height,
- FALSE);
- }
-
- if (! base_buffer)
- base_buffer = gimp_drawable_get_buffer (drawable);
+ GimpItem *item = GIMP_ITEM (drawable);
+ GimpImage *image = gimp_item_get_image (item);
+ GimpChannel *mask = gimp_image_get_mask (image);
+ gint x, y, width, height;
+ gint offset_x, offset_y;
/* don't apply the mask to itself and don't apply an empty mask */
if (GIMP_DRAWABLE (mask) == drawable || gimp_channel_is_empty (mask))
mask = NULL;
- /* configure the active channel array */
- gimp_drawable_get_active_components (drawable, active_components);
-
- /* determine what sort of operation is being attempted and
- * if it's actually legal...
- */
- operation = gimp_image_get_combination_mode (gimp_drawable_type (drawable),
- src2PR.bytes);
- if (operation == -1)
- {
- g_warning ("%s: illegal parameters.", G_STRFUNC);
- return;
- }
+ if (! base_buffer)
+ base_buffer = gimp_drawable_get_buffer (drawable);
/* get the layer offsets */
gimp_item_get_offset (item, &offset_x, &offset_y);
/* make sure the image application coordinates are within drawable bounds */
- gimp_rectangle_intersect (base_x, base_y, src2PR.w, src2PR.h,
+ gimp_rectangle_intersect (base_x, base_y,
+ buffer_region->width, buffer_region->height,
0, 0,
gimp_item_get_width (item),
gimp_item_get_height (item),
@@ -124,7 +94,6 @@ gimp_drawable_real_apply_buffer (GimpDrawable *drawable,
&x, &y, &width, &height);
}
- /* If the calling procedure specified an undo step... */
if (push_undo)
{
GimpDrawableUndo *undo;
@@ -152,54 +121,120 @@ gimp_drawable_real_apply_buffer (GimpDrawable *drawable,
}
}
- /* configure the pixel regions */
-
- pixel_region_init (&src1PR, gimp_gegl_buffer_get_tiles (base_buffer),
- x, y, width, height,
- FALSE);
-
- pixel_region_resize (&src2PR,
- src2PR.x + (x - base_x), src2PR.y + (y - base_y),
- width, height);
-
- if (dest_buffer)
+ if (gimp_use_gegl (image->gimp) && ! dest_buffer)
{
- pixel_region_init (&destPR, gimp_gegl_buffer_get_tiles (dest_buffer),
- dest_x, dest_y,
- buffer_region->width, buffer_region->height,
- TRUE);
+ GeglBuffer *mask_buffer = NULL;
+ GeglNode *apply;
+
+ if (mask)
+ mask_buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (mask));
+
+ dest_buffer = gimp_drawable_get_buffer (drawable);
+
+ apply = gimp_gegl_create_apply_buffer_node (buffer,
+ base_x - buffer_region->x,
+ base_y - buffer_region->y,
+ 0,
+ 0,
+ 0,
+ 0,
+ mask_buffer,
+ -offset_x,
+ -offset_y,
+ opacity,
+ mode);
+
+ gimp_apply_operation (base_buffer, NULL, NULL,
+ apply,
+ dest_buffer,
+ GEGL_RECTANGLE (x, y, width, height));
+
+ g_object_unref (apply);
}
else
{
- pixel_region_init (&destPR, gimp_drawable_get_tiles (drawable),
- x, y, width, height,
- TRUE);
- }
+ PixelRegion src1PR, src2PR, destPR;
+ CombinationMode operation;
+ gboolean active_components[MAX_CHANNELS];
- if (mask)
- {
- PixelRegion maskPR;
+ if (gimp_gegl_buffer_get_temp_buf (buffer))
+ {
+ pixel_region_init_temp_buf (&src2PR,
+ gimp_gegl_buffer_get_temp_buf (buffer),
+ buffer_region->x, buffer_region->y,
+ buffer_region->width, buffer_region->height);
+ }
+ else
+ {
+ pixel_region_init (&src2PR, gimp_gegl_buffer_get_tiles (buffer),
+ buffer_region->x, buffer_region->y,
+ buffer_region->width, buffer_region->height,
+ FALSE);
+ }
- pixel_region_init (&maskPR,
- gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
- x + offset_x,
- y + offset_y,
- width, height,
+ /* configure the active channel array */
+ gimp_drawable_get_active_components (drawable, active_components);
+
+ /* determine what sort of operation is being attempted and
+ * if it's actually legal...
+ */
+ operation = gimp_image_get_combination_mode (gimp_drawable_type (drawable),
+ src2PR.bytes);
+ if (operation == -1)
+ {
+ g_warning ("%s: illegal parameters.", G_STRFUNC);
+ return;
+ }
+
+ /* configure the pixel regions */
+
+ pixel_region_init (&src1PR, gimp_gegl_buffer_get_tiles (base_buffer),
+ x, y, width, height,
FALSE);
- combine_regions (&src1PR, &src2PR, &destPR, &maskPR, NULL,
- opacity * 255.999,
- mode,
- active_components,
- operation);
- }
- else
- {
- combine_regions (&src1PR, &src2PR, &destPR, NULL, NULL,
- opacity * 255.999,
- mode,
- active_components,
- operation);
+ pixel_region_resize (&src2PR,
+ src2PR.x + (x - base_x), src2PR.y + (y - base_y),
+ width, height);
+
+ if (dest_buffer)
+ {
+ pixel_region_init (&destPR, gimp_gegl_buffer_get_tiles (dest_buffer),
+ dest_x, dest_y,
+ buffer_region->width, buffer_region->height,
+ TRUE);
+ }
+ else
+ {
+ pixel_region_init (&destPR, gimp_drawable_get_tiles (drawable),
+ x, y, width, height,
+ TRUE);
+ }
+
+ if (mask)
+ {
+ PixelRegion maskPR;
+
+ pixel_region_init (&maskPR,
+ gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
+ x + offset_x,
+ y + offset_y,
+ width, height,
+ FALSE);
+
+ combine_regions (&src1PR, &src2PR, &destPR, &maskPR, NULL,
+ opacity * 255.999,
+ mode,
+ active_components,
+ operation);
+ }
+ else
+ {
+ combine_regions (&src1PR, &src2PR, &destPR, NULL, NULL,
+ opacity * 255.999,
+ mode,
+ active_components,
+ operation);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]