From 9bc1c1f65d4a53adeff8e9eb9e926b5a37b21356 Mon Sep 17 00:00:00 2001 From: Glenn Kennard Date: Wed, 19 Mar 2008 15:37:36 +0100 Subject: 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. --- raster/render.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'raster/render.c') 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) { -- cgit v1.2.3