add op_lidstate
[pandora-misc.git] / op_gammatable.c
index dd321ed..690a689 100644 (file)
@@ -34,7 +34,8 @@
 static void usage(const char *argv0)
 {
        fprintf(stderr, "usage:\n");
-       fprintf(stderr, "%s [-n] {<gamma> | <gamma_r> <gamma_g> <gamma_b>}\n",
+       fprintf(stderr, "%s [-n] [-b <black_level>] "
+                       "{<gamma> | <gamma_r> <gamma_g> <gamma_b>}\n",
                argv0);
        exit(1);
 }
@@ -43,6 +44,7 @@ int main(int argc, char *argv[])
 {
        unsigned int v, r, g, b;
        float gamma[3] = { 0.f, };
+       float base = 0.f, scale;
        int negative = 0, ptod = 0, half = 0;
        int i, arg = 1;
 
@@ -53,6 +55,11 @@ int main(int argc, char *argv[])
                        usage(argv[0]);
                else if (strcmp(argv[arg], "-n") == 0)
                        negative = 1;
+               else if (strcmp(argv[arg], "-b") == 0) {
+                       arg++;
+                       if (arg < argc)
+                               base = atof(argv[arg]);
+               }
                else if (strcmp(argv[arg], "-ptod") == 0)
                        ptod = 1;
                else if (strcmp(argv[arg], "-half") == 0)
@@ -79,11 +86,18 @@ int main(int argc, char *argv[])
                usage(argv[0]);
        }
 
+       if (base < 0.f || base > 255.f) {
+               fprintf(stderr, "invalid black level: %.3f\n", base);
+               usage(argv[0]);
+       }
+       scale = 255.f - base;
+       base += 0.5f; // rounding
+
        for (i = 0; i < 256; i++) {
                // based on http://www.teamten.com/lawrence/graphics/gamma/
-               r = (unsigned int) (255.f * powf((float)i / 255.f, 1.f / gamma[0]) + 0.5f);
-               g = (unsigned int) (255.f * powf((float)i / 255.f, 1.f / gamma[1]) + 0.5f);
-               b = (unsigned int) (255.f * powf((float)i / 255.f, 1.f / gamma[2]) + 0.5f);
+               r = (unsigned int) (base + scale * powf((float)i / 255.f, 1.f / gamma[0]));
+               g = (unsigned int) (base + scale * powf((float)i / 255.f, 1.f / gamma[1]));
+               b = (unsigned int) (base + scale * powf((float)i / 255.f, 1.f / gamma[2]));
 
                v = (r << 16) | (g << 8) | b;
                if (negative)