/**************************************************************************** * * tttypes.h * * Basic SFNT/TrueType type definitions and interface (specification * only). * * Copyright (C) 1996-2024 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, * modified, and distributed under the terms of the FreeType project * license, LICENSE.TXT. By continuing to use, modify, or distribute * this file you indicate that you have read the license and * understand and accept it fully. * */ #ifndef TTTYPES_H_ #define TTTYPES_H_ #include #include #include #include "freetype/fttypes.h" #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #include #endif FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * @struct: * TTC_HeaderRec * * @description: * TrueType collection header. This table contains the offsets of the * font headers of each distinct TrueType face in the file. * * @fields: * tag :: * Must be 'ttc~' to indicate a TrueType collection. * * version :: * The version number. * * count :: * The number of faces in the collection. The specification says this * should be an unsigned long, but we use a signed long since we need * the value -1 for specific purposes. * * offsets :: * The offsets of the font headers, one per face. */ typedef struct TTC_HeaderRec_ { FT_ULong tag; FT_Fixed version; FT_Long count; FT_ULong* offsets; } TTC_HeaderRec; /************************************************************************** * * @struct: * SFNT_HeaderRec * * @description: * SFNT file format header. * * @fields: * format_tag :: * The font format tag. * * num_tables :: * The number of tables in file. * * search_range :: * Must be '16 * (max power of 2 <= num_tables)'. * * entry_selector :: * Must be log2 of 'search_range / 16'. * * range_shift :: * Must be 'num_tables * 16 - search_range'. */ typedef struct SFNT_HeaderRec_ { FT_ULong format_tag; FT_UShort num_tables; FT_UShort search_range; FT_UShort entry_selector; FT_UShort range_shift; FT_ULong offset; /* not in file */ } SFNT_HeaderRec, *SFNT_Header; /************************************************************************** * * @struct: * TT_TableRec * * @description: * This structure describes a given table of a TrueType font. * * @fields: * Tag :: * A four-bytes tag describing the table. * * CheckSum :: * The table checksum. This value can be ignored. * * Offset :: * The offset of the table from the start of the TrueType font in its * resource. * * Length :: * The table length (in bytes). */ typedef struct TT_TableRec_ { FT_ULong Tag; /* table type */ FT_ULong CheckSum; /* table checksum */ FT_ULong Offset; /* table file offset */ FT_ULong Length; /* table length */ } TT_TableRec, *TT_Table; /************************************************************************** * * @struct: * TT_LongMetricsRec * * @description: * A structure modeling the long metrics of the 'hmtx' and 'vmtx' * TrueType tables. The values are expressed in font units. * * @fields: * advance :: * The advance width or height for the glyph. * * bearing :: * The left-side or top-side bearing for the glyph. */ typedef struct TT_LongMetricsRec_ { FT_UShort advance; FT_Short bearing; } TT_LongMetricsRec, *TT_LongMetrics; /************************************************************************** * * @type: * TT_ShortMetrics * * @description: * A simple type to model the short metrics of the 'hmtx' and 'vmtx' * tables. */ typedef FT_Short TT_ShortMetrics; /************************************************************************** * * @struct: * TT_NameRec * * @description: * A structure modeling TrueType name records. Name records are used to * store important strings like family name, style name, copyright, * etc. in _localized_ versions (i.e., language, encoding, etc). * * @fields: * platformID :: * The ID of the name's encoding platform. * * encodingID :: * The platform-specific ID for the name's encoding. * * languageID :: * The platform-specific ID for the name's language. * * nameID :: * The ID specifying what kind of name this is. * * stringLength :: * The length of the string in bytes. * * stringOffset :: * The offset to the string in the 'name' table. * * string :: * A pointer to the string's bytes. Note that these are usually UTF-16 * encoded characters. */ typedef struct TT_NameRec_ { FT_UShort platformID; FT_UShort encodingID; FT_UShort languageID; FT_UShort nameID; FT_UShort stringLength; FT_ULong stringOffset; /* this last field is not defined in the spec */ /* but used by the FreeType engine */ FT_Byte* string; } TT_NameRec, *TT_Name; /************************************************************************** * * @struct: * TT_LangTagRec * * @description: * A structure modeling language tag records in SFNT 'name' tables, * introduced in OpenType version 1.6. * * @fields: * stringLength :: * The length of the string in bytes. * * stringOffset :: * The offset to the string in the 'name' table. * * string :: * A pointer to the string's bytes. Note that these are UTF-16BE * encoded characters. */ typedef struct TT_LangTagRec_ { FT_UShort stringLength; FT_ULong stringOffset; /* this last field is not defined in the spec */ /* but used by the FreeType engine */ FT_Byte* string; } TT_LangTagRec, *TT_LangTag; /************************************************************************** * * @struct: * TT_NameTableRec * * @description: * A structure modeling the TrueType name table. * * @fields: * format :: * The format of the name table. * * numNameRecords :: * The number of names in table. * * storageOffset :: * The offset of the name table in the 'name' TrueType table. * * names :: * An array of name records. * * numLangTagRecords :: * The number of language tags in table. * * langTags :: * An array of language tag records. * * stream :: * The file's input stream. */ typedef struct TT_NameTableRec_ { FT_UShort format; FT_UInt numNameRecords; FT_UInt storageOffset; TT_NameRec* names; FT_UInt numLangTagRecords; TT_LangTagRec* langTags; FT_Stream stream; } TT_NameTableRec, *TT_NameTable; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * @struct: * TT_GaspRangeRec * * @description: * A tiny structure used to model a gasp range according to the TrueType * specification. * * @fields: * maxPPEM :: * The maximum ppem value to which `gaspFlag` applies. * * gaspFlag :: * A flag describing the grid-fitting and anti-aliasing modes to be * used. */ typedef struct TT_GaspRangeRec_ { FT_UShort maxPPEM; FT_UShort gaspFlag; } TT_GaspRangeRec, *TT_GaspRange; #define TT_GASP_GRIDFIT 0x01 #define TT_GASP_DOGRAY 0x02 /************************************************************************** * * @struct: * TT_GaspRec * * @description: * A structure modeling the TrueType 'gasp' table used to specify * grid-fitting and anti-aliasing behaviour. * * @fields: * version :: * The version number. * * numRanges :: * The number of gasp ranges in table. * * gaspRanges :: * An array of gasp ranges. */ typedef struct TT_Gasp_ { FT_UShort version; FT_UShort numRanges; TT_GaspRange gaspRanges; } TT_GaspRec; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** EMBEDDED BITMAPS SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * @struct: * TT_SBit_MetricsRec * * @description: * A structure used to hold the big metrics of a given glyph bitmap in a * TrueType or OpenType font. These are usually found in the 'EBDT' * (Microsoft) or 'bloc' (Apple) table. * * @fields: * height :: * The glyph height in pixels. * * width :: * The glyph width in pixels. * * horiBearingX :: * The horizontal left bearing. * * horiBearingY :: * The horizontal top bearing. * * horiAdvance :: * The horizontal advance. * * vertBearingX :: * The vertical left bearing. * * vertBearingY :: * The vertical top bearing. * * vertAdvance :: * The vertical advance. */ typedef struct TT_SBit_MetricsRec_ { FT_UShort height; FT_UShort width; FT_Short horiBearingX; FT_Short horiBearingY; FT_UShort horiAdvance; FT_Short vertBearingX; FT_Short vertBearingY; FT_UShort vertAdvance; } TT_SBit_MetricsRec, *TT_SBit_Metrics; /************************************************************************** * * @struct: * TT_SBit_SmallMetricsRec * * @description: * A structure used to hold the small metrics of a given glyph bitmap in * a TrueType or OpenType font. These are usually found in the 'EBDT' * (Microsoft) or the 'bdat' (Apple) table. * * @fields: * height :: * The glyph height in pixels. * * width :: * The glyph width in pixels. * * bearingX :: * The left-side bearing. * * bearingY :: * The top-side bearing. * * advance :: * The advance width or height. */ typedef struct TT_SBit_Small_Metrics_ { FT_Byte height; FT_Byte width; FT_Char bearingX; FT_Char bearingY; FT_Byte advance; } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; /************************************************************************** * * @struct: * TT_SBit_LineMetricsRec * * @description: * A structure used to describe the text line metrics of a given bitmap * strike, for either a horizontal or vertical layout. * * @fields: * ascender :: * The ascender in pixels. * * descender :: * The descender in pixels. * * max_width :: * The maximum glyph width in pixels. * * caret_slope_enumerator :: * Rise of the caret slope, typically set to 1 for non-italic fonts. * * caret_slope_denominator :: * Rise of the caret slope, typically set to 0 for non-italic fonts. * * caret_offset :: * Offset in pixels to move the caret for proper positioning. * * min_origin_SB :: * Minimum of horiBearingX (resp. vertBearingY). * min_advance_SB :: * Minimum of * * horizontal advance - ( horiBearingX + width ) * * resp. * * vertical advance - ( vertBearingY + height ) * * max_before_BL :: * Maximum of horiBearingY (resp. vertBearingY). * * min_after_BL :: * Minimum of * * horiBearingY - height * * resp. * * vertBearingX - width * * pads :: * Unused (to make the size of the record a multiple of 32 bits. */ typedef struct TT_SBit_LineMetricsRec_ { FT_Char ascender; FT_Char descender; FT_Byte max_width; FT_Char caret_slope_numerator; FT_Char caret_slope_denominator; FT_Char caret_offset; FT_Char min_origin_SB; FT_Char min_advance_SB; FT_Char max_before_BL; FT_Char min_after_BL; FT_Char pads[2]; } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; /************************************************************************** * * @struct: * TT_SBit_RangeRec * * @description: * A TrueType/OpenType subIndexTable as defined in the 'EBLC' (Microsoft) * or 'bloc' (Apple) tables. * * @fields: * first_glyph :: * The first glyph index in the range. * * last_glyph :: * The last glyph index in the range. * * index_format :: * The format of index table. Valid values are 1 to 5. * * image_format :: * The format of 'EBDT' image data. * * image_offset :: * The offset to image data in 'EBDT'. * * image_size :: * For index formats 2 and 5. This is the size in bytes of each glyph * bitmap. * * big_metrics :: * For index formats 2 and 5. This is the big metrics for each glyph * bitmap. * * num_glyphs :: * For index formats 4 and 5. This is the number of glyphs in the code * array. * * glyph_offsets :: * For index formats 1 and 3. * * glyph_codes :: * For index formats 4 and 5. * * table_offset :: * The offset of the index table in the 'EBLC' table. Only used during * strike loading. */ typedef struct TT_SBit_RangeRec_ { FT_UShort first_glyph; FT_UShort last_glyph; FT_UShort index_format; FT_UShort image_format; FT_ULong image_offset; FT_ULong image_size; TT_SBit_MetricsRec metrics; FT_ULong num_glyphs; FT_ULong* glyph_offsets; FT_UShort* glyph_codes; FT_ULong table_offset; } TT_SBit_RangeRec, *TT_SBit_Range; /************************************************************************** * * @struct: * TT_SBit_StrikeRec * * @description: * A structure used describe a given bitmap strike in the 'EBLC' * (Microsoft) or 'bloc' (Apple) tables. * * @fields: * num_index_ranges :: * The number of index ranges. * * index_ranges :: * An array of glyph index ranges. * * color_ref :: * Unused. `color_ref` is put in for future enhancements, but these * fields are already in use by other platforms (e.g. Newton). For * details, please see * * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html * * hori :: * The line metrics for horizontal layouts. * * vert :: * The line metrics for vertical layouts. * * start_glyph :: * The lowest glyph index for this strike. * * end_glyph :: * The highest glyph index for this strike. * * x_ppem :: * The number of horizontal pixels per EM. * * y_ppem :: * The number of vertical pixels per EM. * * bit_depth :: * The bit depth. Valid values are 1, 2, 4, and 8. * * flags :: * Is this a vertical or horizontal strike? For details, please see * * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html */ typedef struct TT_SBit_StrikeRec_ { FT_Int num_ranges; TT_SBit_Range sbit_ranges; FT_ULong ranges_offset; FT_ULong color_ref; TT_SBit_LineMetricsRec hori; TT_SBit_LineMetricsRec vert; FT_UShort start_glyph; FT_UShort end_glyph; FT_Byte x_ppem; FT_Byte y_ppem; FT_Byte bit_depth; FT_Char flags; } TT_SBit_StrikeRec, *TT_SBit_Strike; /************************************************************************** * * @struct: * TT_SBit_ComponentRec * * @description: * A simple structure to describe a compound sbit element. * * @fields: * glyph_code :: * The element's glyph index. * * x_offset :: * The element's left bearing. * * y_offset :: * The element's top bearing. */ typedef struct TT_SBit_ComponentRec_ { FT_UShort glyph_code; FT_Char x_offset; FT_Char y_offset; } TT_SBit_ComponentRec, *TT_SBit_Component; /************************************************************************** * * @struct: * TT_SBit_ScaleRec * * @description: * A structure used describe a given bitmap scaling table, as defined in * the 'EBSC' table. * * @fields: * hori :: * The horizontal line metrics. * * vert :: * The vertical line metrics. * * x_ppem :: * The number of horizontal pixels per EM. * * y_ppem :: * The number of vertical pixels per EM. * * x_ppem_substitute :: * Substitution x_ppem value. * * y_ppem_substitute :: * Substitution y_ppem value. */ typedef struct TT_SBit_ScaleRec_ { TT_SBit_LineMetricsRec hori; TT_SBit_LineMetricsRec vert; FT_Byte x_ppem; FT_Byte y_ppem; FT_Byte x_ppem_substitute; FT_Byte y_ppem_substitute; } TT_SBit_ScaleRec, *TT_SBit_Scale; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * @struct: * TT_Post_NamesRec * * @description: * Postscript names table, either format 2.0 or 2.5. * * @fields: * loaded :: * A flag to indicate whether the PS names are loaded. * * num_glyphs :: * The number of named glyphs in the table. * * num_names :: * The number of PS names stored in the table. * * glyph_indices :: * The indices of the glyphs in the names arrays. * * glyph_names :: * The PS names not in Mac Encoding. */ typedef struct TT_Post_NamesRec_ { FT_Bool loaded; FT_UShort num_glyphs; FT_UShort num_names; FT_UShort* glyph_indices; FT_Byte** glyph_names; } TT_Post_NamesRec, *TT_Post_Names; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** GX VARIATION TABLE SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT typedef struct GX_BlendRec_ *GX_Blend; #endif /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* * These types are used to support a `BDF ' table that isn't part of the * official TrueType specification. It is mainly used in SFNT-based bitmap * fonts that were generated from a set of BDF fonts. * * The format of the table is as follows. * * USHORT version `BDF ' table version number, should be 0x0001. USHORT * strikeCount Number of strikes (bitmap sizes) in this table. ULONG * stringTable Offset (from start of BDF table) to string * table. * * This is followed by an array of `strikeCount' descriptors, having the * following format. * * USHORT ppem Vertical pixels per EM for this strike. USHORT numItems * Number of items for this strike (properties and * atoms). Maximum is 255. * * This array in turn is followed by `strikeCount' value sets. Each `value * set' is an array of `numItems' items with the following format. * * ULONG item_name Offset in string table to item name. * USHORT item_type The item type. Possible values are * 0 => string (e.g., COMMENT) * 1 => atom (e.g., FONT or even SIZE) * 2 => int32 * 3 => uint32 * 0x10 => A flag to indicate a properties. This * is ORed with the above values. * ULONG item_value For strings => Offset into string table without * the corresponding double quotes. * For atoms => Offset into string table. * For integers => Direct value. * * All strings in the string table consist of bytes and are * zero-terminated. * */ #ifdef TT_CONFIG_OPTION_BDF typedef struct TT_BDFRec_ { FT_Byte* table; FT_Byte* table_end; FT_Byte* strings; FT_ULong strings_size; FT_UInt num_strikes; FT_Bool loaded; } TT_BDFRec, *TT_BDF; #endif /* TT_CONFIG_OPTION_BDF */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * This structure/class is defined here because it is common to the * following formats: TTF, OpenType-TT, and OpenType-CFF. * * Note, however, that the classes TT_Size and TT_GlyphSlot are not shared * between font drivers, and are thus defined in `ttobjs.h`. * */ /************************************************************************** * * @type: * TT_Face * * @description: * A handle to a TrueType face/font object. A TT_Face encapsulates the * resolution and scaling independent parts of a TrueType font resource. * * @note: * The TT_Face structure is also used as a 'parent class' for the * OpenType-CFF class (T2_Face). */ typedef struct TT_FaceRec_* TT_Face; /* a function type used for the truetype bytecode interpreter hooks */ typedef FT_Error (*TT_Interpreter)( void* exec_context ); /* forward declaration */ typedef struct TT_LoaderRec_* TT_Loader; /************************************************************************** * * @functype: * TT_Loader_GotoTableFunc * * @description: * Seeks a stream to the start of a given TrueType table. * * @input: * face :: * A handle to the target face object. * * tag :: * A 4-byte tag used to name the table. * * stream :: * The input stream. * * @output: * length :: * The length of the table in bytes. Set to 0 if not needed. * * @return: * FreeType error code. 0 means success. * * @note: * The stream cursor must be at the font file's origin. */ typedef FT_Error (*TT_Loader_GotoTableFunc)( TT_Face face, FT_ULong tag, FT_Stream stream, FT_ULong* length ); /************************************************************************** * * @functype: * TT_Loader_StartGlyphFunc * * @description: * Seeks a stream to the start of a given glyph element, and opens a * frame for it. * * @input: * loader :: * The current TrueType glyph loader object. * * glyph index :: The index of the glyph to access. * * offset :: * The offset of the glyph according to the 'locations' table. * * byte_count :: * The size of the frame in bytes. * * @return: * FreeType error code. 0 means success. * * @note: * This function is normally equivalent to FT_STREAM_SEEK(offset) * followed by FT_FRAME_ENTER(byte_count) with the loader's stream, but * alternative formats (e.g. compressed ones) might use something * different. */ typedef FT_Error (*TT_Loader_StartGlyphFunc)( TT_Loader loader, FT_UInt glyph_index, FT_ULong offset, FT_UInt byte_count ); /************************************************************************** * * @functype: * TT_Loader_ReadGlyphFunc * * @description: * Reads one glyph element (its header, a simple glyph, or a composite) * from the loader's current stream frame. * * @input: * loader :: * The current TrueType glyph loader object. * * @return: * FreeType error code. 0 means success. */ typedef FT_Error (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); /************************************************************************** * * @functype: * TT_Loader_EndGlyphFunc * * @description: * Closes the current loader stream frame for the glyph. * * @input: * loader :: * The current TrueType glyph loader object. */ typedef void (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); typedef enum TT_SbitTableType_ { TT_SBIT_TABLE_TYPE_NONE = 0, TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */ /* `bloc' (Apple) */ TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google) */ TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple) */ /* do not remove */ TT_SBIT_TABLE_TYPE_MAX } TT_SbitTableType; /* OpenType 1.8 brings new tables for variation font support; */ /* to make the old MM and GX fonts still work we need to check */ /* the presence (and validity) of the functionality provided */ /* by those tables. The following flag macros are for the */ /* field `variation_support'. */ /* */ /* Note that `fvar' gets checked immediately at font loading, */ /* while the other features are only loaded if MM support is */ /* actually requested. */ /* FVAR */ #define TT_FACE_FLAG_VAR_FVAR ( 1 << 0 ) /* HVAR */ #define TT_FACE_FLAG_VAR_HADVANCE ( 1 << 1 ) #define TT_FACE_FLAG_VAR_LSB ( 1 << 2 ) #define TT_FACE_FLAG_VAR_RSB ( 1 << 3 ) /* VVAR */ #define TT_FACE_FLAG_VAR_VADVANCE ( 1 << 4 ) #define TT_FACE_FLAG_VAR_TSB ( 1 << 5 ) #define TT_FACE_FLAG_VAR_BSB ( 1 << 6 ) #define TT_FACE_FLAG_VAR_VORG ( 1 << 7 ) /* MVAR */ #define TT_FACE_FLAG_VAR_MVAR ( 1 << 8 ) /************************************************************************** * * TrueType Face Type * * @struct: * TT_Face * * @description: * The TrueType face class. These objects model the resolution and * point-size independent data found in a TrueType font file. * * @fields: * root :: * The base FT_Face structure, managed by the base layer. * * ttc_header :: * The TrueType collection header, used when the file is a 'ttc' rather * than a 'ttf'. For ordinary font files, the field `ttc_header.count` * is set to 0. * * format_tag :: * The font format tag. * * num_tables :: * The number of TrueType tables in this font file. * * dir_tables :: * The directory of TrueType tables for this font file. * * header :: * The font's font header ('head' table). Read on font opening. * * horizontal :: * The font's horizontal header ('hhea' table). This field also * contains the associated horizontal metrics table ('hmtx'). * * max_profile :: * The font's maximum profile table. Read on font opening. Note that * some maximum values cannot be taken directly from this table. We * thus define additional fields below to hold the computed maxima. * * vertical_info :: * A boolean which is set when the font file contains vertical metrics. * If not, the value of the 'vertical' field is undefined. * * vertical :: * The font's vertical header ('vhea' table). This field also contains * the associated vertical metrics table ('vmtx'), if found. * IMPORTANT: The contents of this field is undefined if the * `vertical_info` field is unset. * * num_names :: * The number of name records within this TrueType font. * * name_table :: * The table of name records ('name'). * * os2 :: * The font's OS/2 table ('OS/2'). * * postscript :: * The font's PostScript table ('post' table). The PostScript glyph * names are not loaded by the driver on face opening. See the * 'ttpost' module for more details. * * cmap_table :: * Address of the face's 'cmap' SFNT table in memory (it's an extracted * frame). * * cmap_size :: * The size in bytes of the `cmap_table` described above. * * goto_table :: * A function called by each TrueType table loader to position a * stream's cursor to the start of a given table according to its tag. * It defaults to TT_Goto_Face but can be different for strange formats * (e.g. Type 42). * * access_glyph_frame :: * A function used to access the frame of a given glyph within the * face's font file. * * forget_glyph_frame :: * A function used to forget the frame of a given glyph when all data * has been loaded. * * read_glyph_header :: * A function used to read a glyph header. It must be called between * an 'access' and 'forget'. * * read_simple_glyph :: * A function used to read a simple glyph. It must be called after the * header was read, and before the 'forget'. * * read_composite_glyph :: * A function used to read a composite glyph. It must be called after * the header was read, and before the 'forget'. * * sfnt :: * A pointer to the SFNT service. * * psnames :: * A pointer to the PostScript names service. * * mm :: * A pointer to the Multiple Masters service. * * tt_var :: * A pointer to the Metrics Variations service for the "truetype" * driver. * * face_var :: * A pointer to the Metrics Variations service for this `TT_Face`'s * driver. * * psaux :: * A pointer to the PostScript Auxiliary service. * * gasp :: * The grid-fitting and scaling properties table ('gasp'). This table * is optional in TrueType/OpenType fonts. * * pclt :: * The 'pclt' SFNT table. * * num_sbit_scales :: * The number of sbit scales for this font. * * sbit_scales :: * Array of sbit scales embedded in this font. This table is optional * in a TrueType/OpenType font. * * postscript_names :: * A table used to store the Postscript names of the glyphs for this * font. See the file `ttconfig.h` for comments on the * TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. * * palette_data :: * Some fields from the 'CPAL' table that are directly indexed. * * palette_index :: * The current palette index, as set by @FT_Palette_Select. * * palette :: * An array containing the current palette's colors. * * have_foreground_color :: * There was a call to @FT_Palette_Set_Foreground_Color. * * foreground_color :: * The current foreground color corresponding to 'CPAL' color index * 0xFFFF. Only valid if `have_foreground_color` is set. * * font_program_size :: * Size in bytecodes of the face's font program. 0 if none defined. * Ignored for Type 2 fonts. * * font_program :: * The face's font program (bytecode stream) executed at load time, * also used during glyph rendering. Comes from the 'fpgm' table. * Ignored for Type 2 font fonts. * * cvt_program_size :: * The size in bytecodes of the face's cvt program. Ignored for Type 2 * fonts. * * cvt_program :: * The face's cvt program (bytecode stream) executed each time an * instance/size is changed/reset. Comes from the 'prep' table. * Ignored for Type 2 fonts. * * cvt_size :: * Size of the control value table (in entries). Ignored for Type 2 * fonts. * * cvt :: * The face's original control value table. Coordinates are expressed * in unscaled font units (in 26.6 format). Comes from the 'cvt~' * table. Ignored for Type 2 fonts. * * If varied by the `CVAR' table, non-integer values are possible. * * interpreter :: * A pointer to the TrueType bytecode interpreters field is also used * to hook the debugger in 'ttdebug'. * * extra :: * Reserved for third-party font drivers. * * postscript_name :: * The PS name of the font. Used by the postscript name service. * * glyf_len :: * The length of the 'glyf' table. Needed for malformed 'loca' tables. * * glyf_offset :: * The file offset of the 'glyf' table. * * is_cff2 :: * Set if the font format is CFF2. * * doblend :: * A boolean which is set if the font should be blended (this is for GX * var). * * blend :: * Contains the data needed to control GX variation tables (rather like * Multiple Master data). * * variation_support :: * Flags that indicate which OpenType functionality related to font * variation support is present, valid, and usable. For example, * TT_FACE_FLAG_VAR_FVAR is only set if we have at least one design * axis. * * var_postscript_prefix :: * The PostScript name prefix needed for constructing a variation font * instance's PS name . * * var_postscript_prefix_len :: * The length of the `var_postscript_prefix` string. * * var_default_named_instance :: * The index of the default named instance. * * non_var_style_name :: * The non-variation style name, used as a backup. * * horz_metrics_size :: * The size of the 'hmtx' table. * * vert_metrics_size :: * The size of the 'vmtx' table. * * num_locations :: * The number of glyph locations in this TrueType file. This should be * one more than the number of glyphs. Ignored for Type 2 fonts. * * glyph_locations :: * An array of longs. These are offsets to glyph data within the * 'glyf' table. Ignored for Type 2 font faces. * * hdmx_table :: * A pointer to the 'hdmx' table. * * hdmx_table_size :: * The size of the 'hdmx' table. * * hdmx_record_count :: * The number of hdmx records. * * hdmx_record_size :: * The size of a single hdmx record. * * hdmx_records :: * A array of pointers to the 'hdmx' table records sorted by ppem. * * sbit_table :: * A pointer to the font's embedded bitmap location table. * * sbit_table_size :: * The size of `sbit_table`. * * sbit_table_type :: * The sbit table type (CBLC, sbix, etc.). * * sbit_num_strikes :: * The number of sbit strikes exposed by FreeType's API, omitting * invalid strikes. * * sbit_strike_map :: * A mapping between the strike indices exposed by the API and the * indices used in the font's sbit table. * * kern_table :: * A pointer to the 'kern' table. * * kern_table_size :: * The size of the 'kern' table. * * num_kern_tables :: * The number of supported kern subtables (up to 32; FreeType * recognizes only horizontal ones with format 0). * * kern_avail_bits :: * The availability status of kern subtables; if bit n is set, table n * is available. * * kern_order_bits :: * The sortedness status of kern subtables; if bit n is set, table n is * sorted. * * bdf :: * Data related to an SFNT font's 'bdf' table; see `tttypes.h`. * * horz_metrics_offset :: * The file offset of the 'hmtx' table. * * vert_metrics_offset :: * The file offset of the 'vmtx' table. * * ebdt_start :: * The file offset of the sbit data table (CBDT, bdat, etc.). * * ebdt_size :: * The size of the sbit data table. * * cpal :: * A pointer to data related to the 'CPAL' table. `NULL` if the table * is not available. * * colr :: * A pointer to data related to the 'COLR' table. `NULL` if the table * is not available. * * svg :: * A pointer to data related to the 'SVG' table. `NULL` if the table * is not available. */ typedef struct TT_FaceRec_ { FT_FaceRec root; TTC_HeaderRec ttc_header; FT_ULong format_tag; FT_UShort num_tables; TT_Table dir_tables; TT_Header header; /* TrueType header table */ TT_HoriHeader horizontal; /* TrueType horizontal header */ TT_MaxProfile max_profile; FT_Bool vertical_info; TT_VertHeader vertical; /* TT Vertical header, if present */ FT_UShort num_names; /* number of name records */ TT_NameTableRec name_table; /* name table */ TT_OS2 os2; /* TrueType OS/2 table */ TT_Postscript postscript; /* TrueType Postscript table */ FT_Byte* cmap_table; /* extracted `cmap' table */ FT_ULong cmap_size; TT_Loader_GotoTableFunc goto_table; TT_Loader_StartGlyphFunc access_glyph_frame; TT_Loader_EndGlyphFunc forget_glyph_frame; TT_Loader_ReadGlyphFunc read_glyph_header; TT_Loader_ReadGlyphFunc read_simple_glyph; TT_Loader_ReadGlyphFunc read_composite_glyph; /* a typeless pointer to the SFNT_Interface table used to load */ /* the basic TrueType tables in the face object */ void* sfnt; /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ /* handle glyph names <-> unicode & Mac values */ void* psnames; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* a typeless pointer to the FT_Service_MultiMasters table used to */ /* handle variation fonts */ void* mm; /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ /* used to handle the HVAR, VVAR, and MVAR OpenType tables by the */ /* "truetype" driver */ void* tt_var; /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ /* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */ /* TT_Face's driver */ void* face_var; /* since 2.13.1 */ #endif /* a typeless pointer to the PostScript Aux service */ void* psaux; /************************************************************************ * * Optional TrueType/OpenType tables * */ /* grid-fitting and scaling table */ TT_GaspRec gasp; /* the `gasp' table */ /* PCL 5 table */ TT_PCLT pclt; /* embedded bitmaps support */ FT_ULong num_sbit_scales; TT_SBit_Scale sbit_scales; /* postscript names table */ TT_Post_NamesRec postscript_names; /* glyph colors */ FT_Palette_Data palette_data; /* since 2.10 */ FT_UShort palette_index; FT_Color* palette; FT_Bool have_foreground_color; FT_Color foreground_color; /************************************************************************ * * TrueType-specific fields (ignored by the CFF driver) * */ /* the font program, if any */ FT_ULong font_program_size; FT_Byte* font_program; /* the cvt program, if any */ FT_ULong cvt_program_size; FT_Byte* cvt_program; /* the original, unscaled, control value table */ FT_ULong cvt_size; FT_Int32* cvt; /* A pointer to the bytecode interpreter to use. This is also */ /* used to hook the debugger for the `ttdebug' utility. */ TT_Interpreter interpreter; /************************************************************************ * * Other tables or fields. This is used by derivative formats like * OpenType. * */ FT_Generic extra; const char* postscript_name; FT_ULong glyf_len; FT_ULong glyf_offset; /* since 2.7.1 */ FT_Bool is_cff2; /* since 2.7.1 */ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_Bool doblend; GX_Blend blend; FT_UInt32 variation_support; /* since 2.7.1 */ const char* var_postscript_prefix; /* since 2.7.2 */ FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ FT_UInt var_default_named_instance; /* since 2.13.1 */ const char* non_var_style_name; /* since 2.13.1 */ #endif /* since version 2.2 */ FT_ULong horz_metrics_size; FT_ULong vert_metrics_size; FT_ULong num_locations; /* up to 0xFFFF + 1 */ FT_Byte* glyph_locations; FT_Byte* hdmx_table; FT_ULong hdmx_table_size; FT_UInt hdmx_record_count; FT_ULong hdmx_record_size; FT_Byte** hdmx_records; FT_Byte* sbit_table; FT_ULong sbit_table_size; TT_SbitTableType sbit_table_type; FT_UInt sbit_num_strikes; FT_UInt* sbit_strike_map; FT_Byte* kern_table; FT_ULong kern_table_size; FT_UInt num_kern_tables; FT_UInt32 kern_avail_bits; FT_UInt32 kern_order_bits; #ifdef TT_CONFIG_OPTION_GPOS_KERNING FT_Byte* gpos_table; FT_Bool gpos_kerning_available; #endif #ifdef TT_CONFIG_OPTION_BDF TT_BDFRec bdf; #endif /* TT_CONFIG_OPTION_BDF */ /* since 2.3.0 */ FT_ULong horz_metrics_offset; FT_ULong vert_metrics_offset; #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS /* since 2.7 */ FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ FT_ULong ebdt_size; #endif /* since 2.10 */ void* cpal; void* colr; /* since 2.12 */ void* svg; } TT_FaceRec; /************************************************************************** * * @struct: * TT_GlyphZoneRec * * @description: * A glyph zone is used to load, scale and hint glyph outline * coordinates. * * @fields: * memory :: * A handle to the memory manager. * * max_points :: * The maximum size in points of the zone. * * max_contours :: * Max size in links contours of the zone. * * n_points :: * The current number of points in the zone. * * n_contours :: * The current number of contours in the zone. * * org :: * The original glyph coordinates (font units/scaled). * * cur :: * The current glyph coordinates (scaled/hinted). * * tags :: * The point control tags. * * contours :: * The contours end points. * * first_point :: * Offset of the current subglyph's first point. */ typedef struct TT_GlyphZoneRec_ { FT_Memory memory; FT_UShort max_points; FT_UShort max_contours; FT_UShort n_points; /* number of points in zone */ FT_UShort n_contours; /* number of contours */ FT_Vector* org; /* original point coordinates */ FT_Vector* cur; /* current point coordinates */ FT_Vector* orus; /* original (unscaled) point coordinates */ FT_Byte* tags; /* current touch flags */ FT_UShort* contours; /* contour end points */ FT_UShort first_point; /* offset of first (#0) point */ } TT_GlyphZoneRec, *TT_GlyphZone; /* handle to execution context */ typedef struct TT_ExecContextRec_* TT_ExecContext; /************************************************************************** * * @type: * TT_Size * * @description: * A handle to a TrueType size object. */ typedef struct TT_SizeRec_* TT_Size; /* glyph loader structure */ typedef struct TT_LoaderRec_ { TT_Face face; TT_Size size; FT_GlyphSlot glyph; FT_GlyphLoader gloader; FT_ULong load_flags; FT_UInt glyph_index; FT_Stream stream; FT_UInt byte_len; FT_Short n_contours; FT_BBox bbox; FT_Int left_bearing; FT_Int advance; FT_Int linear; FT_Bool linear_def; FT_Vector pp1; FT_Vector pp2; /* the zone where we load our glyphs */ TT_GlyphZoneRec base; TT_GlyphZoneRec zone; TT_ExecContext exec; FT_Byte* instructions; FT_ULong ins_pos; /* for possible extensibility in other formats */ void* other; /* since version 2.1.8 */ FT_Int top_bearing; FT_Int vadvance; FT_Vector pp3; FT_Vector pp4; /* since version 2.2.1 */ FT_Byte* cursor; FT_Byte* limit; /* since version 2.6.2 */ FT_ListRec composites; /* since version 2.11.2 */ FT_Byte* widthp; } TT_LoaderRec; FT_END_HEADER #endif /* TTTYPES_H_ */ /* END */