[gegl] libs: npd: move some structures and functions from NPD operation to NPD library



commit 71a93724f78af432fee29c293aad80ed235a2ffc
Author: Marek Dvoroznak <dvoromar gmail com>
Date:   Mon Dec 2 03:41:33 2013 +0100

    libs: npd: move some structures and functions from NPD operation to NPD library
    
    Move some structures and functions from NPD operation
    to NPD library in order to offer their functionality
    to other potentional GEGL based applications.

 libs/npd/npd_common.h     |    3 -
 libs/npd/npd_gegl.c       |   70 ++++++++++++++++++++-
 libs/npd/npd_gegl.h       |   51 ++++++++++++++++
 libs/npd/npd_math.h       |    3 +
 operations/external/npd.c |  145 +++++----------------------------------------
 5 files changed, 135 insertions(+), 137 deletions(-)
---
diff --git a/libs/npd/npd_common.h b/libs/npd/npd_common.h
index e890e38..7ffb537 100644
--- a/libs/npd/npd_common.h
+++ b/libs/npd/npd_common.h
@@ -24,9 +24,6 @@
 
 #include <glib.h>
 
-#include <gegl-matrix.h>
-typedef GeglMatrix3 NPDMatrix;
-
 /* opaque types for independency on used display library */
 typedef struct _NPDImage    NPDImage;
 typedef struct _NPDColor    NPDColor;
diff --git a/libs/npd/npd_gegl.c b/libs/npd/npd_gegl.c
index af5237d..509a123 100644
--- a/libs/npd/npd_gegl.c
+++ b/libs/npd/npd_gegl.c
@@ -19,8 +19,9 @@
  * Copyright (C) 2013 Marek Dvoroznak <dvoromar gmail com>
  */
 
-#include "npd_math.h"
+#include "npd_gegl.h"
 #include <glib.h>
+#include <gegl.h>
 
 void
 npd_compute_affinity (NPDPoint  *p11,
@@ -32,15 +33,15 @@ npd_compute_affinity (NPDPoint  *p11,
                       NPDMatrix *T)
 {
   GeglMatrix3 Y, X;
-  
+
   Y.coeff[0][0] = p12->x; Y.coeff[1][0] = p12->y; Y.coeff[2][0] = 1;
   Y.coeff[0][1] = p22->x; Y.coeff[1][1] = p22->y; Y.coeff[2][1] = 1;
   Y.coeff[0][2] = p32->x; Y.coeff[1][2] = p32->y; Y.coeff[2][2] = 1;
-  
+
   X.coeff[0][0] = p11->x; X.coeff[1][0] = p11->y; X.coeff[2][0] = 1;
   X.coeff[0][1] = p21->x; X.coeff[1][1] = p21->y; X.coeff[2][1] = 1;
   X.coeff[0][2] = p31->x; X.coeff[1][2] = p31->y; X.coeff[2][2] = 1;
-  
+
   gegl_matrix3_invert (&X);
   gegl_matrix3_multiply (&Y, &X, T);
 }
@@ -54,3 +55,64 @@ npd_apply_transformation (NPDMatrix *T,
   gegl_matrix3_transform_point (T, &x, &y);
   dest->x = x; dest->y = y;
 }
+
+void
+npd_gegl_set_pixel_color (NPDImage *image,
+                          gint      x,
+                          gint      y,
+                          NPDColor *color)
+{
+  if (x > -1 && x < image->width &&
+      y > -1 && y < image->height)
+    {
+      gint position = 4 * (y * image->width + x);
+
+      image->buffer[position + 0] = color->r;
+      image->buffer[position + 1] = color->g;
+      image->buffer[position + 2] = color->b;
+      image->buffer[position + 3] = color->a;
+    }
+}
+
+void
+npd_gegl_get_pixel_color (NPDImage *image,
+                          gint      x,
+                          gint      y,
+                          NPDColor *color)
+{
+  if (x > -1 && x < image->width &&
+      y > -1 && y < image->height)
+    {
+      gint position = 4 * (y * image->width + x);
+
+      color->r = image->buffer[position + 0];
+      color->g = image->buffer[position + 1];
+      color->b = image->buffer[position + 2];
+      color->a = image->buffer[position + 3];
+    }
+  else
+    {
+      color->r = color->g = color->b = color->a = 0;
+    }
+}
+
+void
+npd_gegl_create_image (NPDImage   *image,
+                       GeglBuffer *gegl_buffer,
+                       const Babl *format)
+{
+  guchar *buffer;
+  buffer = g_new0 (guchar, gegl_buffer_get_pixel_count (gegl_buffer) * 4);
+  gegl_buffer_get (gegl_buffer, NULL, 1.0, format,
+                   buffer, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
+  image->buffer = buffer;
+  image->width = gegl_buffer_get_width (gegl_buffer);
+  image->height = gegl_buffer_get_height (gegl_buffer);
+}
+
+void
+npd_gegl_destroy_image (NPDImage *image)
+{
+  g_free(image->buffer);
+}
diff --git a/libs/npd/npd_gegl.h b/libs/npd/npd_gegl.h
new file mode 100644
index 0000000..f255061
--- /dev/null
+++ b/libs/npd/npd_gegl.h
@@ -0,0 +1,51 @@
+/*
+ * This file is part of N-point image deformation library.
+ *
+ * N-point image deformation library is free software: you can
+ * redistribute it and/or modify it under the terms of the
+ * GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * N-point image deformation library is distributed in the hope
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with N-point image deformation library.
+ * If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2013 Marek Dvoroznak <dvoromar gmail com>
+ */
+
+#ifndef __NPD_GEGL_H__
+#define        __NPD_GEGL_H__
+
+#include "npd_math.h"
+#include "graphics.h"
+#include <gegl.h>
+
+struct _NPDImage
+{
+  gint     width;
+  gint     height;
+  NPDPoint position;
+  guchar  *buffer;
+};
+
+void npd_gegl_set_pixel_color (NPDImage *image,
+                               gint      x,
+                               gint      y,
+                               NPDColor *color);
+
+void npd_gegl_get_pixel_color (NPDImage *image,
+                               gint      x,
+                               gint      y,
+                               NPDColor *color);
+void npd_gegl_create_image    (NPDImage   *image,
+                               GeglBuffer *gegl_buffer,
+                               const Babl *format);
+void npd_gegl_destroy_image   (NPDImage *image);
+
+#endif /* __NPD_GEGL_H__ */
diff --git a/libs/npd/npd_math.h b/libs/npd/npd_math.h
index 39d4de0..3220d31 100644
--- a/libs/npd/npd_math.h
+++ b/libs/npd/npd_math.h
@@ -23,6 +23,9 @@
 #define        __NPD_MATH_H__
 
 #include "npd_common.h"
+#include <gegl-matrix.h>
+
+typedef GeglMatrix3 NPDMatrix;
 
 #define NPD_EPSILON 0.00001
 
diff --git a/operations/external/npd.c b/operations/external/npd.c
index c68ddcc..be3e1bf 100644
--- a/operations/external/npd.c
+++ b/operations/external/npd.c
@@ -55,16 +55,9 @@ gegl_chant_boolean (mesh_visible, _("mesh visible"),
 #include <stdio.h>
 #include <math.h>
 #include <npd/npd.h>
+#include <npd/npd_gegl.h>
 #include <cairo.h>
 
-struct _NPDImage
-{
-  gint     width;
-  gint     height;
-  NPDPoint position;
-  guchar  *buffer;
-};
-
 struct _NPDDisplay
 {
   NPDImage  image;
@@ -77,96 +70,22 @@ typedef struct
   NPDModel  model;
 } NPDProperties;
 
-void npd_create_image         (NPDImage   *image,
-                               GeglBuffer *gegl_buffer,
-                               const Babl *format);
-
-void npd_set_pixel_color_impl (NPDImage *image,
-                               gint      x,
-                               gint      y,
-                               NPDColor *color);
-
-void npd_get_pixel_color_impl (NPDImage *image,
-                               gint      x,
-                               gint      y,
-                               NPDColor *color);
-
-void npd_draw_line_impl       (NPDDisplay *display,
-                               gfloat      x0,
-                               gfloat      y0,
-                               gfloat      x1,
-                               gfloat      y1);
-
-void npd_set_pixel_color_impl (NPDImage *image,
-                               gint      x,
-                               gint      y,
-                               NPDColor *color)
-{
-  if (x > -1 && x < image->width &&
-      y > -1 && y < image->height)
-    {
-      gint position = 4 * (y * image->width + x);
-
-      image->buffer[position + 0] = color->r;
-      image->buffer[position + 1] = color->g;
-      image->buffer[position + 2] = color->b;
-      image->buffer[position + 3] = color->a;
-    }
-}
-
-void
-npd_get_pixel_color_impl (NPDImage *image,
-                          gint      x,
-                          gint      y,
-                          NPDColor *color)
-{
-  if (x > -1 && x < image->width &&
-      y > -1 && y < image->height)
-    {
-      gint position = 4 * (y * image->width + x);
-
-      color->r = image->buffer[position + 0];
-      color->g = image->buffer[position + 1];
-      color->b = image->buffer[position + 2];
-      color->a = image->buffer[position + 3];
-    }
-  else
-    {
-      color->r = color->g = color->b = color->a = 0;
-    }
-}
-
-void npd_draw_line_impl (NPDDisplay *display,
-                         gfloat      x0,
-                         gfloat      y0,
-                         gfloat      x1,
-                         gfloat      y1)
+static void npd_draw_line_impl (NPDDisplay *display,
+                                gfloat      x0,
+                                gfloat      y0,
+                                gfloat      x1,
+                                gfloat      y1)
 {
   cairo_move_to (display->cr, x0, y0);
   cairo_line_to (display->cr, x1, y1);
 }
 
-void
+static void
 npd_draw_model (NPDModel   *model,
                 NPDDisplay *display)
 {
-  NPDHiddenModel *hm = model->hidden_model;
-  NPDImage *image = model->reference_image;
-  gint i;
+  npd_draw_model_into_image (model, &display->image);
 
-  /* draw texture */
-  if (model->texture_visible)
-    {
-      for (i = 0; i < hm->num_of_bones; i++)
-        {
-          npd_texture_quadrilateral(&hm->reference_bones[i],
-                                    &hm->current_bones[i],
-                                     image,
-                                    &display->image,
-                                     NPD_BILINEAR_INTERPOLATION | NPD_ALPHA_BLENDING);
-        }
-    }
-  
   /* draw mesh */
   if (model->mesh_visible)
     {
@@ -176,7 +95,7 @@ npd_draw_model (NPDModel   *model,
                                                      CAIRO_FORMAT_ARGB32,
                                                      display->image.width,
                                                      display->image.height,
-                                                     display->image.width * 4);
+                                                     display->image.width);
       display->cr = cairo_create (surface);
       cairo_set_line_width (display->cr, 1);
       cairo_set_source_rgba (display->cr, 0, 0, 0, 1);
@@ -185,39 +104,6 @@ npd_draw_model (NPDModel   *model,
     }
 }
 
-void
-npd_create_model_from_image (NPDModel *model,
-                             NPDImage *image,
-                             gint      square_size)
-{
-  npd_init_model(model);
-  model->reference_image = image;
-  model->mesh_square_size = square_size;
-    
-  npd_create_mesh_from_image (model, image->width, image->height, 0, 0);
-}
-
-void
-npd_create_image (NPDImage   *image,
-                  GeglBuffer *gegl_buffer,
-                  const Babl *format)
-{
-  guchar *buffer;
-  buffer = g_new0 (guchar, gegl_buffer_get_pixel_count (gegl_buffer) * 4);
-  gegl_buffer_get (gegl_buffer, NULL, 1.0, format,
-                   buffer, GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
-
-  image->buffer = buffer;
-  image->width = gegl_buffer_get_width (gegl_buffer);
-  image->height = gegl_buffer_get_height (gegl_buffer);
-}
-
-void
-npd_destroy_image (NPDImage *image)
-{
-  g_free(image->buffer);
-}
-
 static void
 prepare (GeglOperation *operation)
 {
@@ -230,7 +116,7 @@ prepare (GeglOperation *operation)
       props->first_run = TRUE;
       o->chant_data    = props;
     }
-  
+
   gegl_operation_set_format (operation, "input",
                              babl_format ("RGBA float"));
   gegl_operation_set_format (operation, "output",
@@ -258,11 +144,11 @@ process (GeglOperation       *operation,
       NPDImage *input_image = g_new (NPDImage, 1);
       NPDDisplay *display = g_new (NPDDisplay, 1);
 
-      npd_init (npd_set_pixel_color_impl,
-                npd_get_pixel_color_impl,
+      npd_init (npd_gegl_set_pixel_color,
+                npd_gegl_get_pixel_color,
                 npd_draw_line_impl);
 
-      npd_create_image (input_image, input, format);
+      npd_gegl_create_image (input_image, input, format);
       width = input_image->width;
       height = input_image->height;
 
@@ -272,9 +158,8 @@ process (GeglOperation       *operation,
       display->image.buffer = output_buffer;
       model->display = display;
 
-      npd_create_model_from_image (model, input_image, o->square_size);
+      npd_create_model_from_image (model, input_image, width, height, 0, 0, o->square_size);
       hm = model->hidden_model;
-/*      npd_create_list_of_overlapping_points (hm);*/
 
       o->model = model;
 
@@ -302,7 +187,7 @@ process (GeglOperation       *operation,
     }
 
   gegl_buffer_set (output, NULL, 0, format, output_buffer, GEGL_AUTO_ROWSTRIDE);
-  
+
   return TRUE;
 }
 


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