gegl r2812 - in trunk: . bin operations/affine



Author: ok
Date: Wed Dec  3 01:31:35 2008
New Revision: 2812
URL: http://svn.gnome.org/viewvc/gegl?rev=2812&view=rev

Log:
* operations/affine/affine.c: (op_affine_class_init), (process): made
the affine op not cache it's results, also make it pass the data
through like nop if the transform is the identity transform and create
a shifted sub-buffer for integer translates and translates using the
"nearest" resampler.
* bin/editor.c: (gegl_node_get_translation), (move_rel):
s/gegl:shift/gegl:translate/
* bin/gegl.c: s/gegl:shift/gegl:translate/
The gegl:shift operation will be deprecated in the next GEGL release.


Modified:
   trunk/ChangeLog
   trunk/bin/editor.c
   trunk/bin/gegl.c
   trunk/operations/affine/affine.c

Modified: trunk/bin/editor.c
==============================================================================
--- trunk/bin/editor.c	(original)
+++ trunk/bin/editor.c	Wed Dec  3 01:31:35 2008
@@ -205,7 +205,7 @@
           node = *consumers;
           g_free (consumers);
           opname = gegl_node_get_operation (node);
-          if (g_str_equal (opname, "gegl:shift") ||
+          if (g_str_equal (opname, "gegl:translate") ||
               g_str_equal (opname, "gegl:translate"))
             {
               gdouble tx, ty;
@@ -501,13 +501,13 @@
 {
   GeglNode *shift;
  
-  for (shift = node; shift && !g_str_equal (gegl_node_get_operation (shift), "gegl:shift");shift=gegl_previous_sibling (shift))
+  for (shift = node; shift && !g_str_equal (gegl_node_get_operation (shift), "gegl:translate");shift=gegl_previous_sibling (shift))
     {
     }
 
   if (!shift)
     {
-      shift = gegl_add_sibling ("gegl:shift");
+      shift = gegl_add_sibling ("gegl:translate");
         {
           select_node (node);
         }

Modified: trunk/bin/gegl.c
==============================================================================
--- trunk/bin/gegl.c	(original)
+++ trunk/bin/gegl.c	Wed Dec  3 01:31:35 2008
@@ -49,7 +49,7 @@
 #endif
 
 #define DEFAULT_COMPOSITION \
-"<?xml version='1.0' encoding='UTF-8'?> <gegl> <node operation='gegl:crop'> <params> <param name='x'>0</param> <param name='y'>0</param> <param name='width'>690</param> <param name='height'>670</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:shift'> <params> <param name='x'>14</param> <param name='y'>613</param> </params> </node> <node operation='gegl:opacity'> <params> <param name='value'>0.59999999999999998</param> </params> </node> <node name='text' operation='gegl:text'> <params> <param name='string'>2000-2008 ? Calvin Williamson, Caroline Dahloff, Manish Singh, Jay Cox, Daniel Rogers, Sven Neumann, Michael Natterer,  ?yvind Kol?s, Philip Lafleur, Dominik Ernst, Richard Kralovic, Kevin Cozens, Victor Bogado, Martin Nordholts, Geert Jordaens, Michael Schumacher, John Marshall, ?tienne Bersac, Mark Probst, H?kon Hitland, Tor Lillqvist, Hans Breuer, Deji Akingunola, Bradley Broom, Hans Petter Jansson, Jan Heller, dmacks netspace org, Sven Anders
 , Hubert Figui?re, Sam Hocevar, yahvuu at gmail.com, Nicolas Robidoux, Garry R. Osgood, Shlomi Fish, Jakub Steiner and Tonda Tavalec</param> <param name='font'>Sans</param> <param name='size'>8</param> <param name='color'>rgb(0.0000, 0.0000, 0.0000)</param> <param name='wrap'>628</param> <param name='alignment'>0</param> <param name='width'>622</param> <param name='height'>40</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:shift'> <params> <param name='x'>300</param> <param name='y'>500</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:shift'> <params> <param name='x'>0</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <gegl:path d='M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,35 35,42 35,
 50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z' fill='white'/> </node> <node operation='gegl:over'> <node operation='gegl:shift'> <params> <param name='x'>88</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M50,0 C23,0 0,22 0,50 C0,77 22,100 50,100 C68,100 85,90 93,75 L40,75 C35,75 35,65 40,65 L98,65 C100,55 100,45 98,35 L40,35 C35,35 35,25 40,25 L93,25 C84,10 68,0 50,0 z</param> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:shift'> <params> <param name='x'>176</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <pa
 rams> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,35 35,42 35,50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z</param> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:shift'> <params> <param name='x'>264</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M30,4 C12,13 0,30 0,50 C0,78 23,100 50,100 C71,100 88,88 96,71 L56,71 C42,71 30,59 30,45 L30,4 z</pa
 ram> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:rotate'> <params> <param name='origin-x'>0</param> <param name='origin-y'>0</param> <param name='filter'>linear</param> <param name='hard-edges'>false</param> <param name='lanczos-width'>3</param> <param name='degrees'>42</param> </params> </node> <node operation='gegl:checkerboard'> <params> <param name='x'>43</param> <param name='y'>44</param> <param name='x-offset'>0</param> <param name='y-offset'>0</param> <param name='color1'>rgb(0.7097, 0.7097, 0.7097)</param> <param name='color2'>rgb(0.7661, 0.7661, 0.7661)</param> </params> </node> </gegl>"
+"<?xml version='1.0' encoding='UTF-8'?> <gegl> <node operation='gegl:crop'> <params> <param name='x'>0</param> <param name='y'>0</param> <param name='width'>690</param> <param name='height'>670</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>14</param> <param name='y'>613</param> </params> </node> <node operation='gegl:opacity'> <params> <param name='value'>0.59999999999999998</param> </params> </node> <node name='text' operation='gegl:text'> <params> <param name='string'>2000-2008 ? Calvin Williamson, Caroline Dahloff, Manish Singh, Jay Cox, Daniel Rogers, Sven Neumann, Michael Natterer,  ?yvind Kol?s, Philip Lafleur, Dominik Ernst, Richard Kralovic, Kevin Cozens, Victor Bogado, Martin Nordholts, Geert Jordaens, Michael Schumacher, John Marshall, ?tienne Bersac, Mark Probst, H?kon Hitland, Tor Lillqvist, Hans Breuer, Deji Akingunola, Bradley Broom, Hans Petter Jansson, Jan Heller, dmacks netspace org, Sven An
 ders, Hubert Figui?re, Sam Hocevar, yahvuu at gmail.com, Nicolas Robidoux, Garry R. Osgood, Shlomi Fish, Jakub Steiner and Tonda Tavalec</param> <param name='font'>Sans</param> <param name='size'>8</param> <param name='color'>rgb(0.0000, 0.0000, 0.0000)</param> <param name='wrap'>628</param> <param name='alignment'>0</param> <param name='width'>622</param> <param name='height'>40</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>300</param> <param name='y'>500</param> </params> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>0</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <gegl:path d='M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,
 35 35,42 35,50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z' fill='white'/> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>88</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M50,0 C23,0 0,22 0,50 C0,77 22,100 50,100 C68,100 85,90 93,75 L40,75 C35,75 35,65 40,65 L98,65 C100,55 100,45 98,35 L40,35 C35,35 35,25 40,25 L93,25 C84,10 68,0 50,0 z</param> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:over'> <node operation='gegl:translate'> <params> <param name='x'>176</param> <param name='y'>0</param> </params> </node> <node operation='g
 egl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M0,50 C0,78 24,100 50,100 C77,100 100,78 100,50 C100,45 99,40 98,35 C82,35 66,35 50,35 C42,35 35,42 35,50 C35,58 42,65 50,65 C56,65 61,61 64,56 C67,51 75,55 73,60 C69,69 60,75 50,75 C36,75 25,64 25,50 C25,36 36,25 50,25 L93,25 C83,9 67,0 49,0 C25,0 0,20 0,50 z</param> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:translate'> <params> <param name='x'>264</param> <param name='y'>0</param> </params> </node> <node operation='gegl:dropshadow'> <params> <param name='opacity'>1.2</param> <param name='x'>0</param> <param name='y'>0</param> <param name='radius'>8</param> </params> </node> <node operation='gegl:path'> <params> <param name='d'>M30,4 C12,13 0,30 0,50 C0,78 23,100 50,100 C71,100 88,88 96,71 L56,71 C42,71
  30,59 30,45 L30,4 z</param> <param name='fill'>rgb(1.0000, 1.0000, 1.0000)</param> </params> </node> </node> <node operation='gegl:rotate'> <params> <param name='origin-x'>0</param> <param name='origin-y'>0</param> <param name='filter'>linear</param> <param name='hard-edges'>false</param> <param name='lanczos-width'>3</param> <param name='degrees'>42</param> </params> </node> <node operation='gegl:checkerboard'> <params> <param name='x'>43</param> <param name='y'>44</param> <param name='x-offset'>0</param> <param name='y-offset'>0</param> <param name='color1'>rgb(0.7097, 0.7097, 0.7097)</param> <param name='color2'>rgb(0.7661, 0.7661, 0.7661)</param> </params> </node> </gegl>"
 
 static void
 gegl_enable_fatal_warnings (void)

Modified: trunk/operations/affine/affine.c
==============================================================================
--- trunk/operations/affine/affine.c	(original)
+++ trunk/operations/affine/affine.c	Wed Dec  3 01:31:35 2008
@@ -72,10 +72,20 @@
                                               const gchar         *input_pad,
                                               const GeglRectangle *region);
 
+#if 0
 static gboolean      process                 (GeglOperation       *op,
                                               GeglBuffer          *input,
                                               GeglBuffer          *output,
                                               const GeglRectangle *result);
+#endif
+
+
+static gboolean
+process (GeglOperation       *operation,
+         GeglOperationContext *context,
+         const gchar         *output_prop,
+         const GeglRectangle *result);
+
 static GeglNode    * detect                  (GeglOperation       *operation,
                                               gint                 x,
                                               gint                 y);
@@ -193,7 +203,7 @@
 op_affine_class_init (OpAffineClass *klass)
 {
   GObjectClass             *gobject_class = G_OBJECT_CLASS (klass);
-  GeglOperationFilterClass *filter_class  = GEGL_OPERATION_FILTER_CLASS (klass);
+  /*GeglOperationFilterClass *filter_class  = GEGL_OPERATION_FILTER_CLASS (klass);*/
   GeglOperationClass       *op_class      = GEGL_OPERATION_CLASS (klass);
 
   gobject_class->set_property = set_property;
@@ -206,9 +216,11 @@
   op_class->detect = detect;
   op_class->categories = "transform";
   op_class->prepare = prepare;
+  op_class->no_cache = TRUE;
 
 
-  filter_class->process = process;
+  /*filter_class->process = process;*/
+  op_class->process = process;
 
   klass->create_matrix = NULL;
 
@@ -711,42 +723,65 @@
 
 static gboolean
 process (GeglOperation       *operation,
-         GeglBuffer          *input,
-         GeglBuffer          *output,
+         GeglOperationContext *context,
+         const gchar         *output_prop,
          const GeglRectangle *result)
 {
+  GeglBuffer          *input;
+  GeglBuffer          *output;
   OpAffine            *affine = (OpAffine *) operation;
 
   if (is_intermediate_node (affine) ||
       gegl_matrix3_is_identity (affine->matrix))
     {
-      /* XXX: make the copying smarter, by perhaps even COW sharing
-       * of tiles (in the gegl_buffer_copy code)
-       */
-      gegl_buffer_copy (input, NULL, output, NULL);
-    }
-#if 0  /* XXX: port to use newer APIs, perhaps not possible to achieve COW,
-                but should still be faster than a full resampling when it
-                is not needed */
+      /* passing straight through (like gegl:nop) */
+      input  = gegl_operation_context_get_source (context, "input");
+      if (!input)
+        {
+          g_warning ("transform received NULL input");
+          return FALSE;
+        }
+
+      gegl_operation_context_set_object (context, "output", G_OBJECT (input));
+    }
   else if (gegl_matrix3_is_translate (affine->matrix) &&
            (! strcmp (affine->filter, "nearest") ||
             (affine->matrix [0][2] == (gint) affine->matrix [0][2] &&
              affine->matrix [1][2] == (gint) affine->matrix [1][2])))
     {
+      /* doing a buffer shifting trick, (enhanced nop) */
       GeglRectangle input_rectangle = *result;
-      input_rectangle.x += (gint) affine->matrix [0][2];
-      input_rectangle.y += (gint) affine->matrix [1][2];
-      gegl_buffer_copy (input, NULL, output, &input_rectangle);
+      input  = gegl_operation_context_get_source (context, "input");
+
+      output = g_object_new (GEGL_TYPE_BUFFER,
+                             "source",    input,
+                             "shift-x",   (int)-affine->matrix[0][2],
+                             "shift-y",   (int)-affine->matrix[1][2],
+                             "abyss-width", -1,  /* turn of abyss
+                                                    (relying on abyss
+                                                    of source) */
+                         NULL);
+
+      gegl_operation_context_set_object (context, "output", G_OBJECT (output));
+
+      if (input != NULL)
+        g_object_unref (input);
     }
-#endif
   else
     {
-      /* XXX: add back more samplers */
+      /* for all other cases, do a proper resampling */
+
+      input  = gegl_operation_context_get_source (context, "input");
+      output = gegl_operation_context_get_target (context, "output");
+
       g_object_set(affine->sampler, "buffer", input, NULL);
       gegl_sampler_prepare (affine->sampler);
       affine_generic (output, input, affine->matrix, affine->sampler);
       g_object_unref(affine->sampler->buffer);
       affine->sampler->buffer = NULL;
+
+      if (input != NULL)
+        g_object_unref (input);
     }
 
   return TRUE;



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