24#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
39#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
53#define FT_COMPONENT ttdriver
60 FT_CALLBACK_DEF( FT_Error )
61 tt_property_set( FT_Module module,
62 const char* property_name,
64 FT_Bool value_is_string )
66 FT_Error error = FT_Err_Ok;
67 TT_Driver driver = (TT_Driver)module;
69#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
70 FT_UNUSED( value_is_string );
74 if ( !ft_strcmp( property_name,
"interpreter-version" ) )
76 FT_UInt interpreter_version;
79#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
80 if ( value_is_string )
82 const char* s = (
const char*)value;
85 interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 );
90 FT_UInt* iv = (FT_UInt*)value;
93 interpreter_version = *iv;
96 switch ( interpreter_version )
98 case TT_INTERPRETER_VERSION_35:
99 driver->interpreter_version = TT_INTERPRETER_VERSION_35;
102 case TT_INTERPRETER_VERSION_38:
103 case TT_INTERPRETER_VERSION_40:
104#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
105 driver->interpreter_version = TT_INTERPRETER_VERSION_40;
110 error = FT_ERR( Unimplemented_Feature );
116 FT_TRACE2((
"tt_property_set: missing property `%s'\n",
118 return FT_THROW( Missing_Property );
122 FT_CALLBACK_DEF( FT_Error )
123 tt_property_get( FT_Module module,
124 const char* property_name,
127 FT_Error error = FT_Err_Ok;
128 TT_Driver driver = (TT_Driver)module;
130 FT_UInt interpreter_version = driver->interpreter_version;
133 if ( !ft_strcmp( property_name,
"interpreter-version" ) )
135 FT_UInt* val = (FT_UInt*)value;
138 *val = interpreter_version;
143 FT_TRACE2((
"tt_property_get: missing property `%s'\n",
145 return FT_THROW( Missing_Property );
149 FT_DEFINE_SERVICE_PROPERTIESREC(
150 tt_service_properties,
206 FT_CALLBACK_DEF( FT_Error )
207 tt_get_kerning( FT_Face face,
212 TT_Face ttface = (TT_Face)face;
213 SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
223 if ( ttface->kern_avail_bits )
224 kerning->x = sfnt->get_kerning( ttface,
227#ifdef TT_CONFIG_OPTION_GPOS_KERNING
228 else if ( ttface->num_gpos_lookups_kerning )
229 kerning->x = sfnt->get_gpos_kerning( ttface,
239 FT_CALLBACK_DEF( FT_Error )
240 tt_get_advances( FT_Face face,
247 TT_Face ttface = (TT_Face)face;
252 if ( flags & FT_LOAD_VERTICAL_LAYOUT )
254#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
256 if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
257 !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
258 return FT_THROW( Unimplemented_Feature );
261 for ( nn = 0; nn < count; nn++ )
268 TT_Get_VMetrics( ttface, start + nn, 0, &tsb, &ah );
274#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
276 if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
277 !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
278 return FT_THROW( Unimplemented_Feature );
281 for ( nn = 0; nn < count; nn++ )
287 TT_Get_HMetrics( ttface, start + nn, &lsb, &aw );
309#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
311 FT_CALLBACK_DEF( FT_Error )
312 tt_size_select( FT_Size size,
313 FT_ULong strike_index )
315 TT_Face ttface = (TT_Face)size->face;
316 TT_Size ttsize = (TT_Size)size;
317 FT_Error error = FT_Err_Ok;
320 ttsize->strike_index = strike_index;
322 if ( FT_IS_SCALABLE( size->face ) )
325 FT_Select_Metrics( size->face, strike_index );
327 tt_size_reset( ttsize );
331 SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
332 FT_Size_Metrics* size_metrics = &size->metrics;
335 error = sfnt->load_strike_metrics( ttface,
339 ttsize->strike_index = 0xFFFFFFFFUL;
348 FT_CALLBACK_DEF( FT_Error )
349 tt_size_request( FT_Size size,
350 FT_Size_Request req )
352 TT_Size ttsize = (TT_Size)size;
353 FT_Error error = FT_Err_Ok;
356#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
358 if ( FT_HAS_FIXED_SIZES( size->face ) )
360 TT_Face ttface = (TT_Face)size->face;
361 SFNT_Service sfnt = (SFNT_Service)ttface->sfnt;
362 FT_ULong strike_index;
365 error = sfnt->set_sbit_strike( ttface, req, &strike_index );
368 ttsize->strike_index = 0xFFFFFFFFUL;
370 return tt_size_select( size, strike_index );
376 FT_Error err = FT_Request_Metrics( size->face, req );
386 if ( FT_IS_SCALABLE( size->face ) )
388 error = tt_size_reset( ttsize );
390#ifdef TT_USE_BYTECODE_INTERPRETER
395 ttsize->metrics->x_ppem > ttsize->metrics->y_ppem
396 ? req->horiResolution
397 : req->vertResolution;
401 if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES ||
405 ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem,
447 FT_CALLBACK_DEF( FT_Error )
448 tt_glyph_load( FT_GlyphSlot slot,
451 FT_Int32 load_flags )
453 TT_GlyphSlot ttslot = (TT_GlyphSlot)slot;
454 TT_Size ttsize = (TT_Size)size;
455 FT_Face face = ttslot->face;
460 return FT_THROW( Invalid_Slot_Handle );
463 return FT_THROW( Invalid_Size_Handle );
466 return FT_THROW( Invalid_Face_Handle );
468#ifdef FT_CONFIG_OPTION_INCREMENTAL
469 if ( glyph_index >= (FT_UInt)face->num_glyphs &&
470 !face->internal->incremental_interface )
472 if ( glyph_index >= (FT_UInt)face->num_glyphs )
474 return FT_THROW( Invalid_Argument );
476 if ( load_flags & FT_LOAD_NO_HINTING )
481 if ( FT_IS_TRICKY( face ) )
482 load_flags &= ~FT_LOAD_NO_HINTING;
484 if ( load_flags & FT_LOAD_NO_AUTOHINT )
485 load_flags |= FT_LOAD_NO_HINTING;
488 if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
490 load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
492 if ( !FT_IS_TRICKY( face ) )
493 load_flags |= FT_LOAD_NO_HINTING;
497 ttsize->metrics = ( load_flags & FT_LOAD_NO_HINTING )
499 : &ttsize->hinted_metrics;
502 error = TT_Load_Glyph( ttsize, ttslot, glyph_index, load_flags );
523#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
525 FT_DEFINE_SERVICE_MULTIMASTERSREC(
526 tt_service_gx_multi_masters,
535 TT_Set_Named_Instance,
536 TT_Get_Default_Named_Instance,
541 tt_construct_ps_name,
542 tt_var_load_delta_set_index_mapping,
544 tt_var_load_item_variation_store,
546 tt_var_get_item_delta,
547 tt_var_done_item_variation_store,
549 tt_var_done_delta_set_index_map,
555 FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
556 tt_service_metrics_variations,
574 static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine =
576#ifdef TT_USE_BYTECODE_INTERPRETER
578 FT_TRUETYPE_ENGINE_TYPE_PATENTED
582 FT_TRUETYPE_ENGINE_TYPE_NONE
588 FT_DEFINE_SERVICE_TTGLYFREC(
589 tt_service_truetype_glyf,
591 (TT_Glyf_GetLocationFunc)tt_face_get_location
595#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
596 FT_DEFINE_SERVICEDESCREC6(
599 FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE,
600 FT_SERVICE_ID_MULTI_MASTERS, &tt_service_gx_multi_masters,
601 FT_SERVICE_ID_METRICS_VARIATIONS, &tt_service_metrics_variations,
602 FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
603 FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf,
604 FT_SERVICE_ID_PROPERTIES, &tt_service_properties )
606 FT_DEFINE_SERVICEDESCREC4(
609 FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE,
610 FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
611 FT_SERVICE_ID_TT_GLYF, &tt_service_truetype_glyf,
612 FT_SERVICE_ID_PROPERTIES, &tt_service_properties )
616 FT_CALLBACK_DEF( FT_Module_Interface )
617 tt_get_interface( FT_Module driver,
618 const char* tt_interface )
621 FT_Module_Interface result;
626 result = ft_service_list_lookup( tt_services, tt_interface );
632 library = driver->library;
637 sfntd = FT_Get_Module( library,
"sfnt" );
640 sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
642 return sfnt->get_interface( driver, tt_interface );
651#ifdef TT_USE_BYTECODE_INTERPRETER
652#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER
654#define TT_HINTER_FLAG 0
657#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
658#define TT_SIZE_SELECT tt_size_select
660#define TT_SIZE_SELECT 0
666 FT_MODULE_FONT_DRIVER |
667 FT_MODULE_DRIVER_SCALABLE |
670 sizeof ( TT_DriverRec ),
682 sizeof ( TT_FaceRec ),
683 sizeof ( TT_SizeRec ),
684 sizeof ( FT_GlyphSlotRec ),