Bug#929422: unblock: ghostscript/9.27~dfsg-2
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Please unblock package ghostscript
Upstream regression in 9.27 was fixed in ghostscript/9.27~dfsg-2
with cherrypicking almost 50 lines of code, debdiff attached.
diff -Nru ghostscript-9.27~dfsg/debian/changelog ghostscript-9.27~dfsg/debian/changelog
--- ghostscript-9.27~dfsg/debian/changelog 2019-04-05 03:17:20.000000000 +0900
+++ ghostscript-9.27~dfsg/debian/changelog 2019-04-20 17:16:50.000000000 +0900
@@ -1,3 +1,11 @@
+ghostscript (9.27~dfsg-2) unstable; urgency=medium
+
+ * Add patch cherry-picked upstream
+ to fix regression resolving bounding box of font glyphs.
+ Closes: Bug#927429. Thanks to Kenshi Muto.
+
+ -- Jonas Smedegaard <dr@jones.dk> Sat, 20 Apr 2019 10:16:50 +0200
+
ghostscript (9.27~dfsg-1) unstable; urgency=high
[ upstream ]
diff -Nru ghostscript-9.27~dfsg/debian/patches/020190410~06c9207.patch ghostscript-9.27~dfsg/debian/patches/020190410~06c9207.patch
--- ghostscript-9.27~dfsg/debian/patches/020190410~06c9207.patch 1970-01-01 09:00:00.000000000 +0900
+++ ghostscript-9.27~dfsg/debian/patches/020190410~06c9207.patch 2019-04-20 17:15:04.000000000 +0900
@@ -0,0 +1,91 @@
+Description: Fix regression resolving bounding box of font glyphs
+ Re-introduce over/underflow workaround
+ .
+ Commit 355434f4b1bbe8c4f98cafad5a6868aa2f0eaae1 reverted a workaround
+ that compensated for over/underflow in Freetype's TTF hinting
+ (related to freedom and projection vector calculations).
+ That problem no longer exists in recent Freetype releases,
+ and the workaround actually caused other issues to occur with hinting.
+ .
+ What wasn't obvious was
+ that the workaround also protected over/underflow issues
+ relating to the unitsPerEm value.
+ .
+ So this re-instates the workaround,
+ but bases the decision on how the final scale is distributing
+ between the Freetype "size" and the Freetype matrix
+ on the unitsPerEm value
+ (this is relevant for all font types
+ as for non-TTF font types
+ Freetype derives the unitsPerEm from the FontMatrix for PS type fonts).
+Origin: upstream, http://git.ghostscript.com/?p=ghostpdl.git;h=06c9207
+Author: Chris Liddell <chris.liddell@artifex.com>
+Forwarded: yes
+Bug: http://bugs.ghostscript.com/show_bug.cgi?id=700952
+Bug: http://bugs.ghostscript.com/show_bug.cgi?id=700875
+Bug-Debian: https://bugs.debian.org/927429
+Last-Update: 2019-04-20
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/base/fapi_ft.c
++++ b/base/fapi_ft.c
+@@ -974,13 +974,19 @@
+ */
+ static void
+ transform_decompose(FT_Matrix * a_transform, FT_UInt * xresp, FT_UInt * yresp,
+- FT_Fixed * a_x_scale, FT_Fixed * a_y_scale)
++ FT_Fixed * a_x_scale, FT_Fixed * a_y_scale, int units_per_EM)
+ {
+ double scalex, scaley, fact = 1.0;
+ double factx = 1.0, facty = 1.0;
+ FT_Matrix ftscale_mat;
+ FT_UInt xres;
+ FT_UInt yres;
++ /* We have to account for units_per_EM as we fiddle with the scaling
++ * in order to avoid underflow (mostly in the TTF hinting code), but
++ * we also want to clamp to a lower value (512, admittedly arrived at
++ * via experimentation) in order to preserve the fidelity of the outlines.
++ */
++ double upe = units_per_EM > 512 ? (float)units_per_EM : 512.0;
+
+ scalex = hypot((double)a_transform->xx, (double)a_transform->xy);
+ scaley = hypot((double)a_transform->yx, (double)a_transform->yy);
+@@ -1067,10 +1073,25 @@
+ scalex *= fact;
+ }
+
+- ftscale_mat.xx = (FT_Fixed) (65536.0 / scalex);
+- ftscale_mat.xy = (FT_Fixed) 0;
+- ftscale_mat.yx = (FT_Fixed) 0;
+- ftscale_mat.yy = (FT_Fixed) (65536.0 / scaley);
++ /* see above */
++ fact = 1.0;
++ while (scaley * yres > (double)upe * 72.0 && (xres > 0 && yres > 0)
++ && (scalex > 0.0 && scaley > 0.0)) {
++ if (scaley < yres) {
++ xres >>= 1;
++ yres >>= 1;
++ fact *= 2.0;
++ }
++ else {
++ scalex /= 1.25;
++ scaley /= 1.25;
++ }
++ }
++
++ ftscale_mat.xx = (FT_Fixed) ((65536.0 / scalex) * fact);
++ ftscale_mat.xy = 0;
++ ftscale_mat.yx = 0;
++ ftscale_mat.yy = (FT_Fixed) ((65536.0 / scaley) * fact);
+
+ FT_Matrix_Multiply(a_transform, &ftscale_mat);
+ memcpy(a_transform, &ftscale_mat, sizeof(FT_Matrix));
+@@ -1315,7 +1336,7 @@
+ * transform.
+ */
+ transform_decompose(&face->ft_transform, &face->horz_res,
+- &face->vert_res, &face->width, &face->height);
++ &face->vert_res, &face->width, &face->height, face->ft_face->units_per_EM);
+
+ ft_error = FT_Set_Char_Size(face->ft_face, face->width, face->height,
+ face->horz_res, face->vert_res);
diff -Nru ghostscript-9.27~dfsg/debian/patches/series ghostscript-9.27~dfsg/debian/patches/series
--- ghostscript-9.27~dfsg/debian/patches/series 2019-04-05 01:39:06.000000000 +0900
+++ ghostscript-9.27~dfsg/debian/patches/series 2019-04-20 17:09:53.000000000 +0900
@@ -1,3 +1,4 @@
+020190410~06c9207.patch
2001_docdir_fix_for_debian.patch
2002_gs_man_fix_debian.patch
2003_support_multiarch.patch
unblock ghostscript/9.27~dfsg-2
Reply to: