diff options
Diffstat (limited to 'libcolour-template.c')
-rw-r--r-- | libcolour-template.c | 97 |
1 files changed, 95 insertions, 2 deletions
diff --git a/libcolour-template.c b/libcolour-template.c index 80568de..f5455b0 100644 --- a/libcolour-template.c +++ b/libcolour-template.c @@ -16,7 +16,7 @@ #endif -#define MARSHAL_VERSION 0 +#define MARSHAL_VERSION 1 @@ -710,6 +710,95 @@ libcolour_marshal(const libcolour_colour_t *colour, void *buf) } +static size_t +libcolour_unmarshal_version_0_rgb(void *colour, const void *buf) +{ + libcolour_rgb_t *c = colour; + struct old_rgb { + enum libcolour_model model; + TYPE R; + TYPE G; + TYPE B; + int with_transfer; + enum libcolour_encoding_type encoding_type; + TYPE gamma; + TYPE offset; + TYPE slope; + TYPE transition; + TYPE transitioninv; + TYPE (*to_encoded_red)(TYPE); + TYPE (*to_decoded_red)(TYPE); + TYPE (*to_encoded_green)(TYPE); + TYPE (*to_decoded_green)(TYPE); + TYPE (*to_encoded_blue)(TYPE); + TYPE (*to_decoded_blue)(TYPE); + libcolour_ciexyy_t red; + libcolour_ciexyy_t green; + libcolour_ciexyy_t blue; + libcolour_ciexyy_t white; + TYPE white_r; + TYPE white_g; + TYPE white_b; + TYPE M[3][3]; + TYPE Minv[3][3]; + enum libcolour_rgb_colour_space colour_space; + } old_c; + if (c) { + memcpy(&old_c, (const char *)buf + sizeof(int), sizeof(old_c)); + memset(&c->transfer, 0, sizeof(c->transfer)); + c->model = old_c.model; + c->R = old_c.R; + c->G = old_c.G; + c->B = old_c.B; + c->with_transfer = old_c.with_transfer; + c->encoding_type = old_c.encoding_type; + if (c->encoding_type == LIBCOLOUR_ENCODING_TYPE_SIMPLE) { + c->transfer.simple.gamma = old_c.gamma; + } else if (c->encoding_type == LIBCOLOUR_ENCODING_TYPE_REGULAR) { + c->transfer.regular.gamma = old_c.gamma; + c->transfer.regular.offset = old_c.offset; + c->transfer.regular.slope = old_c.slope; + c->transfer.regular.transition = old_c.transition; + c->transfer.regular.transitioninv = old_c.transitioninv; + } else if (c->encoding_type == LIBCOLOUR_ENCODING_TYPE_CUSTOM) { + c->transfer.custom.to_encoded_red = old_c.to_encoded_red; + c->transfer.custom.to_decoded_red = old_c.to_decoded_red; + c->transfer.custom.to_encoded_green = old_c.to_encoded_green; + c->transfer.custom.to_decoded_green = old_c.to_decoded_green; + c->transfer.custom.to_encoded_blue = old_c.to_encoded_blue; + c->transfer.custom.to_decoded_blue = old_c.to_decoded_blue; + } + c->red = old_c.red; + c->green = old_c.green; + c->blue = old_c.blue; + c->white = old_c.white; + c->white_r = old_c.white_r; + c->white_g = old_c.white_g; + c->white_b = old_c.white_b; + c->M[0][0] = old_c.M[0][0]; + c->M[0][1] = old_c.M[0][1]; + c->M[0][2] = old_c.M[0][2]; + c->M[1][0] = old_c.M[1][0]; + c->M[1][1] = old_c.M[1][1]; + c->M[1][2] = old_c.M[1][2]; + c->M[2][0] = old_c.M[2][0]; + c->M[2][1] = old_c.M[2][1]; + c->M[2][2] = old_c.M[2][2]; + c->Minv[0][0] = old_c.Minv[0][0]; + c->Minv[0][1] = old_c.Minv[0][1]; + c->Minv[0][2] = old_c.Minv[0][2]; + c->Minv[1][0] = old_c.Minv[1][0]; + c->Minv[1][1] = old_c.Minv[1][1]; + c->Minv[1][2] = old_c.Minv[1][2]; + c->Minv[2][0] = old_c.Minv[2][0]; + c->Minv[2][1] = old_c.Minv[2][1]; + c->Minv[2][2] = old_c.Minv[2][2]; + c->colour_space = old_c.colour_space; + } + return sizeof(int) + sizeof(old_c); +} + + size_t libcolour_unmarshal(libcolour_colour_t *colour, const void *buf) { @@ -717,7 +806,7 @@ libcolour_unmarshal(libcolour_colour_t *colour, const void *buf) size_t r; int ver; ver = *(const int *)buf; - if (ver != MARSHAL_VERSION) { + if (ver < 0 || ver > MARSHAL_VERSION) { errno = EINVAL; return 0; } @@ -725,6 +814,10 @@ libcolour_unmarshal(libcolour_colour_t *colour, const void *buf) switch (model) { #define X(C, T, N)\ case C:\ + if (C == LIBCOLOUR_RGB && ver == 0) {\ + r = libcolour_unmarshal_version_0_rgb(colour, buf);\ + break;\ + }\ if (colour)\ memcpy(colour, (const char *)buf + sizeof(int), sizeof(T));\ r = sizeof(int) + sizeof(T);\ |