[gegl] transform-core: restore old transform_generic



commit dfd9c769f8e1bb76e1cc1df8f1cc26424e6c4b87
Author: Nicolas Robidoux <nrobidoux git gnome org>
Date:   Tue Dec 18 10:10:08 2012 -0500

    transform-core: restore old transform_generic

 operations/transform/transform-core.c |   96 +++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)
---
diff --git a/operations/transform/transform-core.c b/operations/transform/transform-core.c
index 2d254e8..1cc2b0f 100644
--- a/operations/transform/transform-core.c
+++ b/operations/transform/transform-core.c
@@ -1058,6 +1058,101 @@ transform_generic (GeglBuffer  *dest,
   const GeglRectangle *dest_extent;
   gint                 x,
                        y;
+  gfloat * restrict    dest_buf,
+                      *dest_ptr;
+  GeglMatrix3          inverse;
+  gdouble              u_start,
+                       v_start,
+                       w_start,
+                       u_float,
+                       v_float,
+                       w_float;
+  const Babl          *format = babl_format ("RaGaBaA float");
+  gint                 dest_pixels;
+
+  g_object_get (dest, "pixels", &dest_pixels, NULL);
+  dest_extent = gegl_buffer_get_extent (dest);
+
+  i = gegl_buffer_iterator_new (dest,
+                                dest_extent,
+                                level,
+                                format,
+                                GEGL_BUFFER_WRITE,
+                                GEGL_ABYSS_NONE);
+
+  while (gegl_buffer_iterator_next (i))
+    {
+      GeglRectangle *roi = &i->roi[0];
+
+      dest_buf = (gfloat *)i->data[0];
+
+      gegl_matrix3_copy_into (&inverse, matrix);
+      gegl_matrix3_invert (&inverse);
+
+      u_start = inverse.coeff [0][0] * (roi->x + (gdouble) 0.5) +
+                inverse.coeff [0][1] * (roi->y + (gdouble) 0.5) +
+                inverse.coeff [0][2];
+      v_start = inverse.coeff [1][0] * (roi->x + (gdouble) 0.5)  +
+                inverse.coeff [1][1] * (roi->y + (gdouble) 0.5)  +
+                inverse.coeff [1][2];
+      w_start = inverse.coeff [2][0] * (roi->x + (gdouble) 0.5)  +
+                inverse.coeff [2][1] * (roi->y + (gdouble) 0.5)  +
+                inverse.coeff [2][2];
+
+      for (dest_ptr = dest_buf, y = roi->height; y--;)
+        {
+          u_float = u_start;
+          v_float = v_start;
+          w_float = w_start;
+
+          for (x = roi->width; x--;)
+            {
+              GeglMatrix2 inverse_jacobian;
+              gdouble w_recip = 1.0 / w_float;
+              gdouble u = u_float * w_recip;
+              gdouble v = v_float * w_recip;
+
+              inverse_jacobian.coeff [0][0] =
+                (inverse.coeff [0][0] - inverse.coeff [2][0] * u) * w_recip;
+              inverse_jacobian.coeff [0][1] =
+                (inverse.coeff [0][1] - inverse.coeff [2][1] * u) * w_recip;
+              inverse_jacobian.coeff [1][0] =
+                (inverse.coeff [1][0] - inverse.coeff [2][0] * v) * w_recip;
+              inverse_jacobian.coeff [1][1] =
+                (inverse.coeff [1][1] - inverse.coeff [2][1] * v) * w_recip;
+
+              gegl_sampler_get (sampler,
+                                u,
+                                v,
+                                &inverse_jacobian,
+                                dest_ptr,
+                                GEGL_ABYSS_NONE);
+              dest_ptr+=4;
+
+              u_float += inverse.coeff [0][0];
+              v_float += inverse.coeff [1][0];
+              w_float += inverse.coeff [2][0];
+            }
+
+          u_start += inverse.coeff [0][1];
+          v_start += inverse.coeff [1][1];
+          w_start += inverse.coeff [2][1];
+        }
+    }
+}
+
+#if 0
+static void
+transform_generic (GeglBuffer  *dest,
+                   GeglBuffer  *src,
+                   GeglMatrix3 *matrix,
+                   GeglSampler *sampler,
+                   gint         level)
+{
+  GeglBufferIterator  *i;
+  const GeglRectangle *dest_extent;
+  gint                 x,
+                       y;
   gfloat * restrict    dest_buf;
 
   GeglMatrix3          inverse;
@@ -1251,6 +1346,7 @@ transform_generic (GeglBuffer  *dest,
         }
     }
 }
+#endif
 
 /*
  * Use to determine if key transform matrix coefficients are close



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