[gimp/goat-invasion: 214/401] app: replace GimpPaintCore's undo_tiles by a GeglBuffer
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/goat-invasion: 214/401] app: replace GimpPaintCore's undo_tiles by a GeglBuffer
- Date: Mon, 2 Apr 2012 12:06:06 +0000 (UTC)
commit 09f453676d5f333e3dc799823e3a97ca2c75a66c
Author: Michael Natterer <mitch gimp org>
Date: Thu Mar 22 16:29:33 2012 +0100
app: replace GimpPaintCore's undo_tiles by a GeglBuffer
and simply use a dumb straight copy of the drawable, it's GEGL's job
to do proper COW.
app/paint/gimp-paint.c | 2 +-
app/paint/gimpinkundo.c | 2 +-
app/paint/gimppaintcore.c | 209 ++++++++---------------------------------
app/paint/gimppaintcore.h | 8 +--
app/paint/gimppaintcoreundo.c | 2 +-
app/paint/gimppencil.c | 2 +-
app/tools/gimpclonetool.c | 1 +
7 files changed, 45 insertions(+), 181 deletions(-)
---
diff --git a/app/paint/gimp-paint.c b/app/paint/gimp-paint.c
index 8ad7f65..ffe9334 100644
--- a/app/paint/gimp-paint.c
+++ b/app/paint/gimp-paint.c
@@ -17,7 +17,7 @@
#include "config.h"
-#include <glib-object.h>
+#include <gegl.h>
#include "paint-types.h"
diff --git a/app/paint/gimpinkundo.c b/app/paint/gimpinkundo.c
index 1fc7981..d345fe4 100644
--- a/app/paint/gimpinkundo.c
+++ b/app/paint/gimpinkundo.c
@@ -19,7 +19,7 @@
#include <string.h>
-#include <glib-object.h>
+#include <gegl.h>
#include "paint-types.h"
diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c
index cfda565..e01fa59 100644
--- a/app/paint/gimppaintcore.c
+++ b/app/paint/gimppaintcore.c
@@ -161,7 +161,7 @@ gimp_paint_core_init (GimpPaintCore *core)
core->use_saved_proj = FALSE;
- core->undo_tiles = NULL;
+ core->undo_buffer = NULL;
core->saved_proj_tiles = NULL;
core->canvas_tiles = NULL;
@@ -382,12 +382,10 @@ gimp_paint_core_start (GimpPaintCore *core,
}
/* Allocate the undo structure */
- if (core->undo_tiles)
- tile_manager_unref (core->undo_tiles);
+ if (core->undo_buffer)
+ g_object_unref (core->undo_buffer);
- core->undo_tiles = tile_manager_new (gimp_item_get_width (item),
- gimp_item_get_height (item),
- gimp_drawable_bytes (drawable));
+ core->undo_buffer = gimp_gegl_buffer_dup (gimp_drawable_get_buffer (drawable));
/* Allocate the saved proj structure */
if (core->saved_proj_tiles)
@@ -458,7 +456,6 @@ gimp_paint_core_finish (GimpPaintCore *core,
if (push_undo)
{
- GeglBuffer *src;
GeglBuffer *buffer;
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_PAINT,
@@ -466,21 +463,12 @@ gimp_paint_core_finish (GimpPaintCore *core,
GIMP_PAINT_CORE_GET_CLASS (core)->push_undo (core, image, NULL);
- /* set undo blocks */
- gimp_paint_core_validate_undo_tiles (core, drawable,
- core->x1,
- core->y1,
- core->x2 - core->x1,
- core->y2 - core->y1);
-
- src = gimp_tile_manager_create_buffer (core->undo_tiles,
- gimp_drawable_get_format (drawable));
buffer = gimp_gegl_buffer_new (GIMP_GEGL_RECT (0, 0,
core->x2 - core->x1,
core->y2 - core->y1),
gimp_drawable_get_format (drawable));
- gegl_buffer_copy (src,
+ gegl_buffer_copy (core->undo_buffer,
GIMP_GEGL_RECT (core->x1, core->y1,
core->x2 - core->x1,
core->y2 - core->y1),
@@ -492,14 +480,13 @@ gimp_paint_core_finish (GimpPaintCore *core,
core->x1, core->y1,
core->x2 - core->x1, core->y2 - core->y1);
- g_object_unref (src);
g_object_unref (buffer);
gimp_image_undo_group_end (image);
}
- tile_manager_unref (core->undo_tiles);
- core->undo_tiles = NULL;
+ g_object_unref (core->undo_buffer);
+ core->undo_buffer = NULL;
if (core->saved_proj_tiles)
{
@@ -510,37 +497,6 @@ gimp_paint_core_finish (GimpPaintCore *core,
gimp_viewable_preview_thaw (GIMP_VIEWABLE (drawable));
}
-static void
-gimp_paint_core_copy_valid_tiles (TileManager *src_tiles,
- TileManager *dest_tiles,
- gint x,
- gint y,
- gint w,
- gint h)
-{
- Tile *src_tile;
- gint i, j;
-
- for (i = y; i < (y + h); i += (TILE_HEIGHT - (i % TILE_HEIGHT)))
- {
- for (j = x; j < (x + w); j += (TILE_WIDTH - (j % TILE_WIDTH)))
- {
- src_tile = tile_manager_get_tile (src_tiles,
- j, i, FALSE, FALSE);
-
- if (tile_is_valid (src_tile))
- {
- src_tile = tile_manager_get_tile (src_tiles,
- j, i, TRUE, FALSE);
-
- tile_manager_map_tile (dest_tiles, j, i, src_tile);
-
- tile_release (src_tile, FALSE);
- }
- }
- }
-}
-
void
gimp_paint_core_cancel (GimpPaintCore *core,
GimpDrawable *drawable)
@@ -566,13 +522,14 @@ gimp_paint_core_cancel (GimpPaintCore *core,
gimp_item_get_height (GIMP_ITEM (drawable)),
&x, &y, &width, &height))
{
- gimp_paint_core_copy_valid_tiles (core->undo_tiles,
- gimp_drawable_get_tiles (drawable),
- x, y, width, height);
+ gegl_buffer_copy (core->undo_buffer,
+ GIMP_GEGL_RECT (x, y, width, height),
+ gimp_drawable_get_buffer (drawable),
+ GIMP_GEGL_RECT (x, y, width, height));
}
- tile_manager_unref (core->undo_tiles);
- core->undo_tiles = NULL;
+ g_object_unref (core->undo_buffer);
+ core->undo_buffer = NULL;
if (core->saved_proj_tiles)
{
@@ -590,10 +547,10 @@ gimp_paint_core_cleanup (GimpPaintCore *core)
{
g_return_if_fail (GIMP_IS_PAINT_CORE (core));
- if (core->undo_tiles)
+ if (core->undo_buffer)
{
- tile_manager_unref (core->undo_tiles);
- core->undo_tiles = NULL;
+ g_object_unref (core->undo_buffer);
+ core->undo_buffer = NULL;
}
if (core->saved_proj_tiles)
@@ -751,21 +708,13 @@ gimp_paint_core_get_orig_image (GimpPaintCore *core,
gint width,
gint height)
{
- PixelRegion srcPR;
- PixelRegion destPR;
- Tile *undo_tile;
- gboolean release_tile;
- gint h;
- gint pixelwidth;
- gint drawable_width;
- gint drawable_height;
- const guchar *s;
- guchar *d;
- gpointer pr;
+ GeglBuffer *orig_buffer;
+ gint drawable_width;
+ gint drawable_height;
g_return_val_if_fail (GIMP_IS_PAINT_CORE (core), NULL);
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL);
- g_return_val_if_fail (core->undo_tiles != NULL, NULL);
+ g_return_val_if_fail (GEGL_IS_BUFFER (core->undo_buffer), NULL);
core->orig_buf = temp_buf_resize (core->orig_buf,
gimp_drawable_bytes (drawable),
@@ -781,57 +730,24 @@ gimp_paint_core_get_orig_image (GimpPaintCore *core,
&x, &y,
&width, &height);
- /* configure the pixel regions */
- pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
- x, y, width, height,
- FALSE);
-
- pixel_region_init_temp_buf (&destPR, core->orig_buf,
- x - core->orig_buf->x,
- y - core->orig_buf->y,
- width, height);
-
- for (pr = pixel_regions_register (2, &srcPR, &destPR);
- pr != NULL;
- pr = pixel_regions_process (pr))
- {
- /* If the undo tile corresponding to this location is valid, use it */
- undo_tile = tile_manager_get_tile (core->undo_tiles,
- srcPR.x, srcPR.y,
- FALSE, FALSE);
-
- if (tile_is_valid (undo_tile))
- {
- release_tile = TRUE;
-
- undo_tile = tile_manager_get_tile (core->undo_tiles,
- srcPR.x, srcPR.y,
- TRUE, FALSE);
- s = tile_data_pointer (undo_tile, srcPR.x, srcPR.y);
- }
- else
- {
- release_tile = FALSE;
-
- s = srcPR.data;
- }
-
- d = destPR.data;
-
- pixelwidth = srcPR.w * srcPR.bytes;
-
- h = srcPR.h;
- while (h --)
- {
- memcpy (d, s, pixelwidth);
-
- s += srcPR.rowstride;
- d += destPR.rowstride;
- }
-
- if (release_tile)
- tile_release (undo_tile, FALSE);
- }
+ orig_buffer =
+ gegl_buffer_linear_new_from_data (core->orig_buf->data,
+ gimp_drawable_get_format (drawable),
+ GIMP_GEGL_RECT (x - core->orig_buf->x,
+ y - core->orig_buf->y,
+ width, height),
+ core->orig_buf->width *
+ core->orig_buf->bytes,
+ NULL, NULL);
+
+ gegl_buffer_copy (core->undo_buffer,
+ GIMP_GEGL_RECT (x, y, width, height),
+ orig_buffer,
+ GIMP_GEGL_RECT (x - core->orig_buf->x,
+ y - core->orig_buf->y,
+ width, height));
+
+ g_object_unref (orig_buffer);
return core->orig_buf;
}
@@ -944,13 +860,6 @@ gimp_paint_core_paste (GimpPaintCore *core,
TileManager *alt = NULL;
PixelRegion srcPR;
- /* set undo blocks */
- gimp_paint_core_validate_undo_tiles (core, drawable,
- core->canvas_buf->x,
- core->canvas_buf->y,
- core->canvas_buf->width,
- core->canvas_buf->height);
-
if (core->use_saved_proj)
{
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
@@ -998,7 +907,7 @@ gimp_paint_core_paste (GimpPaintCore *core,
}
canvas_tiles_to_canvas_buf (core);
- alt = core->undo_tiles;
+ alt = gimp_gegl_buffer_get_tiles (core->undo_buffer);
}
/* Otherwise:
* combine the canvas buf and the paint mask to the canvas buf
@@ -1064,13 +973,6 @@ gimp_paint_core_replace (GimpPaintCore *core,
return;
}
- /* set undo blocks */
- gimp_paint_core_validate_undo_tiles (core, drawable,
- core->canvas_buf->x,
- core->canvas_buf->y,
- core->canvas_buf->width,
- core->canvas_buf->height);
-
if (mode == GIMP_PAINT_CONSTANT)
{
/* Some tools (ink) paint the mask to paint_core->canvas_tiles
@@ -1260,39 +1162,6 @@ paint_mask_to_canvas_buf (GimpPaintCore *core,
}
void
-gimp_paint_core_validate_undo_tiles (GimpPaintCore *core,
- GimpDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h)
-{
- gint i, j;
-
- g_return_if_fail (GIMP_IS_PAINT_CORE (core));
- g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
- g_return_if_fail (core->undo_tiles != NULL);
-
- for (i = y; i < (y + h); i += (TILE_HEIGHT - (i % TILE_HEIGHT)))
- {
- for (j = x; j < (x + w); j += (TILE_WIDTH - (j % TILE_WIDTH)))
- {
- Tile *dest_tile = tile_manager_get_tile (core->undo_tiles,
- j, i, FALSE, FALSE);
-
- if (! tile_is_valid (dest_tile))
- {
- Tile *src_tile =
- tile_manager_get_tile (gimp_drawable_get_tiles (drawable),
- j, i, TRUE, FALSE);
- tile_manager_map_tile (core->undo_tiles, j, i, src_tile);
- tile_release (src_tile, FALSE);
- }
- }
- }
-}
-
-void
gimp_paint_core_validate_saved_proj_tiles (GimpPaintCore *core,
GimpPickable *pickable,
gint x,
diff --git a/app/paint/gimppaintcore.h b/app/paint/gimppaintcore.h
index 970edb8..1ad7ea6 100644
--- a/app/paint/gimppaintcore.h
+++ b/app/paint/gimppaintcore.h
@@ -55,7 +55,7 @@ struct _GimpPaintCore
gboolean use_saved_proj; /* keep the unmodified proj around */
- TileManager *undo_tiles; /* tiles which have been modified */
+ GeglBuffer *undo_buffer; /* pixels which have been modified */
TileManager *saved_proj_tiles; /* proj tiles which have been modified */
TileManager *canvas_tiles; /* the buffer to paint the mask to */
@@ -184,12 +184,6 @@ void gimp_paint_core_replace (GimpPaintCore *core,
gdouble image_opacity,
GimpPaintApplicationMode mode);
-void gimp_paint_core_validate_undo_tiles (GimpPaintCore *core,
- GimpDrawable *drawable,
- gint x,
- gint y,
- gint w,
- gint h);
void gimp_paint_core_validate_saved_proj_tiles (GimpPaintCore *core,
GimpPickable *pickable,
gint x,
diff --git a/app/paint/gimppaintcoreundo.c b/app/paint/gimppaintcoreundo.c
index dd9011f..a560583 100644
--- a/app/paint/gimppaintcoreundo.c
+++ b/app/paint/gimppaintcoreundo.c
@@ -17,7 +17,7 @@
#include "config.h"
-#include <glib-object.h>
+#include <gegl.h>
#include "paint-types.h"
diff --git a/app/paint/gimppencil.c b/app/paint/gimppencil.c
index 68a6551..19f6a6f 100644
--- a/app/paint/gimppencil.c
+++ b/app/paint/gimppencil.c
@@ -17,7 +17,7 @@
#include "config.h"
-#include <glib-object.h>
+#include <gegl.h>
#include "paint-types.h"
diff --git a/app/tools/gimpclonetool.c b/app/tools/gimpclonetool.c
index ec827bc..325b4c4 100644
--- a/app/tools/gimpclonetool.c
+++ b/app/tools/gimpclonetool.c
@@ -17,6 +17,7 @@
#include "config.h"
+#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]