38#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
58#define FT_COMPONENT cffdriver
110 FT_CALLBACK_DEF( FT_Error )
111 cff_get_kerning( FT_Face face,
116 CFF_Face cffface = (CFF_Face)face;
117 SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
127 if ( cffface->kern_avail_bits )
128 kerning->x = sfnt->get_kerning( cffface,
131#ifdef TT_CONFIG_OPTION_GPOS_KERNING
132 else if ( cffface->num_gpos_lookups_kerning )
133 kerning->x = sfnt->get_gpos_kerning( cffface,
173 FT_CALLBACK_DEF( FT_Error )
174 cff_glyph_load( FT_GlyphSlot slot,
177 FT_Int32 load_flags )
180 CFF_GlyphSlot cffslot = (CFF_GlyphSlot)slot;
181 CFF_Size cffsize = (CFF_Size)size;
184 FT_TRACE1((
"cff_glyph_load: glyph index %u\n", glyph_index ));
187 error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags );
196 FT_CALLBACK_DEF( FT_Error )
197 cff_get_advances( FT_Face face,
203 CFF_Face cffface = (CFF_Face)face;
208 if ( !FT_IS_SFNT( face ) )
209 return FT_THROW( Unimplemented_Feature );
211 horz = !( flags & FT_LOAD_VERTICAL_LAYOUT );
218 if ( !cffface->horizontal.number_Of_HMetrics )
219 return FT_THROW( Unimplemented_Feature );
221#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
223 if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
224 !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
225 return FT_THROW( Unimplemented_Feature );
234 if ( !cffface->vertical_info )
235 return FT_THROW( Unimplemented_Feature );
237#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
239 if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
240 !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
241 return FT_THROW( Unimplemented_Feature );
246 for ( nn = 0; nn < count; nn++ )
252 ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface,
258 FT_TRACE5((
" idx %u: advance %s %d font unit%s\n",
260 horz ?
"width" :
"height",
262 aw == 1 ?
"" :
"s" ));
275 FT_CALLBACK_DEF( FT_Error )
276 cff_get_glyph_name( FT_Face face,
281 CFF_Face cffface = (CFF_Face)face;
282 CFF_Font font = (CFF_Font)cffface->extra.data;
290 if ( font->version_major == 2 )
292 FT_Library library = FT_FACE_LIBRARY( face );
293 FT_Module sfnt_module = FT_Get_Module( library,
"sfnt" );
294 FT_Service_GlyphDict service =
295 (FT_Service_GlyphDict)ft_module_get_service(
297 FT_SERVICE_ID_GLYPH_DICT,
301 if ( service && service->get_name )
302 return service->get_name( face, glyph_index, buffer, buffer_max );
305 FT_ERROR((
"cff_get_glyph_name:"
306 " cannot get glyph name from a CFF2 font\n" ));
308 " without the `psnames' module\n" ));
309 error = FT_THROW( Missing_Module );
314 if ( !font->psnames )
316 FT_ERROR((
"cff_get_glyph_name:"
317 " cannot get glyph name from CFF & CEF fonts\n" ));
319 " without the `psnames' module\n" ));
320 error = FT_THROW( Missing_Module );
325 sid = font->charset.sids[glyph_index];
328 gname = cff_index_get_sid_string( font, sid );
331 FT_STRCPYN( buffer, gname, buffer_max );
340 FT_CALLBACK_DEF( FT_UInt )
341 cff_get_name_index( FT_Face face,
342 const FT_String* glyph_name )
344 CFF_Face cffface = (CFF_Face)face;
345 CFF_Font cff = (CFF_Font)cffface->extra.data;
346 CFF_Charset charset = &cff->charset;
347 FT_Service_PsCMaps psnames;
355 if ( cff->version_major == 2 )
357 FT_Library library = FT_FACE_LIBRARY( face );
358 FT_Module sfnt_module = FT_Get_Module( library,
"sfnt" );
359 FT_Service_GlyphDict service =
360 (FT_Service_GlyphDict)ft_module_get_service(
362 FT_SERVICE_ID_GLYPH_DICT,
366 if ( service && service->name_index )
367 return service->name_index( face, glyph_name );
370 FT_ERROR((
"cff_get_name_index:"
371 " cannot get glyph index from a CFF2 font\n" ));
373 " without the `psnames' module\n" ));
378 FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
382 for ( i = 0; i < cff->num_glyphs; i++ )
384 sid = charset->sids[i];
387 name = cff_index_get_string( cff, sid - 391 );
389 name = (FT_String *)psnames->adobe_std_strings( sid );
394 if ( !ft_strcmp( glyph_name, name ) )
402 FT_DEFINE_SERVICE_GLYPHDICTREC(
403 cff_service_glyph_dict,
415 FT_CALLBACK_DEF( FT_Int )
416 cff_ps_has_glyph_names( FT_Face face )
418 return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
422 FT_CALLBACK_DEF( FT_Error )
423 cff_ps_get_font_info( FT_Face face,
424 PS_FontInfoRec* afont_info )
426 CFF_Face cffface = (CFF_Face)face;
427 CFF_Font cff = (CFF_Font)cffface->extra.data;
428 FT_Error error = FT_Err_Ok;
431 if ( cffface->is_cff2 )
433 error = FT_THROW( Invalid_Argument );
437 if ( cff && !cff->font_info )
439 CFF_FontRecDict dict = &cff->top_font.font_dict;
440 FT_Memory memory = FT_FACE_MEMORY( face );
441 PS_FontInfoRec* font_info = NULL;
444 if ( FT_QNEW( font_info ) )
447 font_info->version = cff_index_get_sid_string( cff,
449 font_info->notice = cff_index_get_sid_string( cff,
451 font_info->full_name = cff_index_get_sid_string( cff,
453 font_info->family_name = cff_index_get_sid_string( cff,
455 font_info->weight = cff_index_get_sid_string( cff,
457 font_info->italic_angle = dict->italic_angle;
458 font_info->is_fixed_pitch = dict->is_fixed_pitch;
459 font_info->underline_position = (FT_Short)dict->underline_position;
460 font_info->underline_thickness = (FT_UShort)dict->underline_thickness;
462 cff->font_info = font_info;
466 *afont_info = *cff->font_info;
473 FT_CALLBACK_DEF( FT_Error )
474 cff_ps_get_font_extra( FT_Face face,
475 PS_FontExtraRec* afont_extra )
477 CFF_Face cffface = (CFF_Face)face;
478 CFF_Font cff = (CFF_Font)cffface->extra.data;
479 FT_Error error = FT_Err_Ok;
482 if ( cff && !cff->font_extra )
484 CFF_FontRecDict dict = &cff->top_font.font_dict;
485 FT_Memory memory = FT_FACE_MEMORY( face );
486 PS_FontExtraRec* font_extra = NULL;
487 FT_String* embedded_postscript;
490 if ( FT_QNEW( font_extra ) )
493 font_extra->fs_type = 0U;
495 embedded_postscript = cff_index_get_sid_string(
497 dict->embedded_postscript );
498 if ( embedded_postscript )
500 FT_String* start_fstype;
501 FT_String* start_def;
505 if ( ( start_fstype = ft_strstr( embedded_postscript,
506 "/FSType" ) ) != NULL &&
507 ( start_def = ft_strstr( start_fstype +
508 sizeof (
"/FSType" ) - 1,
514 for ( s = start_fstype +
sizeof (
"/FSType" ) - 1;
518 if ( *s >=
'0' && *s <=
'9' )
520 if ( font_extra->fs_type >= ( FT_USHORT_MAX - 9 ) / 10 )
523 font_extra->fs_type = 0U;
527 font_extra->fs_type *= 10;
528 font_extra->fs_type += (FT_UShort)( *s -
'0' );
530 else if ( *s !=
' ' && *s !=
'\n' && *s !=
'\r' )
534 font_extra->fs_type = 0U;
541 cff->font_extra = font_extra;
545 *afont_extra = *cff->font_extra;
552 FT_DEFINE_SERVICE_PSINFOREC(
555 cff_ps_get_font_info,
556 cff_ps_get_font_extra,
557 cff_ps_has_glyph_names,
570 FT_CALLBACK_DEF(
const char* )
571 cff_get_ps_name( FT_Face face )
573 CFF_Face cffface = (CFF_Face)face;
574 CFF_Font cff = (CFF_Font)cffface->extra.data;
575 SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
581 if ( FT_IS_SFNT( face ) && sfnt )
583 FT_Library library = FT_FACE_LIBRARY( face );
584 FT_Module sfnt_module = FT_Get_Module( library,
"sfnt" );
585 FT_Service_PsFontName service =
586 (FT_Service_PsFontName)ft_module_get_service(
588 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME,
592 if ( service && service->get_ps_font_name )
593 return service->get_ps_font_name( face );
596 return cff ? (
const char*)cff->font_name : NULL;
600 FT_DEFINE_SERVICE_PSFONTNAMEREC(
617 FT_CALLBACK_DEF( FT_Error )
618 cff_get_cmap_info( FT_CharMap charmap,
619 TT_CMapInfo *cmap_info )
621 FT_CMap cmap = FT_CMAP( charmap );
622 FT_Error error = FT_Err_Ok;
624 FT_Face face = FT_CMAP_FACE( cmap );
625 FT_Library library = FT_FACE_LIBRARY( face );
628 if ( cmap->clazz != &cff_cmap_encoding_class_rec &&
629 cmap->clazz != &cff_cmap_unicode_class_rec )
631 FT_Module sfnt = FT_Get_Module( library,
"sfnt" );
632 FT_Service_TTCMaps service =
633 (FT_Service_TTCMaps)ft_module_get_service( sfnt,
634 FT_SERVICE_ID_TT_CMAP,
638 if ( service && service->get_cmap_info )
639 error = service->get_cmap_info( charmap, cmap_info );
642 error = FT_THROW( Invalid_CharMap_Format );
648 FT_DEFINE_SERVICE_TTCMAPSREC(
649 cff_service_get_cmap_info,
659 FT_CALLBACK_DEF( FT_Error )
660 cff_get_ros( FT_Face face,
661 const char* *registry,
662 const char* *ordering,
665 FT_Error error = FT_Err_Ok;
666 CFF_Face cffface = (CFF_Face)face;
667 CFF_Font cff = (CFF_Font)cffface->extra.data;
672 CFF_FontRecDict dict = &cff->top_font.font_dict;
675 if ( dict->cid_registry == 0xFFFFU )
677 error = FT_THROW( Invalid_Argument );
683 if ( !cff->registry )
684 cff->registry = cff_index_get_sid_string( cff,
685 dict->cid_registry );
686 *registry = cff->registry;
691 if ( !cff->ordering )
692 cff->ordering = cff_index_get_sid_string( cff,
693 dict->cid_ordering );
694 *ordering = cff->ordering;
704 if ( dict->cid_supplement < FT_INT_MIN ||
705 dict->cid_supplement > FT_INT_MAX )
706 FT_TRACE1((
"cff_get_ros: too large supplement %ld is truncated\n",
707 dict->cid_supplement ));
708 *supplement = (FT_Int)dict->cid_supplement;
717 FT_CALLBACK_DEF( FT_Error )
718 cff_get_is_cid( FT_Face face,
721 FT_Error error = FT_Err_Ok;
722 CFF_Face cffface = (CFF_Face)face;
723 CFF_Font cff = (CFF_Font)cffface->extra.data;
730 CFF_FontRecDict dict = &cff->top_font.font_dict;
733 if ( dict->cid_registry != 0xFFFFU )
741 FT_CALLBACK_DEF( FT_Error )
742 cff_get_cid_from_glyph_index( FT_Face face,
746 FT_Error error = FT_Err_Ok;
747 CFF_Face cffface = (CFF_Face)face;
748 CFF_Font cff = (CFF_Font)cffface->extra.data;
754 CFF_FontRecDict dict = &cff->top_font.font_dict;
757 if ( dict->cid_registry == 0xFFFFU )
759 error = FT_THROW( Invalid_Argument );
763 if ( glyph_index >= cff->num_glyphs )
765 error = FT_THROW( Invalid_Argument );
769 c = cff->charset.sids[glyph_index];
780 FT_DEFINE_SERVICE_CIDREC(
781 cff_service_cid_info,
787 cff_get_cid_from_glyph_index
797 FT_DEFINE_SERVICE_PROPERTIESREC(
798 cff_service_properties,
804#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
811 FT_CALLBACK_DEF( FT_Error )
812 cff_set_mm_blend( FT_Face face,
816 CFF_Face cffface = (CFF_Face)face;
817 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
820 return mm->set_mm_blend( face, num_coords, coords );
824 FT_CALLBACK_DEF( FT_Error )
825 cff_get_mm_blend( FT_Face face,
829 CFF_Face cffface = (CFF_Face)face;
830 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
833 return mm->get_mm_blend( face, num_coords, coords );
837 FT_CALLBACK_DEF( FT_Error )
838 cff_set_mm_weightvector( FT_Face face,
840 FT_Fixed* weightvector )
842 CFF_Face cffface = (CFF_Face)face;
843 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
846 return mm->set_mm_weightvector( face, len, weightvector );
850 FT_CALLBACK_DEF( FT_Error )
851 cff_get_mm_weightvector( FT_Face face,
853 FT_Fixed* weightvector )
855 CFF_Face cffface = (CFF_Face)face;
856 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
859 return mm->get_mm_weightvector( face, len, weightvector );
863 FT_CALLBACK_DEF(
void )
864 cff_construct_ps_name( FT_Face face )
866 CFF_Face cffface = (CFF_Face)face;
867 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
870 mm->construct_ps_name( face );
874 FT_CALLBACK_DEF( FT_Error )
875 cff_get_mm_var( FT_Face face,
878 CFF_Face cffface = (CFF_Face)face;
879 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
882 return mm->get_mm_var( face, master );
886 FT_CALLBACK_DEF( FT_Error )
887 cff_set_var_design( FT_Face face,
891 CFF_Face cffface = (CFF_Face)face;
892 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
895 return mm->set_var_design( face, num_coords, coords );
899 FT_CALLBACK_DEF( FT_Error )
900 cff_get_var_design( FT_Face face,
904 CFF_Face cffface = (CFF_Face)face;
905 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
908 return mm->get_var_design( face, num_coords, coords );
912 FT_CALLBACK_DEF( FT_Error )
913 cff_set_named_instance( FT_Face face,
914 FT_UInt instance_index )
916 CFF_Face cffface = (CFF_Face)face;
917 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
920 return mm->set_named_instance( face, instance_index );
924 FT_CALLBACK_DEF( FT_Error )
925 cff_get_default_named_instance( FT_Face face,
926 FT_UInt *instance_index )
928 CFF_Face cffface = (CFF_Face)face;
929 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
932 return mm->get_default_named_instance( face, instance_index );
936 FT_CALLBACK_DEF( FT_Error )
937 cff_load_item_variation_store( FT_Face face,
939 GX_ItemVarStore itemStore )
941 CFF_Face cffface = (CFF_Face)face;
942 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
945 return mm->load_item_var_store( face, offset, itemStore );
949 FT_CALLBACK_DEF( FT_Error )
950 cff_load_delta_set_index_mapping( FT_Face face,
952 GX_DeltaSetIdxMap map,
953 GX_ItemVarStore itemStore,
956 CFF_Face cffface = (CFF_Face)face;
957 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
960 return mm->load_delta_set_idx_map( face, offset, map,
961 itemStore, table_len );
965 FT_CALLBACK_DEF( FT_Int )
966 cff_get_item_delta( FT_Face face,
967 GX_ItemVarStore itemStore,
971 CFF_Face cffface = (CFF_Face)face;
972 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
975 return mm->get_item_delta( face, itemStore, outerIndex, innerIndex );
979 FT_CALLBACK_DEF(
void )
980 cff_done_item_variation_store( FT_Face face,
981 GX_ItemVarStore itemStore )
983 CFF_Face cffface = (CFF_Face)face;
984 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
987 mm->done_item_var_store( face, itemStore );
991 FT_CALLBACK_DEF(
void )
992 cff_done_delta_set_index_map( FT_Face face,
993 GX_DeltaSetIdxMap deltaSetIdxMap )
995 CFF_Face cffface = (CFF_Face)face;
996 FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm;
999 mm->done_delta_set_idx_map( face, deltaSetIdxMap );
1004 FT_DEFINE_SERVICE_MULTIMASTERSREC(
1005 cff_service_multi_masters,
1014 cff_set_named_instance,
1016 cff_get_default_named_instance,
1018 cff_set_mm_weightvector,
1020 cff_get_mm_weightvector,
1022 cff_construct_ps_name,
1024 cff_load_delta_set_index_mapping,
1026 cff_load_item_variation_store,
1030 cff_done_item_variation_store,
1032 cff_done_delta_set_index_map,
1044 FT_CALLBACK_DEF( FT_Error )
1045 cff_hadvance_adjust( FT_Face face,
1049 CFF_Face cffface = (CFF_Face)face;
1050 FT_Service_MetricsVariations
1051 var = (FT_Service_MetricsVariations)cffface->tt_var;
1054 return var->hadvance_adjust( face, gindex, avalue );
1058 FT_CALLBACK_DEF(
void )
1059 cff_metrics_adjust( FT_Face face )
1061 CFF_Face cffface = (CFF_Face)face;
1062 FT_Service_MetricsVariations
1063 var = (FT_Service_MetricsVariations)cffface->tt_var;
1066 var->metrics_adjust( face );
1070 FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
1071 cff_service_metrics_variations,
1073 cff_hadvance_adjust,
1093 FT_DEFINE_SERVICE_CFFLOADREC(
1094 cff_service_cff_load,
1096 cff_get_standard_encoding,
1097 cff_load_private_dict,
1099 cff_blend_check_vector,
1100 cff_blend_build_vector
1116#if defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
1117 FT_DEFINE_SERVICEDESCREC10(
1120 FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF,
1121 FT_SERVICE_ID_MULTI_MASTERS, &cff_service_multi_masters,
1122 FT_SERVICE_ID_METRICS_VARIATIONS, &cff_service_metrics_variations,
1123 FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info,
1124 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cff_service_ps_name,
1125 FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict,
1126 FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info,
1127 FT_SERVICE_ID_CID, &cff_service_cid_info,
1128 FT_SERVICE_ID_PROPERTIES, &cff_service_properties,
1129 FT_SERVICE_ID_CFF_LOAD, &cff_service_cff_load
1132 FT_DEFINE_SERVICEDESCREC8(
1135 FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF,
1136 FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info,
1137 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cff_service_ps_name,
1138 FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict,
1139 FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info,
1140 FT_SERVICE_ID_CID, &cff_service_cid_info,
1141 FT_SERVICE_ID_PROPERTIES, &cff_service_properties,
1142 FT_SERVICE_ID_CFF_LOAD, &cff_service_cff_load
1147 FT_CALLBACK_DEF( FT_Module_Interface )
1148 cff_get_interface( FT_Module driver,
1149 const char* module_interface )
1153 FT_Module_Interface result;
1156 result = ft_service_list_lookup( cff_services, module_interface );
1163 library = driver->library;
1168 sfnt = FT_Get_Module( library,
"sfnt" );
1170 return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
1176#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
1177#define CFF_SIZE_SELECT cff_size_select
1179#define CFF_SIZE_SELECT 0
1185 FT_MODULE_FONT_DRIVER |
1186 FT_MODULE_DRIVER_SCALABLE |
1187 FT_MODULE_DRIVER_HAS_HINTER |
1188 FT_MODULE_DRIVER_HINTS_LIGHTLY,
1190 sizeof ( PS_DriverRec ),
1201 sizeof ( TT_FaceRec ),
1202 sizeof ( CFF_SizeRec ),
1203 sizeof ( CFF_GlyphSlotRec ),