gfx/graphite2/src/inc/TtfUtil.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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

mercurial