diff options
Diffstat (limited to '')
| -rw-r--r-- | src/convert.c | 17 | 
1 files changed, 14 insertions, 3 deletions
| diff --git a/src/convert.c b/src/convert.c index 5a358c9..9a2c3d9 100644 --- a/src/convert.c +++ b/src/convert.c @@ -24,6 +24,8 @@  #define WASDIV0(x)  (isinf(x) || isnan(x)) +#define PI          (3.14159265358979323846) +#define PI2         (2 * PI) @@ -598,11 +600,12 @@ static void cielchuv_to_cieluv(const libcolour_cielchuv_t* restrict from, libcol      tmp.model = LIBCOLOUR_CIEXYZ;      tmp2.model = LIBCOLOUR_CIELCHUV;      tmp2.white = to->white; +    tmp2.one_revolution = PI2;      to_ciexyz((const libcolour_colour_t*)from, &tmp);      to_cielchuv((const libcolour_colour_t*)&tmp, &tmp2);      L = tmp2.L, C = tmp2.C, h = tmp2.h;    } else { -    L = from->L, C = from->C, h = from->h; +    L = from->L, C = from->C, h = from->h * PI2 / from->one_revolution;    }    to->L = L;    to->u = C * cos(h); @@ -655,7 +658,7 @@ static void cieluv_to_cielchuv(const libcolour_cieluv_t* restrict from, libcolou    }    to->L = L;    to->C = sqrt(u * u + v * v); -  to->h = atan2(v, u); +  to->h = atan2(v, u) / PI2 * to->one_revolution;  }  static void other_to_cielchuv(const libcolour_colour_t* restrict from, libcolour_cielchuv_t* restrict to) @@ -669,6 +672,7 @@ static void other_to_cielchuv(const libcolour_colour_t* restrict from, libcolour  static void to_cielchuv(const libcolour_colour_t* restrict from, libcolour_cielchuv_t* restrict to)  { +  double one_revolution;    switch (from->model) {    case LIBCOLOUR_CIELUV:      cieluv_to_cielchuv(&from->cieluv, to); @@ -677,7 +681,14 @@ static void to_cielchuv(const libcolour_colour_t* restrict from, libcolour_cielc      if (to->white.X == from->cielchuv.white.X &&  	to->white.Y == from->cielchuv.white.Y &&  	to->white.Z == from->cielchuv.white.Z) { -      *to = from->cielchuv; +      if (to->one_revolution == from->cielchuv.one_revolution) { +	*to = from->cielchuv; +      } else { +	one_revolution = to->one_revolution; +	*to = from->cielchuv; +	to->one_revolution = one_revolution; +	to->h = to->h / from->cielchuv.one_revolution * one_revolution; +      }        break;      }      /* fall through */ | 
