changeset 3910:750fb808aa15

gdImageCopyRotated() may images of even height or width patch by Adam Bocim
author Igor Sysoev <igor@sysoev.ru>
date Tue, 10 May 2011 12:04:57 +0000
parents 0daede16d68b
children c50df367648e
files src/http/modules/ngx_http_image_filter_module.c
diffstat 1 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_image_filter_module.c
+++ b/src/http/modules/ngx_http_image_filter_module.c
@@ -723,7 +723,7 @@ ngx_http_image_size(ngx_http_request_t *
 static ngx_buf_t *
 ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
 {
-    int                            sx, sy, dx, dy, ox, oy, size,
+    int                            sx, sy, dx, dy, ox, oy, ax, ay, size,
                                    colors, palette, transparent,
                                    red, green, blue, t;
     u_char                        *out;
@@ -852,6 +852,9 @@ transparent:
     if (ctx->angle) {
         src = dst;
 
+        ax = (dx % 2 == 0) ? 1 : 0;
+        ay = (dy % 2 == 0) ? 1 : 0;
+
         switch (ctx->angle) {
 
         case 90:
@@ -861,7 +864,17 @@ transparent:
                 gdImageDestroy(src);
                 return NULL;
             }
-            gdImageCopyRotated(dst, src, dy/2, dx/2, 0, 0, dx, dy, ctx->angle);
+            if (ctx->angle == 90) {
+                ox = dy / 2 + ay;
+                oy = dx / 2 - ax;
+
+            } else {
+                ox = dy / 2 - ay;
+                oy = dx / 2 + ax;
+            }
+
+            gdImageCopyRotated(dst, src, ox, oy, 0, 0,
+                               dx + ax, dy + ay, ctx->angle);
             gdImageDestroy(src);
 
             t = dx;
@@ -875,7 +888,8 @@ transparent:
                 gdImageDestroy(src);
                 return NULL;
             }
-            gdImageCopyRotated(dst, src, dx/2, dy/2, 0, 0, dx, dy, ctx->angle);
+            gdImageCopyRotated(dst, src, dx / 2 - ax, dy / 2 - ay, 0, 0,
+                               dx + ax, dy + ay, ctx->angle);
             gdImageDestroy(src);
             break;
         }