diff options
author | Mattias Andrée <maandree@kth.se> | 2017-06-09 23:08:39 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2017-06-09 23:08:39 +0200 |
commit | 96a7efc1df64b23697f9d5ae398604bf1471a56f (patch) | |
tree | 0a162c2a5aebb2167d91943cfc5cc640a96b5083 /convert-template.c | |
parent | Add man pages for most colour models (diff) | |
download | libcolour-96a7efc1df64b23697f9d5ae398604bf1471a56f.tar.gz libcolour-96a7efc1df64b23697f9d5ae398604bf1471a56f.tar.bz2 libcolour-96a7efc1df64b23697f9d5ae398604bf1471a56f.tar.xz |
Reduce size of RGB struct, and add LIBCOLOUR_CIELCHUV.7 and LIBCOLOUR_RGB.7
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'convert-template.c')
-rw-r--r-- | convert-template.c | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/convert-template.c b/convert-template.c index d06ccc0..223f840 100644 --- a/convert-template.c +++ b/convert-template.c @@ -20,8 +20,8 @@ #define PI2 (2 * D(3.14159265358979323846)) #define WASDIV0(X) (xisinf(X) || xisnan(X)) -#define REGULAR(S, T) ((T) <= (S)->transition ? (S)->slope * (T) : (1 + (S)->offset) * xpow((T), 1 / (S)->gamma) - (S)->offset) -#define INVREGULAR(S, T) ((T) <= (S)->transitioninv ? (T) / (S)->slope : xpow(((T) + (S)->offset) / (1 + (S)->offset), (S)->gamma)) +#define REGULAR(S, T) ((T) <= (S)->TRANSITION ? (S)->SLOPE * (T) : (1 + (S)->OFFSET) * xpow((T), 1 / (S)->GAMMA) - (S)->OFFSET) +#define INVREGULAR(S, T) ((T) <= (S)->TRANSITIONINV ? (T) / (S)->SLOPE : xpow(((T) + (S)->OFFSET) / (1 + (S)->OFFSET), (S)->GAMMA)) #define TRANSFORM(X, Y, Z, A, B, C, R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3)\ do {\ @@ -33,6 +33,20 @@ +#define SLOPE transfer.regular.slope +#define TRANSITIONINV transfer.regular.transitioninv +#define TRANSITION transfer.regular.transition +#define GAMMA transfer.regular.gamma +#define OFFSET transfer.regular.offset +#define TO_ENCODED_RED transfer.custom.to_encoded_red +#define TO_DECODED_RED transfer.custom.to_decoded_red +#define TO_ENCODED_GREEN transfer.custom.to_encoded_green +#define TO_DECODED_GREEN transfer.custom.to_decoded_green +#define TO_ENCODED_BLUE transfer.custom.to_encoded_blue +#define TO_DECODED_BLUE transfer.custom.to_decoded_blue + + + static void to_rgb(const libcolour_colour_t *restrict from, libcolour_rgb_t *restrict to); static void to_srgb(const libcolour_colour_t *restrict from, libcolour_srgb_t *restrict to); static void to_ciexyy(const libcolour_colour_t *restrict from, libcolour_ciexyy_t *restrict to); @@ -73,9 +87,9 @@ rgb_encode(libcolour_rgb_t *restrict colour, const libcolour_rgb_t *restrict spa if (colour->G < 0) g_sign = -1, colour->G = -colour->G; if (colour->B < 0) b_sign = -1, colour->B = -colour->B; if (space->encoding_type == LIBCOLOUR_ENCODING_TYPE_SIMPLE) { - colour->R = xpow(colour->R, 1 / space->gamma); - colour->G = xpow(colour->G, 1 / space->gamma); - colour->B = xpow(colour->B, 1 / space->gamma); + colour->R = xpow(colour->R, 1 / space->GAMMA); + colour->G = xpow(colour->G, 1 / space->GAMMA); + colour->B = xpow(colour->B, 1 / space->GAMMA); } else { colour->R = REGULAR(space, colour->R); colour->G = REGULAR(space, colour->G); @@ -86,9 +100,9 @@ rgb_encode(libcolour_rgb_t *restrict colour, const libcolour_rgb_t *restrict spa colour->B *= b_sign; break; case LIBCOLOUR_ENCODING_TYPE_CUSTOM: - colour->R = (space->to_encoded_red)(colour->R); - colour->G = (space->to_encoded_green)(colour->G); - colour->B = (space->to_encoded_blue)(colour->B); + colour->R = (space->TO_ENCODED_RED)(colour->R); + colour->G = (space->TO_ENCODED_GREEN)(colour->G); + colour->B = (space->TO_ENCODED_BLUE)(colour->B); break; default: fprintf(stderr, "libcolour: invalid encoding type\n"); @@ -109,9 +123,9 @@ rgb_decode(libcolour_rgb_t *restrict colour, const libcolour_rgb_t *restrict spa if (colour->G < 0) g_sign = -1, colour->G = -colour->G; if (colour->B < 0) b_sign = -1, colour->B = -colour->B; if (space->encoding_type == LIBCOLOUR_ENCODING_TYPE_SIMPLE) { - colour->R = xpow(colour->R, space->gamma); - colour->G = xpow(colour->G, space->gamma); - colour->B = xpow(colour->B, space->gamma); + colour->R = xpow(colour->R, space->GAMMA); + colour->G = xpow(colour->G, space->GAMMA); + colour->B = xpow(colour->B, space->GAMMA); } else { colour->R = INVREGULAR(space, colour->R); colour->G = INVREGULAR(space, colour->G); @@ -122,9 +136,9 @@ rgb_decode(libcolour_rgb_t *restrict colour, const libcolour_rgb_t *restrict spa colour->B *= b_sign; break; case LIBCOLOUR_ENCODING_TYPE_CUSTOM: - colour->R = (space->to_decoded_red)(colour->R); - colour->G = (space->to_decoded_green)(colour->G); - colour->B = (space->to_decoded_blue)(colour->B); + colour->R = (space->TO_DECODED_RED)(colour->R); + colour->G = (space->TO_DECODED_GREEN)(colour->G); + colour->B = (space->TO_DECODED_BLUE)(colour->B); break; default: fprintf(stderr, "libcolour: invalid encoding type\n"); @@ -139,19 +153,19 @@ rgb_same_transfer(const libcolour_rgb_t *restrict a, const libcolour_rgb_t *rest return 0; switch (a->encoding_type) { case LIBCOLOUR_ENCODING_TYPE_SIMPLE: - return a->gamma == b->gamma; + return a->GAMMA == b->GAMMA; case LIBCOLOUR_ENCODING_TYPE_REGULAR: - return a->gamma == b->gamma && - a->offset == b->offset && - a->slope == b->slope && - a->transition == b->transition; + return a->GAMMA == b->GAMMA && + a->OFFSET == b->OFFSET && + a->SLOPE == b->SLOPE && + a->TRANSITION == b->TRANSITION; case LIBCOLOUR_ENCODING_TYPE_CUSTOM: - return a->to_encoded_red == b->to_encoded_red && - a->to_encoded_green == b->to_encoded_green && - a->to_encoded_blue == b->to_encoded_blue && - a->to_decoded_red == b->to_decoded_red && - a->to_decoded_green == b->to_decoded_green && - a->to_decoded_blue == b->to_decoded_blue; + return a->TO_ENCODED_RED == b->TO_ENCODED_RED && + a->TO_ENCODED_GREEN == b->TO_ENCODED_GREEN && + a->TO_ENCODED_BLUE == b->TO_ENCODED_BLUE && + a->TO_DECODED_RED == b->TO_DECODED_RED && + a->TO_DECODED_GREEN == b->TO_DECODED_GREEN && + a->TO_DECODED_BLUE == b->TO_DECODED_BLUE; default: return 1; } |