1 /***************************************************************************/ 2 /* */ 3 /* ftgloadr.h */ 4 /* */ 5 /* The FreeType glyph loader (specification). */ 6 /* */ 7 /* Copyright 2002-2015 by */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg */ 9 /* */ 10 /* This file is part of the FreeType project, and may only be used, */ 11 /* modified, and distributed under the terms of the FreeType project */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13 /* this file you indicate that you have read the license and */ 14 /* understand and accept it fully. */ 15 /* */ 16 /***************************************************************************/ 17 18 19 #ifndef __FTGLOADR_H__ 20 #define __FTGLOADR_H__ 21 22 23 #include <ft2build.h> 24 #include FT_FREETYPE_H 25 26 27 FT_BEGIN_HEADER 28 29 30 /*************************************************************************/ 31 /* */ 32 /* <Struct> */ 33 /* FT_GlyphLoader */ 34 /* */ 35 /* <Description> */ 36 /* The glyph loader is an internal object used to load several glyphs */ 37 /* together (for example, in the case of composites). */ 38 /* */ 39 /* <Note> */ 40 /* The glyph loader implementation is not part of the high-level API, */ 41 /* hence the forward structure declaration. */ 42 /* */ 43 typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; 44 45 46 #if 0 /* moved to freetype.h in version 2.2 */ 47 #define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 48 #define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 49 #define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 50 #define FT_SUBGLYPH_FLAG_SCALE 8 51 #define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 52 #define FT_SUBGLYPH_FLAG_2X2 0x80 53 #define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 54 #endif 55 56 57 typedef struct FT_SubGlyphRec_ 58 { 59 FT_Int index; 60 FT_UShort flags; 61 FT_Int arg1; 62 FT_Int arg2; 63 FT_Matrix transform; 64 65 } FT_SubGlyphRec; 66 67 68 typedef struct FT_GlyphLoadRec_ 69 { 70 FT_Outline outline; /* outline */ 71 FT_Vector* extra_points; /* extra points table */ 72 FT_Vector* extra_points2; /* second extra points table */ 73 FT_UInt num_subglyphs; /* number of subglyphs */ 74 FT_SubGlyph subglyphs; /* subglyphs */ 75 76 } FT_GlyphLoadRec, *FT_GlyphLoad; 77 78 79 typedef struct FT_GlyphLoaderRec_ 80 { 81 FT_Memory memory; 82 FT_UInt max_points; 83 FT_UInt max_contours; 84 FT_UInt max_subglyphs; 85 FT_Bool use_extra; 86 87 FT_GlyphLoadRec base; 88 FT_GlyphLoadRec current; 89 90 void* other; /* for possible future extension? */ 91 92 } FT_GlyphLoaderRec; 93 94 95 /* create new empty glyph loader */ 96 FT_BASE( FT_Error ) 97 FT_GlyphLoader_New( FT_Memory memory, 98 FT_GlyphLoader *aloader ); 99 100 /* add an extra points table to a glyph loader */ 101 FT_BASE( FT_Error ) 102 FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); 103 104 /* destroy a glyph loader */ 105 FT_BASE( void ) 106 FT_GlyphLoader_Done( FT_GlyphLoader loader ); 107 108 /* reset a glyph loader (frees everything int it) */ 109 FT_BASE( void ) 110 FT_GlyphLoader_Reset( FT_GlyphLoader loader ); 111 112 /* rewind a glyph loader */ 113 FT_BASE( void ) 114 FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); 115 116 /* check that there is enough space to add `n_points' and `n_contours' */ 117 /* to the glyph loader */ 118 FT_BASE( FT_Error ) 119 FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, 120 FT_UInt n_points, 121 FT_UInt n_contours ); 122 123 124 #define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ 125 ( (_count) == 0 || \ 126 ( (FT_UInt)(_loader)->base.outline.n_points + \ 127 (FT_UInt)(_loader)->current.outline.n_points + \ 128 (FT_UInt)(_count) ) <= (_loader)->max_points ) 129 130 #define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ 131 ( (_count) == 0 || \ 132 ( (FT_UInt)(_loader)->base.outline.n_contours + \ 133 (FT_UInt)(_loader)->current.outline.n_contours + \ 134 (FT_UInt)(_count) ) <= (_loader)->max_contours ) 135 136 #define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \ 137 ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ 138 FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ 139 ? 0 \ 140 : FT_GlyphLoader_CheckPoints( (_loader), \ 141 (FT_UInt)(_points), \ 142 (FT_UInt)(_contours) ) ) 143 144 145 /* check that there is enough space to add `n_subs' sub-glyphs to */ 146 /* a glyph loader */ 147 FT_BASE( FT_Error ) 148 FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, 149 FT_UInt n_subs ); 150 151 /* prepare a glyph loader, i.e. empty the current glyph */ 152 FT_BASE( void ) 153 FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); 154 155 /* add the current glyph to the base glyph */ 156 FT_BASE( void ) 157 FT_GlyphLoader_Add( FT_GlyphLoader loader ); 158 159 /* copy points from one glyph loader to another */ 160 FT_BASE( FT_Error ) 161 FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, 162 FT_GlyphLoader source ); 163 164 /* */ 165 166 167 FT_END_HEADER 168 169 #endif /* __FTGLOADR_H__ */ 170 171 172 /* END */ 173