[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.
This commit is contained in:
parent
4058939cb1
commit
fa437d8d3c
23
ChangeLog
23
ChangeLog
@ -1,3 +1,26 @@
|
||||
2017-01-31 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
[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 <wl@gnu.org>
|
||||
|
||||
Add framework to support services with 9 functions.
|
||||
|
@ -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,
|
||||
|
@ -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 \
|
||||
|
@ -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" ));
|
||||
|
Loading…
Reference in New Issue
Block a user