| 1 | /**************************************************************************** |
| 2 | * |
| 3 | * ftincrem.h |
| 4 | * |
| 5 | * FreeType incremental loading (specification). |
| 6 | * |
| 7 | * Copyright (C) 2002-2023 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 FTINCREM_H_ |
| 20 | #define FTINCREM_H_ |
| 21 | |
| 22 | #include <freetype/freetype.h> |
| 23 | #include <freetype/ftparams.h> |
| 24 | |
| 25 | #ifdef FREETYPE_H |
| 26 | #error "freetype.h of FreeType 1 has been loaded!" |
| 27 | #error "Please fix the directory search order for header files" |
| 28 | #error "so that freetype.h of FreeType 2 is found first." |
| 29 | #endif |
| 30 | |
| 31 | |
| 32 | FT_BEGIN_HEADER |
| 33 | |
| 34 | /************************************************************************** |
| 35 | * |
| 36 | * @section: |
| 37 | * incremental |
| 38 | * |
| 39 | * @title: |
| 40 | * Incremental Loading |
| 41 | * |
| 42 | * @abstract: |
| 43 | * Custom Glyph Loading. |
| 44 | * |
| 45 | * @description: |
| 46 | * This section contains various functions used to perform so-called |
| 47 | * 'incremental' glyph loading. This is a mode where all glyphs loaded |
| 48 | * from a given @FT_Face are provided by the client application. |
| 49 | * |
| 50 | * Apart from that, all other tables are loaded normally from the font |
| 51 | * file. This mode is useful when FreeType is used within another |
| 52 | * engine, e.g., a PostScript Imaging Processor. |
| 53 | * |
| 54 | * To enable this mode, you must use @FT_Open_Face, passing an |
| 55 | * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an |
| 56 | * @FT_Incremental_Interface value. See the comments for |
| 57 | * @FT_Incremental_InterfaceRec for an example. |
| 58 | * |
| 59 | */ |
| 60 | |
| 61 | |
| 62 | /************************************************************************** |
| 63 | * |
| 64 | * @type: |
| 65 | * FT_Incremental |
| 66 | * |
| 67 | * @description: |
| 68 | * An opaque type describing a user-provided object used to implement |
| 69 | * 'incremental' glyph loading within FreeType. This is used to support |
| 70 | * embedded fonts in certain environments (e.g., PostScript |
| 71 | * interpreters), where the glyph data isn't in the font file, or must be |
| 72 | * overridden by different values. |
| 73 | * |
| 74 | * @note: |
| 75 | * It is up to client applications to create and implement |
| 76 | * @FT_Incremental objects, as long as they provide implementations for |
| 77 | * the methods @FT_Incremental_GetGlyphDataFunc, |
| 78 | * @FT_Incremental_FreeGlyphDataFunc and |
| 79 | * @FT_Incremental_GetGlyphMetricsFunc. |
| 80 | * |
| 81 | * See the description of @FT_Incremental_InterfaceRec to understand how |
| 82 | * to use incremental objects with FreeType. |
| 83 | * |
| 84 | */ |
| 85 | typedef struct FT_IncrementalRec_* FT_Incremental; |
| 86 | |
| 87 | |
| 88 | /************************************************************************** |
| 89 | * |
| 90 | * @struct: |
| 91 | * FT_Incremental_MetricsRec |
| 92 | * |
| 93 | * @description: |
| 94 | * A small structure used to contain the basic glyph metrics returned by |
| 95 | * the @FT_Incremental_GetGlyphMetricsFunc method. |
| 96 | * |
| 97 | * @fields: |
| 98 | * bearing_x :: |
| 99 | * Left bearing, in font units. |
| 100 | * |
| 101 | * bearing_y :: |
| 102 | * Top bearing, in font units. |
| 103 | * |
| 104 | * advance :: |
| 105 | * Horizontal component of glyph advance, in font units. |
| 106 | * |
| 107 | * advance_v :: |
| 108 | * Vertical component of glyph advance, in font units. |
| 109 | * |
| 110 | * @note: |
| 111 | * These correspond to horizontal or vertical metrics depending on the |
| 112 | * value of the `vertical` argument to the function |
| 113 | * @FT_Incremental_GetGlyphMetricsFunc. |
| 114 | * |
| 115 | */ |
| 116 | typedef struct FT_Incremental_MetricsRec_ |
| 117 | { |
| 118 | FT_Long bearing_x; |
| 119 | FT_Long bearing_y; |
| 120 | FT_Long advance; |
| 121 | FT_Long advance_v; /* since 2.3.12 */ |
| 122 | |
| 123 | } FT_Incremental_MetricsRec; |
| 124 | |
| 125 | |
| 126 | /************************************************************************** |
| 127 | * |
| 128 | * @struct: |
| 129 | * FT_Incremental_Metrics |
| 130 | * |
| 131 | * @description: |
| 132 | * A handle to an @FT_Incremental_MetricsRec structure. |
| 133 | * |
| 134 | */ |
| 135 | typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; |
| 136 | |
| 137 | |
| 138 | /************************************************************************** |
| 139 | * |
| 140 | * @type: |
| 141 | * FT_Incremental_GetGlyphDataFunc |
| 142 | * |
| 143 | * @description: |
| 144 | * A function called by FreeType to access a given glyph's data bytes |
| 145 | * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is |
| 146 | * enabled. |
| 147 | * |
| 148 | * Note that the format of the glyph's data bytes depends on the font |
| 149 | * file format. For TrueType, it must correspond to the raw bytes within |
| 150 | * the 'glyf' table. For PostScript formats, it must correspond to the |
| 151 | * **unencrypted** charstring bytes, without any `lenIV` header. It is |
| 152 | * undefined for any other format. |
| 153 | * |
| 154 | * @input: |
| 155 | * incremental :: |
| 156 | * Handle to an opaque @FT_Incremental handle provided by the client |
| 157 | * application. |
| 158 | * |
| 159 | * glyph_index :: |
| 160 | * Index of relevant glyph. |
| 161 | * |
| 162 | * @output: |
| 163 | * adata :: |
| 164 | * A structure describing the returned glyph data bytes (which will be |
| 165 | * accessed as a read-only byte block). |
| 166 | * |
| 167 | * @return: |
| 168 | * FreeType error code. 0~means success. |
| 169 | * |
| 170 | * @note: |
| 171 | * If this function returns successfully the method |
| 172 | * @FT_Incremental_FreeGlyphDataFunc will be called later to release the |
| 173 | * data bytes. |
| 174 | * |
| 175 | * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for |
| 176 | * compound glyphs. |
| 177 | * |
| 178 | */ |
| 179 | typedef FT_Error |
| 180 | (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, |
| 181 | FT_UInt glyph_index, |
| 182 | FT_Data* adata ); |
| 183 | |
| 184 | |
| 185 | /************************************************************************** |
| 186 | * |
| 187 | * @type: |
| 188 | * FT_Incremental_FreeGlyphDataFunc |
| 189 | * |
| 190 | * @description: |
| 191 | * A function used to release the glyph data bytes returned by a |
| 192 | * successful call to @FT_Incremental_GetGlyphDataFunc. |
| 193 | * |
| 194 | * @input: |
| 195 | * incremental :: |
| 196 | * A handle to an opaque @FT_Incremental handle provided by the client |
| 197 | * application. |
| 198 | * |
| 199 | * data :: |
| 200 | * A structure describing the glyph data bytes (which will be accessed |
| 201 | * as a read-only byte block). |
| 202 | * |
| 203 | */ |
| 204 | typedef void |
| 205 | (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, |
| 206 | FT_Data* data ); |
| 207 | |
| 208 | |
| 209 | /************************************************************************** |
| 210 | * |
| 211 | * @type: |
| 212 | * FT_Incremental_GetGlyphMetricsFunc |
| 213 | * |
| 214 | * @description: |
| 215 | * A function used to retrieve the basic metrics of a given glyph index |
| 216 | * before accessing its data. This allows for handling font types such |
| 217 | * as PCL~XL Format~1, Class~2 downloaded TrueType fonts, where the glyph |
| 218 | * metrics (`hmtx` and `vmtx` tables) are permitted to be omitted from |
| 219 | * the font, and the relevant metrics included in the header of the glyph |
| 220 | * outline data. Importantly, this is not intended to allow custom glyph |
| 221 | * metrics (for example, Postscript Metrics dictionaries), because that |
| 222 | * conflicts with the requirements of outline hinting. Such custom |
| 223 | * metrics must be handled separately, by the calling application. |
| 224 | * |
| 225 | * @input: |
| 226 | * incremental :: |
| 227 | * A handle to an opaque @FT_Incremental handle provided by the client |
| 228 | * application. |
| 229 | * |
| 230 | * glyph_index :: |
| 231 | * Index of relevant glyph. |
| 232 | * |
| 233 | * vertical :: |
| 234 | * If true, return vertical metrics. |
| 235 | * |
| 236 | * ametrics :: |
| 237 | * This parameter is used for both input and output. The original |
| 238 | * glyph metrics, if any, in font units. If metrics are not available |
| 239 | * all the values must be set to zero. |
| 240 | * |
| 241 | * @output: |
| 242 | * ametrics :: |
| 243 | * The glyph metrics in font units. |
| 244 | * |
| 245 | */ |
| 246 | typedef FT_Error |
| 247 | (*FT_Incremental_GetGlyphMetricsFunc) |
| 248 | ( FT_Incremental incremental, |
| 249 | FT_UInt glyph_index, |
| 250 | FT_Bool vertical, |
| 251 | FT_Incremental_MetricsRec *ametrics ); |
| 252 | |
| 253 | |
| 254 | /************************************************************************** |
| 255 | * |
| 256 | * @struct: |
| 257 | * FT_Incremental_FuncsRec |
| 258 | * |
| 259 | * @description: |
| 260 | * A table of functions for accessing fonts that load data incrementally. |
| 261 | * Used in @FT_Incremental_InterfaceRec. |
| 262 | * |
| 263 | * @fields: |
| 264 | * get_glyph_data :: |
| 265 | * The function to get glyph data. Must not be null. |
| 266 | * |
| 267 | * free_glyph_data :: |
| 268 | * The function to release glyph data. Must not be null. |
| 269 | * |
| 270 | * get_glyph_metrics :: |
| 271 | * The function to get glyph metrics. May be null if the font does not |
| 272 | * require it. |
| 273 | * |
| 274 | */ |
| 275 | typedef struct FT_Incremental_FuncsRec_ |
| 276 | { |
| 277 | FT_Incremental_GetGlyphDataFunc get_glyph_data; |
| 278 | FT_Incremental_FreeGlyphDataFunc free_glyph_data; |
| 279 | FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; |
| 280 | |
| 281 | } FT_Incremental_FuncsRec; |
| 282 | |
| 283 | |
| 284 | /************************************************************************** |
| 285 | * |
| 286 | * @struct: |
| 287 | * FT_Incremental_InterfaceRec |
| 288 | * |
| 289 | * @description: |
| 290 | * A structure to be used with @FT_Open_Face to indicate that the user |
| 291 | * wants to support incremental glyph loading. You should use it with |
| 292 | * @FT_PARAM_TAG_INCREMENTAL as in the following example: |
| 293 | * |
| 294 | * ``` |
| 295 | * FT_Incremental_InterfaceRec inc_int; |
| 296 | * FT_Parameter parameter; |
| 297 | * FT_Open_Args open_args; |
| 298 | * |
| 299 | * |
| 300 | * // set up incremental descriptor |
| 301 | * inc_int.funcs = my_funcs; |
| 302 | * inc_int.object = my_object; |
| 303 | * |
| 304 | * // set up optional parameter |
| 305 | * parameter.tag = FT_PARAM_TAG_INCREMENTAL; |
| 306 | * parameter.data = &inc_int; |
| 307 | * |
| 308 | * // set up FT_Open_Args structure |
| 309 | * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; |
| 310 | * open_args.pathname = my_font_pathname; |
| 311 | * open_args.num_params = 1; |
| 312 | * open_args.params = ¶meter; // we use one optional argument |
| 313 | * |
| 314 | * // open the font |
| 315 | * error = FT_Open_Face( library, &open_args, index, &face ); |
| 316 | * ... |
| 317 | * ``` |
| 318 | * |
| 319 | */ |
| 320 | typedef struct FT_Incremental_InterfaceRec_ |
| 321 | { |
| 322 | const FT_Incremental_FuncsRec* funcs; |
| 323 | FT_Incremental object; |
| 324 | |
| 325 | } FT_Incremental_InterfaceRec; |
| 326 | |
| 327 | |
| 328 | /************************************************************************** |
| 329 | * |
| 330 | * @type: |
| 331 | * FT_Incremental_Interface |
| 332 | * |
| 333 | * @description: |
| 334 | * A pointer to an @FT_Incremental_InterfaceRec structure. |
| 335 | * |
| 336 | */ |
| 337 | typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; |
| 338 | |
| 339 | |
| 340 | /* */ |
| 341 | |
| 342 | |
| 343 | FT_END_HEADER |
| 344 | |
| 345 | #endif /* FTINCREM_H_ */ |
| 346 | |
| 347 | |
| 348 | /* END */ |
| 349 | |