freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master d718ac4 3/5: [truetype] Provide metrics variation ser


From: Werner LEMBERG
Subject: [freetype2] master d718ac4 3/5: [truetype] Provide metrics variation service.
Date: Wed, 11 Jan 2017 13:28:10 +0000 (UTC)

branch: master
commit d718ac4ead0d711bd73d8103ba67cca10a55b3d9
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [truetype] Provide metrics variation service.
    
    * include/freetype/internal/services/svmetric.h
    (FT_Metrics_Adjust_Func): Reduce number of necessary parameters.
    
    * src/truetype/ttgxvar.c: Include FT_LIST_H.
    (tt_size_reset_iterator): New auxiliary function for...
    (tt_apply_var): New function.
    
    * src/truetype/ttgxvar.h: Updated.
    
    * src/truetype/ttdriver.c (tt_service_metrics_variations): Add
    `tt_apply_mvar'.
    
    * include/freetype/internal/ftserv.h (FT_ServiceCache): Add metrics
    variation service.
---
 ChangeLog                                     |   19 +++++
 include/freetype/internal/ftserv.h            |    1 +
 include/freetype/internal/services/svmetric.h |    6 +-
 src/truetype/ttdriver.c                       |    2 +-
 src/truetype/ttgxvar.c                        |   97 +++++++++++++++++++++++++
 src/truetype/ttgxvar.h                        |    3 +
 6 files changed, 123 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f3bb28b..b196b5a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
 2017-01-11  Werner Lemberg  <address@hidden>
 
+       [truetype] Provide metrics variation service.
+
+       * include/freetype/internal/services/svmetric.h
+       (FT_Metrics_Adjust_Func): Reduce number of necessary parameters.
+
+       * src/truetype/ttgxvar.c: Include FT_LIST_H.
+       (tt_size_reset_iterator): New auxiliary function for...
+       (tt_apply_var): New function.
+
+       * src/truetype/ttgxvar.h: Updated.
+
+       * src/truetype/ttdriver.c (tt_service_metrics_variations): Add
+       `tt_apply_mvar'.
+
+       * include/freetype/internal/ftserv.h (FT_ServiceCache): Add metrics
+       variation service.
+
+2017-01-11  Werner Lemberg  <address@hidden>
+
        [truetype] Parse `MVAR' table.
 
        * src/truetype/ttgxvar.h (MVAR_TAG_XXX): New macros for MVAR tags.
diff --git a/include/freetype/internal/ftserv.h 
b/include/freetype/internal/ftserv.h
index ad71cb6..c84afba 100644
--- a/include/freetype/internal/ftserv.h
+++ b/include/freetype/internal/ftserv.h
@@ -714,6 +714,7 @@ FT_BEGIN_HEADER
   {
     FT_Pointer  service_POSTSCRIPT_FONT_NAME;
     FT_Pointer  service_MULTI_MASTERS;
+    FT_Pointer  service_METRICS_VARIATIONS;
     FT_Pointer  service_GLYPH_DICT;
     FT_Pointer  service_PFR_METRICS;
     FT_Pointer  service_WINFNT;
diff --git a/include/freetype/internal/services/svmetric.h 
b/include/freetype/internal/services/svmetric.h
index 8f2fb60..cac9bf8 100644
--- a/include/freetype/internal/services/svmetric.h
+++ b/include/freetype/internal/services/svmetric.h
@@ -74,10 +74,8 @@ FT_BEGIN_HEADER
 
   /* MVAR */
 
-  typedef FT_Error
-  (*FT_Metrics_Adjust_Func)( FT_Face   face,
-                             FT_ULong  tag,
-                             FT_Int   *avalue );
+  typedef void
+  (*FT_Metrics_Adjust_Func)( FT_Face  face );
 
 
   FT_DEFINE_SERVICE( MetricsVariations )
diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c
index 3cbff59..19f7858 100644
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -507,7 +507,7 @@
     (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
     (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
 
-    (FT_Metrics_Adjust_Func) NULL                    /* metrics_adjust  */
+    (FT_Metrics_Adjust_Func) tt_apply_mvar           /* metrics_adjust  */
   )
 
 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
index c89a1c9..0380335 100644
--- a/src/truetype/ttgxvar.c
+++ b/src/truetype/ttgxvar.c
@@ -50,6 +50,7 @@
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_MULTIPLE_MASTERS_H
+#include FT_LIST_H
 
 #include "ttpload.h"
 #include "ttgxvar.h"
@@ -1175,6 +1176,102 @@
   }
 
 
+  static FT_Error
+  tt_size_reset_iterator( FT_ListNode  node,
+                          void*        user )
+  {
+    TT_Size  size = (TT_Size)node->data;
+
+    FT_UNUSED( user );
+
+
+    tt_size_reset( size, 1 );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_apply_mvar                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply `MVAR' table adjustments.                                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_apply_mvar( TT_Face  face )
+  {
+    GX_Blend  blend = face->blend;
+    GX_Value  value, limit;
+
+
+    if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) )
+      return;
+
+    value = blend->mvar_table->values;
+    limit = value + blend->mvar_table->valueCount;
+
+    for ( ; value < limit; value++ )
+    {
+      FT_Short*  p = ft_var_get_value_pointer( face, value->tag );
+      FT_Int     delta;
+
+
+      delta = ft_var_get_item_delta( face,
+                                     &blend->mvar_table->itemStore,
+                                     value->outerIndex,
+                                     value->innerIndex );
+
+      FT_TRACE5(( "value %c%c%c%c (%d units) adjusted by %d units (MVAR)\n",
+                  (FT_Char)( value->tag >> 24 ),
+                  (FT_Char)( value->tag >> 16 ),
+                  (FT_Char)( value->tag >> 8 ),
+                  (FT_Char)( value->tag ),
+                  value->unmodified,
+                  delta ));
+
+      /* since we handle both signed and unsigned values as FT_Short, */
+      /* ensure proper overflow arithmetic                            */
+      *p = (FT_Short)( value->unmodified + (FT_Short)delta );
+    }
+
+    /* adjust all derived values */
+    {
+      FT_Face  root = &face->root;
+
+
+      if ( face->os2.version != 0xFFFFU )
+      {
+        if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+        {
+          root->ascender  = face->os2.sTypoAscender;
+          root->descender = face->os2.sTypoDescender;
+
+          root->height = root->ascender - root->descender +
+                         face->os2.sTypoLineGap;
+        }
+        else
+        {
+          root->ascender  =  (FT_Short)face->os2.usWinAscent;
+          root->descender = -(FT_Short)face->os2.usWinDescent;
+
+          root->height = root->ascender - root->descender;
+        }
+      }
+
+      /* iterate over all FT_Size objects and call `tt_size_reset' */
+      /* to propagate the metrics changes                          */
+      FT_List_Iterate( &root->sizes_list,
+                       tt_size_reset_iterator,
+                       NULL );
+    }
+  }
+
+
   typedef struct  GX_GVar_Head_
   {
     FT_Long    version;
diff --git a/src/truetype/ttgxvar.h b/src/truetype/ttgxvar.h
index a04b410..bbe240f 100644
--- a/src/truetype/ttgxvar.h
+++ b/src/truetype/ttgxvar.h
@@ -332,6 +332,9 @@ FT_BEGIN_HEADER
                       FT_UInt  gindex,
                       FT_Int  *adelta );
 
+  FT_LOCAL( void )
+  tt_apply_mvar( TT_Face  face );
+
   FT_LOCAL( FT_Error )
   tt_get_var_blend( TT_Face      face,
                     FT_UInt     *num_coords,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]