|
1 /* GRAPHITE2 LICENSING |
|
2 |
|
3 Copyright 2010, SIL International |
|
4 All rights reserved. |
|
5 |
|
6 This library is free software; you can redistribute it and/or modify |
|
7 it under the terms of the GNU Lesser General Public License as published |
|
8 by the Free Software Foundation; either version 2.1 of License, or |
|
9 (at your option) any later version. |
|
10 |
|
11 This program is distributed in the hope that it will be useful, |
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
14 Lesser General Public License for more details. |
|
15 |
|
16 You should also have received a copy of the GNU Lesser General Public |
|
17 License along with this library in the file named "LICENSE". |
|
18 If not, write to the Free Software Foundation, 51 Franklin Street, |
|
19 Suite 500, Boston, MA 02110-1335, USA or visit their web page on the |
|
20 internet at http://www.fsf.org/licenses/lgpl.html. |
|
21 |
|
22 Alternatively, the contents of this file may be used under the terms of the |
|
23 Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public |
|
24 License, as published by the Free Software Foundation, either version 2 |
|
25 of the License or (at your option) any later version. |
|
26 */ |
|
27 #pragma once |
|
28 /*--------------------------------------------------------------------*//*:Ignore this sentence. |
|
29 |
|
30 File: TtfUtil.h |
|
31 Responsibility: Alan Ward |
|
32 Last reviewed: Not yet. |
|
33 |
|
34 Description: |
|
35 Utility class for handling TrueType font files. |
|
36 ----------------------------------------------------------------------------------------------*/ |
|
37 |
|
38 |
|
39 #include <cstddef> |
|
40 |
|
41 namespace graphite2 |
|
42 { |
|
43 namespace TtfUtil |
|
44 { |
|
45 |
|
46 typedef long fontTableId32; |
|
47 typedef unsigned short gid16; |
|
48 |
|
49 #define TTF_TAG(a,b,c,d) ((a << 24UL) + (b << 16UL) + (c << 8UL) + (d)) |
|
50 |
|
51 // Enumeration used to specify a table in a TTF file |
|
52 class Tag |
|
53 { |
|
54 unsigned long _v; |
|
55 public: |
|
56 Tag(const char n[5]) throw() : _v(TTF_TAG(n[0],n[1],n[2],n[3])) {} |
|
57 Tag(const unsigned long tag) throw() : _v(tag) {} |
|
58 |
|
59 operator unsigned long () const throw () { return _v; } |
|
60 |
|
61 enum |
|
62 { |
|
63 Feat = TTF_TAG('F','e','a','t'), |
|
64 Glat = TTF_TAG('G','l','a','t'), |
|
65 Gloc = TTF_TAG('G','l','o','c'), |
|
66 Sile = TTF_TAG('S','i','l','e'), |
|
67 Silf = TTF_TAG('S','i','l','f'), |
|
68 Sill = TTF_TAG('S','i','l','l'), |
|
69 cmap = TTF_TAG('c','m','a','p'), |
|
70 cvt = TTF_TAG('c','v','t',' '), |
|
71 cryp = TTF_TAG('c','r','y','p'), |
|
72 head = TTF_TAG('h','e','a','d'), |
|
73 fpgm = TTF_TAG('f','p','g','m'), |
|
74 gdir = TTF_TAG('g','d','i','r'), |
|
75 glyf = TTF_TAG('g','l','y','f'), |
|
76 hdmx = TTF_TAG('h','d','m','x'), |
|
77 hhea = TTF_TAG('h','h','e','a'), |
|
78 hmtx = TTF_TAG('h','m','t','x'), |
|
79 loca = TTF_TAG('l','o','c','a'), |
|
80 kern = TTF_TAG('k','e','r','n'), |
|
81 LTSH = TTF_TAG('L','T','S','H'), |
|
82 maxp = TTF_TAG('m','a','x','p'), |
|
83 name = TTF_TAG('n','a','m','e'), |
|
84 OS_2 = TTF_TAG('O','S','/','2'), |
|
85 post = TTF_TAG('p','o','s','t'), |
|
86 prep = TTF_TAG('p','r','e','p') |
|
87 }; |
|
88 }; |
|
89 |
|
90 /*---------------------------------------------------------------------------------------------- |
|
91 Class providing utility methods to parse a TrueType font file (TTF). |
|
92 Callling application handles all file input and memory allocation. |
|
93 Assumes minimal knowledge of TTF file format. |
|
94 ----------------------------------------------------------------------------------------------*/ |
|
95 ////////////////////////////////// tools to find & check TTF tables |
|
96 bool GetHeaderInfo(size_t & lOffset, size_t & lSize); |
|
97 bool CheckHeader(const void * pHdr); |
|
98 bool GetTableDirInfo(const void * pHdr, size_t & lOffset, size_t & lSize); |
|
99 bool GetTableInfo(const Tag TableTag, const void * pHdr, const void * pTableDir, |
|
100 size_t & lOffset, size_t & lSize); |
|
101 bool CheckTable(const Tag TableId, const void * pTable, size_t lTableSize); |
|
102 |
|
103 ////////////////////////////////// simple font wide info |
|
104 size_t GlyphCount(const void * pMaxp); |
|
105 #ifdef ALL_TTFUTILS |
|
106 size_t MaxCompositeComponentCount(const void * pMaxp); |
|
107 size_t MaxCompositeLevelCount(const void * pMaxp); |
|
108 size_t LocaGlyphCount(size_t lLocaSize, const void * pHead); // throw (std::domain_error); |
|
109 #endif |
|
110 int DesignUnits(const void * pHead); |
|
111 #ifdef ALL_TTFUTILS |
|
112 int HeadTableCheckSum(const void * pHead); |
|
113 void HeadTableCreateTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD); |
|
114 void HeadTableModifyTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD); |
|
115 bool IsItalic(const void * pHead); |
|
116 int FontAscent(const void * pOs2); |
|
117 int FontDescent(const void * pOs2); |
|
118 bool FontOs2Style(const void *pOs2, bool & fBold, bool & fItalic); |
|
119 bool Get31EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize); |
|
120 bool Get31EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize); |
|
121 bool Get30EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize); |
|
122 bool Get30EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize); |
|
123 int PostLookup(const void * pPost, size_t lPostSize, const void * pMaxp, |
|
124 const char * pPostName); |
|
125 #endif |
|
126 |
|
127 ////////////////////////////////// utility methods helpful for name table |
|
128 bool GetNameInfo(const void * pName, int nPlatformId, int nEncodingId, |
|
129 int nLangId, int nNameId, size_t & lOffset, size_t & lSize); |
|
130 //size_t NameTableLength(const byte * pTable); |
|
131 #ifdef ALL_TTFUTILS |
|
132 int GetLangsForNames(const void * pName, int nPlatformId, int nEncodingId, |
|
133 int *nameIdList, int cNameIds, short *langIdList); |
|
134 void SwapWString(void * pWStr, size_t nSize = 0); // throw (std::invalid_argument); |
|
135 #endif |
|
136 |
|
137 ////////////////////////////////// cmap lookup tools |
|
138 const void * FindCmapSubtable(const void * pCmap, int nPlatformId = 3, |
|
139 int nEncodingId = 1, size_t length = 0); |
|
140 bool CheckCmapSubtable4(const void * pCmap31); |
|
141 gid16 CmapSubtable4Lookup(const void * pCmapSubtabel4, unsigned int nUnicodeId, int rangeKey = 0); |
|
142 unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnicodeId, |
|
143 int * pRangeKey = 0); |
|
144 bool CheckCmapSubtable12(const void *pCmap310); |
|
145 gid16 CmapSubtable12Lookup(const void * pCmap310, unsigned int uUnicodeId, int rangeKey = 0); |
|
146 unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUnicodeId, |
|
147 int * pRangeKey = 0); |
|
148 |
|
149 ///////////////////////////////// horizontal metric data for a glyph |
|
150 bool HorMetrics(gid16 nGlyphId, const void * pHmtx, size_t lHmtxSize, |
|
151 const void * pHhea, int & nLsb, unsigned int & nAdvWid); |
|
152 |
|
153 ////////////////////////////////// primitives for loca and glyf lookup |
|
154 size_t LocaLookup(gid16 nGlyphId, const void * pLoca, size_t lLocaSize, |
|
155 const void * pHead); // throw (std::out_of_range); |
|
156 void * GlyfLookup(const void * pGlyf, size_t lGlyfOffset, size_t lTableLen); |
|
157 |
|
158 ////////////////////////////////// primitves for simple glyph data |
|
159 bool GlyfBox(const void * pSimpleGlyf, int & xMin, int & yMin, |
|
160 int & xMax, int & yMax); |
|
161 |
|
162 #ifdef ALL_TTFUTILS |
|
163 int GlyfContourCount(const void * pSimpleGlyf); |
|
164 bool GlyfContourEndPoints(const void * pSimpleGlyf, int * prgnContourEndPoint, |
|
165 int cnPointsTotal, size_t & cnPoints); |
|
166 bool GlyfPoints(const void * pSimpleGlyf, int * prgnX, int * prgnY, |
|
167 char * prgbFlag, int cnPointsTotal, int & cnPoints); |
|
168 |
|
169 // primitive to find the glyph ids in a composite glyph |
|
170 bool GetComponentGlyphIds(const void * pSimpleGlyf, int * prgnCompId, |
|
171 size_t cnCompIdTotal, size_t & cnCompId); |
|
172 // primitive to find the placement data for a component in a composite glyph |
|
173 bool GetComponentPlacement(const void * pSimpleGlyf, int nCompId, |
|
174 bool fOffset, int & a, int & b); |
|
175 // primitive to find the transform data for a component in a composite glyph |
|
176 bool GetComponentTransform(const void * pSimpleGlyf, int nCompId, |
|
177 float & flt11, float & flt12, float & flt21, float & flt22, bool & fTransOffset); |
|
178 #endif |
|
179 |
|
180 ////////////////////////////////// operate on composite or simple glyph (auto glyf lookup) |
|
181 void * GlyfLookup(gid16 nGlyphId, const void * pGlyf, const void * pLoca, |
|
182 size_t lGlyfSize, size_t lLocaSize, const void * pHead); // primitive used by below methods |
|
183 |
|
184 #ifdef ALL_TTFUTILS |
|
185 // below are primary user methods for handling glyf data |
|
186 bool IsSpace(gid16 nGlyphId, const void * pLoca, size_t lLocaSize, const void * pHead); |
|
187 bool IsDeepComposite(gid16 nGlyphId, const void * pGlyf, const void * pLoca, |
|
188 size_t lGlyfSize, size_t lLocaSize, const void * pHead); |
|
189 |
|
190 bool GlyfBox(gid16 nGlyphId, const void * pGlyf, const void * pLoca, size_t lGlyfSize, size_t lLocaSize, |
|
191 const void * pHead, int & xMin, int & yMin, int & xMax, int & yMax); |
|
192 bool GlyfContourCount(gid16 nGlyphId, const void * pGlyf, const void * pLoca, |
|
193 size_t lGlyfSize, size_t lLocaSize, const void *pHead, size_t & cnContours); |
|
194 bool GlyfContourEndPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca, |
|
195 size_t lGlyfSize, size_t lLocaSize, const void * pHead, int * prgnContourEndPoint, size_t cnPoints); |
|
196 bool GlyfPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca, |
|
197 size_t lGlyfSize, size_t lLocaSize, const void * pHead, const int * prgnContourEndPoint, size_t cnEndPoints, |
|
198 int * prgnX, int * prgnY, bool * prgfOnCurve, size_t cnPoints); |
|
199 |
|
200 // utitily method used by high-level GlyfPoints |
|
201 bool SimplifyFlags(char * prgbFlags, int cnPoints); |
|
202 bool CalcAbsolutePoints(int * prgnX, int * prgnY, int cnPoints); |
|
203 #endif |
|
204 |
|
205 } // end of namespace TtfUtil |
|
206 } // end of namespace graphite2 |