Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* GRAPHITE2 LICENSING
3 Copyright 2010, SIL International
4 All rights reserved.
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.
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.
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.
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.
30 File: TtfUtil.h
31 Responsibility: Alan Ward
32 Last reviewed: Not yet.
34 Description:
35 Utility class for handling TrueType font files.
36 ----------------------------------------------------------------------------------------------*/
39 #include <cstddef>
41 namespace graphite2
42 {
43 namespace TtfUtil
44 {
46 typedef long fontTableId32;
47 typedef unsigned short gid16;
49 #define TTF_TAG(a,b,c,d) ((a << 24UL) + (b << 16UL) + (c << 8UL) + (d))
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) {}
59 operator unsigned long () const throw () { return _v; }
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 };
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);
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
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
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);
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);
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);
158 ////////////////////////////////// primitves for simple glyph data
159 bool GlyfBox(const void * pSimpleGlyf, int & xMin, int & yMin,
160 int & xMax, int & yMax);
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);
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
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
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);
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);
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
205 } // end of namespace TtfUtil
206 } // end of namespace graphite2