summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-10-15 13:43:53 +0200
committerTor Andersson <tor.andersson@artifex.com>2015-10-15 13:44:04 +0200
commitee657bcce322d97869cf437caddf5d4c962ed217 (patch)
tree2efddfc3e117feb71f731596bfbb13ea5fd799a1 /platform
parentbe11a8c835c9069bfd52d5042f50fc902172df9b (diff)
downloadmupdf-ee657bcce322d97869cf437caddf5d4c962ed217.tar.xz
x11: Add generic pixel conversion function.
Slow, but at least it won't crash. Fix for bug 695742.
Diffstat (limited to 'platform')
-rw-r--r--platform/x11/x11_image.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/platform/x11/x11_image.c b/platform/x11/x11_image.c
index 4f2db2e8..329a58b8 100644
--- a/platform/x11/x11_image.c
+++ b/platform/x11/x11_image.c
@@ -688,6 +688,66 @@ ximage_convert_bgr233(PARAMS)
}
}
+static void
+ximage_convert_generic(PARAMS)
+{
+ unsigned long rm, gm, bm, rs, gs, bs, rx, bx, gx;
+ unsigned long pixel;
+ unsigned long r, g, b;
+ int x, y;
+
+ rm = info.visual.red_mask;
+ gm = info.visual.green_mask;
+ bm = info.visual.blue_mask;
+
+ rs = ffs(rm) - 1;
+ gs = ffs(gm) - 1;
+ bs = ffs(bm) - 1;
+
+ rx = ffs(~(rm >> rs)) - 1;
+ gx = ffs(~(gm >> gs)) - 1;
+ bx = ffs(~(bm >> bs)) - 1;
+
+ for (y = 0; y < h; y++) {
+ for (x = 0; x < w; x++) {
+ r = src[4*x + 0];
+ g = src[4*x + 1];
+ b = src[4*x + 2];
+
+ /* adjust precision */
+ if (rx < 8) r >>= (8 - rx); else if (rx > 8) r <<= (rx - 8);
+ if (gx < 8) g >>= (8 - gx); else if (gx > 8) g <<= (gx - 8);
+ if (bx < 8) b >>= (8 - bx); else if (bx > 8) b <<= (bx - 8);
+
+ pixel = (r << rs) | (g << gs) | (b << bs);
+
+ if (ImageByteOrder(info.display) == MSBFirst) {
+ if (info.bitsperpixel > 16) {
+ dst[4*x + 0] = (pixel >> 24) & 0xFF;
+ dst[4*x + 1] = (pixel >> 16) & 0xFF;
+ dst[4*x + 2] = (pixel >> 8) & 0xFF;
+ dst[4*x + 3] = (pixel) & 0xFF;
+ } else if (info.bitsperpixel > 8) {
+ dst[2*x + 0] = (pixel >> 8) & 0xFF;
+ dst[2*x + 1] = (pixel) & 0xFF;
+ }
+ } else {
+ if (info.bitsperpixel > 16) {
+ dst[4*x + 0] = (pixel) & 0xFF;
+ dst[4*x + 1] = (pixel >> 8) & 0xFF;
+ dst[4*x + 2] = (pixel >> 16) & 0xFF;
+ dst[4*x + 3] = (pixel >> 24) & 0xFF;
+ } else if (info.bitsperpixel > 8) {
+ dst[2*x + 0] = (pixel) & 0xFF;
+ dst[2*x + 1] = (pixel >> 8) & 0xFF;
+ }
+ }
+ }
+ src += srcstride;
+ dst += dststride;
+ }
+}
+
ximage_convert_func_t ximage_convert_funcs[] = {
ximage_convert_argb8888,
ximage_convert_bgra8888,
@@ -700,4 +760,5 @@ ximage_convert_func_t ximage_convert_funcs[] = {
ximage_convert_rgb555,
ximage_convert_rgb555_br,
ximage_convert_bgr233,
+ ximage_convert_generic
};