SkColor SkHSVToColor(U8CPU a, const SkScalar hsv[3]) { SkASSERT(hsv); U8CPU s = UnitScalarToByte(hsv[1]); U8CPU v = UnitScalarToByte(hsv[2]); if (0 == s) { // shade of gray return SkColorSetARGB(a, v, v, v); } SkFixed hx = (hsv[0] < 0 || hsv[0] >= SkIntToScalar(360)) ? 0 : SkScalarToFixed(hsv[0]/60); SkFixed f = hx & 0xFFFF; unsigned v_scale = SkAlpha255To256(v); unsigned p = SkAlphaMul(255 - s, v_scale); unsigned q = SkAlphaMul(255 - (s * f >> 16), v_scale); unsigned t = SkAlphaMul(255 - (s * (SK_Fixed1 - f) >> 16), v_scale); unsigned r, g, b; SkASSERT((unsigned)(hx >> 16) < 6); switch (hx >> 16) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; default: r = v; g = p; b = q; break; } return SkColorSetARGB(a, r, g, b); }
ccColor3B CCUtils::hsv2ccc3(ccColorHSV c) { unsigned char s = UnitScalarToByte(c.s); unsigned char v = UnitScalarToByte(c.v); // if s is zero then rgb color is gray if (0 == s) { return ccc3(v, v, v); } int hx = (c.h < 0 || c.h >= 360.f) ? 0 : (int)((c.h / 60) * (1 << 16)); int f = hx & 0xFFFF; unsigned char v_scale = v + 1; unsigned char p = ((255 - s) * v_scale) >> 8; unsigned char q = ((255 - (s * f >> 16)) * v_scale) >> 8; unsigned char t = ((255 - (s * ((1 << 16) - f) >> 16)) * v_scale) >> 8; unsigned char r, g, b; switch (hx >> 16) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; default: r = v; g = p; b = q; break; } return ccc3(r, g, b); }