/* See LICENSE file for copyright and license details. */ #include #include #include #include #include "libcolour.h" #define TYPE_COLOUR libcolour_colour_llf_t #define TYPE_PRINTF ".10Lf" #define TYPE_STRTOD strtold const char *argv0; static void get_colour_space(char ***argvp, TYPE_COLOUR *cs) { #define argv (*argvp) if (!strcasecmp(*argv, "srgb")) { argv++; cs->model = LIBCOLOUR_SRGB; if (!*argv || !**argv) exit(2); cs->srgb.with_transfer = !!strchr("yYtT", **argv); argv++; } else if (!strcasecmp(*argv, "xyy") || !strcasecmp(*argv, "ciexyy")) { argv++; cs->model = LIBCOLOUR_CIEXYY; } else if (!strcasecmp(*argv, "xyz") || !strcasecmp(*argv, "ciexyz")) { argv++; cs->model = LIBCOLOUR_CIEXYZ; } else if (!strcasecmp(*argv, "lab") || !strcasecmp(*argv, "cielab")) { argv++; cs->model = LIBCOLOUR_CIELAB; } else if (!strcasecmp(*argv, "yiq")) { argv++; cs->model = LIBCOLOUR_YIQ; } else if (!strcasecmp(*argv, "ydbdr")) { argv++; cs->model = LIBCOLOUR_YDBDR; } else if (!strcasecmp(*argv, "yuv")) { argv++; cs->model = LIBCOLOUR_YUV; } else if (!strcasecmp(*argv, "ypbpr")) { argv++; cs->model = LIBCOLOUR_YPBPR; } else if (!strcasecmp(*argv, "ycgco")) { argv++; cs->model = LIBCOLOUR_YCGCO; } else if (!strcasecmp(*argv, "cie1960ucs") || !strcasecmp(*argv, "cieucs") || !strcasecmp(*argv, "ucs")) { argv++; cs->model = LIBCOLOUR_CIE1960UCS; } else if (!strcasecmp(*argv, "cieuvw") || !strcasecmp(*argv, "uvw")) { argv++; cs->model = LIBCOLOUR_CIEUVW; if (!*argv) exit(2); cs->cieuvw.u0 = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cieuvw.v0 = TYPE_STRTOD(*argv++, NULL); } else if (!strcasecmp(*argv, "cieluv") || !strcasecmp(*argv, "luv")) { argv++; cs->model = LIBCOLOUR_CIELUV; cs->cieluv.white.model = LIBCOLOUR_CIEXYZ; if (!*argv) exit(2); cs->cieluv.white.X = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cieluv.white.Y = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cieluv.white.Z = TYPE_STRTOD(*argv++, NULL); } else if (!strcasecmp(*argv, "cielchuv") || !strcasecmp(*argv, "lchuv")) { argv++; cs->model = LIBCOLOUR_CIELCHUV; cs->cielchuv.white.model = LIBCOLOUR_CIEXYZ; if (!*argv) exit(2); cs->cielchuv.white.X = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cielchuv.white.Y = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cielchuv.white.Z = TYPE_STRTOD(*argv++, NULL); if (!*argv) exit(2); cs->cielchuv.one_revolution = TYPE_STRTOD(*argv++, NULL); } else if (!strcasecmp(*argv, "yes")) { argv++; cs->model = LIBCOLOUR_YES; } #undef argv } int main(int argc, char *argv[]) { TYPE_COLOUR from, to; if (!*argv) return 2; argv0 = *argv++; if (!*argv) return 2; get_colour_space(&argv, &from); if (!*argv) return 2; from.srgb.R = TYPE_STRTOD(*argv++, NULL); if (!*argv) return 2; from.srgb.G = TYPE_STRTOD(*argv++, NULL); if (!*argv) return 2; from.srgb.B = TYPE_STRTOD(*argv++, NULL); if (!*argv) return 2; get_colour_space(&argv, &to); if (*argv) return 2; if (libcolour_convert(&from, &to)) return 1; printf("%"TYPE_PRINTF" %"TYPE_PRINTF" %"TYPE_PRINTF"\n", to.srgb.R, to.srgb.G, to.srgb.B); fflush(stdout); if (ferror(stdout)) return 2; return 0; (void) argc; }