]> git.plutz.net Git - stereofy/blobdiff - anaglyph.c
empirical tweaks to emc algorithm
[stereofy] / anaglyph.c
index 3a325be5a44df7bf4b67b6ad068e880431b8c2e6..1ade9521c828b279b1e793e6adf9c015c8b2d406 100644 (file)
@@ -4,8 +4,10 @@
 
 int error(int code);
 int mm(int v, int min, int max);
-int anaglyph(FILE *in1, FILE *in2, FILE *out, char *alg);
-unsigned char* colorize(unsigned char *out, const unsigned char *left, const unsigned char *right, const char *alg);
+int anaglyph(FILE *in1, FILE *in2, FILE *out,
+       unsigned char* (*alg)(unsigned char*, const unsigned char*, const unsigned char*) );
+unsigned char* (*parse_func(const char *arg))(unsigned char*, const unsigned char*, const unsigned char*);
+
 unsigned char* full_gm(unsigned char *out, const unsigned char *l, const unsigned char *r);
 unsigned char* half_gm(unsigned char *out, const unsigned char *l, const unsigned char *r);
 unsigned char* dubois_gm(unsigned char *out, const unsigned char *l, const unsigned char *r);
@@ -17,12 +19,12 @@ unsigned char* dubois_mc(unsigned char *out, const unsigned char *l, const unsig
 unsigned char* dubois_ab(unsigned char *out, const unsigned char *l, const unsigned char *r);
 
 int main(int argc, char *argv[]){
-  FILE *in1, *in2, *out; int cnt; char *alg = malloc(5);
-  in1 = in2 = out = NULL; alg = strcpy(alg, "-dgm");
+  FILE *in1, *in2, *out; int cnt; in1 = in2 = out = NULL;
+  unsigned char* (*alg)(unsigned char[], const unsigned char[], const unsigned char[]) = &dubois_rc;
 
   if (argc < 4 || argc > 5) return error(1);
   for (cnt = 1; cnt < argc; cnt++) {
-    if (argv[cnt][0] == '-') alg = strcpy(alg, argv[cnt]);
+    if (argv[cnt][0] == '-') alg = parse_func(argv[cnt]);
     else if (!in1){ if ((in1 = fopen(argv[cnt], "r")) == NULL) return error(2);}
     else if (!in2){ if ((in2 = fopen(argv[cnt], "r")) == NULL) return error(2);}
     else if (!out){ if ((out = fopen(argv[cnt], "w")) == NULL) return error(3);}
@@ -98,11 +100,11 @@ unsigned char* half_rc(unsigned char *out, const unsigned char *l, const unsigne
 
 //red-cyan Dubois
 unsigned char* dubois_rc(unsigned char *out, const unsigned char *l, const unsigned char *r){
-  out[0] = (unsigned char)mm((456*(int)l[0] +  500*(int)l[1] + 176*(int)l[2] +
+  out[0] = (unsigned char) mm((456*(int)l[0] +  500*(int)l[1] + 176*(int)l[2] +
         -43*(int)r[0] + -88*(int)r[1] +   -2*(int)r[2]) / 1000, 0, 255);
-  out[1] = (unsigned char)mm((-40*(int)l[0] +  -38*(int)l[1] + -16*(int)l[2] +
+  out[1] = (unsigned char) mm((-40*(int)l[0] +  -38*(int)l[1] + -16*(int)l[2] +
         378*(int)r[0] + 734*(int)r[1] +  -18*(int)r[2]) / 1000, 0, 255);
-  out[2] = (unsigned char)mm((-15*(int)l[0] +  -21*(int)l[1] +  -5*(int)l[2] +
+  out[2] = (unsigned char) mm((-15*(int)l[0] +  -21*(int)l[1] +  -5*(int)l[2] +
        -72*(int)r[0] +-113*(int)r[1] + 1226*(int)r[2]) / 1000, 0, 255);
   return out;
 }
@@ -115,19 +117,14 @@ unsigned char* full_mc(unsigned char *out, const unsigned char *l, const unsigne
   return out;
 }
 
-//magenta-cyan "Dubois"
-unsigned char* dubois_mc(unsigned char *out, const unsigned char *l, const unsigned char *r){
-  out[0] = (unsigned char)mm((529*(int)l[0] + 705*(int)l[1] + 24*(int)l[2] +
-        -62*(int)r[0] +-158*(int)r[1] +  -39*(int)r[2]) / 1000, 0, 255);
-  out[1] = (unsigned char)mm((-40*(int)l[0] +  -38*(int)l[1] + -16*(int)l[2] +
-        378*(int)r[0] + 734*(int)r[1] +  -18*(int)r[2]) / 1000, 0, 255);
-  out[2] = (unsigned char)mm((-15*(int)l[0] +  -24*(int)l[1] +   8*(int)l[2] +
-       -32*(int)r[0] + -19*(int)r[1] + 1081*(int)r[2]) / 1000, 0, 255);
-
-//  out[2] = (unsigned char)mm((-15*(int)l[0] +  -27*(int)l[1] +  21*(int)l[2] + gm
-//       9*(int)r[0] +  75*(int)r[1] +  937*(int)r[2]) / 1000, 0, 255);
-//  out[2] = (unsigned char)mm((-15*(int)l[0] +  -21*(int)l[1] +  -5*(int)l[2] + rc
-//     -72*(int)r[0] +-113*(int)r[1] + 1226*(int)r[2]) / 1000, 0, 255);
+//magenta-cyan experimental
+unsigned char* experimental_mc(unsigned char *out, const unsigned char *l, const unsigned char *r){
+  out[0] = (unsigned char) mm((556*(int)l[0] +  400*(int)l[1] + 176*(int)l[2] +
+        -43*(int)r[0] + -88*(int)r[1] +   -2*(int)r[2]) / 950, 0, 255);
+  out[1] = (unsigned char) mm((-40*(int)l[0] +  -38*(int)l[1] + -16*(int)l[2] +
+        278*(int)r[0] + 734*(int)r[1] +  -18*(int)r[2]) / 1100, 0, 255);
+  out[2] = (unsigned char) mm((-15*(int)l[0] +  -21*(int)l[1] + 600*(int)l[2] +
+       -72*(int)r[0] +-113*(int)r[1] + 621*(int)r[2]) / 950, 0, 255);
   return out;
 }
 
@@ -142,26 +139,27 @@ unsigned char* dubois_ab(unsigned char *out, const unsigned char *l, const unsig
   return out;
 }
 
-unsigned char* colorize(unsigned char *out, const unsigned char *left, const unsigned char *right, const char *alg){
-  if (!strcmp(alg, "-fgm")) return full_gm(out, left, right);
-  if (!strcmp(alg, "-hgm")) return half_gm(out, left, right);
-  if (!strcmp(alg, "-dgm")) return dubois_gm(out, left, right);
+unsigned char* (*parse_func(const char *arg))(unsigned char*, const unsigned char*, const unsigned char*){
+  if (!strcmp(arg, "-fgm")) return &full_gm;
+  if (!strcmp(arg, "-hgm")) return &half_gm;
+  if (!strcmp(arg, "-dgm")) return &dubois_gm;
 
-  if (!strcmp(alg, "-frc")) return full_rc(out, left, right);
-  if (!strcmp(alg, "-hrc")) return half_rc(out, left, right);
-  if (!strcmp(alg, "-drc")) return dubois_rc(out, left, right);
+  if (!strcmp(arg, "-frc")) return &full_rc;
+  if (!strcmp(arg, "-hrc")) return &half_rc;
+  if (!strcmp(arg, "-drc")) return &dubois_rc;
 
-  if (!strcmp(alg, "-fmc")) return full_mc(out, left, right);
-  if (!strcmp(alg, "-dmc")) return dubois_mc(out, left, right);
-  if (!strcmp(alg, "-dab")) return dubois_ab(out, left, right);
-  exit(error(1)); return out;
+  if (!strcmp(arg, "-fmc")) return &full_mc;
+  if (!strcmp(arg, "-dab")) return &dubois_ab;
+  if (!strcmp(arg, "-emc")) return &experimental_mc;
+  exit(error(1)); return &dubois_rc;
 }
 
-int anaglyph(FILE *in1, FILE *in2, FILE *out, char *alg){
+int anaglyph(FILE *in1, FILE *in2, FILE *out,
+       unsigned char* (*alg)(unsigned char*, const unsigned char*, const unsigned char*) ){
   unsigned char *i1 = malloc(3), *i2 = malloc(3), *o = malloc(3);
 
   while (fread( i1, 1, 3, in1) && fread( i2, 1, 3, in2)){
-    if (!fwrite(colorize( o, i1, i2, alg), 1, 3, out)) return error(5);
+    if (!fwrite(alg( o, i1, i2), 1, 3, out)) return error(5);
   }
   return 0;
 }