gegl r2144 - in trunk: . gegl/process
- From: ok svn gnome org
- To: svn-commits-list gnome org
- Subject: gegl r2144 - in trunk: . gegl/process
- Date: Sun, 2 Mar 2008 23:09:04 +0000 (GMT)
Author: ok
Date: Sun Mar 2 23:09:04 2008
New Revision: 2144
URL: http://svn.gnome.org/viewvc/gegl?rev=2144&view=rev
Log:
* gegl/process/gegl-processor.c: (render_rectangle): merged buffered
and unbuffered code paths.
Modified:
trunk/ChangeLog
trunk/gegl/process/gegl-processor.c
Modified: trunk/gegl/process/gegl-processor.c
==============================================================================
--- trunk/gegl/process/gegl-processor.c (original)
+++ trunk/gegl/process/gegl-processor.c Sun Mar 2 23:09:04 2008
@@ -294,20 +294,24 @@
return processor;
}
-
-
/* returns TRUE if there is more work */
-static gboolean render_rectangle_buffered (GeglProcessor *processor)
+static gboolean render_rectangle (GeglProcessor *processor)
{
- GeglCache *cache = gegl_node_get_cache (processor->input);
- gint max_area = processor->chunk_size;
+ gboolean buffered = !(GEGL_IS_OPERATION_SINK(processor->node->operation) &&
+ !gegl_operation_sink_needs_full (processor->node->operation));
+ const gint max_area = processor->chunk_size;
+ GeglCache *cache = NULL;
+ gint pxsize = 0;
+
+ if (buffered)
+ {
+ cache = gegl_node_get_cache (processor->input);
+ g_object_get (cache, "px-size", &pxsize, NULL);
+ }
if (processor->dirty_rectangles)
{
GeglRectangle *dr = processor->dirty_rectangles->data;
- gint pxsize;
-
- g_object_get (cache, "px-size", &pxsize, NULL);
if (dr->height * dr->width > max_area && 1)
{
@@ -350,7 +354,6 @@
return TRUE;
}
}
-
processor->dirty_rectangles = g_slist_remove (processor->dirty_rectangles, dr);
if (!dr->width || !dr->height)
@@ -359,108 +362,43 @@
return TRUE;
}
- if (gegl_region_rect_in (cache->valid_region, dr) !=
- GEGL_OVERLAP_RECTANGLE_IN)
- {
- guchar *buf;
-
- gegl_region_union_with_rect (cache->valid_region, dr);
- buf = g_malloc (dr->width * dr->height * pxsize);
- g_assert (buf);
-
- gegl_node_blit (cache->node, 1.0, dr, cache->format, buf, GEGL_AUTO_ROWSTRIDE, GEGL_BLIT_DEFAULT);
- gegl_buffer_set (GEGL_BUFFER (cache), dr, cache->format, buf, GEGL_AUTO_ROWSTRIDE);
-
- gegl_cache_computed (cache, dr);
-
- g_free (buf);
- }
-
- g_slice_free (GeglRectangle, dr);
- }
-
- return processor->dirty_rectangles != NULL;
-}
-
-/* returns TRUE if there is more work */
-static gboolean render_rectangle_unbuffered (GeglProcessor *processor)
-{
- const gint max_area = processor->chunk_size;
-
- if (processor->dirty_rectangles)
- {
- GeglRectangle *dr = processor->dirty_rectangles->data;
-
- if (dr->height * dr->width > max_area && 1)
+
+ if (buffered)
{
- gint band_size;
-
- if (dr->height > dr->width)
- {
- GeglRectangle *fragment;
-
- band_size = dr->height / 2;
-
- if (band_size < 1)
- band_size = 1;
-
- fragment = g_slice_dup (GeglRectangle, dr);
-
- fragment->height = band_size;
- dr->height -= band_size;
- dr->y += band_size;
-
- processor->dirty_rectangles = g_slist_prepend (processor->dirty_rectangles, fragment);
- return TRUE;
- }
- else
+ /* only do work if the rectangle is not completely inside the valid region of
+ * the cache
+ */
+ if (gegl_region_rect_in (cache->valid_region, dr) !=
+ GEGL_OVERLAP_RECTANGLE_IN)
{
- GeglRectangle *fragment;
-
- band_size = dr->width / 2;
+ guchar *buf;
- if (band_size < 1)
- band_size = 1;
+ gegl_region_union_with_rect (cache->valid_region, dr);
+ buf = g_malloc (dr->width * dr->height * pxsize);
+ g_assert (buf);
- fragment = g_slice_dup (GeglRectangle, dr);
+ gegl_node_blit (cache->node, 1.0, dr, cache->format, buf, GEGL_AUTO_ROWSTRIDE,
+ GEGL_BLIT_DEFAULT);
+ /* check that we haven't been recently */
+ gegl_buffer_set (GEGL_BUFFER (cache), dr, cache->format, buf, GEGL_AUTO_ROWSTRIDE);
- fragment->width = band_size;
- dr->width -= band_size;
- dr->x += band_size;
+ gegl_cache_computed (cache, dr);
- processor->dirty_rectangles = g_slist_prepend (processor->dirty_rectangles, fragment);
- return TRUE;
+ g_free (buf);
}
}
- processor->dirty_rectangles = g_slist_remove (processor->dirty_rectangles, dr);
-
- if (!dr->width || !dr->height)
+ else
{
- g_slice_free (GeglRectangle, dr);
- return TRUE;
+ gegl_node_blit (processor->node, 1.0, dr, NULL, NULL, GEGL_AUTO_ROWSTRIDE, GEGL_BLIT_DEFAULT);
+ gegl_region_union_with_rect (processor->valid_region, dr);
+ g_slice_free (GeglRectangle, dr);
}
-
- gegl_node_blit (processor->node, 1.0, dr, NULL, NULL, GEGL_AUTO_ROWSTRIDE, GEGL_BLIT_DEFAULT);
- gegl_region_union_with_rect (processor->valid_region, dr);
- g_slice_free (GeglRectangle, dr);
}
return processor->dirty_rectangles != NULL;
}
-/* FIXME: merge duplicated code between the two different code paths
- */
-static gboolean render_rectangle (GeglProcessor *processor)
-{
- if (GEGL_IS_OPERATION_SINK (processor->node->operation) &&
- !gegl_operation_sink_needs_full (processor->node->operation))
- {
- return render_rectangle_unbuffered (processor);
- }
- return render_rectangle_buffered (processor);
-}
-
static gint rect_area (GeglRectangle *rectangle)
{
return rectangle->width * rectangle->height;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]