app: port GimpSourceCore and its classes to painting to the paint_buffer

This commit is contained in:
Michael Natterer 2012-04-01 21:02:49 +02:00
parent 0e458f9613
commit b4996f2605
5 changed files with 85 additions and 68 deletions

View File

@ -61,7 +61,9 @@ static void gimp_clone_motion (GimpSourceCore *source_core,
GeglRectangle *src_rect,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint paint_area_offset_x,
gint paint_area_offset_y,
gint paint_area_width,
@ -141,7 +143,9 @@ gimp_clone_motion (GimpSourceCore *source_core,
GeglRectangle *src_rect,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint paint_area_offset_x,
gint paint_area_offset_y,
gint paint_area_width,
@ -153,13 +157,9 @@ gimp_clone_motion (GimpSourceCore *source_core,
GimpContext *context = GIMP_CONTEXT (paint_options);
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
GimpDynamicsOutput *force_output;
GeglBuffer *dest_buffer;
gdouble fade_point;
gdouble force;
dest_buffer = gimp_temp_buf_create_buffer (paint_area,
gimp_drawable_get_format_with_alpha (drawable));
switch (options->clone_type)
{
case GIMP_IMAGE_CLONE:
@ -169,7 +169,7 @@ gimp_clone_motion (GimpSourceCore *source_core,
src_rect->y,
paint_area_width,
paint_area_height),
dest_buffer,
paint_buffer,
GIMP_GEGL_RECT (paint_area_offset_x,
paint_area_offset_y,
0, 0));
@ -182,14 +182,14 @@ gimp_clone_motion (GimpSourceCore *source_core,
GimpPattern *pattern = gimp_context_get_pattern (context);
GeglBuffer *src_buffer = gimp_pattern_create_buffer (pattern);
gegl_buffer_set_pattern (dest_buffer,
gegl_buffer_set_pattern (paint_buffer,
GIMP_GEGL_RECT (paint_area_offset_x,
paint_area_offset_y,
paint_area_width,
paint_area_height),
src_buffer,
- paint_area->x - src_offset_x,
- paint_area->y - src_offset_y);
- paint_buffer_x - src_offset_x,
- paint_buffer_y - src_offset_y);
/* XXX: move this to FINISH */
g_object_unref (src_buffer);
@ -197,8 +197,6 @@ gimp_clone_motion (GimpSourceCore *source_core,
break;
}
g_object_unref (dest_buffer);
force_output = gimp_dynamics_get_output (GIMP_BRUSH_CORE (paint_core)->dynamics,
GIMP_DYNAMICS_OUTPUT_FORCE);

View File

@ -26,8 +26,6 @@
#include "paint-types.h"
#include "paint-funcs/paint-funcs.h"
#include "base/pixel-region.h"
#include "base/temp-buf.h"
@ -108,7 +106,9 @@ static void gimp_heal_motion (GimpSourceCore *source_core,
GeglRectangle *src_rect,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint paint_area_offset_x,
gint paint_area_offset_y,
gint paint_area_width,
@ -447,7 +447,9 @@ gimp_heal_motion (GimpSourceCore *source_core,
GeglRectangle *src_rect,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint paint_area_offset_x,
gint paint_area_offset_y,
gint paint_area_width,
@ -460,6 +462,7 @@ gimp_heal_motion (GimpSourceCore *source_core,
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
TempBuf *src_temp_buf;
TempBuf *dest_temp_buf;
GeglBuffer *dest_buffer;
PixelRegion srcPR;
PixelRegion destPR;
const TempBuf *mask_buf;
@ -498,24 +501,21 @@ gimp_heal_motion (GimpSourceCore *source_core,
g_object_unref (tmp);
}
{
GeglBuffer *tmp;
dest_temp_buf = temp_buf_new (gegl_buffer_get_width (paint_buffer),
gegl_buffer_get_height (paint_buffer),
gimp_drawable_bytes_with_alpha (drawable),
0, 0, NULL);
dest_temp_buf = temp_buf_new (paint_area->width,
paint_area->height,
gimp_drawable_bytes_with_alpha (drawable),
0, 0, NULL);
dest_buffer =
gimp_temp_buf_create_buffer (dest_temp_buf,
gimp_drawable_get_format_with_alpha (drawable));
tmp = gimp_temp_buf_create_buffer (dest_temp_buf,
gimp_drawable_get_format_with_alpha (drawable));
gegl_buffer_copy (gimp_drawable_get_buffer (drawable),
GIMP_GEGL_RECT (paint_area->x, paint_area->y,
paint_area->width, paint_area->height),
tmp,
GIMP_GEGL_RECT (0, 0, 0, 0));
g_object_unref (tmp);
}
gegl_buffer_copy (gimp_drawable_get_buffer (drawable),
GIMP_GEGL_RECT (paint_buffer_x, paint_buffer_y,
gegl_buffer_get_width (paint_buffer),
gegl_buffer_get_height (paint_buffer)),
dest_buffer,
GIMP_GEGL_RECT (0, 0, 0, 0));
/* check that srcPR, tempPR, destPR, and mask_buf are the same size */
if (src_temp_buf->width != dest_temp_buf->width ||
@ -541,16 +541,13 @@ gimp_heal_motion (GimpSourceCore *source_core,
/* heal destPR using srcPR */
gimp_heal_region (&destPR, &srcPR, mask_buf);
pixel_region_init_temp_buf (&srcPR, dest_temp_buf,
0, 0,
mask_buf->width, mask_buf->height);
pixel_region_init_temp_buf (&destPR, paint_area,
paint_area_offset_x,
paint_area_offset_y,
paint_area_width,
paint_area_height);
copy_region (&srcPR, &destPR);
gegl_buffer_copy (dest_buffer,
GIMP_GEGL_RECT (0, 0, mask_buf->width, mask_buf->height),
paint_buffer,
GIMP_GEGL_RECT (paint_area_offset_x,
paint_area_offset_y,
paint_area_width,
paint_area_height));
/* replace the canvas with our healed data */
gimp_brush_core_replace_canvas (GIMP_BRUSH_CORE (paint_core), drawable,

View File

@ -64,7 +64,9 @@ static GeglBuffer * gimp_perspective_clone_get_source (GimpSourceCore *source_
GimpPickable *src_pickable,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint *paint_area_offset_x,
gint *paint_area_offset_y,
gint *paint_area_width,
@ -337,7 +339,9 @@ gimp_perspective_clone_get_source (GimpSourceCore *source_core,
GimpPickable *src_pickable,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint *paint_area_offset_x,
gint *paint_area_offset_y,
gint *paint_area_width,
@ -358,10 +362,10 @@ gimp_perspective_clone_get_source (GimpSourceCore *source_core,
src_format_alpha = gimp_pickable_get_format_with_alpha (src_pickable);
/* Destination coordinates that will be painted */
x1d = paint_area->x;
y1d = paint_area->y;
x2d = paint_area->x + paint_area->width;
y2d = paint_area->y + paint_area->height;
x1d = paint_buffer_x;
y1d = paint_buffer_y;
x2d = paint_buffer_x + gegl_buffer_get_width (paint_buffer);
y2d = paint_buffer_y + gegl_buffer_get_height (paint_buffer);
/* Boundary box for source pixels to copy: Convert all the vertex of
* the box to paint in destination area to its correspondent in

View File

@ -85,7 +85,9 @@ static GeglBuffer *
GimpPickable *src_pickable,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint *paint_area_offset_x,
gint *paint_area_offset_y,
gint *paint_area_width,
@ -356,7 +358,9 @@ gimp_source_core_motion (GimpSourceCore *source_core,
GeglRectangle src_rect;
gint src_offset_x;
gint src_offset_y;
TempBuf *paint_area;
GeglBuffer *paint_buffer;
gint paint_buffer_x;
gint paint_buffer_y;
gint paint_area_offset_x;
gint paint_area_offset_y;
gint paint_area_width;
@ -401,15 +405,17 @@ gimp_source_core_motion (GimpSourceCore *source_core,
gimp_pickable_flush (src_pickable);
}
paint_area = gimp_paint_core_get_paint_area (paint_core, drawable,
paint_options, coords);
if (! paint_area)
paint_buffer = gimp_paint_core_get_paint_buffer (paint_core, drawable,
paint_options, coords,
&paint_buffer_x,
&paint_buffer_y);
if (! paint_buffer)
return;
paint_area_offset_x = 0;
paint_area_offset_y = 0;
paint_area_width = paint_area->width;
paint_area_height = paint_area->height;
paint_area_width = gegl_buffer_get_width (paint_buffer);
paint_area_height = gegl_buffer_get_height (paint_buffer);
if (options->use_source)
{
@ -420,7 +426,9 @@ gimp_source_core_motion (GimpSourceCore *source_core,
src_pickable,
src_offset_x,
src_offset_y,
paint_area,
paint_buffer,
paint_buffer_x,
paint_buffer_y,
&paint_area_offset_x,
&paint_area_offset_y,
&paint_area_width,
@ -430,8 +438,8 @@ gimp_source_core_motion (GimpSourceCore *source_core,
return;
}
/* Set the paint area to transparent */
temp_buf_data_clear (paint_area);
/* Set the paint buffer to transparent */
gegl_buffer_clear (paint_buffer, NULL);
GIMP_SOURCE_CORE_GET_CLASS (source_core)->motion (source_core,
drawable,
@ -443,7 +451,9 @@ gimp_source_core_motion (GimpSourceCore *source_core,
&src_rect,
src_offset_x,
src_offset_y,
paint_area,
paint_buffer,
paint_buffer_x,
paint_buffer_y,
paint_area_offset_x,
paint_area_offset_y,
paint_area_width,
@ -460,7 +470,9 @@ gimp_source_core_real_get_source (GimpSourceCore *source_core,
GimpPickable *src_pickable,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
gint *paint_area_offset_x,
gint *paint_area_offset_y,
gint *paint_area_width,
@ -475,10 +487,10 @@ gimp_source_core_real_get_source (GimpSourceCore *source_core,
gint x, y;
gint width, height;
if (! gimp_rectangle_intersect (paint_area->x + src_offset_x,
paint_area->y + src_offset_y,
paint_area->width,
paint_area->height,
if (! gimp_rectangle_intersect (paint_buffer_x + src_offset_x,
paint_buffer_y + src_offset_y,
gegl_buffer_get_width (paint_buffer),
gegl_buffer_get_height (paint_buffer),
0, 0,
gegl_buffer_get_width (src_buffer),
gegl_buffer_get_height (src_buffer),
@ -508,8 +520,8 @@ gimp_source_core_real_get_source (GimpSourceCore *source_core,
dest_buffer = gimp_paint_core_get_orig_image (GIMP_PAINT_CORE (source_core));
}
*paint_area_offset_x = x - (paint_area->x + src_offset_x);
*paint_area_offset_y = y - (paint_area->y + src_offset_y);
*paint_area_offset_x = x - (paint_buffer_x + src_offset_x);
*paint_area_offset_y = y - (paint_buffer_y + src_offset_y);
*paint_area_width = width;
*paint_area_height = height;

View File

@ -60,7 +60,10 @@ struct _GimpSourceCoreClass
GimpPickable *src_pickable,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
/* offsets *into* the paint_buffer: */
gint *paint_area_offset_x,
gint *paint_area_offset_y,
gint *paint_area_width,
@ -77,7 +80,10 @@ struct _GimpSourceCoreClass
GeglRectangle *src_rect,
gint src_offset_x,
gint src_offset_y,
TempBuf *paint_area,
GeglBuffer *paint_buffer,
gint paint_buffer_x,
gint paint_buffer_y,
/* offsets *into* the paint_buffer: */
gint paint_area_offset_x,
gint paint_area_offset_y,
gint paint_area_width,