diff src/http/modules/ngx_http_image_filter_module.c @ 624:d4da38525468 NGINX_1_0_2

nginx 1.0.2 *) Feature: now shared zones and caches use POSIX semaphores. *) Bugfix: in the "rotate" parameter of the "image_filter" directive. Thanks to Adam Bocim. *) Bugfix: nginx could not be built on Solaris; the bug had appeared in 1.0.1.
author Igor Sysoev <http://sysoev.ru>
date Tue, 10 May 2011 00:00:00 +0400
parents b4dcae568a2a
children f200748c0ac8
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;
         }