diff options
author | Øyvind Kolås <pippin@gimp.org> | 2017-08-26 21:55:08 +0200 |
---|---|---|
committer | Øyvind Kolås <pippin@gimp.org> | 2017-08-28 19:06:35 +0200 |
commit | 04628ad1b1135912622342cbd87f99c1319138a1 (patch) | |
tree | 8648bcb759839a0b9174423a66976491a925a15c | |
parent | cc29a763ff19ab743c977ab77da2ffa6087365ba (diff) |
babl: move matrix code to new file babl-matrix.h
-rw-r--r-- | babl/Makefile.am | 25 | ||||
-rw-r--r-- | babl/babl-matrix.h | 91 | ||||
-rw-r--r-- | babl/babl-space.c | 2 | ||||
-rw-r--r-- | 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 |