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