You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-01 16:38:31 +00:00
[Complex Text Layouts] Add third-party TextServer dependencies (ICU, HarfBuzz, Graphite).
This commit is contained in:
208
thirdparty/graphite/src/inc/TtfUtil.h
vendored
Normal file
208
thirdparty/graphite/src/inc/TtfUtil.h
vendored
Normal file
@@ -0,0 +1,208 @@
|
||||
/* GRAPHITE2 LICENSING
|
||||
|
||||
Copyright 2010, SIL International
|
||||
All rights reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2.1 of License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should also have received a copy of the GNU Lesser General Public
|
||||
License along with this library in the file named "LICENSE".
|
||||
If not, write to the Free Software Foundation, 51 Franklin Street,
|
||||
Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
|
||||
internet at http://www.fsf.org/licenses/lgpl.html.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of the
|
||||
Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public
|
||||
License, as published by the Free Software Foundation, either version 2
|
||||
of the License or (at your option) any later version.
|
||||
*/
|
||||
#pragma once
|
||||
/*--------------------------------------------------------------------*//*:Ignore this sentence.
|
||||
|
||||
File: TtfUtil.h
|
||||
Responsibility: Alan Ward
|
||||
Last reviewed: Not yet.
|
||||
|
||||
Description:
|
||||
Utility class for handling TrueType font files.
|
||||
----------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
namespace graphite2
|
||||
{
|
||||
namespace TtfUtil
|
||||
{
|
||||
|
||||
#define OVERFLOW_OFFSET_CHECK(p, o) (o + reinterpret_cast<size_t>(p) < reinterpret_cast<size_t>(p))
|
||||
|
||||
typedef long fontTableId32;
|
||||
typedef unsigned short gid16;
|
||||
|
||||
#define TTF_TAG(a,b,c,d) ((a << 24UL) + (b << 16UL) + (c << 8UL) + (d))
|
||||
|
||||
// Enumeration used to specify a table in a TTF file
|
||||
class Tag
|
||||
{
|
||||
unsigned int _v;
|
||||
public:
|
||||
Tag(const char n[5]) throw() : _v(TTF_TAG(n[0],n[1],n[2],n[3])) {}
|
||||
Tag(const unsigned int tag) throw() : _v(tag) {}
|
||||
|
||||
operator unsigned int () const throw () { return _v; }
|
||||
|
||||
enum
|
||||
{
|
||||
Feat = TTF_TAG('F','e','a','t'),
|
||||
Glat = TTF_TAG('G','l','a','t'),
|
||||
Gloc = TTF_TAG('G','l','o','c'),
|
||||
Sile = TTF_TAG('S','i','l','e'),
|
||||
Silf = TTF_TAG('S','i','l','f'),
|
||||
Sill = TTF_TAG('S','i','l','l'),
|
||||
cmap = TTF_TAG('c','m','a','p'),
|
||||
cvt = TTF_TAG('c','v','t',' '),
|
||||
cryp = TTF_TAG('c','r','y','p'),
|
||||
head = TTF_TAG('h','e','a','d'),
|
||||
fpgm = TTF_TAG('f','p','g','m'),
|
||||
gdir = TTF_TAG('g','d','i','r'),
|
||||
glyf = TTF_TAG('g','l','y','f'),
|
||||
hdmx = TTF_TAG('h','d','m','x'),
|
||||
hhea = TTF_TAG('h','h','e','a'),
|
||||
hmtx = TTF_TAG('h','m','t','x'),
|
||||
loca = TTF_TAG('l','o','c','a'),
|
||||
kern = TTF_TAG('k','e','r','n'),
|
||||
LTSH = TTF_TAG('L','T','S','H'),
|
||||
maxp = TTF_TAG('m','a','x','p'),
|
||||
name = TTF_TAG('n','a','m','e'),
|
||||
OS_2 = TTF_TAG('O','S','/','2'),
|
||||
post = TTF_TAG('p','o','s','t'),
|
||||
prep = TTF_TAG('p','r','e','p')
|
||||
};
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------------------------
|
||||
Class providing utility methods to parse a TrueType font file (TTF).
|
||||
Callling application handles all file input and memory allocation.
|
||||
Assumes minimal knowledge of TTF file format.
|
||||
----------------------------------------------------------------------------------------------*/
|
||||
////////////////////////////////// tools to find & check TTF tables
|
||||
bool GetHeaderInfo(size_t & lOffset, size_t & lSize);
|
||||
bool CheckHeader(const void * pHdr);
|
||||
bool GetTableDirInfo(const void * pHdr, size_t & lOffset, size_t & lSize);
|
||||
bool GetTableInfo(const Tag TableTag, const void * pHdr, const void * pTableDir,
|
||||
size_t & lOffset, size_t & lSize);
|
||||
bool CheckTable(const Tag TableId, const void * pTable, size_t lTableSize);
|
||||
|
||||
////////////////////////////////// simple font wide info
|
||||
size_t GlyphCount(const void * pMaxp);
|
||||
#ifdef ALL_TTFUTILS
|
||||
size_t MaxCompositeComponentCount(const void * pMaxp);
|
||||
size_t MaxCompositeLevelCount(const void * pMaxp);
|
||||
size_t LocaGlyphCount(size_t lLocaSize, const void * pHead); // throw (std::domain_error);
|
||||
#endif
|
||||
int DesignUnits(const void * pHead);
|
||||
#ifdef ALL_TTFUTILS
|
||||
int HeadTableCheckSum(const void * pHead);
|
||||
void HeadTableCreateTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD);
|
||||
void HeadTableModifyTime(const void * pHead, unsigned int * pnDateBC, unsigned int * pnDateAD);
|
||||
bool IsItalic(const void * pHead);
|
||||
int FontAscent(const void * pOs2);
|
||||
int FontDescent(const void * pOs2);
|
||||
bool FontOs2Style(const void *pOs2, bool & fBold, bool & fItalic);
|
||||
bool Get31EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize);
|
||||
bool Get31EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize);
|
||||
bool Get30EngFamilyInfo(const void * pName, size_t & lOffset, size_t & lSize);
|
||||
bool Get30EngFullFontInfo(const void * pName, size_t & lOffset, size_t & lSize);
|
||||
int PostLookup(const void * pPost, size_t lPostSize, const void * pMaxp,
|
||||
const char * pPostName);
|
||||
#endif
|
||||
|
||||
////////////////////////////////// utility methods helpful for name table
|
||||
bool GetNameInfo(const void * pName, int nPlatformId, int nEncodingId,
|
||||
int nLangId, int nNameId, size_t & lOffset, size_t & lSize);
|
||||
//size_t NameTableLength(const byte * pTable);
|
||||
#ifdef ALL_TTFUTILS
|
||||
int GetLangsForNames(const void * pName, int nPlatformId, int nEncodingId,
|
||||
int *nameIdList, int cNameIds, short *langIdList);
|
||||
void SwapWString(void * pWStr, size_t nSize = 0); // throw (std::invalid_argument);
|
||||
#endif
|
||||
|
||||
////////////////////////////////// cmap lookup tools
|
||||
const void * FindCmapSubtable(const void * pCmap, int nPlatformId = 3,
|
||||
int nEncodingId = 1, size_t length = 0);
|
||||
bool CheckCmapSubtable4(const void * pCmap31, const void * pCmapEnd /*, unsigned int maxgid*/);
|
||||
gid16 CmapSubtable4Lookup(const void * pCmapSubtabel4, unsigned int nUnicodeId, int rangeKey = 0);
|
||||
unsigned int CmapSubtable4NextCodepoint(const void *pCmap31, unsigned int nUnicodeId,
|
||||
int * pRangeKey = 0);
|
||||
bool CheckCmapSubtable12(const void *pCmap310, const void * pCmapEnd /*, unsigned int maxgid*/);
|
||||
gid16 CmapSubtable12Lookup(const void * pCmap310, unsigned int uUnicodeId, int rangeKey = 0);
|
||||
unsigned int CmapSubtable12NextCodepoint(const void *pCmap310, unsigned int nUnicodeId,
|
||||
int * pRangeKey = 0);
|
||||
|
||||
///////////////////////////////// horizontal metric data for a glyph
|
||||
bool HorMetrics(gid16 nGlyphId, const void * pHmtx, size_t lHmtxSize,
|
||||
const void * pHhea, int & nLsb, unsigned int & nAdvWid);
|
||||
|
||||
////////////////////////////////// primitives for loca and glyf lookup
|
||||
size_t LocaLookup(gid16 nGlyphId, const void * pLoca, size_t lLocaSize,
|
||||
const void * pHead); // throw (std::out_of_range);
|
||||
void * GlyfLookup(const void * pGlyf, size_t lGlyfOffset, size_t lTableLen);
|
||||
|
||||
////////////////////////////////// primitves for simple glyph data
|
||||
bool GlyfBox(const void * pSimpleGlyf, int & xMin, int & yMin,
|
||||
int & xMax, int & yMax);
|
||||
|
||||
#ifdef ALL_TTFUTILS
|
||||
int GlyfContourCount(const void * pSimpleGlyf);
|
||||
bool GlyfContourEndPoints(const void * pSimpleGlyf, int * prgnContourEndPoint,
|
||||
int cnPointsTotal, size_t & cnPoints);
|
||||
bool GlyfPoints(const void * pSimpleGlyf, int * prgnX, int * prgnY,
|
||||
char * prgbFlag, int cnPointsTotal, int & cnPoints);
|
||||
|
||||
// primitive to find the glyph ids in a composite glyph
|
||||
bool GetComponentGlyphIds(const void * pSimpleGlyf, int * prgnCompId,
|
||||
size_t cnCompIdTotal, size_t & cnCompId);
|
||||
// primitive to find the placement data for a component in a composite glyph
|
||||
bool GetComponentPlacement(const void * pSimpleGlyf, int nCompId,
|
||||
bool fOffset, int & a, int & b);
|
||||
// primitive to find the transform data for a component in a composite glyph
|
||||
bool GetComponentTransform(const void * pSimpleGlyf, int nCompId,
|
||||
float & flt11, float & flt12, float & flt21, float & flt22, bool & fTransOffset);
|
||||
#endif
|
||||
|
||||
////////////////////////////////// operate on composite or simple glyph (auto glyf lookup)
|
||||
void * GlyfLookup(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
|
||||
size_t lGlyfSize, size_t lLocaSize, const void * pHead); // primitive used by below methods
|
||||
|
||||
#ifdef ALL_TTFUTILS
|
||||
// below are primary user methods for handling glyf data
|
||||
bool IsSpace(gid16 nGlyphId, const void * pLoca, size_t lLocaSize, const void * pHead);
|
||||
bool IsDeepComposite(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
|
||||
size_t lGlyfSize, size_t lLocaSize, const void * pHead);
|
||||
|
||||
bool GlyfBox(gid16 nGlyphId, const void * pGlyf, const void * pLoca, size_t lGlyfSize, size_t lLocaSize,
|
||||
const void * pHead, int & xMin, int & yMin, int & xMax, int & yMax);
|
||||
bool GlyfContourCount(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
|
||||
size_t lGlyfSize, size_t lLocaSize, const void *pHead, size_t & cnContours);
|
||||
bool GlyfContourEndPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
|
||||
size_t lGlyfSize, size_t lLocaSize, const void * pHead, int * prgnContourEndPoint, size_t cnPoints);
|
||||
bool GlyfPoints(gid16 nGlyphId, const void * pGlyf, const void * pLoca,
|
||||
size_t lGlyfSize, size_t lLocaSize, const void * pHead, const int * prgnContourEndPoint, size_t cnEndPoints,
|
||||
int * prgnX, int * prgnY, bool * prgfOnCurve, size_t cnPoints);
|
||||
|
||||
// utitily method used by high-level GlyfPoints
|
||||
bool SimplifyFlags(char * prgbFlags, int cnPoints);
|
||||
bool CalcAbsolutePoints(int * prgnX, int * prgnY, int cnPoints);
|
||||
#endif
|
||||
|
||||
} // end of namespace TtfUtil
|
||||
} // end of namespace graphite2
|
||||
Reference in New Issue
Block a user