summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Kennard <glenn.kennard@gmail.com>2008-03-19 17:13:26 +0100
committerGlenn Kennard <glenn.kennard@gmail.com>2008-03-19 17:13:26 +0100
commitb2e958214b88b18f8319885cdc80a8a3be0ce08a (patch)
tree920a80d19236d2a9d9ed0d5023aa013a1823dbbd
parent1daa95159d0419fc37167077b5148d2a711da0b8 (diff)
downloadmupdf-b2e958214b88b18f8319885cdc80a8a3be0ce08a.tar.xz
Optimize pdf_loadtile for indexed images
-rw-r--r--mupdf/pdf_image.c27
-rw-r--r--raster/render.c15
2 files changed, 24 insertions, 18 deletions
diff --git a/mupdf/pdf_image.c b/mupdf/pdf_image.c
index 20a801d7..a5cc61d6 100644
--- a/mupdf/pdf_image.c
+++ b/mupdf/pdf_image.c
@@ -486,7 +486,7 @@ pdf_loadtile(fz_image *img, fz_pixmap *tile)
{
fz_pixmap *tmp;
int x, y, k, i;
- int bpcfact = 1;
+ int invbpcfact = 1<<16;
error = fz_newpixmap(&tmp, tile->x, tile->y, tile->w, tile->h, 1);
if (error)
@@ -494,10 +494,10 @@ pdf_loadtile(fz_image *img, fz_pixmap *tile)
switch (src->bpc)
{
- case 1: bpcfact = 255; break;
- case 2: bpcfact = 85; break;
- case 4: bpcfact = 17; break;
- case 8: bpcfact = 1; break;
+ case 1: invbpcfact = (1<<16) / 255; break;
+ case 2: invbpcfact = (1<<16) / 85; break;
+ case 4: invbpcfact = (1<<16) / 17; break;
+ case 8: invbpcfact = (1<<16) / 1; break;
}
tilefunc(src->samples->rp + (tile->y * src->stride), src->stride,
@@ -506,15 +506,20 @@ pdf_loadtile(fz_image *img, fz_pixmap *tile)
for (y = 0; y < tile->h; y++)
{
+ int dn = tile->n;
+ unsigned char *dst = tile->samples + y * tile->w * dn;
+ unsigned char *st = tmp->samples + y * tmp->w;
+ unsigned char *index = src->indexed->lookup;
+ int high = src->indexed->high;
+ int sn = src->indexed->base->n;
for (x = 0; x < tile->w; x++)
{
- tile->samples[(y * tile->w + x) * tile->n] = 255;
- i = tmp->samples[y * tmp->w + x] / bpcfact;
- i = CLAMP(i, 0, src->indexed->high);
- for (k = 0; k < src->indexed->base->n; k++)
+ dst[x * dn] = 255; // alpha
+ i = st[x] * invbpcfact >> 16;
+ i = CLAMP(i, 0, high);
+ for (k = 0; k < sn; k++)
{
- tile->samples[(y * tile->w + x) * tile->n + k + 1] =
- src->indexed->lookup[i * src->indexed->base->n + k];
+ dst[x * dn + k + 1] = index[i * sn + k];
}
}
}
diff --git a/raster/render.c b/raster/render.c
index 6df46c37..6a69308b 100644
--- a/raster/render.c
+++ b/raster/render.c
@@ -375,7 +375,7 @@ DEBUG("image %dx%d %d+%d %s\n{\n", image->w, image->h, image->n, image->a, image
calcimagescale(ctm, image->w, image->h, &dx, &dy);
/* y-banded loading/scaling of image, more cache-friendly */
- tileheight = MAX(512*1024/(image->w * image->n), dy);
+ int tileheight = MAX(512*1024/(image->w * image->n), dy);
if ((dx != 1 || dy != 1) && image->h > tileheight) {
int y = 0;
@@ -386,6 +386,8 @@ DEBUG("image %dx%d %d+%d %s\n{\n", image->w, image->h, image->n, image->a, image
return error;
error = fz_newscaledpixmap(&temp, image->w, image->h, image->n + 1, dx, dy);
+ if (error)
+ goto cleanup;
do {
if (y + tileheight > image->h)
@@ -396,14 +398,11 @@ DEBUG("image %dx%d %d+%d %s\n{\n", image->w, image->h, image->n, image->a, image
0, y, image->w, tileheight, dx, dy);
error = image->loadtile(image, tile);
if (error)
- goto cleanup;
+ goto cleanup1;
error = fz_scalepixmaptile(temp, 0, y, tile, dx, dy);
- if (error) {
- if (temp)
- fz_droppixmap(temp);
- goto cleanup;
- }
+ if (error)
+ goto cleanup1;
y += tileheight;
} while (y < image->h);
@@ -511,6 +510,8 @@ DEBUG("}\n");
fz_droppixmap(tile);
return nil;
+cleanup1:
+ fz_droppixmap(temp);
cleanup:
fz_droppixmap(tile);
return error;