freetype-commit
[Top][All Lists]
Advanced

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

[freetype2] master fa437d8 3/3: [cff] Provide metrics variation service


From: Werner LEMBERG
Subject: [freetype2] master fa437d8 3/3: [cff] Provide metrics variation service interface (#50196).
Date: Tue, 31 Jan 2017 22:11:39 +0000 (UTC)

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

    [cff] Provide metrics variation service interface (#50196).
    
    Only now I've got an OTF with an HVAR table for testing...
    
    The code in `ftmm.c' uses `FT_FACE_LOOKUP_SERVICE' to get the
    metrics variations interface.  However, this didn't work with
    `FT_FACE_FIND_GLOBAL_SERVICE' used in `sfnt_init_face'.
    
    * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
    (cff_hadvance_adjust, cff_metrics_adjust): Wrapper functions for
    metric service functions from the `truetype' module.
    (cff_service_metrics_variations): New service.
    (cff_services): Updated.
    
    * src/cff/cffpic.h (CFF_SERVICE_METRICS_VAR_GET): New macro.
    [FT_CONFIG_OPTION_PIC]: Synchronize code.
    
    * src/sfnt/sfobjs.c (sfnt_init_face): Replace call to
    FT_FACE_FIND_GLOBAL_SERVICE with `ft_module_get_service' to always
    load the service from the `truetype' module.
---
 ChangeLog          |   23 +++++++++++++++++++++++
 src/cff/cffdrivr.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 src/cff/cffpic.h   |   29 +++++++++++++++++++----------
 src/sfnt/sfobjs.c  |   12 +++++++++++-
 4 files changed, 101 insertions(+), 13 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9402b18..5a0585a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,28 @@
 2017-01-31  Werner Lemberg  <address@hidden>
 
+       [cff] Provide metrics variation service interface (#50196).
+
+       Only now I've got an OTF with an HVAR table for testing...
+
+       The code in `ftmm.c' uses `FT_FACE_LOOKUP_SERVICE' to get the
+       metrics variations interface.  However, this didn't work with
+       `FT_FACE_FIND_GLOBAL_SERVICE' used in `sfnt_init_face'.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (cff_hadvance_adjust, cff_metrics_adjust): Wrapper functions for
+       metric service functions from the `truetype' module.
+       (cff_service_metrics_variations): New service.
+       (cff_services): Updated.
+
+       * src/cff/cffpic.h (CFF_SERVICE_METRICS_VAR_GET): New macro.
+       [FT_CONFIG_OPTION_PIC]: Synchronize code.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Replace call to
+       FT_FACE_FIND_GLOBAL_SERVICE with `ft_module_get_service' to always
+       load the service from the `truetype' module.
+
+2017-01-31  Werner Lemberg  <address@hidden>
+
        Add framework to support services with 9 functions.
 
        * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC9):
diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c
index 467b3ed..cbafd7e 100644
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -34,6 +34,7 @@
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 #endif
 
 #include "cfferrs.h"
@@ -1018,6 +1019,49 @@
     (FT_Get_Var_Blend_Func) cff_get_var_blend,      /* get_var_blend  */
     (FT_Done_Blend_Func)    cff_done_blend          /* done_blend     */
   )
+
+
+  /*
+   *  METRICS VARIATIONS SERVICE
+   *
+   */
+
+  static FT_Error
+  cff_hadvance_adjust( CFF_Face  face,
+                       FT_UInt   gindex,
+                       FT_Int   *avalue )
+  {
+    FT_Service_MetricsVariations  var = 
(FT_Service_MetricsVariations)face->var;
+
+
+    return var->hadvance_adjust( FT_FACE( face ), gindex, avalue );
+  }
+
+
+  static void
+  cff_metrics_adjust( CFF_Face  face )
+  {
+    FT_Service_MetricsVariations  var = 
(FT_Service_MetricsVariations)face->var;
+
+
+    var->metrics_adjust( FT_FACE( face ) );
+  }
+
+
+  FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
+    cff_service_metrics_variations,
+
+    (FT_HAdvance_Adjust_Func)cff_hadvance_adjust,    /* hadvance_adjust */
+    (FT_LSB_Adjust_Func)     NULL,                   /* lsb_adjust      */
+    (FT_RSB_Adjust_Func)     NULL,                   /* rsb_adjust      */
+
+    (FT_VAdvance_Adjust_Func)NULL,                   /* vadvance_adjust */
+    (FT_TSB_Adjust_Func)     NULL,                   /* tsb_adjust      */
+    (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
+    (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
+
+    (FT_Metrics_Adjust_Func) cff_metrics_adjust      /* metrics_adjust  */
+  )
 #endif
 
 
@@ -1035,11 +1079,12 @@
 
 #if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \
      defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC8(
+  FT_DEFINE_SERVICEDESCREC9(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_METRICS_VARIATIONS,   &CFF_SERVICE_METRICS_VAR_GET,
     FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
@@ -1060,11 +1105,12 @@
     FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
   )
 #elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC7(
+  FT_DEFINE_SERVICEDESCREC8(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_METRICS_VARIATIONS,   &CFF_SERVICE_METRICS_VAR_GET,
     FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
diff --git a/src/cff/cffpic.h b/src/cff/cffpic.h
index 0b89fcb..1d36323 100644
--- a/src/cff/cffpic.h
+++ b/src/cff/cffpic.h
@@ -33,6 +33,7 @@
 #define CFF_SERVICE_PROPERTIES_GET       cff_service_properties
 #define CFF_SERVICES_GET                 cff_services
 #define CFF_SERVICE_MULTI_MASTERS_GET    cff_service_multi_masters
+#define CFF_SERVICE_METRICS_VAR_GET      cff_service_metrics_variations
 #define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec
 #define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec
 #define CFF_FIELD_HANDLERS_GET           cff_field_handlers
@@ -46,22 +47,26 @@
 #include FT_SERVICE_TT_CMAP_H
 #include FT_SERVICE_CID_H
 #include FT_SERVICE_PROPERTIES_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 
 
 FT_BEGIN_HEADER
 
   typedef struct  CffModulePIC_
   {
-    FT_ServiceDescRec*        cff_services;
-    CFF_Field_Handler*        cff_field_handlers;
-    FT_Service_PsInfoRec      cff_service_ps_info;
-    FT_Service_GlyphDictRec   cff_service_glyph_dict;
-    FT_Service_PsFontNameRec  cff_service_ps_name;
-    FT_Service_TTCMapsRec     cff_service_get_cmap_info;
-    FT_Service_CIDRec         cff_service_cid_info;
-    FT_Service_PropertiesRec  cff_service_properties;
-    FT_CMap_ClassRec          cff_cmap_encoding_class_rec;
-    FT_CMap_ClassRec          cff_cmap_unicode_class_rec;
+    FT_ServiceDescRec*               cff_services;
+    CFF_Field_Handler*               cff_field_handlers;
+    FT_Service_PsInfoRec             cff_service_ps_info;
+    FT_Service_GlyphDictRec          cff_service_glyph_dict;
+    FT_Service_PsFontNameRec         cff_service_ps_name;
+    FT_Service_TTCMapsRec            cff_service_get_cmap_info;
+    FT_Service_CIDRec                cff_service_cid_info;
+    FT_Service_PropertiesRec         cff_service_properties;
+    FT_Service_MultiMastersRec       cff_service_multiple_masters;
+    FT_Service_MetricsVariationsRec  cff_service_metrics_variations;
+    FT_CMap_ClassRec                 cff_cmap_encoding_class_rec;
+    FT_CMap_ClassRec                 cff_cmap_unicode_class_rec;
 
   } CffModulePIC;
 
@@ -83,6 +88,10 @@ FT_BEGIN_HEADER
           ( GET_PIC( library )->cff_service_properties )
 #define CFF_SERVICES_GET                       \
           ( GET_PIC( library )->cff_services )
+#define CFF_SERVICE_MULTI_MASTERS_GET                       \
+          ( GET_PIC( library )->cff_service_multi_masters )
+#define CFF_SERVICE_METRICS_VAR_GET                              \
+          ( GET_PIC( library )->cff_service_metrics_variations )
 #define CFF_CMAP_ENCODING_CLASS_REC_GET                       \
           ( GET_PIC( library )->cff_cmap_encoding_class_rec )
 #define CFF_CMAP_UNICODE_CLASS_REC_GET                       \
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
index 0854ea0..67e868c 100644
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -894,7 +894,17 @@
                                         0 );
     }
 
-    FT_FACE_FIND_GLOBAL_SERVICE( face, face->var, METRICS_VARIATIONS );
+    if ( !face->var )
+    {
+      /* we want the metrics variations interface */
+      /* from the `truetype' module only          */
+      FT_Module  tt_module = FT_Get_Module( library, "truetype" );
+
+
+      face->var = ft_module_get_service( tt_module,
+                                         FT_SERVICE_ID_METRICS_VARIATIONS,
+                                         0 );
+    }
 #endif
 
     FT_TRACE2(( "SFNT driver\n" ));



reply via email to

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