gegl r2484 - in trunk: . gegl/buffer



Author: ok
Date: Wed Jun 18 09:11:28 2008
New Revision: 2484
URL: http://svn.gnome.org/viewvc/gegl?rev=2484&view=rev

Log:
* gegl/buffer/gegl-sampler.c: (gegl_sampler_get),
(gegl_sampler_get_from_buffer): modified to fetch a 64x64 buffer of
data around the requested pixel (when the buffer doesn't already
contain the desired data). The samplers could probably be further
modified to assume this 64x64 buffer in their code.


Modified:
   trunk/ChangeLog
   trunk/gegl/buffer/gegl-sampler.c

Modified: trunk/gegl/buffer/gegl-sampler.c
==============================================================================
--- trunk/gegl/buffer/gegl-sampler.c	(original)
+++ trunk/gegl/buffer/gegl-sampler.c	Wed Jun 18 09:11:28 2008
@@ -103,15 +103,17 @@
 
 void
 gegl_sampler_get (GeglSampler *self,
-                  gdouble           x,
-                  gdouble           y,
-                  void             *output)
+                  gdouble      x,
+                  gdouble      y,
+                  void        *output)
 {
   GeglSamplerClass *klass;
 #if 0  /* avoiding expensive typecheck here */
   g_return_if_fail (GEGL_IS_SAMPLER (self));
 #endif
 
+  self->x = x;
+  self->y = y;
   klass = GEGL_SAMPLER_GET_CLASS (self);
 
   klass->get (self, x, y, output);
@@ -178,45 +180,65 @@
   G_OBJECT_CLASS (gegl_sampler_parent_class)->dispose (gobject);
 }
 
+#include <math.h>
+
 gfloat *
 gegl_sampler_get_from_buffer (GeglSampler *sampler,
                               gint         x,
                               gint         y)
 {
-   const GeglRectangle *buffer_rectangle;
-   guchar              *buffer_ptr;
-   gint                 dx;
-   gint                 dy;
-   gint                 bpp;
-   gint                 sof;
+   guchar        *buffer_ptr;
+   gint           dx;
+   gint           dy;
+   gint           bpp;
+   gint           sof;
+
 
-   /* Initialise */
    bpp = sampler->interpolate_format->format.bytes_per_pixel;
-   buffer_rectangle  = gegl_buffer_get_extent(sampler->buffer);
 
-   if ( !gegl_rectangle_contains (buffer_rectangle, &sampler->sampler_rectangle) ||
-        sampler->sampler_buffer == NULL )
+   if (sampler->sampler_buffer == NULL ||
+       x < sampler->sampler_rectangle.x ||
+       y < sampler->sampler_rectangle.y ||
+       x >= sampler->sampler_rectangle.x + sampler->sampler_rectangle.width ||
+       y >= sampler->sampler_rectangle.y + sampler->sampler_rectangle.height)
      {
-       gint buffer_size = (buffer_rectangle->width *
-                           buffer_rectangle->height *
-                           bpp);
+       GeglRectangle  fetch_rectangle/* = sampler->context_rect*/;
+
+       fetch_rectangle.x = (gint) sampler->x;
+       fetch_rectangle.y = (gint) sampler->y;
+
+       /* we override the fetch rectangle needed by the sampler, hoping that
+        * the extra pixels we fetch comes in useful in subsequent requests,
+        * we assume that it is more likely that further access is to the right
+        * or down of our currently requested position.
+        */
+       fetch_rectangle.x -= 8;
+       fetch_rectangle.y -= 8;
+       fetch_rectangle.width = 64;
+       fetch_rectangle.height = 64;
+
+
        if (sampler->sampler_buffer == NULL )
-         sampler->sampler_buffer = g_malloc0 (buffer_size);
-       else
-         sampler->sampler_buffer = g_realloc (sampler->sampler_buffer, buffer_size);
+         { /* we always request the same amount of pixels (64kb worth) */
+           sampler->sampler_buffer = g_malloc0 (fetch_rectangle.width *
+                                                fetch_rectangle.height *
+                                                bpp);
+         }
+
        gegl_buffer_get (sampler->buffer,
                         1.0,
-                        buffer_rectangle,
+                        &fetch_rectangle,
                         sampler->interpolate_format,
                         sampler->sampler_buffer,
                         GEGL_AUTO_ROWSTRIDE);
-       gegl_rectangle_copy (&sampler->sampler_rectangle,buffer_rectangle);
+
+       sampler->sampler_rectangle = fetch_rectangle;
      }
 
-   dx = x - buffer_rectangle->x;
-   dy = y - buffer_rectangle->y;
+   dx = x - sampler->sampler_rectangle.x;
+   dy = y - sampler->sampler_rectangle.y;
    buffer_ptr = (guchar *)sampler->sampler_buffer;
-   sof = ( dx +  (dy * buffer_rectangle->width)) * bpp;
+   sof = ( dx +  (dy * sampler->sampler_rectangle.width)) * bpp;
    return (gfloat*)(buffer_ptr+sof);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]