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);
}
{
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;
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)
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)