diff options
author | Robin Watts <robin.watts@artifex.com> | 2012-11-14 16:40:54 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2012-11-16 13:52:54 +0000 |
commit | 3ec40a4dd9512eed2ee83bf3eb811cdbc1c3dae0 (patch) | |
tree | ae2edc2ab84b5b5a9b3d91e62e1f34ece75d7fb0 /fitz | |
parent | cb381546e5fb73110f09e0720645e3db34a03f98 (diff) | |
download | mupdf-3ec40a4dd9512eed2ee83bf3eb811cdbc1c3dae0.tar.xz |
Rejig cmyk_to_rgb to avoid repeated muls.
Avoid repeated muls by reusing intermediates. Speed generation
of those intermediates by using adds/subs rather than muls.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/res_colorspace.c | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/fitz/res_colorspace.c b/fitz/res_colorspace.c index c0898883..3ae8648e 100644 --- a/fitz/res_colorspace.c +++ b/fitz/res_colorspace.c @@ -81,55 +81,71 @@ static void cmyk_to_rgb(fz_context *ctx, fz_colorspace *cs, float *cmyk, float * { #ifdef SLOWCMYK /* from poppler */ float c = cmyk[0], m = cmyk[1], y = cmyk[2], k = cmyk[3]; - float c1 = 1 - c, m1 = 1 - m, y1 = 1 - y, k1 = 1 - k; float r, g, b, x; + float cm = c * m; + float c1m = m - cm; + float cm1 = c - cm; + float c1m1 = 1 - m - cm1; + float c1m1y = c1m1 * y; + float c1m1y1 = c1m1 - c1m1y; + float c1my = c1m * y; + float c1my1 = c1m - c1my; + float cm1y = cm1 * y; + float cm1y1 = cm1 - cm1y; + float cmy = cm * y; + float cmy1 = cm - cmy; /* this is a matrix multiplication, unrolled for performance */ - x = c1 * m1 * y1 * k1; /* 0 0 0 0 */ - r = g = b = x; - x = c1 * m1 * y1 * k; /* 0 0 0 1 */ + x = c1m1y1 * k; /* 0 0 0 1 */ + r = g = b = c1m1y1 - x; /* 0 0 0 0 */ r += 0.1373 * x; g += 0.1216 * x; b += 0.1255 * x; - x = c1 * m1 * y * k1; /* 0 0 1 0 */ - r += x; - g += 0.9490 * x; - x = c1 * m1 * y * k; /* 0 0 1 1 */ + + x = c1m1y * k; /* 0 0 1 1 */ r += 0.1098 * x; g += 0.1020 * x; - x = c1 * m * y1 * k1; /* 0 1 0 0 */ + x = c1m1y - x; /* 0 0 1 0 */ + r += x; + g += 0.9490 * x; + + x = c1my1 * k; /* 0 1 0 1 */ + r += 0.1412 * x; + x = c1my1 - x; /* 0 1 0 0 */ r += 0.9255 * x; b += 0.5490 * x; - x = c1 * m * y1 * k; /* 0 1 0 1 */ - r += 0.1412 * x; - x = c1 * m * y * k1; /* 0 1 1 0 */ + + x = c1my * k; /* 0 1 1 1 */ + r += 0.1333 * x; + x = c1my - x; /* 0 1 1 0 */ r += 0.9294 * x; g += 0.1098 * x; b += 0.1412 * x; - x = c1 * m * y * k; /* 0 1 1 1 */ - r += 0.1333 * x; - x = c * m1 * y1 * k1; /* 1 0 0 0 */ - g += 0.6784 * x; - b += 0.9373 * x; - x = c * m1 * y1 * k; /* 1 0 0 1 */ + + x = cm1y1 * k; /* 1 0 0 1 */ g += 0.0588 * x; b += 0.1412 * x; - x = c * m1 * y * k1; /* 1 0 1 0 */ + x = cm1y1 - x; /* 1 0 0 0 */ + g += 0.6784 * x; + b += 0.9373 * x; + + x = cm1y * k; /* 1 0 1 1 */ + g += 0.0745 * x; + x = cm1y - x; /* 1 0 1 0 */ g += 0.6510 * x; b += 0.3137 * x; - x = c * m1 * y * k; /* 1 0 1 1 */ - g += 0.0745 * x; - x = c * m * y1 * k1; /* 1 1 0 0 */ + + x = cmy1 * k; /* 1 1 0 1 */ + b += 0.0078 * x; + x = cmy1 - x; /* 1 1 0 0 */ r += 0.1804 * x; g += 0.1922 * x; b += 0.5725 * x; - x = c * m * y1 * k; /* 1 1 0 1 */ - b += 0.0078 * x; - x = c * m * y * k1; /* 1 1 1 0 */ + + x = cmy * (1-k); /* 1 1 1 0 */ r += 0.2118 * x; g += 0.2119 * x; b += 0.2235 * x; - rgb[0] = fz_clamp(r, 0, 1); rgb[1] = fz_clamp(g, 0, 1); rgb[2] = fz_clamp(b, 0, 1); |