1/* 2 ****************************************************************************** 3 * 4 * Copyright (C) 2016 and later: Unicode, Inc. and others. 5 * License & terms of use: http://www.unicode.org/copyright.html#License 6 * 7 ****************************************************************************** 8 ****************************************************************************** * 9 * 10 * Copyright (C) 1999-2001, International Business Machines 11 * Corporation and others. All Rights Reserved. 12 * 13 ****************************************************************************** * 14 * file name: sfnt.h 15 * 16 * created on: ??/??/2001 17 * created by: Eric R. Mader 18 */ 19 20#ifndef __SFNT_H 21#define __SFNT_H 22 23#include "LETypes.h" 24 25 26#ifndef ANY_NUMBER 27#define ANY_NUMBER 1 28#endif 29 30struct DirectoryEntry 31{ 32 le_uint32 tag; 33 le_uint32 checksum; 34 le_uint32 offset; 35 le_uint32 length; 36}; 37 38struct SFNTDirectory 39{ 40 le_uint32 scalerType; 41 le_uint16 numTables; 42 le_uint16 searchRange; 43 le_uint16 entrySelector; 44 le_uint16 rangeShift; 45 DirectoryEntry tableDirectory[ANY_NUMBER]; 46}; 47 48 49struct CMAPEncodingSubtableHeader 50{ 51 le_uint16 platformID; 52 le_uint16 platformSpecificID; 53 le_uint32 encodingOffset; 54}; 55 56struct CMAPTable 57{ 58 le_uint16 version; 59 le_uint16 numberSubtables; 60 CMAPEncodingSubtableHeader encodingSubtableHeaders[ANY_NUMBER]; 61}; 62 63struct CMAPEncodingSubtable 64{ 65 le_uint16 format; 66 le_uint16 length; 67 le_uint16 language; 68}; 69 70struct CMAPFormat0Encoding : CMAPEncodingSubtable 71{ 72 le_uint8 glyphIndexArray[256]; 73}; 74 75struct CMAPFormat2Subheader 76{ 77 le_uint16 firstCode; 78 le_uint16 entryCount; 79 le_int16 idDelta; 80 le_uint16 idRangeOffset; 81}; 82 83struct CMAPFormat2Encoding : CMAPEncodingSubtable 84{ 85 le_uint16 subHeadKeys[256]; 86 CMAPFormat2Subheader subheaders[ANY_NUMBER]; 87}; 88 89struct CMAPFormat4Encoding : CMAPEncodingSubtable 90{ 91 le_uint16 segCountX2; 92 le_uint16 searchRange; 93 le_uint16 entrySelector; 94 le_uint16 rangeShift; 95 le_uint16 endCodes[ANY_NUMBER]; 96// le_uint16 reservedPad; 97// le_uint16 startCodes[ANY_NUMBER]; 98// le_uint16 idDelta[ANY_NUMBER]; 99// le_uint16 idRangeOffset[ANY_NUMBER]; 100// le_uint16 glyphIndexArray[ANY_NUMBER]; 101}; 102 103struct CMAPFormat6Encoding : CMAPEncodingSubtable 104{ 105 le_uint16 firstCode; 106 le_uint16 entryCount; 107 le_uint16 glyphIndexArray[ANY_NUMBER]; 108}; 109 110struct CMAPEncodingSubtable32 111{ 112 le_uint32 format; 113 le_uint32 length; 114 le_uint32 language; 115}; 116 117struct CMAPGroup 118{ 119 le_uint32 startCharCode; 120 le_uint32 endCharCode; 121 le_uint32 startGlyphCode; 122}; 123 124struct CMAPFormat8Encoding : CMAPEncodingSubtable32 125{ 126 le_uint32 is32[65536/32]; 127 le_uint32 nGroups; 128 CMAPGroup groups[ANY_NUMBER]; 129}; 130 131struct CMAPFormat10Encoding : CMAPEncodingSubtable32 132{ 133 le_uint32 startCharCode; 134 le_uint32 numCharCodes; 135 le_uint16 glyphs[ANY_NUMBER]; 136}; 137 138struct CMAPFormat12Encoding : CMAPEncodingSubtable32 139{ 140 le_uint32 nGroups; 141 CMAPGroup groups[ANY_NUMBER]; 142}; 143 144typedef le_int32 fixed; 145 146struct BigDate 147{ 148 le_uint32 bc; 149 le_uint32 ad; 150}; 151 152struct HEADTable 153{ 154 fixed version; 155 fixed fontRevision; 156 le_uint32 checksumAdjustment; 157 le_uint32 magicNumber; 158 le_uint16 flags; 159 le_uint16 unitsPerEm; 160 BigDate created; 161 BigDate modified; 162 le_int16 xMin; 163 le_int16 yMin; 164 le_int16 xMax; 165 le_int16 yMax; 166 le_int16 lowestRecPPEM; 167 le_int16 fontDirectionHint; 168 le_int16 indexToLocFormat; 169 le_int16 glyphDataFormat; 170}; 171 172struct MAXPTable 173{ 174 fixed version; 175 le_uint16 numGlyphs; 176 le_uint16 maxPoints; 177 le_uint16 maxContours; 178 le_uint16 maxComponentPoints; 179 le_uint16 maxComponentContours; 180 le_uint16 maxZones; 181 le_uint16 maxTwilightPoints; 182 le_uint16 maxStorage; 183 le_uint16 maxFunctionDefs; 184 le_uint16 maxInstructionDefs; 185 le_uint16 maxStackElements; 186 le_uint16 maxSizeOfInstructions; 187 le_uint16 maxComponentElements; 188 le_uint16 maxComponentDepth; 189}; 190 191struct HHEATable 192{ 193 fixed version; 194 le_int16 ascent; 195 le_int16 descent; 196 le_int16 lineGap; 197 le_uint16 advanceWidthMax; 198 le_int16 minLeftSideBearing; 199 le_int16 minRightSideBearing; 200 le_int16 xMaxExtent; 201 le_int16 caretSlopeRise; 202 le_int16 caretSlopeRun; 203 le_int16 caretOffset; 204 le_int16 reserved1; 205 le_int16 reserved2; 206 le_int16 reserved3; 207 le_int16 reserved4; 208 le_int16 metricDataFormat; 209 le_uint16 numOfLongHorMetrics; 210}; 211 212struct LongHorMetric 213{ 214 le_uint16 advanceWidth; 215 le_int16 leftSideBearing; 216}; 217 218struct HMTXTable 219{ 220 LongHorMetric hMetrics[ANY_NUMBER]; // ANY_NUMBER = numOfLongHorMetrics from hhea table 221// le_int16 leftSideBearing[ANY_NUMBER]; // ANY_NUMBER = numGlyphs - numOfLongHorMetrics 222}; 223 224#endif 225 226