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
98 lines
2.3 KiB
2 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;
|
||
|
}
|