diff options
author | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-17 00:28:23 +0100 |
---|---|---|
committer | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-17 00:28:23 +0100 |
commit | 6c16f4d212e87940401b6b2244e0f0b0db060d8c (patch) | |
tree | 299f961c66e97227452ca2c28d7b4bf9bdaca96a | |
parent | 0e8f52a15baa78857ef8de2cf60ecb196f0edf3e (diff) | |
download | mupdf-6c16f4d212e87940401b6b2244e0f0b0db060d8c.tar.xz |
Grayscale image scaling speedup
-rw-r--r-- | raster/imagescale.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/raster/imagescale.c b/raster/imagescale.c index 3022189e..00cbf623 100644 --- a/raster/imagescale.c +++ b/raster/imagescale.c @@ -76,6 +76,11 @@ static void srow2(byte *src, byte *dst, int w, int denom) srown(src, dst, w, denom, 2); } +static void srow2p2(byte * restrict src, byte * restrict dst, int w, int log2denom) +{ + srownp2(src, dst, w, log2denom, 2); +} + static void srow4(byte *src, byte *dst, int w, int denom) { srown(src, dst, w, denom, 4); @@ -141,6 +146,11 @@ static void scol2(byte *src, byte *dst, int w, int denom) scoln(src, dst, w, denom, 2); } +static void scol2p2(byte *src, byte *dst, int w, int denom) +{ + scolnp2(src, dst, w, denom, 2); +} + static void scol4(byte *src, byte *dst, int w, int denom) { scoln(src, dst, w, denom, 4); @@ -177,6 +187,8 @@ fz_scalepixmap(fz_pixmap **dstp, fz_pixmap *src, int xdenom, int ydenom) int y, iy, oy; int ow, oh, n; int ydenom2 = ydenom; + int xispow2 = 0; + int yispow2 = 0; void (*srowx)(byte *src, byte *dst, int w, int denom) = nil; void (*scolx)(byte *src, byte *dst, int w, int denom) = nil; @@ -196,27 +208,36 @@ fz_scalepixmap(fz_pixmap **dstp, fz_pixmap *src, int xdenom, int ydenom) return error; } + xispow2 = !(xdenom & (xdenom - 1)); + if (xispow2) + { + unsigned v = xdenom; + xdenom = 0; + while ((v >>= 1)) xdenom++; + } + yispow2 = !(ydenom & (ydenom - 1)); + if (ydenom) + { + unsigned v = ydenom2; + ydenom2 = 0; + while ((v >>= 1)) ydenom2++; + } + switch (n) { case 1: srowx = fz_srow1; scolx = fz_scol1; break; - case 2: srowx = fz_srow2; scolx = fz_scol2; break; + case 2: srowx = fz_srow2; scolx = fz_scol2; + if (xispow2) + srowx = srow2p2; + if (yispow2) + scolx = scol2p2; + break; case 4: srowx = fz_srow4; scolx = fz_scol4; break; case 5: srowx = fz_srow5; scolx = fz_scol5; - if (!(xdenom & (xdenom - 1))) - { - unsigned v = xdenom; - xdenom = 0; - while ((v >>= 1)) xdenom++; - srowx = srow5p2; - } - if (!(ydenom & (ydenom - 1))) - { - unsigned v = ydenom2; - ydenom2 = 0; - while ((v >>= 1)) ydenom2++; - scolx = scol5p2; - } - + if (xispow2) + srowx = srow5p2; + if (yispow2) + scolx = scol5p2; break; } |