use-FT_Done_MM_Var-in-CFX_Font-AdjustMMParams.patch 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. From ffeb67faf715475f6e463d65c368f556780adf19 Mon Sep 17 00:00:00 2001
  2. From: Lei Zhang <thestig@chromium.org>
  3. Date: Mon, 31 Jan 2022 22:42:35 +0000
  4. Subject: [PATCH] Use FT_Done_MM_Var() in CFX_Font::AdjustMMParams() when
  5. possible.
  6. When FreeType has FT_Done_MM_Var(), use that to free memory in
  7. CFX_Font::AdjustMMParams() to avoid mismatched alloc/free functions.
  8. Bug: pdfium:1400
  9. Change-Id: I044540893103921fc64cdd53fcd628cfebf2c9db
  10. Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/90130
  11. Reviewed-by: Nigi <nigi@chromium.org>
  12. Commit-Queue: Lei Zhang <thestig@chromium.org>
  13. ---
  14. core/fxge/cfx_font.cpp | 28 ++++++++++++++++++++++++++--
  15. 1 file changed, 26 insertions(+), 2 deletions(-)
  16. diff --git a/core/fxge/cfx_font.cpp b/core/fxge/cfx_font.cpp
  17. index c08fe9608..8b3a72700 100644
  18. --- a/core/fxge/cfx_font.cpp
  19. +++ b/core/fxge/cfx_font.cpp
  20. @@ -44,6 +44,30 @@ struct OUTLINE_PARAMS {
  21. float m_CoordUnit;
  22. };
  23. +// TODO(crbug.com/pdfium/1400): When FT_Done_MM_Var() is more likely to be
  24. +// available to all users in the future, remove FreeMMVar() and use
  25. +// FT_Done_MM_Var() directly.
  26. +//
  27. +// Use weak symbols to check if FT_Done_MM_Var() is available at runtime.
  28. +#if !BUILDFLAG(IS_WIN)
  29. +extern "C" __attribute__((weak)) decltype(FT_Done_MM_Var) FT_Done_MM_Var;
  30. +#endif
  31. +
  32. +void FreeMMVar(FXFT_FaceRec* rec, FXFT_MM_VarPtr variation_desc) {
  33. +#if BUILDFLAG(IS_WIN)
  34. + // Assume `use_system_freetype` GN var is never set on Windows.
  35. + constexpr bool has_ft_done_mm_var_func = true;
  36. +#else
  37. + static const bool has_ft_done_mm_var_func = !!FT_Done_MM_Var;
  38. +#endif
  39. + if (has_ft_done_mm_var_func) {
  40. + FT_Done_MM_Var(CFX_GEModule::Get()->GetFontMgr()->GetFTLibrary(),
  41. + variation_desc);
  42. + } else {
  43. + FXFT_Free(rec, variation_desc);
  44. + }
  45. +}
  46. +
  47. FX_RECT FXRectFromFTPos(FT_Pos left, FT_Pos top, FT_Pos right, FT_Pos bottom) {
  48. return FX_RECT(pdfium::base::checked_cast<int32_t>(left),
  49. pdfium::base::checked_cast<int32_t>(top),
  50. @@ -645,7 +669,7 @@ void CFX_Font::AdjustMMParams(int glyph_index,
  51. FT_Pos max_width = FXFT_Get_Glyph_HoriAdvance(m_Face->GetRec()) * 1000 /
  52. FXFT_Get_Face_UnitsPerEM(m_Face->GetRec());
  53. if (max_width == min_width) {
  54. - FXFT_Free(m_Face->GetRec(), pMasters);
  55. + FreeMMVar(m_Face->GetRec(), pMasters);
  56. return;
  57. }
  58. FT_Pos param = min_param + (max_param - min_param) *
  59. @@ -653,7 +677,7 @@ void CFX_Font::AdjustMMParams(int glyph_index,
  60. (max_width - min_width);
  61. coords[1] = param;
  62. }
  63. - FXFT_Free(m_Face->GetRec(), pMasters);
  64. + FreeMMVar(m_Face->GetRec(), pMasters);
  65. FT_Set_MM_Design_Coordinates(m_Face->GetRec(), 2, coords);
  66. }