[babl] babl: move matrix code to new file babl-matrix.h



commit 04628ad1b1135912622342cbd87f99c1319138a1
Author: Øyvind Kolås <pippin gimp org>
Date:   Sat Aug 26 21:55:08 2017 +0200

    babl: move matrix code to new file babl-matrix.h

 babl/Makefile.am   |   25 ++++++++------
 babl/babl-matrix.h |   91 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 babl/babl-space.c  |    2 -
 babl/babl-space.h  |   60 ++--------------------------------
 4 files changed, 108 insertions(+), 70 deletions(-)
---
diff --git a/babl/Makefile.am b/babl/Makefile.am
index cc7d294..7324328 100644
--- a/babl/Makefile.am
+++ b/babl/Makefile.am
@@ -28,7 +28,7 @@ c_sources =                           \
        babl-memory.c                   \
        babl-model.c                    \
        babl-mutex.c                    \
-       babl-palette.c    \
+       babl-palette.c                  \
        babl-ref-pixels.c               \
        babl-sampling.c                 \
        babl-sanity.c                   \
@@ -59,6 +59,7 @@ h_sources  =                          \
        babl-macros.h                   \
        babl-memory.h                   \
        babl-model.h                    \
+       babl-matrix.h                   \
        babl-mutex.h                    \
        babl-ref-pixels.h               \
        babl-sampling.h                 \
@@ -70,28 +71,30 @@ h_sources  =                                \
 
 library_includedir=$(includedir)/babl-$(BABL_API_VERSION)/babl
 libinc_hdrs = \
-       babl-introspect.h       \
-       babl-macros.h           \
-       babl-types.h            \
+       babl-introspect.h               \
+       babl-macros.h                   \
+       babl-types.h                    \
        babl.h
-libinc_generated_hdrs = \
+
+libinc_generated_hdrs =                        \
        babl-version.h
-library_include_HEADERS = \
+
+library_include_HEADERS =              \
        $(libinc_hdrs) $(libinc_generated_hdrs)
 
-AM_CPPFLAGS = \
+AM_CPPFLAGS =                          \
        -DLIBDIR=\""$(libdir)"\"        \
        -I$(top_srcdir)                 \
        -I$(top_srcdir)/babl/base
 
 lib_LTLIBRARIES= libbabl-@BABL_API_VERSION@.la
 libbabl_@BABL_API_VERSION@_la_SOURCES= $(h_sources) $(c_sources)
-libbabl_@BABL_API_VERSION@_la_LIBADD=\
-       base/libbase.la \
+libbabl_@BABL_API_VERSION@_la_LIBADD=  \
+       base/libbase.la                 \
        @LTLIBOBJS@
 
-libbabl_@BABL_API_VERSION@_la_LDFLAGS=                 \
-       ${no_undefined} $(MATH_LIB) $(THREAD_LIB) \
+libbabl_@BABL_API_VERSION@_la_LDFLAGS=                 \
+       ${no_undefined} $(MATH_LIB) $(THREAD_LIB)       \
        -version-info $(BABL_LIBRARY_VERSION)
 
 EXTRA_DIST = babl-ref-pixels.inc
diff --git a/babl/babl-matrix.h b/babl/babl-matrix.h
new file mode 100644
index 0000000..19707cb
--- /dev/null
+++ b/babl/babl-matrix.h
@@ -0,0 +1,91 @@
+#ifndef _BABL_MATRIX_H_
+#define _BABL_MATRIX_H_
+
+#include <stdio.h>
+
+#define m(matr, j, i)  matr[j*3+i]
+
+static inline void babl_matrix_mul_matrix (const double *matA_,
+                                           const double *matB_,
+                                           double *out)
+{
+  int i, j;
+  double matA[9];
+  double matB[9];
+  double t1, t2, t3;
+  memcpy (matA, matA_, sizeof (matA));
+  memcpy (matB, matB_, sizeof (matB));
+
+  for (i = 0; i < 3; i++)
+  {
+    t1 = m(matA, i, 0);
+    t2 = m(matA, i, 1);
+    t3 = m(matA, i, 2);
+
+    for (j = 0; j < 3; j ++)
+    {
+      m(out,i,j) = t1 * m(matB, 0, j);
+      m(out,i,j) += t2 * m(matB, 1, j);
+      m(out,i,j) += t3 * m(matB, 2, j);
+    }
+  }
+}
+
+static inline void babl_matrix_to_float (const double *in, float *out)
+{
+  int i;
+  for (i = 0; i < 9; i ++)
+    out[i] = in[i];
+}
+
+static inline void babl_matrix_invert (const double *in, double *out)
+{
+  double mat[9];
+  double det, invdet;
+  memcpy (mat, in, sizeof (mat));
+  det = m(mat, 0, 0) * (m(mat, 1, 1) *m(mat, 2, 2) - m(mat, 2, 1)*m(mat, 1, 2)) -
+        m(mat, 0, 1) * (m(mat, 1, 0) *m(mat, 2, 2) - m(mat, 1, 2)*m(mat, 2, 0)) +
+        m(mat, 0, 2) * (m(mat, 1, 0) *m(mat, 2, 1) - m(mat, 1, 1)*m(mat, 2, 0));
+  invdet = 1.0 / det;
+  m(out, 0, 0) = (m(mat, 1, 1) * m(mat, 2, 2) - m(mat, 2, 1) * m(mat, 1, 2)) * invdet;
+  m(out, 0, 1) = (m(mat, 0, 2) * m(mat, 2, 1) - m(mat, 0, 1) * m(mat, 2, 2)) * invdet;
+  m(out, 0, 2) = (m(mat, 0, 1) * m(mat, 1, 2) - m(mat, 0, 2) * m(mat, 1, 1)) * invdet;
+  m(out, 1, 0) = (m(mat, 1, 2) * m(mat, 2, 0) - m(mat, 1, 0) * m(mat, 2, 2)) * invdet;
+  m(out, 1, 1) = (m(mat, 0, 0) * m(mat, 2, 2) - m(mat, 0, 2) * m(mat, 2, 0)) * invdet;
+  m(out, 1, 2) = (m(mat, 1, 0) * m(mat, 0, 2) - m(mat, 0, 0) * m(mat, 1, 2)) * invdet;
+  m(out, 2, 0) = (m(mat, 1, 0) * m(mat, 2, 1) - m(mat, 2, 0) * m(mat, 1, 1)) * invdet;
+  m(out, 2, 1) = (m(mat, 2, 0) * m(mat, 0, 1) - m(mat, 0, 0) * m(mat, 2, 1)) * invdet;
+  m(out, 2, 2) = (m(mat, 0, 0) * m(mat, 1, 1) - m(mat, 1, 0) * m(mat, 0, 1)) * invdet;
+}
+
+
+static inline void babl_matrix_mul_vector (const double *mat, const double *v_in, double *v_out)
+{
+  double val[3]={v_in[0], v_in[1], v_in[2]};
+
+  v_out[0] = m(mat, 0, 0) * val[0] + m(mat, 0, 1) * val[1] + m(mat, 0, 2) * val[2];
+  v_out[1] = m(mat, 1, 0) * val[0] + m(mat, 1, 1) * val[1] + m(mat, 1, 2) * val[2];
+  v_out[2] = m(mat, 2, 0) * val[0] + m(mat, 2, 1) * val[1] + m(mat, 2, 2) * val[2];
+}
+
+static inline void babl_matrix_mul_vectorf (const double *mat, const float *v_in, float *v_out)
+{
+  float val[3]={v_in[0], v_in[1], v_in[2]};
+
+  v_out[0] = m(mat, 0, 0) * val[0] + m(mat, 0, 1) * val[1] + m(mat, 0, 2) * val[2];
+  v_out[1] = m(mat, 1, 0) * val[0] + m(mat, 1, 1) * val[1] + m(mat, 1, 2) * val[2];
+  v_out[2] = m(mat, 2, 0) * val[0] + m(mat, 2, 1) * val[1] + m(mat, 2, 2) * val[2];
+}
+
+static inline void babl_matrix_mul_vectorff (const float *mat, const float *v_in, float *v_out)
+{
+  float val[3]={v_in[0], v_in[1], v_in[2]};
+
+  v_out[0] = m(mat, 0, 0) * val[0] + m(mat, 0, 1) * val[1] + m(mat, 0, 2) * val[2];
+  v_out[1] = m(mat, 1, 0) * val[0] + m(mat, 1, 1) * val[1] + m(mat, 1, 2) * val[2];
+  v_out[2] = m(mat, 2, 0) * val[0] + m(mat, 2, 1) * val[1] + m(mat, 2, 2) * val[2];
+}
+
+
+#undef m
+#endif
diff --git a/babl/babl-space.c b/babl/babl-space.c
index 9481d9c..b3385b6 100644
--- a/babl/babl-space.c
+++ b/babl/babl-space.c
@@ -22,8 +22,6 @@
 #include "babl-internal.h"
 #include "base/util.h"
 
-
-
 static BablSpace space_db[MAX_SPACES];
 
 static void babl_chromatic_adaptation_matrix (const double *whitepoint,
diff --git a/babl/babl-space.h b/babl/babl-space.h
index 902a685..a6065dd 100644
--- a/babl/babl-space.h
+++ b/babl/babl-space.h
@@ -22,6 +22,7 @@
 #include <math.h>
 #include <string.h>
 #include "base/util.h"
+#include "babl-matrix.h"
 
 BABL_CLASS_DECLARE (space);
 
@@ -53,67 +54,10 @@ typedef struct
      rigged is merging matrices */
 
 } BablSpace;
-#include <stdio.h>
 
-#define m(matr, j, i)  matr[j*3+i]
 
-static inline void babl_matrix_mul_matrix (const double *matA_,
-                                           const double *matB_,
-                                           double *out)
-{
-  int i, j;
-  double matA[9];
-  double matB[9];
-  double t1, t2, t3;
-  memcpy (matA, matA_, sizeof (matA));
-  memcpy (matB, matB_, sizeof (matB));
-
-  for (i = 0; i < 3; i++)
-  {
-    t1 = m(matA, i, 0);
-    t2 = m(matA, i, 1);
-    t3 = m(matA, i, 2);
-
-    for (j = 0; j < 3; j ++)
-    {
-      m(out,i,j) = t1 * m(matB, 0, j);
-      m(out,i,j) += t2 * m(matB, 1, j);
-      m(out,i,j) += t3 * m(matB, 2, j);
-    }
-  }
-}
-
-static inline void babl_matrix_invert (const double *in, double *out)
-{
-  double mat[9];
-  double det, invdet;
-  memcpy (mat, in, sizeof (mat));
-  det = m(mat, 0, 0) * (m(mat, 1, 1) *m(mat, 2, 2) - m(mat, 2, 1)*m(mat, 1, 2)) -
-        m(mat, 0, 1) * (m(mat, 1, 0) *m(mat, 2, 2) - m(mat, 1, 2)*m(mat, 2, 0)) +
-        m(mat, 0, 2) * (m(mat, 1, 0) *m(mat, 2, 1) - m(mat, 1, 1)*m(mat, 2, 0));
-  invdet = 1.0 / det;
-  m(out, 0, 0) = (m(mat, 1, 1) * m(mat, 2, 2) - m(mat, 2, 1) * m(mat, 1, 2)) * invdet;
-  m(out, 0, 1) = (m(mat, 0, 2) * m(mat, 2, 1) - m(mat, 0, 1) * m(mat, 2, 2)) * invdet;
-  m(out, 0, 2) = (m(mat, 0, 1) * m(mat, 1, 2) - m(mat, 0, 2) * m(mat, 1, 1)) * invdet;
-  m(out, 1, 0) = (m(mat, 1, 2) * m(mat, 2, 0) - m(mat, 1, 0) * m(mat, 2, 2)) * invdet;
-  m(out, 1, 1) = (m(mat, 0, 0) * m(mat, 2, 2) - m(mat, 0, 2) * m(mat, 2, 0)) * invdet;
-  m(out, 1, 2) = (m(mat, 1, 0) * m(mat, 0, 2) - m(mat, 0, 0) * m(mat, 1, 2)) * invdet;
-  m(out, 2, 0) = (m(mat, 1, 0) * m(mat, 2, 1) - m(mat, 2, 0) * m(mat, 1, 1)) * invdet;
-  m(out, 2, 1) = (m(mat, 2, 0) * m(mat, 0, 1) - m(mat, 0, 0) * m(mat, 2, 1)) * invdet;
-  m(out, 2, 2) = (m(mat, 0, 0) * m(mat, 1, 1) - m(mat, 1, 0) * m(mat, 0, 1)) * invdet;
-}
 
 
-static inline void babl_matrix_mul_vector (const double *mat, const double *v_in, double *v_out)
-{
-  double val[3]={v_in[0], v_in[1], v_in[2]};
-
-  v_out[0] = m(mat, 0, 0) * val[0] + m(mat, 0, 1) * val[1] + m(mat, 0, 2) * val[2];
-  v_out[1] = m(mat, 1, 0) * val[0] + m(mat, 1, 1) * val[1] + m(mat, 1, 2) * val[2];
-  v_out[2] = m(mat, 2, 0) * val[0] + m(mat, 2, 1) * val[1] + m(mat, 2, 2) * val[2];
-#undef m
-}
-
 static inline void babl_space_to_xyzf (const Babl *space, const float *rgb, float *xyz)
 {
   BablSpace *space_ = (void*)space;
@@ -151,4 +95,6 @@ static inline void _babl_space_from_xyz (const Babl *space, const double *xyz, d
 void
 babl_space_class_init (void);
 
+
+
 #endif


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