gegl r2144 - in trunk: . gegl/process



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]