diff options
author | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-19 17:13:26 +0100 |
---|---|---|
committer | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-19 17:13:26 +0100 |
commit | b2e958214b88b18f8319885cdc80a8a3be0ce08a (patch) | |
tree | 920a80d19236d2a9d9ed0d5023aa013a1823dbbd | |
parent | 1daa95159d0419fc37167077b5148d2a711da0b8 (diff) | |
download | mupdf-b2e958214b88b18f8319885cdc80a8a3be0ce08a.tar.xz |
Optimize pdf_loadtile for indexed images
-rw-r--r-- | mupdf/pdf_image.c | 27 | ||||
-rw-r--r-- | raster/render.c | 15 |
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; |