1 /*************************************************************************** 2 * 3 * © 2016 and later: Unicode, Inc. and others. 4 * License & terms of use: http://www.unicode.org/copyright.html 5 * 6 ****************************************************************************/ 7 /*************************************************************************** 8 * 9 * Copyright (C) 1998-2013, International Business Machines 10 * Corporation and others. All Rights Reserved. 11 * 12 ************************************************************************/ 13 14 #ifndef __SFNT_H 15 #define __SFNT_H 16 17 #include "layout/LETypes.h" 18 19 U_NAMESPACE_USE 20 21 #ifndef ANY_NUMBER 22 #define ANY_NUMBER 1 23 #endif 24 25 struct DirectoryEntry 26 { 27 le_uint32 tag; 28 le_uint32 checksum; 29 le_uint32 offset; 30 le_uint32 length; 31 }; 32 33 #ifndef __cplusplus 34 typedef struct DirectoryEntry DirectoryEntry; 35 #endif 36 37 struct SFNTDirectory 38 { 39 le_uint32 scalerType; 40 le_uint16 numTables; 41 le_uint16 searchRange; 42 le_uint16 entrySelector; 43 le_uint16 rangeShift; 44 DirectoryEntry tableDirectory[ANY_NUMBER]; 45 }; 46 47 #ifndef __cplusplus 48 typedef struct SFNTDirectory SFNTDirectory; 49 #endif 50 51 52 struct CMAPEncodingSubtableHeader 53 { 54 le_uint16 platformID; 55 le_uint16 platformSpecificID; 56 le_uint32 encodingOffset; 57 }; 58 59 #ifndef __cplusplus 60 typedef struct CMAPEncodingSubtableHeader CMAPEncodingSubtableHeader; 61 #endif 62 63 struct CMAPTable 64 { 65 le_uint16 version; 66 le_uint16 numberSubtables; 67 CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; 68 }; 69 70 #ifndef __cplusplus 71 typedef struct CMAPTable CMAPTable; 72 #endif 73 74 struct CMAPEncodingSubtable 75 { 76 le_uint16 format; 77 le_uint16 length; 78 le_uint16 language; 79 }; 80 81 #ifndef __cplusplus 82 typedef struct CMAPEncodingSubtable CMAPEncodingSubtable; 83 #endif 84 85 #ifdef __cplusplus 86 struct CMAPFormat0Encoding : CMAPEncodingSubtable 87 { 88 le_uint8 glyphIndexArray[256]; 89 }; 90 #else 91 struct CMAPFormat0Encoding 92 { 93 CMAPEncodingSubtable base; 94 95 le_uint8 glyphIndexArray[256]; 96 }; 97 98 typedef struct CMAPFormat0Encoding CMAPFormat0Encoding; 99 #endif 100 101 struct CMAPFormat2Subheader 102 { 103 le_uint16 firstCode; 104 le_uint16 entryCount; 105 le_int16 idDelta; 106 le_uint16 idRangeOffset; 107 }; 108 109 #ifndef __cplusplus 110 typedef struct CMAPFormat2Subheader CMAPFormat2Subheader; 111 #endif 112 113 #ifdef __cplusplus 114 struct CMAPFormat2Encoding : CMAPEncodingSubtable 115 { 116 le_uint16 subHeadKeys[256]; 117 CMAPFormat2Subheader subheaders[ANY_NUMBER]; 118 }; 119 #else 120 struct CMAPFormat2Encoding 121 { 122 CMAPEncodingSubtable base; 123 124 le_uint16 subHeadKeys[256]; 125 CMAPFormat2Subheader subheaders[ANY_NUMBER]; 126 }; 127 128 typedef struct CMAPFormat2Encoding CMAPFormat2Encoding; 129 #endif 130 131 #ifdef __cplusplus 132 struct CMAPFormat4Encoding : CMAPEncodingSubtable 133 { 134 le_uint16 segCountX2; 135 le_uint16 searchRange; 136 le_uint16 entrySelector; 137 le_uint16 rangeShift; 138 le_uint16 endCodes[ANY_NUMBER]; 139 /* 140 le_uint16 reservedPad; 141 le_uint16 startCodes[ANY_NUMBER]; 142 le_uint16 idDelta[ANY_NUMBER]; 143 le_uint16 idRangeOffset[ANY_NUMBER]; 144 le_uint16 glyphIndexArray[ANY_NUMBER]; 145 */ 146 }; 147 #else 148 struct CMAPFormat4Encoding 149 { 150 CMAPEncodingSubtable base; 151 152 le_uint16 segCountX2; 153 le_uint16 searchRange; 154 le_uint16 entrySelector; 155 le_uint16 rangeShift; 156 le_uint16 endCodes[ANY_NUMBER]; 157 /* 158 // le_uint16 reservedPad; 159 // le_uint16 startCodes[ANY_NUMBER]; 160 // le_uint16 idDelta[ANY_NUMBER]; 161 // le_uint16 idRangeOffset[ANY_NUMBER]; 162 // le_uint16 glyphIndexArray[ANY_NUMBER]; 163 */ 164 }; 165 166 typedef struct CMAPFormat4Encoding CMAPFormat4Encoding; 167 #endif 168 169 #ifdef __cplusplus 170 struct CMAPFormat6Encoding : CMAPEncodingSubtable 171 { 172 le_uint16 firstCode; 173 le_uint16 entryCount; 174 le_uint16 glyphIndexArray[ANY_NUMBER]; 175 }; 176 #else 177 struct CMAPFormat6Encoding 178 { 179 CMAPEncodingSubtable base; 180 181 le_uint16 firstCode; 182 le_uint16 entryCount; 183 le_uint16 glyphIndexArray[ANY_NUMBER]; 184 }; 185 186 typedef struct CMAPFormat6Encoding CMAPFormat6Encoding; 187 #endif 188 189 struct CMAPEncodingSubtable32 190 { 191 le_uint32 format; 192 le_uint32 length; 193 le_uint32 language; 194 }; 195 196 #ifndef __cplusplus 197 typedef struct CMAPEncodingSubtable32 CMAPEncodingSubtable32; 198 #endif 199 200 struct CMAPGroup 201 { 202 le_uint32 startCharCode; 203 le_uint32 endCharCode; 204 le_uint32 startGlyphCode; 205 }; 206 207 #ifndef __cplusplus 208 typedef struct CMAPGroup CMAPGroup; 209 #endif 210 211 #ifdef __cplusplus 212 struct CMAPFormat8Encoding : CMAPEncodingSubtable32 213 { 214 le_uint32 is32[65536/32]; 215 le_uint32 nGroups; 216 CMAPGroup groups[ANY_NUMBER]; 217 }; 218 #else 219 struct CMAPFormat8Encoding 220 { 221 CMAPEncodingSubtable32 base; 222 223 le_uint32 is32[65536/32]; 224 le_uint32 nGroups; 225 CMAPGroup groups[ANY_NUMBER]; 226 }; 227 228 typedef struct CMAPFormat8Encoding CMAPFormat8Encoding; 229 #endif 230 231 #ifdef __cplusplus 232 struct CMAPFormat10Encoding : CMAPEncodingSubtable32 233 { 234 le_uint32 startCharCode; 235 le_uint32 numCharCodes; 236 le_uint16 glyphs[ANY_NUMBER]; 237 }; 238 #else 239 struct CMAPFormat10Encoding 240 { 241 CMAPEncodingSubtable32 base; 242 243 le_uint32 startCharCode; 244 le_uint32 numCharCodes; 245 le_uint16 glyphs[ANY_NUMBER]; 246 }; 247 248 typedef struct CMAPFormat10Encoding CMAPFormat10Encoding; 249 #endif 250 251 #ifdef __cplusplus 252 struct CMAPFormat12Encoding : CMAPEncodingSubtable32 253 { 254 le_uint32 nGroups; 255 CMAPGroup groups[ANY_NUMBER]; 256 }; 257 #else 258 struct CMAPFormat12Encoding 259 { 260 CMAPEncodingSubtable32 base; 261 262 le_uint32 nGroups; 263 CMAPGroup groups[ANY_NUMBER]; 264 }; 265 266 typedef struct CMAPFormat12Encoding CMAPFormat12Encoding; 267 #endif 268 269 typedef le_int32 fixed; 270 271 struct BigDate 272 { 273 le_uint32 bc; 274 le_uint32 ad; 275 }; 276 277 #ifndef __cplusplus 278 typedef struct BigDate BigDate; 279 #endif 280 281 struct HEADTable 282 { 283 fixed version; 284 fixed fontRevision; 285 le_uint32 checksumAdjustment; 286 le_uint32 magicNumber; 287 le_uint16 flags; 288 le_uint16 unitsPerEm; 289 BigDate created; 290 BigDate modified; 291 le_int16 xMin; 292 le_int16 yMin; 293 le_int16 xMax; 294 le_int16 yMax; 295 le_int16 lowestRecPPEM; 296 le_int16 fontDirectionHint; 297 le_int16 indexToLocFormat; 298 le_int16 glyphDataFormat; 299 }; 300 301 #ifndef __cplusplus 302 typedef struct HEADTable HEADTable; 303 #endif 304 305 struct MAXPTable 306 { 307 fixed version; 308 le_uint16 numGlyphs; 309 le_uint16 maxPoints; 310 le_uint16 maxContours; 311 le_uint16 maxComponentPoints; 312 le_uint16 maxComponentContours; 313 le_uint16 maxZones; 314 le_uint16 maxTwilightPoints; 315 le_uint16 maxStorage; 316 le_uint16 maxFunctionDefs; 317 le_uint16 maxInstructionDefs; 318 le_uint16 maxStackElements; 319 le_uint16 maxSizeOfInstructions; 320 le_uint16 maxComponentElements; 321 le_uint16 maxComponentDepth; 322 }; 323 324 #ifndef __cplusplus 325 typedef struct MAXPTable MAXPTable; 326 #endif 327 328 struct HHEATable 329 { 330 fixed version; 331 le_int16 ascent; 332 le_int16 descent; 333 le_int16 lineGap; 334 le_uint16 advanceWidthMax; 335 le_int16 minLeftSideBearing; 336 le_int16 minRightSideBearing; 337 le_int16 xMaxExtent; 338 le_int16 caretSlopeRise; 339 le_int16 caretSlopeRun; 340 le_int16 caretOffset; 341 le_int16 reserved1; 342 le_int16 reserved2; 343 le_int16 reserved3; 344 le_int16 reserved4; 345 le_int16 metricDataFormat; 346 le_uint16 numOfLongHorMetrics; 347 }; 348 349 #ifndef __cplusplus 350 typedef struct HHEATable HHEATable; 351 #endif 352 353 struct LongHorMetric 354 { 355 le_uint16 advanceWidth; 356 le_int16 leftSideBearing; 357 }; 358 359 #ifndef __cplusplus 360 typedef struct LongHorMetric LongHorMetric; 361 #endif 362 363 struct HMTXTable 364 { 365 LongHorMetric hMetrics[ANY_NUMBER]; /* ANY_NUMBER = numOfLongHorMetrics from hhea table */ 366 /* le_int16 leftSideBearing[ANY_NUMBER]; ANY_NUMBER = numGlyphs - numOfLongHorMetrics */ 367 }; 368 369 #ifndef __cplusplus 370 typedef struct HMTXTable HMTXTable; 371 #endif 372 373 enum PlatformID 374 { 375 PLATFORM_UNICODE = 0, 376 PLATFORM_MACINTOSH = 1, 377 PLATFORM_ISO = 2, 378 PLATFORM_MICROSOFT = 3, 379 PLATFORM_CUSTOM = 4 380 }; 381 382 enum MacintoshEncodingID 383 { 384 MACINTOSH_ROMAN = 0 385 }; 386 387 enum MacintoshLanguageID 388 { 389 MACINTOSH_ENGLISH = 0 390 }; 391 392 enum MicrosoftEncodingID 393 { 394 MICROSOFT_UNICODE_BMP = 1, 395 MICROSOFT_UNICODE_FULL = 10 396 }; 397 398 enum MicrosoftLanguageID 399 { 400 MICROSOFT_ENGLISH = 0x409 401 }; 402 403 enum NameID 404 { 405 NAME_COPYRIGHT_NOTICE = 0, 406 NAME_FONT_FAMILY = 1, 407 NAME_FONT_SUB_FAMILY = 2, 408 NAME_UNIQUE_FONT_ID = 3, 409 NAME_FULL_FONT_NAME = 4, 410 NAME_VERSION_STRING = 5, 411 NAME_POSTSCRIPT_NAME = 6, 412 NAME_TRADEMARK = 7, 413 NAME_MANUFACTURER = 8, 414 NAME_DESIGNER = 9, 415 NAME_DESCRIPTION = 10, 416 NAME_VENDOR_URL = 11, 417 NAME_DESIGNER_URL = 12, 418 NAME_LICENSE_DESCRIPTION = 13, 419 NAME_LICENSE_URL = 14, 420 NAME_RESERVED = 15, 421 NAME_PREFERRED_FAMILY = 16, 422 NAME_PREFERRED_SUB_FAMILY = 17, 423 NAME_COMPATIBLE_FULL = 18, 424 NAME_SAMPLE_TEXT = 19, 425 NAME_POSTSCRIPT_CID = 20 426 }; 427 428 struct NameRecord 429 { 430 le_uint16 platformID; 431 le_uint16 encodingID; 432 le_uint16 languageID; 433 le_uint16 nameID; 434 le_uint16 length; 435 le_uint16 offset; 436 }; 437 438 #ifndef __cplusplus 439 typedef struct NameRecord NameRecord; 440 #endif 441 442 struct NAMETable 443 { 444 le_uint16 version; 445 le_uint16 count; 446 le_uint16 stringOffset; 447 NameRecord nameRecords[ANY_NUMBER]; 448 }; 449 450 #ifndef __cplusplus 451 typedef struct NAMETable NAMETable; 452 #endif 453 454 #endif 455 456