app: add "chunked" parameter to gimp_tile_handler_validate_validate()
... which allows validating the area in chunks, instead of in a
single step.
(cherry picked from commit faf6acfb67
)
This commit is contained in:
@ -900,7 +900,7 @@ gimp_projection_paint_area (GimpProjection *proj,
|
|||||||
proj->priv->validate_handler,
|
proj->priv->validate_handler,
|
||||||
proj->priv->buffer,
|
proj->priv->buffer,
|
||||||
&rect,
|
&rect,
|
||||||
FALSE);
|
FALSE, FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include "gimp-gegl-types.h"
|
#include "gimp-gegl-types.h"
|
||||||
|
|
||||||
|
#include "core/gimpchunkiterator.h"
|
||||||
#include "core/gimpmarshal.h"
|
#include "core/gimpmarshal.h"
|
||||||
|
|
||||||
#include "gimp-gegl-loops.h"
|
#include "gimp-gegl-loops.h"
|
||||||
@ -529,9 +530,11 @@ void
|
|||||||
gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
||||||
GeglBuffer *buffer,
|
GeglBuffer *buffer,
|
||||||
const GeglRectangle *rect,
|
const GeglRectangle *rect,
|
||||||
gboolean intersect)
|
gboolean intersect,
|
||||||
|
gboolean chunked)
|
||||||
{
|
{
|
||||||
GimpTileHandlerValidateClass *klass;
|
GimpTileHandlerValidateClass *klass;
|
||||||
|
cairo_region_t *region = NULL;
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_TILE_HANDLER_VALIDATE (validate));
|
g_return_if_fail (GIMP_IS_TILE_HANDLER_VALIDATE (validate));
|
||||||
g_return_if_fail (gimp_tile_handler_validate_get_assigned (buffer) ==
|
g_return_if_fail (gimp_tile_handler_validate_get_assigned (buffer) ==
|
||||||
@ -544,30 +547,56 @@ gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
|||||||
|
|
||||||
if (intersect)
|
if (intersect)
|
||||||
{
|
{
|
||||||
cairo_region_t *region = cairo_region_copy (validate->dirty_region);
|
region = cairo_region_copy (validate->dirty_region);
|
||||||
|
|
||||||
cairo_region_intersect_rectangle (region,
|
cairo_region_intersect_rectangle (region,
|
||||||
(const cairo_rectangle_int_t *) rect);
|
(const cairo_rectangle_int_t *) rect);
|
||||||
|
}
|
||||||
|
else if (chunked)
|
||||||
|
{
|
||||||
|
region = cairo_region_create_rectangle (
|
||||||
|
(const cairo_rectangle_int_t *) rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (region)
|
||||||
|
{
|
||||||
if (! cairo_region_is_empty (region))
|
if (! cairo_region_is_empty (region))
|
||||||
{
|
{
|
||||||
gint n_rects;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
gimp_tile_handler_validate_begin_validate (validate);
|
gimp_tile_handler_validate_begin_validate (validate);
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (region);
|
if (chunked)
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t blit_rect;
|
GimpChunkIterator *iter;
|
||||||
|
|
||||||
cairo_region_get_rectangle (region, i, &blit_rect);
|
iter = gimp_chunk_iterator_new (region);
|
||||||
|
region = NULL;
|
||||||
|
|
||||||
klass->validate_buffer (validate,
|
while (gimp_chunk_iterator_next (iter))
|
||||||
(const GeglRectangle *) &blit_rect,
|
{
|
||||||
buffer);
|
GeglRectangle blit_rect;
|
||||||
|
|
||||||
|
while (gimp_chunk_iterator_get_rect (iter, &blit_rect))
|
||||||
|
klass->validate_buffer (validate, &blit_rect, buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gint n_rects;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
n_rects = cairo_region_num_rectangles (region);
|
||||||
|
|
||||||
|
for (i = 0; i < n_rects; i++)
|
||||||
|
{
|
||||||
|
cairo_rectangle_int_t blit_rect;
|
||||||
|
|
||||||
|
cairo_region_get_rectangle (region, i, &blit_rect);
|
||||||
|
|
||||||
|
klass->validate_buffer (validate,
|
||||||
|
(const GeglRectangle *) &blit_rect,
|
||||||
|
buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gimp_tile_handler_validate_end_validate (validate);
|
gimp_tile_handler_validate_end_validate (validate);
|
||||||
|
|
||||||
@ -576,7 +605,7 @@ gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
|||||||
(const cairo_rectangle_int_t *) rect);
|
(const cairo_rectangle_int_t *) rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_region_destroy (region);
|
g_clear_pointer (®ion, cairo_region_destroy);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -95,7 +95,8 @@ void gimp_tile_handler_validate_end_validate (GimpTile
|
|||||||
void gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
void gimp_tile_handler_validate_validate (GimpTileHandlerValidate *validate,
|
||||||
GeglBuffer *buffer,
|
GeglBuffer *buffer,
|
||||||
const GeglRectangle *rect,
|
const GeglRectangle *rect,
|
||||||
gboolean intersect);
|
gboolean intersect,
|
||||||
|
gboolean chunked);
|
||||||
|
|
||||||
gboolean gimp_tile_handler_validate_buffer_set_extent (GeglBuffer *buffer,
|
gboolean gimp_tile_handler_validate_buffer_set_extent (GeglBuffer *buffer,
|
||||||
const GeglRectangle *extent);
|
const GeglRectangle *extent);
|
||||||
|
@ -286,7 +286,7 @@ gimp_operation_buffer_source_validate_process (GeglOperation *operation,
|
|||||||
gimp_tile_handler_validate_validate (validate_handler,
|
gimp_tile_handler_validate_validate (validate_handler,
|
||||||
buffer_source_validate->buffer,
|
buffer_source_validate->buffer,
|
||||||
&rect,
|
&rect,
|
||||||
TRUE);
|
TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gegl_operation_context_set_object (context, "output", G_OBJECT (buffer));
|
gegl_operation_context_set_object (context, "output", G_OBJECT (buffer));
|
||||||
|
Reference in New Issue
Block a user