From 1fd361a1ea06e44286c213ca1f814f49306fdc43 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 19 Aug 2006 03:12:28 +0000 Subject: Create Subversion repository git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/other/cameratopam/dng.c | 73 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 converter/other/cameratopam/dng.c (limited to 'converter/other/cameratopam/dng.c') diff --git a/converter/other/cameratopam/dng.c b/converter/other/cameratopam/dng.c new file mode 100644 index 00000000..44d45b02 --- /dev/null +++ b/converter/other/cameratopam/dng.c @@ -0,0 +1,73 @@ +#include +#include "global_variables.h" + +#include "dng.h" + +void +dng_coeff (double cc[4][4], double cm[4][3], double xyz[3]) +{ + static const double rgb_xyz[3][3] = { /* RGB from XYZ */ + { 3.240479, -1.537150, -0.498535 }, + { -0.969256, 1.875992, 0.041556 }, + { 0.055648, -0.204043, 1.057311 } }; +#if 0 + static const double xyz_rgb[3][3] = { /* XYZ from RGB */ + { 0.412453, 0.357580, 0.180423 }, + { 0.212671, 0.715160, 0.072169 }, + { 0.019334, 0.119193, 0.950227 } }; +#endif + double cam_xyz[4][3], xyz_cam[3][4], invert[3][6], num; + int i, j, k; + + memset (cam_xyz, 0, sizeof cam_xyz); + for (i=0; i < colors; i++) + for (j=0; j < 3; j++) + for (k=0; k < colors; k++) + cam_xyz[i][j] += cc[i][k] * cm[k][j] * xyz[j]; + + for (i=0; i < colors; i++) { + for (num=j=0; j < 3; j++) + num += cam_xyz[i][j]; + for (j=0; j < 3; j++) + cam_xyz[i][j] /= num; + pre_mul[i] = 1 / num; + } + for (i=0; i < 3; i++) { + for (j=0; j < 6; j++) + invert[i][j] = j == i+3; + for (j=0; j < 3; j++) + for (k=0; k < colors; k++) + invert[i][j] += cam_xyz[k][i] * cam_xyz[k][j]; + } + for (i=0; i < 3; i++) { + num = invert[i][i]; + for (j=0; j < 6; j++) /* Normalize row i */ + invert[i][j] /= num; + for (k=0; k < 3; k++) { /* Subtract it from other rows */ + if (k==i) continue; + num = invert[k][i]; + for (j=0; j < 6; j++) + invert[k][j] -= invert[i][j] * num; + } + } + memset (xyz_cam, 0, sizeof xyz_cam); + for (i=0; i < 3; i++) + for (j=0; j < colors; j++) + for (k=0; k < 3; k++) + xyz_cam[i][j] += invert[i][k+3] * cam_xyz[j][k]; + + memset (coeff, 0, sizeof coeff); + for (i=0; i < 3; i++) + for (j=0; j < colors; j++) + for (k=0; k < 3; k++) + coeff[i][j] += rgb_xyz[i][k] * xyz_cam[k][j]; + + for (num=j=0; j < colors; j++) + num += coeff[1][j]; + for (i=0; i < 3; i++) { + for (j=0; j < colors; j++) + coeff[i][j] /= num; + } + use_coeff = 1; +} + -- cgit 1.4.1