From c1506509e34b1b8c7c4b646195fc9827c01c5797 Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Wed, 10 Oct 2012 01:49:51 +0300 Subject: [PATCH] op_gammatable: black level support --- op_gammatable.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/op_gammatable.c b/op_gammatable.c index dd321ed..690a689 100644 --- a/op_gammatable.c +++ b/op_gammatable.c @@ -34,7 +34,8 @@ static void usage(const char *argv0) { fprintf(stderr, "usage:\n"); - fprintf(stderr, "%s [-n] { | }\n", + fprintf(stderr, "%s [-n] [-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) -- 2.39.2