-//\r
-// TTF.H: TTF Class\r
-// by James L. Hammons\r
-// (C) 1999 Underground Software\r
-//\r
-// This class encapsulates all the complexity of a TrueType Font File\r
-// database. Included are functions to load, save, & initialize the\r
-// TTF database.\r
-//\r
-\r
-// These really shouldn't be included here, but are for now...\r
-//#include <string.h>\r
-////#include <afxwin.h> // This is needed only for things like BOOL, etc.\r
-//#include <fstream.h>\r
-//#include <stdlib.h>\r
-//#include <malloc.h> // Both for malloc, free, _msize, realloc\r
-\r
-#ifndef __TTF_H__\r
-#define __TTF_H__\r
-\r
-#include "list.h"\r
-#include "types.h"\r
-#include "glyphpoints.h"\r
-\r
-#define MAXGLYPHS 4096 // Number of glyphs in object\r
-#define MAXPOINTS 2000 // Number of points in a glyph\r
-#define MAXHINTS 2000 // Number of hint uint8s in glyph\r
-\r
-//\r
-// "head" struct\r
-//\r
-struct Head\r
-{\r
- uint32 version; // Fixed - Table version number (0x00010000 for version 1.0.)\r
- uint32 fontRevision; // Fixed - fontRevision (Set by font manufacturer.)\r
- uint32 checkSumAdjustment; // To compute: Set it to 0, sum the entire font\r
- // as ULONG, then store 0xB1B0AFBA - sum.\r
- uint32 magicNumber; // Set to 0x5F0F3CF5.\r
- uint16 flags; /* Bit 0 - baseline for font at y=0;\r
- Bit 1 - left sidebearing at x=0;\r
- Bit 2 - instructions may depend on point size;\r
- Bit 3 - force ppem to integer values for all\r
- internal scaler math; may use\r
- fractional ppem sizes if this bit is clear;\r
- Bit 4 - instructions may alter advance width\r
- (the advance widths might not scale linearly);\r
- Note: All other bits must be zero.*/\r
- uint16 unitsPerEm; // Valid range is from 16 to 16384\r
- uint32 /*longDateTime*/ createdh, createdl; // International date (8-uint8 field).\r
- uint32 /*longDateTime*/ modifiedh, modifiedl; // International date (8-uint8 field).\r
- uint16 xMin; // For all glyph bounding boxes.\r
- uint16 yMin; // For all glyph bounding boxes.\r
- uint16 xMax; // For all glyph bounding boxes.\r
- uint16 yMax; // For all glyph bounding boxes.\r
- uint16 macStyle; /* Bit 0 bold (if set to 1); Bit 1 italic (if set to 1)\r
- Bits 2-15 reserved (set to 0).*/\r
- uint16 lowestRecPPEM; // Smallest readable size in pixels.\r
- int16 fontDirectionHint; /* 0 Fully mixed directional glyphs;\r
- 1 Only strongly left to right;\r
- 2 Like 1 but also contains neutrals;\r
- -1 Only strongly right to left;\r
- -2 Like -1 but also contains neutrals.*/\r
- int16 indexToLocFormat; // 0 for short offsets, 1 for long.\r
- int16 glyphDataFormat; // 0 for current format.\r
-};\r
-\r
-//\r
-// "maxp" struct\r
-//\r
-struct Maxp\r
-{\r
- uint32 version; // Table version number 0x00010000 for version 1.0. \r
- uint16 numGlyphs; // The number of glyphs in the font. \r
- uint16 maxPoints; // Maximum points in a non-composite glyph. \r
- uint16 maxContours; // Maximum contours in a non-composite glyph. \r
- uint16 maxCompositePoints; // Maximum points in a composite glyph. \r
- uint16 maxCompositeContours; // Maximum contours in a composite glyph. \r
- uint16 maxZones; // 1 if instructions do not use the twilight\r
- // zone (Z0), or 2 if instructions do use Z0;\r
- // should be set to 2 in most cases. \r
- uint16 maxTwilightPoints; // Maximum points used in Z0. \r
- uint16 maxStorage; // Number of Storage Area locations. \r
- uint16 maxFunctionDefs; // Number of FDEFs. \r
- uint16 maxInstructionDefs; // Number of IDEFs. \r
- uint16 maxStackElements; // Maximum stack depth. \r
- uint16 maxSizeOfInstructions; // Maximum uint8 count for glyph instructions. \r
- uint16 maxComponentElements; // Maximum number of components referenced at\r
- // "top level" for any composite glyph. \r
- uint16 maxComponentDepth; // Maximum levels of recursion; 1 for simple components.\r
-};\r
-\r
-//\r
-// "cmap" struct\r
-//\r
-/*\r
-USHORT Table version number (0).\r
-USHORT Number of encoding tables, n. \r
-\r
-This is followed by an entry for each of the n encoding table specifying the\r
-particular encoding, and the offset to the actual subtable:\r
-\r
-Type Description \r
-USHORT Platform ID. \r
-USHORT Platform-specific encoding ID. \r
-ULONG uint8 offset from beginning of table to the subtable for this encoding. \r
-\r
-USHORT format Format number is set to 4. \r
-USHORT length Length in uint8s. \r
-USHORT version Version number (starts at 0). \r
-USHORT segCountX2 2 x segCount. \r
-USHORT searchRange 2 x (2**floor(log2(segCount))) \r
-USHORT entrySelector log2(searchRange/2) \r
-USHORT rangeShift 2 x segCount - searchRange \r
-USHORT endCount[segCount] End characterCode for each segment,\r
- last =0xFFFF. \r
-USHORT reservedPad Set to 0. \r
-USHORT startCount[segCount] Start character code for each segment. \r
-USHORT idDelta[segCount] Delta for all character codes in segment. \r
-USHORT idRangeOffset[segCount] Offsets into glyphIdArray or 0 \r
-USHORT glyphIdArray[ ] Glyph index array (arbitrary length) \r
-\r
-The number of segments is specified by segCount, which is not explicitly in\r
-the header; however, all of the header parameters are derived from it. The\r
-searchRange value is twice the largest power of 2 that is less than or equal\r
-to segCount. For example, if segCount=39, we have the following:\r
-\r
-segCountX2 78\r
-searchRange 64 (2 * largest power of 2 <= 39)\r
-entrySelector 5 log2(32)\r
-rangeShift 14 2 x 39 - 64\r
-*/\r
-\r
-struct GlyphPt\r
-{\r
- int x, y;\r
- bool onCurve;\r
-\r
- // Default constructor\r
- GlyphPt(int xx = 0, int yy = 0, bool oc = true): x(xx), y(yy), onCurve(oc) {}\r
-};\r
-\r
-struct Box\r
-{\r
- int16 llx, lly, urx, ury;\r
-\r
- // Default constructor\r
- Box(int16 lx = 0, int16 ly = 0, int16 rx = 0, int16 ry = 0):\r
- llx(lx), lly(ly), urx(rx), ury(ry) {}\r
-};\r
-\r
-struct NameRec\r
-{\r
- uint16 platformID, platformSpecID, languageID, nameID, length;\r
- uint8 * str;\r
-\r
- NameRec(): str(NULL) {}\r
-\r
- NameRec(NameRec &c): str(NULL)\r
- {\r
- *this = c;\r
- }\r
-\r
- ~NameRec()\r
- {\r
- if (str)\r
- delete[] str;\r
- }\r
-\r
- void operator=(const NameRec &c)\r
- {\r
- if (this == &c)\r
- return; // Take care of self-assignment\r
-\r
- if (str)\r
- delete[] str;\r
-\r
- platformID = c.platformID;\r
- platformSpecID = c.platformSpecID;\r
- languageID = c.languageID;\r
- nameID = c.nameID;\r
- length = c.length;\r
-//Fix this str = (uint8 *)strdup((char *)c.str);\r
- }\r
-};\r
-\r
-struct Composite\r
-{\r
- uint16 flags, glyphIndex;\r
- int16 arg1, arg2;\r
- float xScale, yScale, scale01, scale10;\r
-\r
- Composite(uint16 fl = 0, uint16 gl = 0, int16 a1 = 0, int16 a2 = 0,\r
- float xs = 1.0f, float ys = 1.0f, float s01 = 1.0f, float s10 = 1.0f):\r
- flags(fl), glyphIndex(gl), arg1(a1), arg2(a2), xScale(xs), yScale(ys),\r
- scale01(s01), scale10(s10) {}\r
-};\r
-\r
-//\r
-// The TTF class\r
-//\r
-// The following is a set of member functions that needs to be implemented\r
-// to fully encapsulate a TTF database.\r
-//\r
-// SetGlyph(glyphno)\r
-// DeleteGlyph(glyphno)\r
-// AddGlyph()\r
-// GetNumberOfPolys()\r
-// GetPolyStart(polyno)\r
-// SetPolyStart(polyno)\r
-// AddPoly(polyno)\r
-// DeletePoly(polyno)\r
-// IsCompositeGlyph()\r
-// MovePoint(pointno, x, y)\r
-// AddPoint(pointno, x, y)\r
-// DeletePoint(pointno)\r
-// maybe: TGlyphPt GetPointInfo(pointno) instead of three following...\r
-// GetPointX(pointno)\r
-// GetPointY(pointno)\r
-// GetOnCurve(pointno)\r
-// SetOnCurve(pointno)\r
-// ConnectGlyphToChar(glyphno, charno)\r
-// EncodeGlyph(glyphno)\r
-// DecodeGlyph(glyphno)\r
-// GetNumberOfPoints()\r
-// SwapPoints(pointno1, pointno2)\r
-//\r
-// More to be added, as necessary...\r
-//\r
-class TTF\r
-{\r
- private:\r
- bool EncodeGlyph(uint16);\r
- bool DecodeGlyph(uint16);\r
- bool ExtractTables(void);\r
- bool BuildTables(void);\r
-\r
- public:\r
- TTF(void); // Constructor\r
- ~TTF(); // Destructor\r
- void Init(void); // Initalize font database\r
- bool Load(const char *); // Load font database\r
- bool Save(const char *); // Save font database\r
- void ClearTables(void); // Deallocate memory...\r
- bool SetGlyph(uint16 glyphnum); // Set internal pointer/encode/decode\r
- bool AddGlyph(uint16 glyphnum);\r
- bool DeleteGlyph(uint16 glyphnum);\r
- Box GetBoundingBox(void);\r
- GlyphPt GetPoint(uint16 pointno);\r
- uint16 GetNumberOfPolys(void);\r
- uint16 GetPolyEnd(uint16 polynum);\r
- int GetPointX(uint16 pointno);\r
- int GetPointY(uint16 pointno);\r
- bool GetOnCurve(uint16 pointno);\r
- bool SetOnCurve(uint16 pointno, bool state);\r
- bool MovePoint(uint16 pointno, int x, int y);\r
- bool MovePoint(uint16 pointno, GlyphPt p);\r
- bool AddPoint(uint16 pointno, int x, int y, bool state);\r
- bool DeletePoint(uint16 pointno);\r
- bool IsCompositeGlyph(void);\r
- GlyphPoints GetGlyphPoints(uint16);\r
- GlyphPoints GetAllCompositePoints(uint16);\r
- void GetCharName(int, uint8 *);\r
-\r
- private:\r
- bool isDirty; // Has glyph been modified?\r
- bool isCompositeGlyph; // Is it a composite? (need structs to store composite info...)\r
- uint16 currentGlyph; // The glyph currently decoded\r
- uint16 numberOfPoints;\r
- int gx[MAXPOINTS]; // Internal point arrays...\r
- int gy[MAXPOINTS]; // These could be dynamically allocated in the\r
- bool onCurve[MAXPOINTS]; // constructor, with default values being set\r
- uint16 numberOfHints;\r
- uint8 hint[MAXHINTS]; // Hints storage\r
- uint16 numberOfPolys; // Number of polygons in glyph\r
- uint16 poly[200]; // End points of polygons\r
- int16 llx, lly, urx, ury; // Lower left/Upper right X/Y\r
-// public://remove after debugging...\r
- uint8 * glyph[MAXGLYPHS]; // Placeholders for glyphs\r
- uint32 glyphLen[MAXGLYPHS]; // Glyph lengths are stored since malloc() is sloppy\r
- Maxp myMaxp; // Internal placeholders for this shiat\r
- Head myHead;\r
-// public: //private: later...\r
- List<Composite> compositeList; // Composite glyph list\r
- uint8 * EBDT, * EBLC, * EBSC, * LTSH, * OS_2, * PCLT, * VDMX, * cmap, * cvt, * fpgm,\r
- * gasp, * glyf, * hdmx, * head, * hhea, * hmtx, * kern, * loca, * maxp, * name,\r
- * post, * prep, * vhea, * vmtx;\r
- uint32 EBDT_len, EBLC_len, EBSC_len, LTSH_len, OS_2_len, PCLT_len, VDMX_len, cmap_len,\r
- cvt_len, fpgm_len, gasp_len, glyf_len, hdmx_len, head_len, hhea_len, hmtx_len,\r
- kern_len, loca_len, maxp_len, name_len, post_len, prep_len, vhea_len, vmtx_len;\r
- uint8 * * parray[24]; // Pointer array\r
- uint32 * larray[24]; // Length array\r
- bool loaded; // Font loaded/init'ed?\r
-};\r
-\r
-#endif // __TTF_H__\r
-\r
+//
+// TTF.H: TTF Class
+// by James L. Hammons
+// (C) 1999 Underground Software
+//
+// This class encapsulates all the complexity of a TrueType Font File
+// database. Included are functions to load, save, & initialize the
+// TTF database.
+//
+
+#ifndef __TTF_H__
+#define __TTF_H__
+
+#include <stdint.h>
+#include "list.h"
+#include "glyphpoints.h"
+
+#define MAXGLYPHS 4096 // Number of glyphs in object
+#define MAXPOINTS 2000 // Number of points in a glyph
+#define MAXHINTS 2000 // Number of hint uint8_ts in glyph
+
+//
+// "head" struct
+//
+struct Head
+{
+ uint32_t version; // Fixed - Table version number (0x00010000 for version 1.0.)
+ uint32_t fontRevision; // Fixed - fontRevision (Set by font manufacturer.)
+ uint32_t checkSumAdjustment; // To compute: Set it to 0, sum the entire font
+ // as ULONG, then store 0xB1B0AFBA - sum.
+ uint32_t magicNumber; // Set to 0x5F0F3CF5.
+ uint16_t flags; /* Bit 0 - baseline for font at y=0;
+ Bit 1 - left sidebearing at x=0;
+ Bit 2 - instructions may depend on point size;
+ Bit 3 - force ppem to integer values for all
+ internal scaler math; may use
+ fractional ppem sizes if this bit is clear;
+ Bit 4 - instructions may alter advance width
+ (the advance widths might not scale linearly);
+ Note: All other bits must be zero.*/
+ uint16_t unitsPerEm; // Valid range is from 16 to 16384
+ uint32_t /*longDateTime*/ createdh, createdl; // International date (8-uint8_t field).
+ uint32_t /*longDateTime*/ modifiedh, modifiedl; // International date (8-uint8_t field).
+ uint16_t xMin; // For all glyph bounding boxes.
+ uint16_t yMin; // For all glyph bounding boxes.
+ uint16_t xMax; // For all glyph bounding boxes.
+ uint16_t yMax; // For all glyph bounding boxes.
+ uint16_t macStyle; /* Bit 0 bold (if set to 1); Bit 1 italic (if set to 1)
+ Bits 2-15 reserved (set to 0).*/
+ uint16_t lowestRecPPEM; // Smallest readable size in pixels.
+ int16_t fontDirectionHint; /* 0 Fully mixed directional glyphs;
+ 1 Only strongly left to right;
+ 2 Like 1 but also contains neutrals;
+ -1 Only strongly right to left;
+ -2 Like -1 but also contains neutrals.*/
+ int16_t indexToLocFormat; // 0 for short offsets, 1 for long.
+ int16_t glyphDataFormat; // 0 for current format.
+};
+
+//
+// "maxp" struct
+//
+struct Maxp
+{
+ uint32_t version; // Table version number 0x00010000 for version 1.0.
+ uint16_t numGlyphs; // The number of glyphs in the font.
+ uint16_t maxPoints; // Maximum points in a non-composite glyph.
+ uint16_t maxContours; // Maximum contours in a non-composite glyph.
+ uint16_t maxCompositePoints; // Maximum points in a composite glyph.
+ uint16_t maxCompositeContours; // Maximum contours in a composite glyph.
+ uint16_t maxZones; // 1 if instructions do not use the twilight
+ // zone (Z0), or 2 if instructions do use Z0;
+ // should be set to 2 in most cases.
+ uint16_t maxTwilightPoints; // Maximum points used in Z0.
+ uint16_t maxStorage; // Number of Storage Area locations.
+ uint16_t maxFunctionDefs; // Number of FDEFs.
+ uint16_t maxInstructionDefs; // Number of IDEFs.
+ uint16_t maxStackElements; // Maximum stack depth.
+ uint16_t maxSizeOfInstructions; // Maximum uint8_t count for glyph instructions.
+ uint16_t maxComponentElements; // Maximum number of components referenced at
+ // "top level" for any composite glyph.
+ uint16_t maxComponentDepth; // Maximum levels of recursion; 1 for simple components.
+};
+
+//
+// "cmap" struct
+//
+/*
+USHORT Table version number (0).
+USHORT Number of encoding tables, n.
+
+This is followed by an entry for each of the n encoding table specifying the
+particular encoding, and the offset to the actual subtable:
+
+Type Description
+USHORT Platform ID.
+USHORT Platform-specific encoding ID.
+ULONG uint8_t offset from beginning of table to the subtable for this encoding.
+
+USHORT format Format number is set to 4.
+USHORT length Length in uint8_ts.
+USHORT version Version number (starts at 0).
+USHORT segCountX2 2 x segCount.
+USHORT searchRange 2 x (2**floor(log2(segCount)))
+USHORT entrySelector log2(searchRange/2)
+USHORT rangeShift 2 x segCount - searchRange
+USHORT endCount[segCount] End characterCode for each segment,
+ last =0xFFFF.
+USHORT reservedPad Set to 0.
+USHORT startCount[segCount] Start character code for each segment.
+USHORT idDelta[segCount] Delta for all character codes in segment.
+USHORT idRangeOffset[segCount] Offsets into glyphIdArray or 0
+USHORT glyphIdArray[ ] Glyph index array (arbitrary length)
+
+The number of segments is specified by segCount, which is not explicitly in
+the header; however, all of the header parameters are derived from it. The
+searchRange value is twice the largest power of 2 that is less than or equal
+to segCount. For example, if segCount=39, we have the following:
+
+segCountX2 78
+searchRange 64 (2 * largest power of 2 <= 39)
+entrySelector 5 log2(32)
+rangeShift 14 2 x 39 - 64
+*/
+
+struct GlyphPt
+{
+ int x, y;
+ bool onCurve;
+
+ // Default constructor
+ GlyphPt(int xx = 0, int yy = 0, bool oc = true): x(xx), y(yy), onCurve(oc) {}
+};
+
+struct Box
+{
+ int16_t llx, lly, urx, ury;
+
+ // Default constructor
+ Box(int16_t lx = 0, int16_t ly = 0, int16_t rx = 0, int16_t ry = 0):
+ llx(lx), lly(ly), urx(rx), ury(ry) {}
+};
+
+struct NameRec
+{
+ uint16_t platformID, platformSpecID, languageID, nameID, length;
+ uint8_t * str;
+
+ NameRec(): str(NULL) {}
+
+ NameRec(NameRec &c): str(NULL)
+ {
+ *this = c;
+ }
+
+ ~NameRec()
+ {
+ if (str)
+ delete[] str;
+ }
+
+ void operator=(const NameRec &c)
+ {
+ if (this == &c)
+ return; // Take care of self-assignment
+
+ if (str)
+ delete[] str;
+
+ platformID = c.platformID;
+ platformSpecID = c.platformSpecID;
+ languageID = c.languageID;
+ nameID = c.nameID;
+ length = c.length;
+//Fix this str = (uint8_t *)strdup((char *)c.str);
+ }
+};
+
+struct Composite
+{
+ uint16_t flags, glyphIndex;
+ int16_t arg1, arg2;
+ float xScale, yScale, scale01, scale10;
+
+ Composite(uint16_t fl = 0, uint16_t gl = 0, int16_t a1 = 0, int16_t a2 = 0,
+ float xs = 1.0f, float ys = 1.0f, float s01 = 1.0f, float s10 = 1.0f):
+ flags(fl), glyphIndex(gl), arg1(a1), arg2(a2), xScale(xs), yScale(ys),
+ scale01(s01), scale10(s10) {}
+};
+
+//
+// The TTF class
+//
+// The following is a set of member functions that needs to be implemented
+// to fully encapsulate a TTF database.
+//
+// SetGlyph(glyphno)
+// DeleteGlyph(glyphno)
+// AddGlyph()
+// GetNumberOfPolys()
+// GetPolyStart(polyno)
+// SetPolyStart(polyno)
+// AddPoly(polyno)
+// DeletePoly(polyno)
+// IsCompositeGlyph()
+// MovePoint(pointno, x, y)
+// AddPoint(pointno, x, y)
+// DeletePoint(pointno)
+// maybe: TGlyphPt GetPointInfo(pointno) instead of three following...
+// GetPointX(pointno)
+// GetPointY(pointno)
+// GetOnCurve(pointno)
+// SetOnCurve(pointno)
+// ConnectGlyphToChar(glyphno, charno)
+// EncodeGlyph(glyphno)
+// DecodeGlyph(glyphno)
+// GetNumberOfPoints()
+// SwapPoints(pointno1, pointno2)
+//
+// More to be added, as necessary...
+//
+class TTF
+{
+ private:
+ bool EncodeGlyph(uint16_t);
+ bool DecodeGlyph(uint16_t);
+ bool ExtractTables(void);
+ bool BuildTables(void);
+
+ public:
+ TTF(void); // Constructor
+ ~TTF(); // Destructor
+ void Init(void); // Initalize font database
+ bool Load(const char *); // Load font database
+ bool Save(const char *); // Save font database
+ void ClearTables(void); // Deallocate memory...
+ bool SetGlyph(uint16_t glyphnum); // Set internal pointer/encode/decode
+ bool AddGlyph(uint16_t glyphnum);
+ bool DeleteGlyph(uint16_t glyphnum);
+ Box GetBoundingBox(void);
+ GlyphPt GetPoint(uint16_t pointno);
+ uint16_t GetNumberOfPolys(void);
+ uint16_t GetPolyEnd(uint16_t polynum);
+ int GetPointX(uint16_t pointno);
+ int GetPointY(uint16_t pointno);
+ bool GetOnCurve(uint16_t pointno);
+ bool SetOnCurve(uint16_t pointno, bool state);
+ bool MovePoint(uint16_t pointno, int x, int y);
+ bool MovePoint(uint16_t pointno, GlyphPt p);
+ bool AddPoint(uint16_t pointno, int x, int y, bool state);
+ bool DeletePoint(uint16_t pointno);
+ bool IsCompositeGlyph(void);
+ GlyphPoints GetGlyphPoints(uint16_t);
+ GlyphPoints GetAllCompositePoints(uint16_t);
+ void GetCharName(int, uint8_t *);
+
+ private:
+ bool isDirty; // Has glyph been modified?
+ bool isCompositeGlyph; // Is it a composite? (need structs to store composite info...)
+ uint16_t currentGlyph; // The glyph currently decoded
+ uint16_t numberOfPoints;
+ int gx[MAXPOINTS]; // Internal point arrays...
+ int gy[MAXPOINTS]; // These could be dynamically allocated in the
+ bool onCurve[MAXPOINTS]; // constructor, with default values being set
+ uint16_t numberOfHints;
+ uint8_t hint[MAXHINTS]; // Hints storage
+ uint16_t numberOfPolys; // Number of polygons in glyph
+ uint16_t poly[200]; // End points of polygons
+ int16_t llx, lly, urx, ury; // Lower left/Upper right X/Y
+// public://remove after debugging...
+ uint8_t * glyph[MAXGLYPHS]; // Placeholders for glyphs
+ uint32_t glyphLen[MAXGLYPHS]; // Glyph lengths are stored since malloc() is sloppy
+ Maxp myMaxp; // Internal placeholders for this shiat
+ Head myHead;
+// public: //private: later...
+ List<Composite> compositeList; // Composite glyph list
+ uint8_t * EBDT, * EBLC, * EBSC, * LTSH, * OS_2, * PCLT, * VDMX, * cmap, * cvt, * fpgm,
+ * gasp, * glyf, * hdmx, * head, * hhea, * hmtx, * kern, * loca, * maxp, * name,
+ * post, * prep, * vhea, * vmtx;
+ uint32_t EBDT_len, EBLC_len, EBSC_len, LTSH_len, OS_2_len, PCLT_len, VDMX_len, cmap_len,
+ cvt_len, fpgm_len, gasp_len, glyf_len, hdmx_len, head_len, hhea_len, hmtx_len,
+ kern_len, loca_len, maxp_len, name_len, post_len, prep_len, vhea_len, vmtx_len;
+ uint8_t * * parray[24]; // Pointer array
+ uint32_t * larray[24]; // Length array
+ bool loaded; // Font loaded/init'ed?
+};
+
+#endif // __TTF_H__
+