1 /**************************************************************************** 2 * 3 * ttgxvar.h 4 * 5 * TrueType GX Font Variation loader (specification) 6 * 7 * Copyright (C) 2004-2023 by 8 * David Turner, Robert Wilhelm, Werner Lemberg and George Williams. 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 TTGXVAR_H_ 20 #define TTGXVAR_H_ 21 22 23 #include <freetype/internal/ftmmtypes.h> 24 #include "ttobjs.h" 25 26 27 FT_BEGIN_HEADER 28 29 30 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT 31 32 /************************************************************************** 33 * 34 * @Struct: 35 * GX_AVarCorrespondenceRec 36 * 37 * @Description: 38 * A data structure representing `shortFracCorrespondence' in `avar' 39 * table according to the specifications from Apple. 40 */ 41 typedef struct GX_AVarCorrespondenceRec_ 42 { 43 FT_Fixed fromCoord; 44 FT_Fixed toCoord; 45 46 } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; 47 48 49 /************************************************************************** 50 * 51 * @Struct: 52 * GX_AVarRec 53 * 54 * @Description: 55 * Data from the segment field of `avar' table. 56 * There is one of these for each axis. 57 */ 58 typedef struct GX_AVarSegmentRec_ 59 { 60 FT_UShort pairCount; 61 GX_AVarCorrespondence correspondence; /* array with pairCount entries */ 62 63 } GX_AVarSegmentRec, *GX_AVarSegment; 64 65 66 /************************************************************************** 67 * 68 * @Struct: 69 * GX_AVarTableRec 70 * 71 * @Description: 72 * Data from the `avar' table. 73 */ 74 typedef struct GX_AVarTableRec_ 75 { 76 GX_AVarSegment avar_segment; /* avar_segment[num_axis] */ 77 GX_ItemVarStoreRec itemStore; /* Item Variation Store */ 78 GX_DeltaSetIdxMapRec axisMap; /* Axis Mapping */ 79 80 } GX_AVarTableRec, *GX_AVarTable; 81 82 83 /************************************************************************** 84 * 85 * @Struct: 86 * GX_HVVarTableRec 87 * 88 * @Description: 89 * Data from either the `HVAR' or `VVAR' table. 90 */ 91 typedef struct GX_HVVarTableRec_ 92 { 93 GX_ItemVarStoreRec itemStore; /* Item Variation Store */ 94 GX_DeltaSetIdxMapRec widthMap; /* Advance Width Mapping */ 95 96 #if 0 97 GX_DeltaSetIdxMapRec lsbMap; /* not implemented */ 98 GX_DeltaSetIdxMapRec rsbMap; /* not implemented */ 99 100 GX_DeltaSetIdxMapRec tsbMap; /* not implemented */ 101 GX_DeltaSetIdxMapRec bsbMap; /* not implemented */ 102 GX_DeltaSetIdxMapRec vorgMap; /* not implemented */ 103 #endif 104 105 } GX_HVVarTableRec, *GX_HVVarTable; 106 107 108 #define MVAR_TAG_GASP_0 FT_MAKE_TAG( 'g', 's', 'p', '0' ) 109 #define MVAR_TAG_GASP_1 FT_MAKE_TAG( 'g', 's', 'p', '1' ) 110 #define MVAR_TAG_GASP_2 FT_MAKE_TAG( 'g', 's', 'p', '2' ) 111 #define MVAR_TAG_GASP_3 FT_MAKE_TAG( 'g', 's', 'p', '3' ) 112 #define MVAR_TAG_GASP_4 FT_MAKE_TAG( 'g', 's', 'p', '4' ) 113 #define MVAR_TAG_GASP_5 FT_MAKE_TAG( 'g', 's', 'p', '5' ) 114 #define MVAR_TAG_GASP_6 FT_MAKE_TAG( 'g', 's', 'p', '6' ) 115 #define MVAR_TAG_GASP_7 FT_MAKE_TAG( 'g', 's', 'p', '7' ) 116 #define MVAR_TAG_GASP_8 FT_MAKE_TAG( 'g', 's', 'p', '8' ) 117 #define MVAR_TAG_GASP_9 FT_MAKE_TAG( 'g', 's', 'p', '9' ) 118 119 #define MVAR_TAG_CPHT FT_MAKE_TAG( 'c', 'p', 'h', 't' ) 120 #define MVAR_TAG_HASC FT_MAKE_TAG( 'h', 'a', 's', 'c' ) 121 #define MVAR_TAG_HCLA FT_MAKE_TAG( 'h', 'c', 'l', 'a' ) 122 #define MVAR_TAG_HCLD FT_MAKE_TAG( 'h', 'c', 'l', 'd' ) 123 #define MVAR_TAG_HCOF FT_MAKE_TAG( 'h', 'c', 'o', 'f' ) 124 #define MVAR_TAG_HCRN FT_MAKE_TAG( 'h', 'c', 'r', 'n' ) 125 #define MVAR_TAG_HCRS FT_MAKE_TAG( 'h', 'c', 'r', 's' ) 126 #define MVAR_TAG_HDSC FT_MAKE_TAG( 'h', 'd', 's', 'c' ) 127 #define MVAR_TAG_HLGP FT_MAKE_TAG( 'h', 'l', 'g', 'p' ) 128 #define MVAR_TAG_SBXO FT_MAKE_TAG( 's', 'b', 'x', 'o' ) 129 #define MVAR_TAG_SBXS FT_MAKE_TAG( 's', 'b', 'x', 's' ) 130 #define MVAR_TAG_SBYO FT_MAKE_TAG( 's', 'b', 'y', 'o' ) 131 #define MVAR_TAG_SBYS FT_MAKE_TAG( 's', 'b', 'y', 's' ) 132 #define MVAR_TAG_SPXO FT_MAKE_TAG( 's', 'p', 'x', 'o' ) 133 #define MVAR_TAG_SPXS FT_MAKE_TAG( 's', 'p', 'x', 's' ) 134 #define MVAR_TAG_SPYO FT_MAKE_TAG( 's', 'p', 'y', 'o' ) 135 #define MVAR_TAG_SPYS FT_MAKE_TAG( 's', 'p', 'y', 's' ) 136 #define MVAR_TAG_STRO FT_MAKE_TAG( 's', 't', 'r', 'o' ) 137 #define MVAR_TAG_STRS FT_MAKE_TAG( 's', 't', 'r', 's' ) 138 #define MVAR_TAG_UNDO FT_MAKE_TAG( 'u', 'n', 'd', 'o' ) 139 #define MVAR_TAG_UNDS FT_MAKE_TAG( 'u', 'n', 'd', 's' ) 140 #define MVAR_TAG_VASC FT_MAKE_TAG( 'v', 'a', 's', 'c' ) 141 #define MVAR_TAG_VCOF FT_MAKE_TAG( 'v', 'c', 'o', 'f' ) 142 #define MVAR_TAG_VCRN FT_MAKE_TAG( 'v', 'c', 'r', 'n' ) 143 #define MVAR_TAG_VCRS FT_MAKE_TAG( 'v', 'c', 'r', 's' ) 144 #define MVAR_TAG_VDSC FT_MAKE_TAG( 'v', 'd', 's', 'c' ) 145 #define MVAR_TAG_VLGP FT_MAKE_TAG( 'v', 'l', 'g', 'p' ) 146 #define MVAR_TAG_XHGT FT_MAKE_TAG( 'x', 'h', 'g', 't' ) 147 148 149 typedef struct GX_ValueRec_ 150 { 151 FT_ULong tag; 152 FT_UShort outerIndex; 153 FT_UShort innerIndex; 154 155 FT_Short unmodified; /* values are either FT_Short or FT_UShort */ 156 157 } GX_ValueRec, *GX_Value; 158 159 160 /************************************************************************** 161 * 162 * @Struct: 163 * GX_MVarTableRec 164 * 165 * @Description: 166 * Data from the `MVAR' table. 167 */ 168 typedef struct GX_MVarTableRec_ 169 { 170 FT_UShort valueCount; 171 172 GX_ItemVarStoreRec itemStore; /* Item Variation Store */ 173 GX_Value values; /* Value Records */ 174 175 } GX_MVarTableRec, *GX_MVarTable; 176 177 178 /************************************************************************** 179 * 180 * @Struct: 181 * GX_BlendRec 182 * 183 * @Description: 184 * Data for interpolating a font from a distortable font specified 185 * by the GX *var tables ([fgcahvm]var). 186 * 187 * @Fields: 188 * num_axis :: 189 * The number of axes along which interpolation may happen. 190 * 191 * coords :: 192 * An array of design coordinates (in user space) indicating the 193 * contribution along each axis to the final interpolated font. 194 * `normalizedcoords' holds the same values. 195 * 196 * normalizedcoords :: 197 * An array of normalized values (between [-1,1]) indicating the 198 * contribution along each axis to the final interpolated font. 199 * `coords' holds the same values. 200 * 201 * mmvar :: 202 * Data from the `fvar' table. 203 * 204 * mmvar_len :: 205 * The length of the `mmvar' structure. 206 * 207 * normalized_stylecoords :: 208 * A two-dimensional array that holds the named instance data from 209 * `mmvar' as normalized values. 210 * 211 * avar_loaded :: 212 * A Boolean; if set, FreeType tried to load (and parse) the `avar' 213 * table. 214 * 215 * avar_table :: 216 * Data from the `avar' table. 217 * 218 * hvar_loaded :: 219 * A Boolean; if set, FreeType tried to load (and parse) the `hvar' 220 * table. 221 * 222 * hvar_checked :: 223 * A Boolean; if set, FreeType successfully loaded and parsed the 224 * `hvar' table. 225 * 226 * hvar_error :: 227 * If loading and parsing of the `hvar' table failed, this field 228 * holds the corresponding error code. 229 * 230 * hvar_table :: 231 * Data from the `hvar' table. 232 * 233 * vvar_loaded :: 234 * A Boolean; if set, FreeType tried to load (and parse) the `vvar' 235 * table. 236 * 237 * vvar_checked :: 238 * A Boolean; if set, FreeType successfully loaded and parsed the 239 * `vvar' table. 240 * 241 * vvar_error :: 242 * If loading and parsing of the `vvar' table failed, this field 243 * holds the corresponding error code. 244 * 245 * vvar_table :: 246 * Data from the `vvar' table. 247 * 248 * mvar_table :: 249 * Data from the `mvar' table. 250 * 251 * tuplecount :: 252 * The number of shared tuples in the `gvar' table. 253 * 254 * tuplecoords :: 255 * A two-dimensional array that holds the shared tuple coordinates 256 * in the `gvar' table. 257 * 258 * gv_glyphcnt :: 259 * The number of glyphs handled in the `gvar' table. 260 * 261 * glyphoffsets :: 262 * Offsets into the glyph variation data array. 263 * 264 * gvar_size :: 265 * The size of the `gvar' table. 266 */ 267 typedef struct GX_BlendRec_ 268 { 269 FT_UInt num_axis; 270 FT_Fixed* coords; 271 FT_Fixed* normalizedcoords; 272 273 FT_MM_Var* mmvar; 274 FT_Offset mmvar_len; 275 276 FT_Fixed* normalized_stylecoords; 277 /* normalized_stylecoords[num_namedstyles][num_axis] */ 278 279 FT_Bool avar_loaded; 280 GX_AVarTable avar_table; 281 282 FT_Bool hvar_loaded; 283 FT_Bool hvar_checked; 284 FT_Error hvar_error; 285 GX_HVVarTable hvar_table; 286 287 FT_Bool vvar_loaded; 288 FT_Bool vvar_checked; 289 FT_Error vvar_error; 290 GX_HVVarTable vvar_table; 291 292 GX_MVarTable mvar_table; 293 294 FT_UInt tuplecount; 295 FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ 296 297 FT_UInt gv_glyphcnt; 298 FT_ULong* glyphoffsets; /* glyphoffsets[gv_glyphcnt + 1] */ 299 300 FT_ULong gvar_size; 301 302 } GX_BlendRec; 303 304 305 /************************************************************************** 306 * 307 * @enum: 308 * GX_TupleCountFlags 309 * 310 * @Description: 311 * Flags used within the `TupleCount' field of the `gvar' table. 312 */ 313 typedef enum GX_TupleCountFlags_ 314 { 315 GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, 316 GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, 317 GX_TC_TUPLE_COUNT_MASK = 0x0FFF 318 319 } GX_TupleCountFlags; 320 321 322 /************************************************************************** 323 * 324 * @enum: 325 * GX_TupleIndexFlags 326 * 327 * @Description: 328 * Flags used within the `TupleIndex' field of the `gvar' and `cvar' 329 * tables. 330 */ 331 typedef enum GX_TupleIndexFlags_ 332 { 333 GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, 334 GX_TI_INTERMEDIATE_TUPLE = 0x4000, 335 GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, 336 GX_TI_RESERVED_TUPLE_FLAG = 0x1000, 337 GX_TI_TUPLE_INDEX_MASK = 0x0FFF 338 339 } GX_TupleIndexFlags; 340 341 342 #define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) 343 #define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) 344 #define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) 345 #define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) 346 #define TTAG_ital FT_MAKE_TAG( 'i', 't', 'a', 'l' ) 347 348 349 FT_LOCAL( FT_Error ) 350 TT_Set_MM_Blend( FT_Face face, 351 FT_UInt num_coords, 352 FT_Fixed* coords ); 353 354 FT_LOCAL( FT_Error ) 355 TT_Get_MM_Blend( FT_Face face, 356 FT_UInt num_coords, 357 FT_Fixed* coords ); 358 359 FT_LOCAL( FT_Error ) 360 TT_Set_Var_Design( FT_Face face, 361 FT_UInt num_coords, 362 FT_Fixed* coords ); 363 364 FT_LOCAL( FT_Error ) 365 TT_Get_MM_Var( FT_Face face, 366 FT_MM_Var* *master ); 367 368 FT_LOCAL( FT_Error ) 369 TT_Get_Var_Design( FT_Face face, 370 FT_UInt num_coords, 371 FT_Fixed* coords ); 372 373 FT_LOCAL( FT_Error ) 374 TT_Set_Named_Instance( FT_Face face, 375 FT_UInt instance_index ); 376 377 FT_LOCAL( FT_Error ) 378 TT_Get_Default_Named_Instance( FT_Face face, 379 FT_UInt *instance_index ); 380 381 FT_LOCAL( void ) 382 tt_construct_ps_name( FT_Face face ); 383 384 FT_LOCAL( FT_Error ) 385 tt_face_vary_cvt( TT_Face face, 386 FT_Stream stream ); 387 388 389 FT_LOCAL( FT_Error ) 390 TT_Vary_Apply_Glyph_Deltas( TT_Loader loader, 391 FT_Outline* outline, 392 FT_Vector* unrounded ); 393 394 FT_LOCAL( FT_Error ) 395 tt_hadvance_adjust( FT_Face face, 396 FT_UInt gindex, 397 FT_Int *adelta ); 398 399 FT_LOCAL( FT_Error ) 400 tt_vadvance_adjust( FT_Face face, 401 FT_UInt gindex, 402 FT_Int *adelta ); 403 404 FT_LOCAL( void ) 405 tt_apply_mvar( FT_Face face ); 406 407 FT_LOCAL( FT_Error ) 408 tt_var_load_item_variation_store( FT_Face face, 409 FT_ULong offset, 410 GX_ItemVarStore itemStore ); 411 412 FT_LOCAL( FT_Error ) 413 tt_var_load_delta_set_index_mapping( FT_Face face, 414 FT_ULong offset, 415 GX_DeltaSetIdxMap map, 416 GX_ItemVarStore itemStore, 417 FT_ULong table_len ); 418 419 FT_LOCAL( FT_ItemVarDelta ) 420 tt_var_get_item_delta( FT_Face face, 421 GX_ItemVarStore itemStore, 422 FT_UInt outerIndex, 423 FT_UInt innerIndex ); 424 425 FT_LOCAL( void ) 426 tt_var_done_item_variation_store( FT_Face face, 427 GX_ItemVarStore itemStore ); 428 429 FT_LOCAL( void ) 430 tt_var_done_delta_set_index_map( FT_Face face, 431 GX_DeltaSetIdxMap deltaSetIdxMap ); 432 433 434 FT_LOCAL( FT_Error ) 435 tt_get_var_blend( FT_Face face, 436 FT_UInt *num_coords, 437 FT_Fixed* *coords, 438 FT_Fixed* *normalizedcoords, 439 FT_MM_Var* *mm_var ); 440 441 FT_LOCAL( void ) 442 tt_done_blend( FT_Face face ); 443 444 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ 445 446 447 FT_END_HEADER 448 449 450 #endif /* TTGXVAR_H_ */ 451 452 453 /* END */ 454