summaryrefslogtreecommitdiff
path: root/gs
diff options
context:
space:
mode:
authorRay Johnston <ray.johnston@artifex.com>2012-02-19 15:45:43 -0800
committerChris Liddell <chris.liddell@artifex.com>2012-03-15 11:54:23 +0000
commit7339c0fb494ea67e14fa7c0642fab38086f30db6 (patch)
tree477d30eadb3e47d4afa2060b5c2169c15bc4621f /gs
parent6d5bd5530183a9dc01a61897a8b091f6a80ddd5d (diff)
Improve image performance by rotating Width 1 images to Height 1.
The image code makes a call to 'image_render' for each line of the Height. This defeats the joining of any same color pixels into a larger rectangle and also creates extra overhead. Problem analyzed with profiles from cust 532 file "PWTTQ1CC.pdf". Regression testing shows some single pixel differences presumably due to rounding, but no obvious problems.
Diffstat (limited to 'gs')
-rw-r--r--gs/psi/zimage.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gs/psi/zimage.c b/gs/psi/zimage.c
index 60ac46c48..c2b3e7f53 100644
--- a/gs/psi/zimage.c
+++ b/gs/psi/zimage.c
@@ -217,6 +217,26 @@ image1_setup(i_ctx_t * i_ctx_p, bool has_alpha)
return code;
image.Alpha = (has_alpha ? gs_image_alpha_last : gs_image_alpha_none);
+ /* swap Width, Height, and ImageMatrix so that it comes out the same */
+ /* This is only for performance, so only do it for non-skew cases */
+ if (image.Width == 1 && image.Height > 1 && image.BitsPerComponent == 8 &&
+ image.ImageMatrix.xy == 0.0 && image.ImageMatrix.yx == 0.0 &&
+ image.ImageMatrix.tx == 0.0) {
+ float ftmp;
+ int itemp;
+
+ itemp = image.Width;
+ image.Width = image.Height;
+ image.Height = itemp;
+
+ image.ImageMatrix.xy = image.ImageMatrix.xx;
+ image.ImageMatrix.yx = image.ImageMatrix.yy;
+ image.ImageMatrix.xx = 0.0;
+ image.ImageMatrix.yy = 0.0;
+ ftmp = image.ImageMatrix.tx;
+ image.ImageMatrix.tx = image.ImageMatrix.ty;
+ image.ImageMatrix.ty = ftmp;
+ }
return zimage_setup( i_ctx_p,
(gs_pixel_image_t *)&image,
&ip.DataSource[0],