[gegl] transform-core: restore old transform_generic
- From: Nicolas Robidoux <nrobidoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] transform-core: restore old transform_generic
- Date: Tue, 18 Dec 2012 15:10:22 +0000 (UTC)
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]