Workshop o mikrokontrolérech na SKSP 2024.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.3 KiB

3 months ago
/*
* Color spaces tool
*
* (c) 2006 Pavel Charvat <pchar@ucw.cz>
*
* This software may be freely distributed and used according to the terms
* of the GNU General Public License.
*/
#include <ucw/lib.h>
#include <images/images.h>
#include <images/color.h>
#include <getopt.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
static void NONRET
usage(void)
{
fputs("\
Usage: ucw-color-tool input-color-space output-color-space\n\
", stderr);
exit(1);
}
static char *shortopts = "";
static struct option longopts[] =
{
{ NULL, 0, 0, 0 }
};
static const struct color_space_info *
parse_color_space(byte *s)
{
if (!strcasecmp(s, "sRGB"))
return &color_srgb_info;
else if (!strcasecmp(s, "AdobeRGB") || !strcasecmp(s, "Adobe RGB"))
return &color_adobe_rgb_info;
else if (!strcasecmp(s, "CIERGB") || strcasecmp(s, "CIE RGB"))
return &color_cie_rgb_info;
else
die("Unknown color space");
}
static void
print_matrix(double m[9])
{
for (uint j = 0; j < 3; j++)
{
for (uint i = 0; i < 3; i++)
printf(" %12.8f", m[i + j * 3]);
printf("\n");
}
}
int
main(int argc, char **argv)
{
log_init(argv[0]);
int opt;
while ((opt = getopt_long(argc, argv, shortopts, longopts, NULL)) >= 0)
switch (opt)
{
default:
usage();
}
if (argc == optind + 1)
{
const struct color_space_info *a = parse_color_space(argv[optind]);
double a_to_xyz[9], xyz_to_a[9];
color_compute_color_space_to_xyz_matrix(a_to_xyz, &a->chromacity);
color_invert_matrix(xyz_to_a, a_to_xyz);
printf("linear %s -> XYZ:\n", a->name);
print_matrix(a_to_xyz);
printf("XYZ -> linear %s:\n", a->name);
print_matrix(xyz_to_a);
printf("Simple gamma: %.8f\n", a->gamma.simple_gamma);
printf("Detailed gamma: g=%.8f o=%.8f t=%.8f s=%.8f\n", a->gamma.detailed_gamma, a->gamma.offset, a->gamma.transition, a->gamma.slope);
}
else if (argc == optind + 2)
{
const struct color_space_info *a = parse_color_space(argv[optind++]);
const struct color_space_info *b = parse_color_space(argv[optind]);
double a_to_b[9];
color_compute_color_spaces_conversion_matrix(a_to_b, &a->chromacity, &b->chromacity);
printf("linear %s -> linear %s:\n", a->name, b->name);
print_matrix(a_to_b);
}
else
usage();
return 0;
}