ReactOS 0.4.16-dev-1067-ge98bba2
ttdriver.c File Reference
#include <ft2build.h>
#include "ttdriver.h"
#include "ttgload.h"
#include "ttpload.h"
#include "tterrors.h"
Include dependency graph for ttdriver.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define FT_COMPONENT   ttdriver
 
#define TT_HINTER_FLAG   0
 
#define TT_SIZE_SELECT   0
 

Functions

static FT_Error tt_property_set (FT_Module module, const char *property_name, const void *value, FT_Bool value_is_string)
 
static FT_Error tt_property_get (FT_Module module, const char *property_name, const void *value)
 
 FT_DEFINE_SERVICE_PROPERTIESREC (tt_service_properties,(FT_Properties_SetFunc) tt_property_set,(FT_Properties_GetFunc) tt_property_get) static FT_Error tt_get_kerning(FT_Face ttface
 
 if (sfnt)
 
static FT_Error tt_size_request (FT_Size size, FT_Size_Request req)
 
static FT_Error tt_glyph_load (FT_GlyphSlot ttslot, FT_Size ttsize, FT_UInt glyph_index, FT_Int32 load_flags)
 
 FT_DEFINE_SERVICE_TTGLYFREC (tt_service_truetype_glyf,(TT_Glyf_GetLocationFunc) tt_face_get_location) FT_DEFINE_SERVICEDESCREC4(tt_services
 
&tt_service_properties tt_get_interface (FT_Module driver, const char *tt_interface)
 

Variables

FT_UInt left_glyph
 
FT_UInt FT_UInt right_glyph
 
FT_UInt FT_UInt FT_Vectorkerning
 
SFNT_Service sfnt = (SFNT_Service)face->sfnt
 
kerning x = 0
 
kerning y = 0
 
static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine
 
 FT_SERVICE_ID_FONT_FORMAT
 
 FT_FONT_FORMAT_TRUETYPE
 
 FT_SERVICE_ID_TRUETYPE_ENGINE
 
 FT_SERVICE_ID_TT_GLYF
 
tt_service_truetype_glyf
 
 FT_SERVICE_ID_PROPERTIES
 

Macro Definition Documentation

◆ FT_COMPONENT

#define FT_COMPONENT   ttdriver

Definition at line 54 of file ttdriver.c.

◆ TT_HINTER_FLAG

#define TT_HINTER_FLAG   0

Definition at line 614 of file ttdriver.c.

◆ TT_SIZE_SELECT

#define TT_SIZE_SELECT   0

Definition at line 620 of file ttdriver.c.

Function Documentation

◆ FT_DEFINE_SERVICE_PROPERTIESREC()

FT_DEFINE_SERVICE_PROPERTIESREC ( tt_service_properties  ,
(FT_Properties_SetFunc tt_property_set,
(FT_Properties_GetFunc tt_property_get 
)

◆ FT_DEFINE_SERVICE_TTGLYFREC()

FT_DEFINE_SERVICE_TTGLYFREC ( tt_service_truetype_glyf  ,
(TT_Glyf_GetLocationFunc tt_face_get_location 
)

◆ if()

if ( sfnt  )

Definition at line 215 of file ttdriver.c.

228 {
229 FT_UInt nn;
230 TT_Face face = (TT_Face)ttface;
231
232
233 /* XXX: TODO: check for sbits */
234
236 {
237#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
238 /* no fast retrieval for blended MM fonts without VVAR table */
239 if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
240 !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
241 return FT_THROW( Unimplemented_Feature );
242#endif
243
244 for ( nn = 0; nn < count; nn++ )
245 {
246 FT_Short tsb;
247 FT_UShort ah;
248
249
250 /* since we don't need `tsb', we use zero for `yMax' parameter */
251 TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah );
252 advances[nn] = ah;
253 }
254 }
255 else
256 {
257#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
258 /* no fast retrieval for blended MM fonts without HVAR table */
259 if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
260 !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
261 return FT_THROW( Unimplemented_Feature );
262#endif
263
264 for ( nn = 0; nn < count; nn++ )
265 {
266 FT_Short lsb;
267 FT_UShort aw;
268
269
270 TT_Get_HMetrics( face, start + nn, &lsb, &aw );
271 advances[nn] = aw;
272 }
273 }
274
275 return FT_Err_Ok;
276 }
#define FT_LOAD_VERTICAL_LAYOUT
Definition: freetype.h:3031
#define FT_IS_VARIATION(face)
Definition: freetype.h:1414
#define FT_IS_NAMED_INSTANCE(face)
Definition: freetype.h:1396
return FT_Err_Ok
Definition: ftbbox.c:527
#define FT_THROW(e)
Definition: ftdebug.h:241
unsigned short FT_UShort
Definition: fttypes.h:209
signed short FT_Short
Definition: fttypes.h:198
unsigned int FT_UInt
Definition: fttypes.h:231
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
GLbitfield flags
Definition: glext.h:7161
TT_Get_HMetrics(TT_Face face, FT_UInt idx, FT_Short *lsb, FT_UShort *aw)
Definition: ttgload.c:90
TT_Get_VMetrics(TT_Face face, FT_UInt idx, FT_Pos yMax, FT_Short *tsb, FT_UShort *ah)
Definition: ttgload.c:108
#define TT_FACE_FLAG_VAR_HADVANCE
Definition: tttypes.h:1211
struct TT_FaceRec_ * TT_Face
Definition: tttypes.h:1064
#define TT_FACE_FLAG_VAR_VADVANCE
Definition: tttypes.h:1216

◆ tt_get_interface()

&tt_service_properties tt_get_interface ( FT_Module  driver,
const char tt_interface 
)

Definition at line 577 of file ttdriver.c.

579 {
582 FT_Module sfntd;
584
585
586 result = ft_service_list_lookup( tt_services, tt_interface );
587 if ( result )
588 return result;
589
590 if ( !driver )
591 return NULL;
592 library = driver->library;
593 if ( !library )
594 return NULL;
595
596 /* only return the default interface from the SFNT module */
597 sfntd = FT_Get_Module( library, "sfnt" );
598 if ( sfntd )
599 {
601 if ( sfnt )
602 return sfnt->get_interface( driver, tt_interface );
603 }
604
605 return 0;
606 }
FT_Library library
Definition: cffdrivr.c:661
#define NULL
Definition: types.h:112
FT_Get_Module(FT_Library library, const char *module_name)
Definition: ftobjs.c:4964
ft_service_list_lookup(FT_ServiceDesc service_descriptors, const char *service_id)
Definition: ftobjs.c:110
GLuint64EXT * result
Definition: glext.h:11304
struct @1717::@1718 driver
SFNT_Interface * SFNT_Service
Definition: sfnt.h:784
FT_Module_Class * clazz
Definition: ftobjs.h:502
const void * module_interface
Definition: ftmodapi.h:241
FT_Module_Requester get_interface
Definition: sfnt.h:717
SFNT_Service sfnt
Definition: ttdriver.c:209

◆ tt_glyph_load()

static FT_Error tt_glyph_load ( FT_GlyphSlot  ttslot,
FT_Size  ttsize,
FT_UInt  glyph_index,
FT_Int32  load_flags 
)
static

Definition at line 421 of file ttdriver.c.

425 {
427 TT_Size size = (TT_Size)ttsize;
428 FT_Face face = ttslot->face;
430
431
432 if ( !slot )
433 return FT_THROW( Invalid_Slot_Handle );
434
435 if ( !size )
436 return FT_THROW( Invalid_Size_Handle );
437
438 if ( !face )
439 return FT_THROW( Invalid_Face_Handle );
440
441#ifdef FT_CONFIG_OPTION_INCREMENTAL
442 if ( glyph_index >= (FT_UInt)face->num_glyphs &&
443 !face->internal->incremental_interface )
444#else
445 if ( glyph_index >= (FT_UInt)face->num_glyphs )
446#endif
447 return FT_THROW( Invalid_Argument );
448
449 if ( load_flags & FT_LOAD_NO_HINTING )
450 {
451 /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */
452 /* are necessary to disable hinting for tricky fonts */
453
454 if ( FT_IS_TRICKY( face ) )
455 load_flags &= ~FT_LOAD_NO_HINTING;
456
457 if ( load_flags & FT_LOAD_NO_AUTOHINT )
458 load_flags |= FT_LOAD_NO_HINTING;
459 }
460
461 if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
462 {
463 load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
464
465 if ( !FT_IS_TRICKY( face ) )
466 load_flags |= FT_LOAD_NO_HINTING;
467 }
468
469 /* use hinted metrics only if we load a glyph with hinting */
470 size->metrics = ( load_flags & FT_LOAD_NO_HINTING )
471 ? &ttsize->metrics
472 : &size->hinted_metrics;
473
474 /* now fill in the glyph slot with outline/bitmap/layered */
475 error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
476
477 /* force drop-out mode to 2 - irrelevant now */
478 /* slot->outline.dropout_mode = 2; */
479
480 return error;
481 }
#define FT_LOAD_NO_BITMAP
Definition: freetype.h:3030
#define FT_LOAD_NO_SCALE
Definition: freetype.h:3027
#define FT_LOAD_NO_RECURSE
Definition: freetype.h:3036
#define FT_LOAD_NO_HINTING
Definition: freetype.h:3028
#define FT_LOAD_NO_AUTOHINT
Definition: freetype.h:3040
#define FT_IS_TRICKY(face)
Definition: freetype.h:1445
int FT_Error
Definition: fttypes.h:299
GLsizeiptr size
Definition: glext.h:5919
#define error(str)
Definition: mkdosfs.c:1605
FT_Size_Metrics metrics
Definition: freetype.h:1649
Definition: vfat.h:185
TT_Load_Glyph(TT_Size size, TT_GlyphSlot glyph, FT_UInt glyph_index, FT_Int32 load_flags)
Definition: ttgload.c:2713
FT_GlyphSlot TT_GlyphSlot
Definition: ttobjs.h:54
struct TT_SizeRec_ * TT_Size
Definition: tttypes.h:1796

◆ tt_property_get()

static FT_Error tt_property_get ( FT_Module  module,
const char property_name,
const void value 
)
static

Definition at line 119 of file ttdriver.c.

122 {
125
126 FT_UInt interpreter_version = driver->interpreter_version;
127
128
129 if ( !ft_strcmp( property_name, "interpreter-version" ) )
130 {
132
133
134 *val = interpreter_version;
135
136 return error;
137 }
138
139 FT_TRACE0(( "tt_property_get: missing property `%s'\n",
140 property_name ));
141 return FT_THROW( Missing_Property );
142 }
#define FT_TRACE0(varformat)
Definition: ftdebug.h:185
#define ft_strcmp
Definition: ftstdlib.h:86
GLuint GLfloat * val
Definition: glext.h:7180
typedefFT_BEGIN_HEADER struct TT_DriverRec_ * TT_Driver
Definition: ttobjs.h:39
Definition: pdh_main.c:96

◆ tt_property_set()

static FT_Error tt_property_set ( FT_Module  module,
const char property_name,
const void value,
FT_Bool  value_is_string 
)
static

Definition at line 62 of file ttdriver.c.

66 {
69
70#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
71 FT_UNUSED( value_is_string );
72#endif
73
74
75 if ( !ft_strcmp( property_name, "interpreter-version" ) )
76 {
77 FT_UInt interpreter_version;
78
79
80#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
81 if ( value_is_string )
82 {
83 const char* s = (const char*)value;
84
85
86 interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 );
87 }
88 else
89#endif
90 {
91 FT_UInt* iv = (FT_UInt*)value;
92
93
94 interpreter_version = *iv;
95 }
96
97 if ( interpreter_version == TT_INTERPRETER_VERSION_35
98#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
99 || interpreter_version == TT_INTERPRETER_VERSION_38
100#endif
102 || interpreter_version == TT_INTERPRETER_VERSION_40
103#endif
104 )
105 driver->interpreter_version = interpreter_version;
106 else
107 error = FT_ERR( Unimplemented_Feature );
108
109 return error;
110 }
111
112 FT_TRACE0(( "tt_property_set: missing property `%s'\n",
113 property_name ));
114 return FT_THROW( Missing_Property );
115 }
#define FT_UNUSED(arg)
Definition: ftconfig.h:100
#define TT_INTERPRETER_VERSION_38
Definition: ftdriver.h:749
#define TT_INTERPRETER_VERSION_40
Definition: ftdriver.h:750
#define TT_INTERPRETER_VERSION_35
Definition: ftdriver.h:748
#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
Definition: ftoption.h:952
#define ft_strtol
Definition: ftstdlib.h:145
#define FT_ERR(e)
Definition: fttypes.h:599
GLdouble s
Definition: gl.h:2039

◆ tt_size_request()

static FT_Error tt_size_request ( FT_Size  size,
FT_Size_Request  req 
)
static

Definition at line 332 of file ttdriver.c.

334 {
335 TT_Size ttsize = (TT_Size)size;
337
338
339#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
340
341 if ( FT_HAS_FIXED_SIZES( size->face ) )
342 {
343 TT_Face ttface = (TT_Face)size->face;
345 FT_ULong strike_index;
346
347
348 error = sfnt->set_sbit_strike( ttface, req, &strike_index );
349
350 if ( error )
351 ttsize->strike_index = 0xFFFFFFFFUL;
352 else
353 return tt_size_select( size, strike_index );
354 }
355
356#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
357
358 FT_Request_Metrics( size->face, req );
359
360 if ( FT_IS_SCALABLE( size->face ) )
361 {
362 error = tt_size_reset( ttsize, 0 );
363
364#ifdef TT_USE_BYTECODE_INTERPRETER
365 /* for the `MPS' bytecode instruction we need the point size */
366 if ( !error )
367 {
368 FT_UInt resolution =
369 ttsize->metrics->x_ppem > ttsize->metrics->y_ppem
370 ? req->horiResolution
371 : req->vertResolution;
372
373
374 /* if we don't have a resolution value, assume 72dpi */
375 if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES ||
376 !resolution )
377 resolution = 72;
378
379 ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem,
380 64 * 72,
381 resolution );
382 }
383#endif
384 }
385
386 return error;
387 }
@ FT_SIZE_REQUEST_TYPE_SCALES
Definition: freetype.h:2561
#define FT_HAS_FIXED_SIZES(face)
Definition: freetype.h:1333
#define FT_IS_SCALABLE(face)
Definition: freetype.h:1284
FT_MulDiv(FT_Long a, FT_Long b, FT_Long c)
Definition: ftcalc.c:416
FT_Request_Metrics(FT_Face face, FT_Size_Request req)
Definition: ftobjs.c:3072
unsigned long FT_ULong
Definition: fttypes.h:253
FT_UShort x_ppem
Definition: freetype.h:1610
FT_UShort y_ppem
Definition: freetype.h:1611
FT_UInt horiResolution
Definition: freetype.h:2612
FT_Size_Request_Type type
Definition: freetype.h:2609
FT_UInt vertResolution
Definition: freetype.h:2613
TT_Set_SBit_Strike_Func set_sbit_strike
Definition: sfnt.h:764
void * sfnt
Definition: tttypes.h:1573
FT_Size_Metrics * metrics
Definition: ttobjs.h:281
TT_Size_Metrics ttmetrics
Definition: ttobjs.h:284
FT_ULong strike_index
Definition: ttobjs.h:286
FT_UShort ppem
Definition: ttobjs.h:257
tt_size_reset(TT_Size size, FT_Bool only_height)
Definition: ttobjs.c:1294

Variable Documentation

◆ FT_FONT_FORMAT_TRUETYPE

FT_FONT_FORMAT_TRUETYPE

Definition at line 569 of file ttdriver.c.

◆ FT_SERVICE_ID_FONT_FORMAT

FT_SERVICE_ID_FONT_FORMAT

Definition at line 569 of file ttdriver.c.

◆ FT_SERVICE_ID_PROPERTIES

FT_SERVICE_ID_PROPERTIES

Definition at line 572 of file ttdriver.c.

◆ FT_SERVICE_ID_TRUETYPE_ENGINE

FT_SERVICE_ID_TRUETYPE_ENGINE

Definition at line 570 of file ttdriver.c.

◆ FT_SERVICE_ID_TT_GLYF

FT_SERVICE_ID_TT_GLYF

Definition at line 571 of file ttdriver.c.

◆ kerning

◆ left_glyph

FT_UInt left_glyph

Definition at line 204 of file ttdriver.c.

Referenced by cff_get_kerning(), FT_Get_Kerning(), Get_Kerning(), and tt_face_get_kerning().

◆ right_glyph

FT_UInt FT_UInt right_glyph

Definition at line 205 of file ttdriver.c.

Referenced by cff_get_kerning(), FT_Get_Kerning(), Get_Kerning(), and tt_face_get_kerning().

◆ sfnt

◆ tt_service_truetype_engine

& tt_service_truetype_engine
static
Initial value:
=
{
}
@ FT_TRUETYPE_ENGINE_TYPE_NONE
Definition: ftmodapi.h:747

Definition at line 534 of file ttdriver.c.

◆ tt_service_truetype_glyf

& tt_service_truetype_glyf

Definition at line 571 of file ttdriver.c.

◆ x

kerning x = 0

Definition at line 212 of file ttdriver.c.

◆ y

kerning y = 0

Definition at line 213 of file ttdriver.c.