* This software may be freely distributed and used according to the terms
* of the GNU Lesser General Public License.
*
+ *
+ * References:
+ * - http://www.tecgraf.puc-rio.br/~mgattass/color/ColorIndex.html
+ *
* FIXME:
* - fix theoretical problems with rounding errors in srgb_to_luv_pixel()
* - SIMD should help to speed up conversion of large arrays
* - maybe try to generate a long switch in color_conv_pixel()
* with optimized entries instead of access to interpolation table
+ * - most of multiplications in srgb_to_luv_pixels can be replaced
+ * with tables lookup... tests shows almost the same speed for random
+ * input and cca 40% gain when input colors fit in CPU chache
*/
#ifndef _IMAGES_COLOR_H
void srgb_to_luv_init(void);
void srgb_to_luv_pixels(byte *dest, byte *src, uns count);
+/* L covers the interval [0..255]; u and v are centered to 128 and scaled by 1/4 in respect of L */
static inline void
srgb_to_luv_pixel(byte *dest, byte *src)
{
g1 = g + n->ofs[1];
g2 = g + n->ofs[2];
g3 = g + n->ofs[3];
- dest[0] = (g0->val[0] * n->mul[0] + g1->val[0] * n->mul[1] +
+ dest[0] = (g0->val[0] * n->mul[0] + g1->val[0] * n->mul[1] +
g2->val[0] * n->mul[2] + g3->val[0] * n->mul[3] + 128) >> 8;
- dest[1] = (g0->val[1] * n->mul[0] + g1->val[1] * n->mul[1] +
+ dest[1] = (g0->val[1] * n->mul[0] + g1->val[1] * n->mul[1] +
g2->val[1] * n->mul[2] + g3->val[1] * n->mul[3] + 128) >> 8;
- dest[2] = (g0->val[2] * n->mul[0] + g1->val[2] * n->mul[1] +
+ dest[2] = (g0->val[2] * n->mul[0] + g1->val[2] * n->mul[1] +
g2->val[2] * n->mul[2] + g3->val[2] * n->mul[3] + 128) >> 8;
}