Skip to content

Commit cd31aa5

Browse files
author
Takeshi Abe
committed
MFB: #43073, TrueType bounding box is wrong for angle<>0
1 parent 7d91684 commit cd31aa5

File tree

2 files changed

+60
-8
lines changed

2 files changed

+60
-8
lines changed

ext/gd/libgd/gdft.c

+16-8
Original file line numberDiff line numberDiff line change
@@ -1108,15 +1108,23 @@ gdImageStringFTEx (gdImage * im, int *brect, int fg, char *fontlist, double ptsi
11081108
double d1 = sin (angle + 0.78539816339744830962);
11091109
double d2 = sin (angle - 0.78539816339744830962);
11101110

1111+
/* make the center of rotation at (0, 0) */
1112+
FT_BBox normbox;
1113+
1114+
normbox.xMin = 0;
1115+
normbox.yMin = 0;
1116+
normbox.xMax = bbox.xMax - bbox.xMin;
1117+
normbox.yMax = bbox.yMax - bbox.yMin;
1118+
11111119
/* rotate bounding rectangle */
1112-
brect[0] = (int) (bbox.xMin * cos_a - bbox.yMin * sin_a);
1113-
brect[1] = (int) (bbox.xMin * sin_a + bbox.yMin * cos_a);
1114-
brect[2] = (int) (bbox.xMax * cos_a - bbox.yMin * sin_a);
1115-
brect[3] = (int) (bbox.xMax * sin_a + bbox.yMin * cos_a);
1116-
brect[4] = (int) (bbox.xMax * cos_a - bbox.yMax * sin_a);
1117-
brect[5] = (int) (bbox.xMax * sin_a + bbox.yMax * cos_a);
1118-
brect[6] = (int) (bbox.xMin * cos_a - bbox.yMax * sin_a);
1119-
brect[7] = (int) (bbox.xMin * sin_a + bbox.yMax * cos_a);
1120+
brect[0] = (int) (normbox.xMin * cos_a - normbox.yMin * sin_a);
1121+
brect[1] = (int) (normbox.xMin * sin_a + normbox.yMin * cos_a);
1122+
brect[2] = (int) (normbox.xMax * cos_a - normbox.yMin * sin_a);
1123+
brect[3] = (int) (normbox.xMax * sin_a + normbox.yMin * cos_a);
1124+
brect[4] = (int) (normbox.xMax * cos_a - normbox.yMax * sin_a);
1125+
brect[5] = (int) (normbox.xMax * sin_a + normbox.yMax * cos_a);
1126+
brect[6] = (int) (normbox.xMin * cos_a - normbox.yMax * sin_a);
1127+
brect[7] = (int) (normbox.xMin * sin_a + normbox.yMax * cos_a);
11201128

11211129
/* scale, round and offset brect */
11221130
brect[0] = x + gdroundupdown(brect[0], d2 > 0);

ext/gd/tests/bug43073.phpt

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
--TEST--
2+
Bug #43073 (TrueType bounding box is wrong for angle<>0)
3+
--SKIPIF--
4+
<?php
5+
if(!extension_loaded('gd')){ die('skip gd extension not available'); }
6+
?>
7+
--FILE--
8+
<?php
9+
$cwd = dirname(__FILE__);
10+
$font = "$cwd/test8859.ttf";
11+
$delta_t = 360.0 / 16; # Make 16 steps around
12+
$g = imagecreate(800, 800);
13+
$bgnd = imagecolorallocate($g, 255, 255, 255);
14+
$black = imagecolorallocate($g, 0, 0, 0);
15+
$x = 100;
16+
$y = 0;
17+
$cos_t = cos(deg2rad($delta_t));
18+
$sin_t = sin(deg2rad($delta_t));
19+
for ($angle = 0.0; $angle < 360.0; $angle += $delta_t) {
20+
$bbox = imagettftext($g, 24, $angle, 400+$x, 400+$y, $black, $font, 'ABCDEF');
21+
$s = vsprintf("(%d, %d), (%d, %d), (%d, %d), (%d, %d)\n", $bbox);
22+
echo $s;
23+
$temp = $cos_t * $x + $sin_t * $y;
24+
$y = $cos_t * $y - $sin_t * $x;
25+
$x = $temp;
26+
}
27+
?>
28+
--EXPECTF--
29+
(500, 400), (579, 400), (579, 370), (500, 370)
30+
(492, 361), (575, 327), (564, 301), (480, 335)
31+
(470, 329), (540, 260), (521, 242), (451, 312)
32+
(438, 307), (478, 210), (461, 204), (420, 301)
33+
(400, 300), (400, 193), (383, 193), (383, 300)
34+
(361, 307), (319, 207), (297, 216), (338, 317)
35+
(329, 329), (254, 254), (233, 275), (307, 351)
36+
(307, 361), (215, 323), (203, 354), (294, 392)
37+
(300, 400), (203, 400), (203, 431), (300, 431)
38+
(307, 438), (219, 474), (229, 501), (318, 465)
39+
(329, 470), (263, 535), (281, 553), (347, 489)
40+
(361, 492), (326, 575), (343, 582), (378, 499)
41+
(400, 500), (400, 584), (416, 584), (416, 500)
42+
(438, 492), (468, 567), (490, 559), (460, 483)
43+
(470, 470), (523, 525), (545, 505), (491, 449)
44+
(492, 438), (560, 467), (572, 436), (504, 408)

0 commit comments

Comments
 (0)