Mageia Bugzilla – Attachment 11250 Details for
Bug 24866
klatexformula produces images that do not fit onto display window of klatexformula
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
New Account
|
Forgot Password
[patch]
Patch included in Debian ghostscript-9.27~dfsg-2 to fix this problem
020190410~06c9207.patch (text/plain), 3.51 KB, created by
w unruh
on 2019-08-13 00:19:53 CEST
(
hide
)
Description:
Patch included in Debian ghostscript-9.27~dfsg-2 to fix this problem
Filename:
MIME Type:
Creator:
w unruh
Created:
2019-08-13 00:19:53 CEST
Size:
3.51 KB
patch
obsolete
>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);
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);
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 24866
:
11024
| 11250