Index: src/cff/cffdrivr.c |
diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c |
index eb4c14ee5d3578570b41d2e0beb2155d6d825862..c8ca96ba49541f3474c4d3278086c69d441ca92e 100644 |
--- a/src/cff/cffdrivr.c |
+++ b/src/cff/cffdrivr.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* OpenType font driver implementation (body). */ |
/* */ |
-/* Copyright 1996-2012 by */ |
+/* Copyright 1996-2013 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -37,6 +37,8 @@ |
#include FT_SERVICE_XFREE86_NAME_H |
#include FT_SERVICE_GLYPH_DICT_H |
+#include FT_SERVICE_PROPERTIES_H |
+#include FT_CFF_DRIVER_H |
/*************************************************************************/ |
@@ -115,7 +117,7 @@ |
if ( sfnt ) |
kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); |
- return CFF_Err_Ok; |
+ return FT_Err_Ok; |
} |
@@ -160,7 +162,7 @@ |
if ( !slot ) |
- return CFF_Err_Invalid_Slot_Handle; |
+ return FT_THROW( Invalid_Slot_Handle ); |
/* check whether we want a scaled outline or bitmap */ |
if ( !size ) |
@@ -174,7 +176,7 @@ |
{ |
/* these two objects must have the same parent */ |
if ( cffsize->face != cffslot->face ) |
- return CFF_Err_Invalid_Face_Handle; |
+ return FT_THROW( Invalid_Face_Handle ); |
} |
/* now load the glyph outline if necessary */ |
@@ -195,7 +197,7 @@ |
FT_Fixed* advances ) |
{ |
FT_UInt nn; |
- FT_Error error = CFF_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
FT_GlyphSlot slot = face->glyph; |
@@ -239,7 +241,7 @@ |
" cannot get glyph name from CFF & CEF fonts\n" |
" " |
" without the `PSNames' module\n" )); |
- error = CFF_Err_Missing_Module; |
+ error = FT_THROW( Missing_Module ); |
goto Exit; |
} |
@@ -252,7 +254,7 @@ |
if ( gname ) |
FT_STRCPYN( buffer, gname, buffer_max ); |
- error = CFF_Err_Ok; |
+ error = FT_Err_Ok; |
Exit: |
return error; |
@@ -298,7 +300,8 @@ |
} |
- FT_DEFINE_SERVICE_GLYPHDICTREC(cff_service_glyph_dict, |
+ FT_DEFINE_SERVICE_GLYPHDICTREC( |
+ cff_service_glyph_dict, |
(FT_GlyphDict_GetNameFunc) cff_get_glyph_name, |
(FT_GlyphDict_NameIndexFunc)cff_get_name_index |
) |
@@ -321,7 +324,7 @@ |
PS_FontInfoRec* afont_info ) |
{ |
CFF_Font cff = (CFF_Font)face->extra.data; |
- FT_Error error = CFF_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
if ( cff && cff->font_info == NULL ) |
@@ -360,7 +363,8 @@ |
} |
- FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, |
+ FT_DEFINE_SERVICE_PSINFOREC( |
+ cff_service_ps_info, |
(PS_GetFontInfoFunc) cff_ps_get_font_info, |
(PS_GetFontExtraFunc) NULL, |
(PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, |
@@ -384,7 +388,8 @@ |
} |
- FT_DEFINE_SERVICE_PSFONTNAMEREC(cff_service_ps_name, |
+ FT_DEFINE_SERVICE_PSFONTNAMEREC( |
+ cff_service_ps_name, |
(FT_PsName_GetFunc)cff_get_ps_name |
) |
@@ -404,16 +409,17 @@ |
TT_CMapInfo *cmap_info ) |
{ |
FT_CMap cmap = FT_CMAP( charmap ); |
- FT_Error error = CFF_Err_Ok; |
- FT_Face face = FT_CMAP_FACE( cmap ); |
- FT_Library library = FT_FACE_LIBRARY( face ); |
+ FT_Error error = FT_Err_Ok; |
+ |
+ FT_Face face = FT_CMAP_FACE( cmap ); |
+ FT_Library library = FT_FACE_LIBRARY( face ); |
cmap_info->language = 0; |
cmap_info->format = 0; |
- if ( cmap->clazz != &FT_CFF_CMAP_ENCODING_CLASS_REC_GET && |
- cmap->clazz != &FT_CFF_CMAP_UNICODE_CLASS_REC_GET ) |
+ if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET && |
+ cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET ) |
{ |
FT_Module sfnt = FT_Get_Module( library, "sfnt" ); |
FT_Service_TTCMaps service = |
@@ -429,7 +435,8 @@ |
} |
- FT_DEFINE_SERVICE_TTCMAPSREC(cff_service_get_cmap_info, |
+ FT_DEFINE_SERVICE_TTCMAPSREC( |
+ cff_service_get_cmap_info, |
(TT_CMap_Info_GetFunc)cff_get_cmap_info |
) |
@@ -444,7 +451,7 @@ |
const char* *ordering, |
FT_Int *supplement ) |
{ |
- FT_Error error = CFF_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
CFF_Font cff = (CFF_Font)face->extra.data; |
@@ -455,7 +462,7 @@ |
if ( dict->cid_registry == 0xFFFFU ) |
{ |
- error = CFF_Err_Invalid_Argument; |
+ error = FT_THROW( Invalid_Argument ); |
goto Fail; |
} |
@@ -499,7 +506,7 @@ |
cff_get_is_cid( CFF_Face face, |
FT_Bool *is_cid ) |
{ |
- FT_Error error = CFF_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
CFF_Font cff = (CFF_Font)face->extra.data; |
@@ -523,7 +530,7 @@ |
FT_UInt glyph_index, |
FT_UInt *cid ) |
{ |
- FT_Error error = CFF_Err_Ok; |
+ FT_Error error = FT_Err_Ok; |
CFF_Font cff; |
@@ -537,13 +544,13 @@ |
if ( dict->cid_registry == 0xFFFFU ) |
{ |
- error = CFF_Err_Invalid_Argument; |
+ error = FT_THROW( Invalid_Argument ); |
goto Fail; |
} |
if ( glyph_index > cff->num_glyphs ) |
{ |
- error = CFF_Err_Invalid_Argument; |
+ error = FT_THROW( Invalid_Argument ); |
goto Fail; |
} |
@@ -558,13 +565,100 @@ |
} |
- FT_DEFINE_SERVICE_CIDREC(cff_service_cid_info, |
+ FT_DEFINE_SERVICE_CIDREC( |
+ cff_service_cid_info, |
(FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, |
(FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, |
(FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index |
) |
+ /* |
+ * PROPERTY SERVICE |
+ * |
+ */ |
+ static FT_Error |
+ cff_property_set( FT_Module module, /* CFF_Driver */ |
+ const char* property_name, |
+ const void* value ) |
+ { |
+ FT_Error error = FT_Err_Ok; |
+ CFF_Driver driver = (CFF_Driver)module; |
+ |
+ |
+ if ( !ft_strcmp( property_name, "hinting-engine" ) ) |
+ { |
+ FT_UInt* hinting_engine = (FT_UInt*)value; |
+ |
+ |
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE |
+ if ( *hinting_engine != FT_CFF_HINTING_ADOBE ) |
+ error = FT_ERR( Unimplemented_Feature ); |
+ else |
+#endif |
+ driver->hinting_engine = *hinting_engine; |
+ |
+ return error; |
+ } |
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) |
+ { |
+ FT_Bool* no_stem_darkening = (FT_Bool*)value; |
+ |
+ |
+ driver->no_stem_darkening = *no_stem_darkening; |
+ |
+ return error; |
+ } |
+ |
+ FT_TRACE0(( "cff_property_set: missing property `%s'\n", |
+ property_name )); |
+ return FT_THROW( Missing_Property ); |
+ } |
+ |
+ |
+ static FT_Error |
+ cff_property_get( FT_Module module, /* CFF_Driver */ |
+ const char* property_name, |
+ const void* value ) |
+ { |
+ FT_Error error = FT_Err_Ok; |
+ CFF_Driver driver = (CFF_Driver)module; |
+ |
+ FT_UInt hinting_engine = driver->hinting_engine; |
+ FT_Bool no_stem_darkening = driver->no_stem_darkening; |
+ |
+ |
+ if ( !ft_strcmp( property_name, "hinting-engine" ) ) |
+ { |
+ FT_UInt* val = (FT_UInt*)value; |
+ |
+ |
+ *val = hinting_engine; |
+ |
+ return error; |
+ } |
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) |
+ { |
+ FT_Bool* val = (FT_Bool*)value; |
+ |
+ |
+ *val = no_stem_darkening; |
+ |
+ return error; |
+ } |
+ |
+ FT_TRACE0(( "cff_property_get: missing property `%s'\n", |
+ property_name )); |
+ return FT_THROW( Missing_Property ); |
+ } |
+ |
+ |
+ FT_DEFINE_SERVICE_PROPERTIESREC( |
+ cff_service_properties, |
+ (FT_Properties_SetFunc)cff_property_set, |
+ (FT_Properties_GetFunc)cff_property_get ) |
+ |
+ |
/*************************************************************************/ |
/*************************************************************************/ |
/*************************************************************************/ |
@@ -576,25 +670,31 @@ |
/*************************************************************************/ |
/*************************************************************************/ |
/*************************************************************************/ |
+ |
#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES |
- FT_DEFINE_SERVICEDESCREC6(cff_services, |
+ FT_DEFINE_SERVICEDESCREC7( |
+ cff_services, |
FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, |
- FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, |
- FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, |
- FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET, |
- FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, |
- FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_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, |
+ FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, |
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, |
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET |
) |
#else |
- FT_DEFINE_SERVICEDESCREC5(cff_services, |
+ FT_DEFINE_SERVICEDESCREC6( |
+ cff_services, |
FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, |
- FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, |
- FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, |
- FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, |
- FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_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, |
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, |
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET |
) |
#endif |
+ |
FT_CALLBACK_DEF( FT_Module_Interface ) |
cff_get_interface( FT_Module driver, /* CFF_Driver */ |
const char* module_interface ) |
@@ -604,7 +704,7 @@ |
FT_Module_Interface result; |
- /* FT_CFF_SERVICES_GET derefers `library' in PIC mode */ |
+ /* CFF_SERVICES_GET derefers `library' in PIC mode */ |
#ifdef FT_CONFIG_OPTION_PIC |
if ( !driver ) |
return NULL; |
@@ -613,7 +713,7 @@ |
return NULL; |
#endif |
- result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); |
+ result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface ); |
if ( result != NULL ) |
return result; |
@@ -641,7 +741,8 @@ |
#define CFF_SIZE_SELECT 0 |
#endif |
- FT_DEFINE_DRIVER( cff_driver_class, |
+ FT_DEFINE_DRIVER( |
+ cff_driver_class, |
FT_MODULE_FONT_DRIVER | |
FT_MODULE_DRIVER_SCALABLE | |
@@ -670,9 +771,6 @@ |
cff_slot_init, |
cff_slot_done, |
- ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ |
- ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ |
- |
cff_glyph_load, |
cff_get_kerning, |