summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--raster/imagescale.c53
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;
}