]> granicus.if.org Git - php/commitdiff
- #43073, TrueType bounding box is wrong for angle<>0
authorPierre Joye <pajoye@php.net>
Wed, 18 Mar 2009 08:15:27 +0000 (08:15 +0000)
committerPierre Joye <pajoye@php.net>
Wed, 18 Mar 2009 08:15:27 +0000 (08:15 +0000)
NEWS
ext/gd/libgd/gdft.c

diff --git a/NEWS b/NEWS
index 876e36463d945c5ed79f4e6239b0eed93073983f..20c212683f955beafcbf386c18f8b72aa32ed973 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,7 @@ PHP                                                                        NEWS
   bit numbers). (Matt)
 - Fixed bug #45799 (imagepng() crashes on empty image). (Martin McNickle,
   Takeshi Abe)
+- Fixed bug #43073, (TrueType bounding box is wrong for angle<>0) (Martin McNickle)
 
 26 Feb 2009, PHP 5.2.9
 - Changed __call() to be invoked on private/protected method access, similar to
index e543f2fe2b0e8c78222a5a5834ed1eb5b26463e5..9c4b9b5293b2f3fa51f75dfd883543de3b74046e 100644 (file)
@@ -1108,15 +1108,23 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi
                double d1 = sin (angle + 0.78539816339744830962);
                double d2 = sin (angle - 0.78539816339744830962);
 
+               /* make the center of rotation at (0, 0) */
+               FT_BBox normbox;
+
+               normbox.xMin = 0;
+               normbox.yMin = 0;
+               normbox.xMax = bbox.xMax - bbox.xMin;
+               normbox.yMax = bbox.yMax - bbox.yMin;
+
                /* rotate bounding rectangle */
-               brect[0] = (int) (bbox.xMin * cos_a - bbox.yMin * sin_a);
-               brect[1] = (int) (bbox.xMin * sin_a + bbox.yMin * cos_a);
-               brect[2] = (int) (bbox.xMax * cos_a - bbox.yMin * sin_a);
-               brect[3] = (int) (bbox.xMax * sin_a + bbox.yMin * cos_a);
-               brect[4] = (int) (bbox.xMax * cos_a - bbox.yMax * sin_a);
-               brect[5] = (int) (bbox.xMax * sin_a + bbox.yMax * cos_a);
-               brect[6] = (int) (bbox.xMin * cos_a - bbox.yMax * sin_a);
-               brect[7] = (int) (bbox.xMin * sin_a + bbox.yMax * cos_a);
+               brect[0] = (int) (normbox.xMin * cos_a - normbox.yMin * sin_a);
+               brect[1] = (int) (normbox.xMin * sin_a + normbox.yMin * cos_a);
+               brect[2] = (int) (normbox.xMax * cos_a - normbox.yMin * sin_a);
+               brect[3] = (int) (normbox.xMax * sin_a + normbox.yMin * cos_a);
+               brect[4] = (int) (normbox.xMax * cos_a - normbox.yMax * sin_a);
+               brect[5] = (int) (normbox.xMax * sin_a + normbox.yMax * cos_a);
+               brect[6] = (int) (normbox.xMin * cos_a - normbox.yMax * sin_a);
+               brect[7] = (int) (normbox.xMin * sin_a + normbox.yMax * cos_a);
 
                /* scale, round and offset brect */
                brect[0] = x + gdroundupdown(brect[0], d2 > 0);