X-Git-Url: http://git.plutz.net/?p=stereofy;a=blobdiff_plain;f=anaglyph.c;h=b0be61c53b1bc66bcda7ea27a3a18dc9a134383a;hp=3a325be5a44df7bf4b67b6ad068e880431b8c2e6;hb=dd9163bfcca6056bf4def621010c751b0e251cdc;hpb=749ec4ad5ec7d49addeaffec4241cabc3c6f2833 diff --git a/anaglyph.c b/anaglyph.c index 3a325be..b0be61c 100644 --- a/anaglyph.c +++ b/anaglyph.c @@ -1,11 +1,29 @@ +// Copyright 2011 Paul Hänsch +// This file is part of Stereofy +// +// Stereofy is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Stereofy 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Stereofy. If not, see . + #include #include #include 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 +35,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);} @@ -33,13 +51,13 @@ int main(int argc, char *argv[]){ int error(int code){ char *msg = "Unknown Error\n"; switch (code) { - case 1: msg = "Usage: anaglyph [ -[fhd]gm | -[fhd]rc | -fmc | -dab ] left.rgb right.rgb output.rgb\n"; - case 2: msg = "Could not open input file for reading\n"; - case 3: msg = "Could not open output file for writing\n"; - case 4: msg = "Unexpected end of file\n"; - case 5: msg = "Cannot write to output file\n"; + case 1: msg = "Usage: anaglyph [ -[fhd]gm | -[fhd]rc | -fmc | -dab ] left.rgb right.rgb output.rgb\n"; break; + case 2: msg = "Could not open input file for reading\n"; break; + case 3: msg = "Could not open output file for writing\n"; break; + case 4: msg = "Unexpected end of file\n"; break; + case 5: msg = "Cannot write to output file\n"; break; } - fprintf(stderr, msg); return code; + fprintf(stderr, "%s", msg); return code; } // min-max to prevent overflowing in Dubois calculations @@ -98,11 +116,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 +133,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 +155,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; }