Have one more patch on top of the previous two. It turns TT_LOADER_SET_PP into a function and properly supports the subpixel hinting modes.
>From f98061a004c14b1039c2614a1a1161ee8da91560 Mon Sep 17 00:00:00 2001
From: Nikolaus Waxweiler <madig...@gmail.com>
Date: Sun, 1 May 2016 19:00:10 +0200
Subject: [PATCH] Turn TT_LOADER_SET_PP macro into function, support subpixel
 hinting.

---
 src/truetype/ttgload.c | 89 +++++++++++++++++++++++++-------------------------
 1 file changed, 45 insertions(+), 44 deletions(-)

diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index 517b5aa..4e8c0f1 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -1335,50 +1335,51 @@
    * (3) for everything else.
    *
    */
-   /* XXX merge infinality + lean datafields? */
+   static void
+   tt_loader_set_pp( TT_Loader loader )
+   {
+     FT_Bool  subpixel_hinting = 0;
+     FT_Bool  grayscale        = 0;
+     FT_Bool  use_aw_2         = 0;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+     TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face );
+#endif
+
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+     if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+     {
+       subpixel_hinting = loader->exec
+                            ? loader->exec->subpixel_hinting
+                            : 0;
+       grayscale        = loader->exec
+                            ? loader->exec->grayscale
+                            : 0;
+     }
+#endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+     if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+     {
+       subpixel_hinting = loader->exec
+                            ? loader->exec->subpixel_hinting_lean
+                            : 0;
+       grayscale         = loader->exec
+                            ? loader->exec->grayscale_cleartype
+                            : 0;
+     }
+#endif
+
+     use_aw_2 = (FT_Bool)( subpixel_hinting && grayscale );
+
+     loader->pp1.x = loader->bbox.xMin - loader->left_bearing;
+     loader->pp1.y = 0;
+     loader->pp2.x = loader->pp1.x + loader->advance;
+     loader->pp2.y = 0;
 
-#define TT_LOADER_SET_PP( loader )                                          \
-          do                                                                \
-          {                                                                 \
-            FT_Bool  subpixel_hinting_ = loader->exec                       \
-                                           ? loader->exec->subpixel_hinting \
-                                           : 0;                             \
-            FT_Bool  grayscale_        = loader->exec                       \
-                                           ? loader->exec->grayscale        \
-                                           : 0;                             \
-            FT_Bool  use_aw_2_         = (FT_Bool)( subpixel_hinting_ &&    \
-                                                    grayscale_        );    \
-                                                                            \
-                                                                            \
-            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
-            (loader)->pp1.y = 0;                                            \
-            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
-            (loader)->pp2.y = 0;                                            \
-                                                                            \
-            (loader)->pp3.x = use_aw_2_ ? (loader)->advance / 2 : 0;        \
-            (loader)->pp3.y = (loader)->bbox.yMax + (loader)->top_bearing;  \
-            (loader)->pp4.x = use_aw_2_ ? (loader)->advance / 2 : 0;        \
-            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
-          } while ( 0 )
-
-#else /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-#define TT_LOADER_SET_PP( loader )                                          \
-          do                                                                \
-          {                                                                 \
-            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
-            (loader)->pp1.y = 0;                                            \
-            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
-            (loader)->pp2.y = 0;                                            \
-                                                                            \
-            (loader)->pp3.x = 0;                                            \
-            (loader)->pp3.y = (loader)->bbox.yMax + (loader)->top_bearing;  \
-            (loader)->pp4.x = 0;                                            \
-            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
-          } while ( 0 )
-
-#endif /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+     loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0;
+     loader->pp3.y = loader->bbox.yMax + loader->top_bearing;
+     loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0;
+     loader->pp4.y = loader->pp3.y - loader->vadvance;
+   }
 
 
   /*************************************************************************/
@@ -1536,7 +1537,7 @@
 
       /* must initialize points before (possibly) overriding */
       /* glyph metrics from the incremental interface        */
-      TT_LOADER_SET_PP( loader );
+      tt_loader_set_pp( loader );
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
       tt_get_metrics_incr_overrides( loader, glyph_index );
@@ -1611,7 +1612,7 @@
 
     /* must initialize phantom points before (possibly) overriding */
     /* glyph metrics from the incremental interface                */
-    TT_LOADER_SET_PP( loader );
+    tt_loader_set_pp( loader );
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     tt_get_metrics_incr_overrides( loader, glyph_index );
-- 
2.5.5

_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to