diff options
author | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-19 15:37:36 +0100 |
---|---|---|
committer | Glenn Kennard <glenn.kennard@gmail.com> | 2008-03-19 15:37:36 +0100 |
commit | 9bc1c1f65d4a53adeff8e9eb9e926b5a37b21356 (patch) | |
tree | 0a0d0f8540565189e974100572de900ccbf21e7c /raster/render.c | |
parent | 22931638c8457d61aa91fdfa12157f62b2d45348 (diff) | |
download | mupdf-9bc1c1f65d4a53adeff8e9eb9e926b5a37b21356.tar.xz |
Split image decode and scaling work into bands for large images
Images larger than will fit in a typical L2 cache that need scaling
are now chopped up and processed in bands. Speeds up McCue.pdf
overall by 1/3. Actual decoding of stream is still done in one
chunk, which now has the highest overhead.
Diffstat (limited to 'raster/render.c')
-rw-r--r-- | raster/render.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/raster/render.c b/raster/render.c index 50e16d8a..e750642f 100644 --- a/raster/render.c +++ b/raster/render.c @@ -373,6 +373,46 @@ 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 + int tileheight = MAX(512*1024/(image->w * image->n), dy); + if ((dx != 1 || dy != 1) && image->h > tileheight) { + int y = 0; + + DEBUG(" load image tile size = %dx%d\n", image->w, tileheight); + error = fz_newpixmap(&tile, 0, 0, image->w, + tileheight, image->n + 1); + if (error) + return error; + + error = fz_newscaledpixmap(&temp, image->w, image->h, image->n + 1, dx, dy); + + do { + if (y + tileheight > image->h) + tileheight = image->h - y; + tile->y = y; + tile->h = tileheight; + DEBUG(" tile xywh=%d %d %d %d sxsy=1/%d 1/%d\n", + 0, y, image->w, tileheight, dx, dy); + error = image->loadtile(image, tile); + if (error) + goto cleanup; + + error = fz_scalepixmaptile(temp, 0, y, tile, dx, dy); + if (error) { + if (temp) + fz_droppixmap(temp); + goto cleanup; + } + + y += tileheight; + } while (y < image->h); + + fz_droppixmap(tile); + tile = temp; + } + else { + + DEBUG(" load image\n"); error = fz_newpixmap(&tile, 0, 0, image->w, image->h, image->n + 1); if (error) @@ -391,6 +431,7 @@ DEBUG(" scale image 1/%d 1/%d\n", dx, dy); fz_droppixmap(tile); tile = temp; } + } if (image->cs && image->cs != gc->model) { |