w32tex
About: TeX Live provides a comprehensive TeX system including all the major TeX-related programs, macro packages, and fonts that are free software. Windows sources.
  Fossies Dox: w32tex-src.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

TtfUtil.h
Go to the documentation of this file.
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 #define OVERFLOW_OFFSET_CHECK(p, o) (o + reinterpret_cast<size_t>(p) < reinterpret_cast<size_t>(p))
47 
48 typedef long fontTableId32;
49 typedef unsigned short gid16;
50 
51 #define TTF_TAG(a,b,c,d) ((a << 24UL) + (b << 16UL) + (c << 8UL) + (d))
52 
53 // Enumeration used to specify a table in a TTF file
54 class Tag
55 {
56  unsigned int _v;
57 public:
58  Tag(const char n[5]) throw() : _v(TTF_TAG(n[0],n[1],n[2],n[3])) {}
59  Tag(const unsigned int tag) throw() : _v(tag) {}
60 
61  operator unsigned int () const throw () { return _v; }
62 
63  enum
64  {
65  Feat = TTF_TAG('F','e','a','t'),
66  Glat = TTF_TAG('G','l','a','t'),
67  Gloc = TTF_TAG('G','l','o','c'),
68  Sile = TTF_TAG('S','i','l','e'),
69  Silf = TTF_TAG('S','i','l','f'),
70  Sill = TTF_TAG('S','i','l','l'),
71  cmap = TTF_TAG('c','m','a','p'),
72  cvt = TTF_TAG('c','v','t',' '),
73  cryp = TTF_TAG('c','r','y','p'),
74  head = TTF_TAG('h','e','a','d'),
75  fpgm = TTF_TAG('f','p','g','m'),
76  gdir = TTF_TAG('g','d','i','r'),
77  glyf = TTF_TAG('g','l','y','f'),
78  hdmx = TTF_TAG('h','d','m','x'),
79  hhea = TTF_TAG('h','h','e','a'),
80  hmtx = TTF_TAG('h','m','t','x'),
81  loca = TTF_TAG('l','o','c','a'),
82  kern = TTF_TAG('k','e','r','n'),
83  LTSH = TTF_TAG('L','T','S','H'),
84  maxp = TTF_TAG('m','a','x','p'),
85  name = TTF_TAG('n','a','m','e'),
86  OS_2 = TTF_TAG('O','S','/','2'),
87  post = TTF_TAG('p','o','s','t'),
88  prep = TTF_TAG('p','r','e','p')
89  };
90 };
91 
92 /*----------------------------------------------------------------------------------------------
93  Class providing utility methods to parse a TrueType font file (TTF).
94  Callling application handles all file input and memory allocation.
95  Assumes minimal knowledge of TTF file format.
96 ----------------------------------------------------------------------------------------------*/
97  ////////////////////////////////// tools to find & check TTF tables
98  bool GetHeaderInfo(size_t & lOffset, size_t & lSize);
99  bool CheckHeader(const void * pHdr);
100  bool GetTableDirInfo(const void * pHdr, size_t & lOffset, size_t & lSize);
101  bool GetTableInfo(const Tag TableTag, const void * pHdr, const void * pTableDir,
102  size_t & lOffset, size_t & lSize);
103  bool CheckTable(const Tag TableId, const void * pTable, size_t lTableSize);
104 
105  ////////////////////////////////// simple font wide info
106  size_t GlyphCount(const void * pMaxp);
107 #ifdef ALL_TTFUTILS
108  size_t MaxCompositeComponentCount(const void * pMaxp);
109  size_t MaxCompositeLevelCount(const void * pMaxp);
110  size_t LocaGlyphCount(size_t lLocaSize, const void * pHead); // throw (std::domain_error);
111 #endif
112  int DesignUnits(const void * pHead);
113 #ifdef ALL_TTFUTILS
114  int HeadTableCheckSum(const void * pHead);
115  void HeadTableCreateTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD);
116  void HeadTableModifyTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD);
117  bool IsItalic(const void * pHead);
118  int FontAscent(const void * pOs2);
119  int FontDescent(const void * pOs2);
120  bool FontOs2Style(const void *pOs2, bool & fBold, bool & fItalic);
121  bool Get31EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize);
122  bool Get31EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize);
123  bool Get30EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize);
124  bool Get30EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize);
125  int PostLookup(const void * pPost, size_t lPostSize, const void * pMaxp,
126  const char * pPostName);
127 #endif
128 
129  ////////////////////////////////// utility methods helpful for name table
130  bool GetNameInfo(const void * pName, int nPlatformId, int nEncodingId,
131  int nLangId, int nNameId, size_t & lOffset, size_t & lSize);
132  //size_t NameTableLength(const byte * pTable);
133 #ifdef ALL_TTFUTILS
134  int GetLangsForNames(const void * pName, int nPlatformId, int nEncodingId,
135  int *nameIdList, int cNameIds, short *langIdList);
136  void SwapWString(void * pWStr, size_t nSize = 0); // throw (std::invalid_argument);
137 #endif
138 
139  ////////////////////////////////// cmap lookup tools
140  const void * FindCmapSubtable(const void * pCmap, int nPlatformId = 3,
141  int nEncodingId = 1, size_t length = 0);
142  bool CheckCmapSubtable4(const void * pCmap31, const void * pCmapEnd /*, unsigned int maxgid*/);
143  gid16 CmapSubtable4Lookup(const void * pCmapSubtabel4, unsigned int nUnicodeId, int rangeKey = 0);
144  unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnicodeId,
145  int * pRangeKey = 0);
146  bool CheckCmapSubtable12(const void *pCmap310, const void * pCmapEnd /*, unsigned int maxgid*/);
147  gid16 CmapSubtable12Lookup(const void * pCmap310, unsigned int uUnicodeId, int rangeKey = 0);
148  unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUnicodeId,
149  int * pRangeKey = 0);
150 
151  ///////////////////////////////// horizontal metric data for a glyph
152  bool HorMetrics(gid16 nGlyphId, const void * pHmtx, size_t lHmtxSize,
153  const void * pHhea, int & nLsb, unsigned int & nAdvWid);
154 
155  ////////////////////////////////// primitives for loca and glyf lookup
156  size_t LocaLookup(gid16 nGlyphId, const void * pLoca, size_t lLocaSize,
157  const void * pHead); // throw (std::out_of_range);
158  void * GlyfLookup(const void * pGlyf, size_t lGlyfOffset, size_t lTableLen);
159 
160  ////////////////////////////////// primitves for simple glyph data
161  bool GlyfBox(const void * pSimpleGlyf, int & xMin, int & yMin,
162  int & xMax, int & yMax);
163 
164 #ifdef ALL_TTFUTILS
165  int GlyfContourCount(const void * pSimpleGlyf);
166  bool GlyfContourEndPoints(const void * pSimpleGlyf, int * prgnContourEndPoint,
167  int cnPointsTotal, size_t & cnPoints);
168  bool GlyfPoints(const void * pSimpleGlyf, int * prgnX, int * prgnY,
169  char * prgbFlag, int cnPointsTotal, int & cnPoints);
170 
171  // primitive to find the glyph ids in a composite glyph
172  bool GetComponentGlyphIds(const void * pSimpleGlyf, int * prgnCompId,
173  size_t cnCompIdTotal, size_t & cnCompId);
174  // primitive to find the placement data for a component in a composite glyph
175  bool GetComponentPlacement(const void * pSimpleGlyf, int nCompId,
176  bool fOffset, int & a, int & b);
177  // primitive to find the transform data for a component in a composite glyph
178  bool GetComponentTransform(const void * pSimpleGlyf, int nCompId,
179  float & flt11, float & flt12, float & flt21, float & flt22, bool & fTransOffset);
180 #endif
181 
182  ////////////////////////////////// operate on composite or simple glyph (auto glyf lookup)
183  void * GlyfLookup(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
184  size_t lGlyfSize, size_t lLocaSize, const void * pHead); // primitive used by below methods
185 
186 #ifdef ALL_TTFUTILS
187  // below are primary user methods for handling glyf data
188  bool IsSpace(gid16 nGlyphId, const void * pLoca, size_t lLocaSize, const void * pHead);
189  bool IsDeepComposite(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
190  size_t lGlyfSize, size_t lLocaSize, const void * pHead);
191 
192  bool GlyfBox(gid16 nGlyphId, const void * pGlyf, const void * pLoca, size_t lGlyfSize, size_t lLocaSize,
193  const void * pHead, int & xMin, int & yMin, int & xMax, int & yMax);
194  bool GlyfContourCount(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
195  size_t lGlyfSize, size_t lLocaSize, const void *pHead, size_t & cnContours);
196  bool GlyfContourEndPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
197  size_t lGlyfSize, size_t lLocaSize, const void * pHead, int * prgnContourEndPoint, size_t cnPoints);
198  bool GlyfPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
199  size_t lGlyfSize, size_t lLocaSize, const void * pHead, const int * prgnContourEndPoint, size_t cnEndPoints,
200  int * prgnX, int * prgnY, bool * prgfOnCurve, size_t cnPoints);
201 
202  // utitily method used by high-level GlyfPoints
203  bool SimplifyFlags(char * prgbFlags, int cnPoints);
204  bool CalcAbsolutePoints(int * prgnX, int * prgnY, int cnPoints);
205 #endif
206 
207 } // end of namespace TtfUtil
208 } // end of namespace graphite2
Tag(const char n[5])
Definition: TtfUtil.h:58
Tag(const unsigned int tag)
Definition: TtfUtil.h:59
unsigned int _v
Definition: TtfUtil.h:56
#define n
Definition: t4ht.c:1290
#define b
Definition: jpegint.h:372
#define a(n)
Definition: gpos-common.c:148
#define length(c)
Definition: ctangleboot.c:65
unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnicodeId, int *pRangeKey=0)
Definition: TtfUtil.cpp:1030
long fontTableId32
Definition: TtfUtil.h:48
bool HorMetrics(gid16 nGlyphId, const void *pHmtx, size_t lHmtxSize, const void *pHhea, int &nLsb, unsigned int &nAdvWid)
Definition: TtfUtil.cpp:806
void * GlyfLookup(const void *pGlyf, size_t lGlyfOffset, size_t lTableLen)
Definition: TtfUtil.cpp:1252
size_t LocaLookup(gid16 nGlyphId, const void *pLoca, size_t lLocaSize, const void *pHead)
Definition: TtfUtil.cpp:1214
bool GetNameInfo(const void *pName, int nPlatformId, int nEncodingId, int nLangId, int nNameId, size_t &lOffset, size_t &lSize)
Definition: TtfUtil.cpp:529
bool GetHeaderInfo(size_t &lOffset, size_t &lSize)
Definition: TtfUtil.cpp:156
bool CheckCmapSubtable4(const void *pCmap31, const void *pCmapEnd)
Definition: TtfUtil.cpp:897
bool CheckCmapSubtable12(const void *pCmap310, const void *pCmapEnd)
Definition: TtfUtil.cpp:1091
unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUnicodeId, int *pRangeKey=0)
Definition: TtfUtil.cpp:1154
bool CheckTable(const Tag TableId, const void *pTable, size_t lTableSize)
Definition: TtfUtil.cpp:228
unsigned short gid16
Definition: TtfUtil.h:49
bool CheckHeader(const void *pHdr)
Definition: TtfUtil.cpp:168
size_t GlyphCount(const void *pMaxp)
Definition: TtfUtil.cpp:361
int DesignUnits(const void *pHead)
Definition: TtfUtil.cpp:425
gid16 CmapSubtable4Lookup(const void *pCmapSubtabel4, unsigned int nUnicodeId, int rangeKey=0)
Definition: TtfUtil.cpp:956
bool GetTableInfo(const Tag TableTag, const void *pHdr, const void *pTableDir, size_t &lOffset, size_t &lSize)
Definition: TtfUtil.cpp:197
const void * FindCmapSubtable(const void *pCmap, int nPlatformId=3, int nEncodingId=1, size_t length=0)
Definition: TtfUtil.cpp:845
bool GlyfBox(const void *pSimpleGlyf, int &xMin, int &yMin, int &xMax, int &yMax)
Definition: TtfUtil.cpp:1264
bool GetTableDirInfo(const void *pHdr, size_t &lOffset, size_t &lSize)
Definition: TtfUtil.cpp:180
gid16 CmapSubtable12Lookup(const void *pCmap310, unsigned int uUnicodeId, int rangeKey=0)
Definition: TtfUtil.cpp:1126
Definition: bits.h:30
#define TTF_TAG(a, b, c, d)
Definition: TtfUtil.h:51
Definition: tables.h:580
Definition: tables.h:455
Definition: gencnval.c:119
Definition: ttf.h:354
Definition: ttf.h:315
Definition: afm2pl.c:145
Definition: ttf.h:413
Definition: ttf.h:449
Definition: xmlparse.c:179
return() int(((double) *(font_tbl[cur_fnt].wtbl+(int)(*(font_tbl[cur_fnt].char_wi+(int)(ch - font_tbl[cur_fnt].char_f)% 256)))/(double)(1L<< 20)) *(double) font_tbl[cur_fnt].scale)
static const char * pName
Definition: wrtjava.cpp:92