This commit is contained in:
thomas committed 2026-10-18 14:06:40 +02:00
commit 2c2202e60d
2491 files changed
+1295990

No files matched your search

@@ -0,0 +1 @@
63
@@ -0,0 +1,38 @@
32
44
45
46
48
49
50
51
52
53
54
55
56
57
58
63
65
66
67
68
69
70
72
73
75
76
77
78
79
80
82
84
85
86
88
97
120
122
@@ -0,0 +1,23 @@
43
45
48
49
50
63
65
66
67
68
69
72
73
76
78
79
81
82
83
84
85
86
90
@@ -0,0 +1 @@
{"typographies":[["Default","arial.ttf",20,4],["Large","arial.ttf",40,4],["Small","arial.ttf",10,4]],"generate_font_format":"0"}
@@ -0,0 +1 @@
{"typographies":[["Default","arial.ttf",20,4],["Large","arial.ttf",40,4],["Small","arial.ttf",10,4]],"generate_font_format":"0"}
@@ -0,0 +1 @@
{"cache_size":4096}
@@ -0,0 +1 @@
{"cache_size":4096}
@@ -0,0 +1,2 @@
AH:0 BA:1 FC:63 EC:0 FF:0 CF:1 FU:0 ZB:0
63
@@ -0,0 +1,39 @@
AH:0 BA:1 FC:63 EC:0 FF:0 CF:0 FU:0 ZB:0
32
44
45
46
48
49
50
51
52
53
54
55
56
57
58
63
65
66
67
68
69
70
72
73
75
76
77
78
79
80
82
84
85
86
88
97
120
122
@@ -0,0 +1,24 @@
AH:0 BA:1 FC:63 EC:0 FF:0 CF:0 FU:0 ZB:0
43
45
48
49
50
63
65
66
67
68
69
72
73
76
78
79
81
82
83
84
85
86
90
@@ -0,0 +1 @@
{"max_floats":0,"max_commands":0,"max_font":""}
@@ -0,0 +1,44 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_APPLICATIONFONTPROVIDER_HPP
#define TOUCHGFX_APPLICATIONFONTPROVIDER_HPP
#include <touchgfx/FontManager.hpp>
namespace touchgfx
{
class FlashDataReader;
}
struct Typography
{
static const touchgfx::FontId DEFAULT = 0;
static const touchgfx::FontId LARGE = 1;
static const touchgfx::FontId SMALL = 2;
};
struct TypographyFontIndex
{
static const touchgfx::FontId DEFAULT = 0; // arial_20_4bpp
static const touchgfx::FontId LARGE = 1; // arial_40_4bpp
static const touchgfx::FontId SMALL = 2; // arial_10_4bpp
static const uint16_t NUMBER_OF_FONTS = 3;
};
class ApplicationFontProvider : public touchgfx::FontProvider
{
public:
virtual touchgfx::Font* getFont(touchgfx::FontId typography);
static void setFlashReader(touchgfx::FlashDataReader* /*flashReader*/)
{
}
static touchgfx::FlashDataReader* getFlashReader()
{
return 0;
}
};
#endif // TOUCHGFX_APPLICATIONFONTPROVIDER_HPP
@@ -0,0 +1,93 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_CACHEDFONT_HPP
#define TOUCHGFX_CACHEDFONT_HPP
#include <fonts/FontCache.hpp>
#include <fonts/GeneratedFont.hpp>
namespace touchgfx
{
class CachedFont : public GeneratedFont
{
public:
CachedFont(const struct touchgfx::BinaryFontData* data, FontId id, FontCache* _cache, const GeneratedFont* _flashFont)
: GeneratedFont(0, // GlyphNode*
data->numberOfGlyphs,
data->fontHeight,
data->baseline,
data->pixAboveTop,
data->pixBelowBottom,
data->bitsPerPixel,
data->byteAlignRow,
data->maxLeft,
data->maxRight,
0, // glyphDataPointer
0, // Kerning table not used for cached font
data->fallbackChar,
data->ellipsisChar,
0, // lsubTablePointer
0), // contextualFormsPointer
fontId(id),
cache(_cache),
flashFont(_flashFont)
{
}
CachedFont()
: GeneratedFont()
{
}
using GeneratedFont::getGlyph;
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const;
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const;
virtual int8_t getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const;
void setFontCache(FontCache& cache);
FontId getFontId() const
{
return fontId;
}
virtual const uint16_t* getGSUBTable() const
{
if (gsubTable != 0)
{
return gsubTable;
}
return flashFont->getGSUBTable();
}
virtual void setGSUBTable(const uint16_t* table)
{
gsubTable = table;
}
virtual const FontContextualFormsTable* getContextualFormsTable() const
{
if (arabicTable != 0)
{
return arabicTable;
}
return flashFont->getContextualFormsTable();
}
virtual void setContextualFormsTable(const FontContextualFormsTable* table)
{
arabicTable = table;
}
private:
FontId fontId;
FontCache* cache;
const GeneratedFont* flashFont;
};
} // namespace touchgfx
#endif // TOUCHGFX_CACHEDFONT_HPP
@@ -0,0 +1,42 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_COMPRESSEDFONTCACHE_HPP
#define TOUCHGFX_COMPRESSEDFONTCACHE_HPP
#include <touchgfx/hal/Types.hpp>
#include <touchgfx/Font.hpp>
namespace touchgfx
{
class CompressedFontCache
{
public:
static void clearCache();
static const uint8_t* hasCachedGlyph(const GlyphNode* glyphNode);
static void unableToCache(const GlyphNode* glyphNode, int byteSize);
static const uint8_t* cacheGlyph(const GlyphNode* glyph, const uint8_t* compressedData);
static int usedMemory()
{
return pixelsTop - (uint8_t*)bitmapFontCache + glyphsAllocated * sizeof(BitmapFontCacheKey);
}
static int cacheClearCounter;
private:
static uint8_t* decompressGlyph(uint8_t* pixelsTop, const GlyphNode* glyphNode, const uint8_t* compressedData);
struct BitmapFontCacheKey
{
const void* glyphNode;
const uint8_t* pixels;
};
static const int cacheSizeBytes = 4096;
static const int cacheWords = (cacheSizeBytes + 3) / 4;
static uint32_t bitmapFontCache[cacheWords];
static uint8_t* pixelsTop;
static int glyphsAllocated;
};
} // namespace touchgfx
#endif // TOUCHGFX_COMPRESSEDFONTCACHE_HPP
@@ -0,0 +1,46 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_COMPRESSEDUNMAPPEDFONTCACHE_HPP
#define TOUCHGFX_COMPRESSEDUNMAPPEDFONTCACHE_HPP
#include <touchgfx/hal/FlashDataReader.hpp>
#include <touchgfx/hal/Types.hpp>
#include <touchgfx/Font.hpp>
namespace touchgfx
{
class CompressedUnmappedFontCache
{
public:
static void clearCache();
static const GlyphNode* hasCachedGlyphNode(const GlyphNode* glyphNode);
static const GlyphNode* hasCachedGlyphData(const GlyphNode* glyphNode, const uint8_t*& pixelData);
static void unableToCache(const GlyphNode* glyphNode, int byteSize);
static GlyphNode* cacheGlyphNode(const GlyphNode* glyph);
static const uint8_t* cacheGlyphData(const GlyphNode* glyph, const uint8_t* compressedData, touchgfx::FlashDataReader* reader);
static int usedMemory()
{
return pixelsTop - (uint8_t*)bitmapFontCache + glyphsAllocated * sizeof(BitmapFontCacheKey);
}
static int cacheClearCounter;
private:
static uint8_t* decompressGlyph(uint8_t* pixelsTop, const GlyphNode* glyphNode, const uint8_t* compressedData, touchgfx::FlashDataReader* reader);
struct BitmapFontCacheKey
{
const void* glyphNodeSrc;
GlyphNode glyphNodeCopy;
const uint8_t* pixels;
};
static const int cacheSizeBytes = 4096;
static const int cacheWords = (cacheSizeBytes + 3) / 4;
static uint32_t bitmapFontCache[cacheWords];
static uint8_t* pixelsTop;
static int glyphsAllocated;
};
} // namespace touchgfx
#endif // TOUCHGFX_COMPRESSEDUNMAPPEDFONTCACHE_HPP
@@ -0,0 +1,112 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_FONTCACHE_HPP
#define TOUCHGFX_FONTCACHE_HPP
#include <touchgfx/Font.hpp>
#include <touchgfx/TypedText.hpp>
#include <fonts/ApplicationFontProvider.hpp>
namespace touchgfx
{
class CachedFont;
class FontDataReader
{
public:
virtual ~FontDataReader()
{
}
virtual void open() = 0;
virtual void close() = 0;
virtual void setPosition(uint32_t position) = 0;
virtual void readData(void* out, uint32_t numberOfBytes) = 0;
};
class FontCache
{
public:
FontCache();
void setReader(FontDataReader* reader);
void clear(bool keepGsubOrContextTable = false);
void setMemory(uint8_t* memory, uint32_t size);
void initializeCachedFont(TypedText t, CachedFont* font, bool loadGsubOrContextTable = false);
bool cacheString(TypedText t, const Unicode::UnicodeChar* string);
bool cacheLigatures(CachedFont* font, TypedText t, const Unicode::UnicodeChar* string);
const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, FontId font) const;
uint32_t getMemoryUsage()
{
return memorySize - (gsubStart - top);
}
void open();
void close();
static inline const uint8_t* getPixelData(const GlyphNode* glyph)
{
return ((const uint8_t*)glyph) + SizeGlyphNode + sizeof(void*);
}
static inline bool isCached(const GlyphNode* g)
{
return g->dataOffset == 0xFFFFFFFF;
}
private:
static const uint32_t SizeGlyphNode = 16;
bool contains(Unicode::UnicodeChar unicode, FontId font) const;
void insert(Unicode::UnicodeChar unicode, FontId font, bool& outOfMemory);
uint8_t* copyGlyph(uint8_t* top, Unicode::UnicodeChar unicode, FontId font, bool& outOfMemory);
void cacheData(GlyphNode* first);
bool cacheSortedString(TypedText t);
bool createSortedString(const Unicode::UnicodeChar* string);
bool createSortedLigatures(CachedFont* font, TypedText t, const Unicode::UnicodeChar* string, ...);
bool sortSortedString(int n);
void setPosition(uint32_t position);
void readData(void* out, uint32_t numberOfBytes);
uint32_t getGlyphSize(const GlyphNode* gn)
{
if (byteAlignRow)
{
// Round up line width to byte boundary and multiply by height
return (gn->width() * bpp + 7) / 8 * gn->height();
}
// Calculate number of pixels and round up to byte bounday
return (gn->width() * gn->height() * bpp + 7) / 8;
}
struct
{
uint8_t* first; // First GlyphNode, glyph in cache;
uint8_t* last; // Last GlyphNode, glyph in cache;
} fontTable[MAX(TypographyFontIndex::NUMBER_OF_FONTS, 1)];
uint32_t memorySize;
uint8_t* memory; // Start of memory
uint8_t* top; // First unused byte
uint8_t* gsubStart; // First address of GSUB tables, allocated in the end of the cache
FontDataReader* reader;
Unicode::UnicodeChar* sortedString;
// Must be bigger than BinaryFontData
static const uint32_t MAX_BUFFER_SIZE = 64;
char buffer[MAX_BUFFER_SIZE];
uint32_t glyphDataOffset;
uint16_t numGlyphs;
uint16_t currentFileGlyphNumber;
uint8_t bpp;
uint8_t byteAlignRow;
GlyphNode currentFileGlyphNode;
};
} // namespace touchgfx
#endif // TOUCHGFX_FONTCACHE_HPP
@@ -0,0 +1,227 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_GENERATEDFONT_HPP
#define TOUCHGFX_GENERATEDFONT_HPP
#include <touchgfx/ConstFont.hpp>
namespace touchgfx
{
class GeneratedFont : public ConstFont
{
public:
GeneratedFont(const GlyphNode* glyphs, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataInternalFlash, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable);
using ConstFont::getGlyph;
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const;
virtual int8_t getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const;
virtual const uint16_t* getGSUBTable() const
{
return gsubTable;
}
virtual const FontContextualFormsTable* getContextualFormsTable() const
{
return arabicTable;
}
protected:
GeneratedFont()
: ConstFont(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), glyphData(0), kerningData(0), gsubTable(0), arabicTable(0)
{
}
const void* glyphData; ///< The glyphs
const KerningNode* kerningData; ///< The kerning
const uint16_t* gsubTable; ///< The GSUB tables
const FontContextualFormsTable* arabicTable; ///< Contextual forms
};
class FusedFont : public GeneratedFont
{
public:
FusedFont(const GlyphNode* glyphs, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataInternalFlash, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable, GlyphNode& fontFusedNode)
: GeneratedFont(glyphs, numGlyphs, height, baseline, pixAboveTop, pixBelowBottom, bitsPerPixel, byteAlignRow,
maxLeft, maxRight, glyphDataInternalFlash, kerningList, fallbackChar, ellipsisChar,
gsubData, formsTable), fusedNode(fontFusedNode)
{ }
using GeneratedFont::getGlyph;
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const;
private:
GlyphNode& fusedNode;
};
struct VectorFontNode
{
uint32_t dataOffset; ///< The index to the data of this glyph in words
Unicode::UnicodeChar unicode; ///< The Unicode of this glyph.
uint16_t width; ///< Width of the actual glyph data
uint16_t height; ///< Height of the actual glyph data
int16_t top; ///< Vertical offset from baseline of the glyph
int16_t left; ///< Horizontal offset from the left of the glyph
uint16_t advance; ///< Width of the glyph (including space to the left and right)
uint16_t kerningTablePos; ///< Where are the kerning information for this glyph stored in the kerning table
uint8_t kerningTableSize; ///< How many entries are there in the kerning table (following kerningTablePos) for this glyph
};
struct VectorKerningNode
{
Unicode::UnicodeChar unicodePrevChar; ///< The Unicode for the first character in the kerning pair
int16_t distance; ///< The kerning distance
};
struct VectorFontData
{
uint16_t numberOfGlyphs;
uint16_t baselineHeight;
uint16_t maxLeft;
uint16_t maxRight;
uint16_t maxAboveTop;
uint16_t maxBelowBottom;
const Unicode::UnicodeChar fallbackChar;
const Unicode::UnicodeChar ellipsisChar;
};
class GeneratedVectorFont : public Font
{
public:
GeneratedVectorFont(uint16_t baseline, float scale, const VectorFontNode* vectorGlyphs, const VectorFontData& fontData,
const uint16_t* const* glyphData, const VectorKerningNode* kerningTable,
const uint16_t* const gsubData, const FontContextualFormsTable* formsTable);
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode) const;
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const;
virtual int8_t getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const;
virtual bool isVectorBasedFont() const { return true; }
virtual float getScaleFactor() const { return scaleFactor; }
virtual const uint16_t* getGSUBTable() const { return gsubTable; }
virtual const FontContextualFormsTable* getContextualFormsTable() const { return arabicTable; }
private:
const VectorFontNode* find(Unicode::UnicodeChar unicode) const;
const GlyphNode* getGlyphNode(const VectorFontNode* node) const;
float scaleFactor;
const VectorFontNode* vectorNodes;
const uint16_t* const* vectorTable;
const VectorKerningNode* kerningTable;
const uint16_t* gsubTable;
const FontContextualFormsTable* arabicTable;
uint16_t numberOfGlyphs;
static GlyphNode glyphNode;
};
struct BinaryFontData
{
uint32_t fontIndex; // The font index (as used by TypedTextDatabase)
uint32_t sizeOfFontData; // Size of the complete BinaryFont
uint32_t offsetToTable; // GlyphNode[]
uint32_t offsetToKerning; // KerningNode[]
uint32_t offsetToGlyphs; // uint8_t[]
uint32_t offsetToGSUB; // uint16_t[]
uint32_t offsetToArabicTable; // FontContextualFormsTable
uint16_t numberOfGlyphs; // Number of glyphs in Table and Glyphs
uint16_t fontHeight; // Font height
uint16_t baseline; // Distance to baseline
uint8_t pixAboveTop; // Max pixels above top
uint8_t pixBelowBottom; // Max pixels below bottom
uint8_t bitsPerPixel; // Bpp
uint8_t byteAlignRow; // A4/A2/A1
uint8_t maxLeft; // The maximum a glyph extends to the left
uint8_t maxRight; // The maximum a glyph extends to the right
Unicode::UnicodeChar fallbackChar; // Fallback Character for the font
Unicode::UnicodeChar ellipsisChar; // Ellipsis Character for the font
};
class BinaryFont : public GeneratedFont
{
public:
BinaryFont(const struct touchgfx::BinaryFontData* data)
: GeneratedFont((const GlyphNode*)((const uint8_t*)data + data->offsetToTable),
data->numberOfGlyphs,
data->fontHeight,
data->baseline,
data->pixAboveTop,
data->pixBelowBottom,
data->bitsPerPixel,
data->byteAlignRow,
data->maxLeft,
data->maxRight,
0,
(const KerningNode*)((const uint8_t*)data + data->offsetToKerning),
data->fallbackChar,
data->ellipsisChar,
(data->offsetToGSUB == 0) ? 0 : (const uint16_t*)((const uint8_t*)data + data->offsetToGSUB),
0),
glyphData((const uint8_t*)data + data->offsetToGlyphs)
{
if (data->offsetToArabicTable > 0)
{
setupContextualTable(data);
}
}
BinaryFont()
: GeneratedFont()
{
}
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const
{
const uint8_t* data = (const uint8_t*)glyphData;
return &(data[glyph->dataOffset]);
}
protected:
const uint8_t* glyphData;
FontContextualFormsTable contextualForms;
private:
typedef const Unicode::UnicodeChar (*array5ptr)[5];
typedef const Unicode::UnicodeChar (*array4ptr)[4];
void setupContextualTable(const struct touchgfx::BinaryFontData* data)
{
const uint16_t* const base = (const uint16_t*)(((const uint8_t*)data) + data->offsetToArabicTable);
// First elements in binary font are offsets to arrays in 16bit words
contextualForms.contextualForms4Long = (array5ptr)(base + base[0]);
contextualForms.contextualForms3Long = (array5ptr)(base + base[1]);
contextualForms.contextualForms2Long = (array5ptr)(base + base[2]);
contextualForms.contextualForms0621_063a = (array4ptr)(base + base[3]);
contextualForms.contextualForms0641_064a = (array4ptr)(base + base[4]);
contextualForms.contextualForms06XX = (array5ptr)(base + base[5]);
contextualForms.contextualForms4LongSize = base[6];
contextualForms.contextualForms3LongSize = base[7];
contextualForms.contextualForms2LongSize = base[8];
contextualForms.contextualForms06XXSize = base[9];
arabicTable = &contextualForms;
}
};
class CompressedMappedFont : public GeneratedFont
{
public:
CompressedMappedFont(const GlyphNode* glyphs, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataInternalFlash, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable);
using GeneratedFont::getGlyph;
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode) const;
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const;
};
} // namespace touchgfx
#endif // TOUCHGFX_GENERATEDFONT_HPP
@@ -0,0 +1,137 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#ifndef TOUCHGFX_UNMAPPEDDATAFONT_HPP
#define TOUCHGFX_UNMAPPEDDATAFONT_HPP
#include <touchgfx/Font.hpp>
namespace touchgfx
{
/**
* An UnmappedDataFont has both glyph table and glyph data placed in a
* flash which does not support random access read (indirect
* access). A unicode table is located in a flash with random read
* access (direct access).
*
* @see Font, ConstFont
*/
class UnmappedDataFont : public Font
{
public:
/**
* Construct the UnmappedDataFont.
*
* @param glyphs The array of glyphs known to this font (indirect).
* @param unicodes The array of unicodes known to this font (direct).
* @param numGlyphs The number of glyphs in list.
* @param height The height in pixels of the highest character in this font.
* @param baseline The height of the baseline in pixels.
* @param pixBelowBottom The maximum number of pixels that can be drawn below the
* bottom in this font.
* @param bitsPerPixel The number of bits per pixel in this font.
* @param byteAlignRow Are glyphs encoded using A4 format
* @param maxLeft The maximum a character extends to the left.
* @param maxRight The maximum a character extends to the right.
* @param glyphDataList Pointer to pointers the glyph data for the font (indirect).
* @param kerningList pointer to the kerning data for the font (direct).
* @param fallbackChar The fallback character for the typography in case no glyph is
* available.
* @param ellipsisChar The ellipsis character used for truncating long texts.
* @param gsubTable Pointer to GSUB table (direct).
*/
UnmappedDataFont(const GlyphNode* glyphs, const uint16_t* unicodes, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataList, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable);
using Font::getGlyph;
/**
* Gets the glyph data associated with the specified Unicode. The
GlyphNode is allocated in the buffer passed to the constructor.
*
* Please note that in case of Thai letters and Arabic letters
* where diacritics can be placed relative to the previous
* character(s), please use TextProvider::getNextLigature()
* instead as it will create a temporary GlyphNode that will be
* adjusted with respect to X/Y position.
*
* @param unicode The character to look up.
* @param pixelData Pointer to the pixel data for the glyph if the glyph is
* found. This is set by this method.
* @param [out] bitsPerPixel Reference where to place the number of bits per pixel.
*
* @return A pointer to the glyph node or null if the glyph was not found.
*/
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const;
/**
* Obtains the address to the pixel data for the specified glyph.
*
* @param glyph The glyph to get the pixels data of.
*
* @return The address of the pixel data of the glyph.
*/
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const;
/**
* Gets the kerning distance between two characters.
*
* @param prevChar The unicode value of the previous character.
* @param glyph the glyph object for the current character.
*
* @return The kerning distance between prevChar and glyph char.
*/
virtual int8_t getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const;
/**
* Gets GSUB table.
*
* @return The GSUB table or null if font has GSUB no table
*/
virtual const uint16_t* getGSUBTable() const
{
return gsubTable;
}
/**
* Gets the contextual forms table used in arabic fonts.
*
* @return The FontContextualFormsTable or null if the font has no table.
*/
virtual const FontContextualFormsTable* getContextualFormsTable() const
{
return arabicTable;
}
protected:
UnmappedDataFont()
: Font(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), glyphList(0), unicodes(0), glyphDataList(0), kerningData(0), gsubTable(0)
{
}
int lookupUnicode(uint16_t unicode) const;
const GlyphNode* glyphList; ///< The list of glyphs
uint16_t listSize; ///< The size of the list of glyphs
const uint16_t* unicodes; ///< LookupTable with all unicodes in this font
const void* glyphDataList; ///< The glyphs (list of pointers)
const KerningNode* kerningData; ///< The kerning
const uint16_t* gsubTable; ///< The GSUB tables
const FontContextualFormsTable* arabicTable; ///< Contextual forms
static GlyphNode glyphNodeBuffer; ///< Buffer for GlyphNodes read from unmapped flash
};
class CompressedUnmappedDataFont : public UnmappedDataFont
{
public:
CompressedUnmappedDataFont(const GlyphNode* glyphs, const uint16_t* unicodes, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataList, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable);
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode) const;
virtual const GlyphNode* getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const;
virtual const uint8_t* getPixelData(const GlyphNode* glyph) const;
};
} // namespace touchgfx
#endif // TOUCHGFX_UNMAPPEDDATAFONT_HPP
@@ -0,0 +1,24 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <fonts/ApplicationFontProvider.hpp>
#include <fonts/GeneratedFont.hpp>
#include <texts/TypedTextDatabase.hpp>
touchgfx::Font* ApplicationFontProvider::getFont(touchgfx::FontId typography)
{
switch (typography)
{
case Typography::DEFAULT:
// arial_20_4bpp
return const_cast<touchgfx::Font*>(TypedTextDatabase::getFonts()[0]);
case Typography::LARGE:
// arial_40_4bpp
return const_cast<touchgfx::Font*>(TypedTextDatabase::getFonts()[1]);
case Typography::SMALL:
// arial_10_4bpp
return const_cast<touchgfx::Font*>(TypedTextDatabase::getFonts()[2]);
default:
return 0;
}
}
@@ -0,0 +1,55 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <fonts/CachedFont.hpp>
namespace touchgfx
{
const uint8_t* CachedFont::getPixelData(const GlyphNode* glyph) const
{
// If glyph is cached, then data is present just after the GlyphNode
if (FontCache::isCached(glyph))
{
const uint8_t* data = FontCache::getPixelData(glyph);
return data;
}
return flashFont->getPixelData(glyph);
}
const GlyphNode* CachedFont::getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const
{
// Look first in internal flash font
const GlyphNode* n = flashFont->find(unicode);
if ((n == 0) && (cache != 0))
{
// Now look in FontCache table
n = cache->getGlyph(unicode, fontId);
}
// Revert to normal behaviour if still not found
if (n == 0 && unicode != 0 && unicode != '\n')
{
Unicode::UnicodeChar fallbackChar = flashFont->getFallbackChar();
n = flashFont->find(fallbackChar);
if (n == 0)
{
n = cache->getGlyph(fallbackChar, fontId);
}
}
if (n != 0)
{
pixelData = getPixelData(n);
bitsPerPixel = getBitsPerPixel();
return n;
}
return (const GlyphNode*)0;
}
int8_t CachedFont::getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const
{
// Kerning is not supported by Font Caching
return 0;
}
} // namespace touchgfx
@@ -0,0 +1,183 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <fonts/CompressedFontCache.hpp>
#include <touchgfx/hal/HAL.hpp>
#include <touchgfx/hal/Paint.hpp>
namespace touchgfx
{
LOCATION_PRAGMA_32("TouchGFX_CompressedFontCache")
uint32_t CompressedFontCache::bitmapFontCache[cacheWords] LOCATION_ATTRIBUTE_32("TouchGFX_CompressedFontCache");
uint8_t* CompressedFontCache::pixelsTop = (uint8_t*)CompressedFontCache::bitmapFontCache;
int CompressedFontCache::glyphsAllocated = 0;
int CompressedFontCache::cacheClearCounter = 0;
namespace
{
/* Read nibbles from a compressed data array */
struct NibReader
{
NibReader(const uint8_t* buffer)
: buffer(buffer), byteIndex(0), low(true)
{}
const uint8_t* buffer;
int byteIndex;
bool low;
uint8_t getNext()
{
if (low)
{
const uint8_t val = buffer[byteIndex] & 0xF;
low = false;
return val;
}
const uint8_t val = buffer[byteIndex] >> 4;
low = true;
byteIndex++;
return val;
}
};
struct NibWriter
{
NibWriter(uint8_t* buffer, int size)
: buffer(buffer), bufferEnd(buffer + size), low(true) {}
uint8_t* buffer;
uint8_t* bufferEnd;
int low;
void put(uint8_t v)
{
if (low)
{
*buffer = v;
low = false;
return;
}
*buffer |= (v << 4);
buffer++;
low = true;
}
bool eof() { return buffer >= bufferEnd; }
};
} // anonymous namespace
uint8_t* CompressedFontCache::decompressGlyph(uint8_t* pixelsTop, const GlyphNode* glyphNode, const uint8_t* compressedData)
{
const int byteSize = (glyphNode->width() + 1) / 2 * glyphNode->height();
NibWriter writer(pixelsTop, byteSize);
NibReader reader(compressedData);
uint8_t* const pixelsEnd = pixelsTop + byteSize;
const int algorithm = glyphNode->dataOffset >> 30;
if (algorithm == 1)
{
// RLE1
while (!writer.eof())
{
const uint8_t value = reader.getNext();
if (value == 0)
{
int zeroCount = reader.getNext();
while (zeroCount)
{
writer.put(0);
zeroCount--;
}
}
writer.put(value);
}
}
else if (algorithm == 2)
{
// RLE2
while (!writer.eof())
{
const uint8_t value = reader.getNext();
if (value == 0 || value == 0xF)
{
int count = reader.getNext();
while (count)
{
writer.put(value);
count--;
}
}
writer.put(value);
}
}
else
{
// Uncompressed
while (pixelsTop < pixelsEnd)
{
*pixelsTop++ = *compressedData++;
}
}
return pixelsEnd;
}
void CompressedFontCache::clearCache()
{
// Wait for DMA2D/GPU2D to finish drawing
HAL::getInstance()->lockUnlockFrameBuffer();
glyphsAllocated = 0;
cacheClearCounter++;
pixelsTop = (uint8_t*)bitmapFontCache;
}
void CompressedFontCache::unableToCache(const GlyphNode* glyphNode, int byteSize)
{
while(1);
}
const uint8_t* CompressedFontCache::hasCachedGlyph(const GlyphNode* glyphNode)
{
const BitmapFontCacheKey* end = (const BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
const BitmapFontCacheKey* first = end - glyphsAllocated;
while (first < end)
{
if (first->glyphNode == glyphNode)
{
return first->pixels;
}
first++;
}
return 0;
}
const uint8_t* CompressedFontCache::cacheGlyph(const GlyphNode* glyph, const uint8_t* compressedData)
{
const int byteSize = (glyph->width() + 1) / 2 * glyph->height();
if (byteSize + 8 > cacheSizeBytes)
{
unableToCache(glyph, byteSize);
return 0;
}
const BitmapFontCacheKey* end = (const BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
if (pixelsTop + byteSize + 8 > (const uint8_t*)&end[-glyphsAllocated])
{
// Unable to fit glyph in data, clear cache
clearCache();
}
const uint8_t* glyphData = pixelsTop;
pixelsTop = decompressGlyph(pixelsTop, glyph, compressedData);
// Flush the cache lines, must be 32byte aligned
uint8_t* rowStart = reinterpret_cast<uint8_t*>(reinterpret_cast<uintptr_t>(glyphData) & ~0x1F);
int alignmentOffset = glyphData - rowStart;
paint::flushLine((uint32_t*)rowStart, byteSize + alignmentOffset);
paint::invalidateTextureCache();
glyphsAllocated++;
BitmapFontCacheKey* key = const_cast<BitmapFontCacheKey*>(end - glyphsAllocated);
key->glyphNode = glyph;
key->pixels = glyphData;
return glyphData;
}
} // namespace touchgfx
@@ -0,0 +1,263 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <fonts/CompressedUnmappedFontCache.hpp>
#include <touchgfx/hal/HAL.hpp>
#include <touchgfx/hal/Paint.hpp>
namespace touchgfx
{
LOCATION_PRAGMA_32("TouchGFX_CompressedUnmappedFontCache")
uint32_t CompressedUnmappedFontCache::bitmapFontCache[cacheWords] LOCATION_ATTRIBUTE_32("TouchGFX_CompressedUnmappedFontCache");
uint8_t* CompressedUnmappedFontCache::pixelsTop = (uint8_t*)CompressedUnmappedFontCache::bitmapFontCache;
int CompressedUnmappedFontCache::glyphsAllocated = 0;
int CompressedUnmappedFontCache::cacheClearCounter = 0;
namespace
{
/* Read nibbles from compressed data in unmapped flash. Must read through reader object */
struct NibUnmapReader
{
NibUnmapReader(const uint8_t* srcAddress, touchgfx::FlashDataReader* reader)
: address(srcAddress), reader(reader), byteIndex(0), low(true)
{
address += bufferSize;
reader->copyData(srcAddress, buffer, sizeof(buffer));
}
const uint8_t* address; //next reading address
touchgfx::FlashDataReader* reader;
static const int bufferSize = 16;
uint8_t buffer[bufferSize];
uint8_t value;
int byteIndex;
bool low;
uint8_t getNext()
{
if (low)
{
value = buffer[byteIndex];
const uint8_t val = value & 0xF;
low = false;
return val;
}
const uint8_t val = value >> 4;
low = true;
if (byteIndex == bufferSize - 1)
{
reader->copyData(address, buffer, bufferSize);
address += bufferSize;
byteIndex = 0;
}
else
{
byteIndex++;
}
return val;
}
};
struct NibWriter
{
NibWriter(uint8_t* buffer, int size)
: buffer(buffer), bufferEnd(buffer + size), low(true) {}
uint8_t* buffer;
uint8_t* bufferEnd;
int low;
void put(uint8_t v)
{
if (low)
{
*buffer = v;
low = false;
return;
}
*buffer |= (v << 4);
buffer++;
low = true;
}
bool eof() { return buffer >= bufferEnd; }
};
} // anonymous namespace
uint8_t* CompressedUnmappedFontCache::decompressGlyph(uint8_t* pixelsTop, const GlyphNode* glyphNode, const uint8_t* compressedData, touchgfx::FlashDataReader* flashReader)
{
const int byteSize = (glyphNode->width() + 1) / 2 * glyphNode->height();
NibWriter writer(pixelsTop, byteSize);
NibUnmapReader reader(compressedData, flashReader);
uint8_t* const pixelsEnd = pixelsTop + byteSize;
const int algorithm = glyphNode->dataOffset >> 30;
if (algorithm == 1)
{
// RLE1
while (!writer.eof())
{
const uint8_t value = reader.getNext();
if (value == 0)
{
int zeroCount = reader.getNext();
while (zeroCount)
{
writer.put(0);
zeroCount--;
}
}
writer.put(value);
}
}
else if (algorithm == 2)
{
// RLE2
while (!writer.eof())
{
const uint8_t value = reader.getNext();
if (value == 0 || value == 0xF)
{
int count = reader.getNext();
while (count)
{
writer.put(value);
count--;
}
}
writer.put(value);
}
}
else
{
// Uncompressed
flashReader->copyData(compressedData, pixelsTop, byteSize);
}
return pixelsEnd;
}
void CompressedUnmappedFontCache::clearCache()
{
// Wait for DMA2D/GPU2D to finish drawing
HAL::getInstance()->lockUnlockFrameBuffer();
glyphsAllocated = 0;
cacheClearCounter++;
pixelsTop = (uint8_t*)bitmapFontCache;
}
void CompressedUnmappedFontCache::unableToCache(const GlyphNode* glyphNode, int byteSize)
{
while(1);
}
const GlyphNode* CompressedUnmappedFontCache::hasCachedGlyphNode(const GlyphNode* glyphNode)
{
const BitmapFontCacheKey* end = (const BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
const BitmapFontCacheKey* first = end - glyphsAllocated;
while (first < end)
{
if (first->glyphNodeSrc == glyphNode)
{
return &first->glyphNodeCopy;
}
first++;
}
return 0;
}
const GlyphNode* CompressedUnmappedFontCache::hasCachedGlyphData(const GlyphNode* glyphNode, const uint8_t*& pixelData)
{
const BitmapFontCacheKey* end = (const BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
const BitmapFontCacheKey* first = end - glyphsAllocated;
while (first < end)
{
if (first->glyphNodeSrc == glyphNode)
{
//Pixel data can be zero!
pixelData = first->pixels;
return &first->glyphNodeCopy;
}
first++;
}
return 0;
}
GlyphNode* CompressedUnmappedFontCache::cacheGlyphNode(const GlyphNode* glyph)
{
const BitmapFontCacheKey* end = (const BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
if (pixelsTop + sizeof(BitmapFontCacheKey) > (const uint8_t*)&end[-glyphsAllocated])
{
// Unable to fit GlyphNode in data, clear cache
clearCache();
}
glyphsAllocated++;
BitmapFontCacheKey* key = const_cast<BitmapFontCacheKey*>(end - glyphsAllocated);
key->glyphNodeSrc = glyph;
key->pixels = 0;
return &key->glyphNodeCopy;
}
const uint8_t* CompressedUnmappedFontCache::cacheGlyphData(const GlyphNode* glyph, const uint8_t* compressedData, touchgfx::FlashDataReader* reader)
{
// Search keys for glyph
BitmapFontCacheKey* end = (BitmapFontCacheKey*)&bitmapFontCache[cacheWords];
BitmapFontCacheKey* it = end - glyphsAllocated;
while (it < end)
{
if (it->glyphNodeSrc == glyph)
{
break;
}
it++;
}
if (it == end)
{
// broken invariant!
return 0;
}
const int byteSize = (it->glyphNodeCopy.width() + 1) / 2 * it->glyphNodeCopy.height();
// Check if pixels can fit in cache
if (pixelsTop + byteSize > (const uint8_t*)&end[-glyphsAllocated])
{
// Can it fit in a clean cache?
if (byteSize + sizeof(BitmapFontCacheKey) > cacheSizeBytes)
{
unableToCache(glyph, byteSize);
return 0;
}
// Unable to fit pixel in data, must clear cache
// Save address of GlyphNode in cache
const GlyphNode* cachedGn = &it->glyphNodeCopy;
// Now clear (reset pointer)
clearCache();
// Insert glyph node again
glyphsAllocated++;
it = const_cast<BitmapFontCacheKey*>(end - 1);
it->glyphNodeSrc = glyph;
it->pixels = 0;
// Copy GlyphNode content from previous position in cache
it->glyphNodeCopy = *cachedGn;
}
//Now decompress data
const uint8_t* glyphData = pixelsTop;
pixelsTop = decompressGlyph(pixelsTop, &it->glyphNodeCopy, compressedData, reader);
// Flush the cache lines, must be 32byte aligned
uint8_t* rowStart = reinterpret_cast<uint8_t*>(reinterpret_cast<uintptr_t>(glyphData) & ~0x1F);
int alignmentOffset = glyphData - rowStart;
paint::flushLine((uint32_t*)rowStart, byteSize + alignmentOffset);
paint::invalidateTextureCache();
it->pixels = glyphData;
return glyphData;
}
} // namespace touchgfx
@@ -0,0 +1,424 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <cstring>
#include <touchgfx/TextProvider.hpp>
#include <touchgfx/Utils.hpp>
#include <fonts/CachedFont.hpp>
#include <fonts/FontCache.hpp>
#include <texts/TypedTextDatabase.hpp>
namespace touchgfx
{
FontCache::FontCache()
: memorySize(0), memory(0), top(0), gsubStart(0), reader(0)
{
}
void FontCache::clear(bool keepGsubOrContextTable /* = false */)
{
memset(fontTable, 0, sizeof(fontTable));
// Top is beginning of memory, no glyphs are cached yet
top = memory;
if (!keepGsubOrContextTable)
{
// gsubStart points to end of memory (nothing loaded yet)
gsubStart = memory + memorySize;
// Round down to 32bit address
gsubStart = (uint8_t*)((uintptr_t)gsubStart & ~(sizeof(void*) - 1));
}
}
void FontCache::setMemory(uint8_t* _memory, uint32_t size)
{
memory = _memory;
memorySize = size;
clear();
}
void FontCache::setReader(FontDataReader* _reader)
{
reader = _reader;
}
const GlyphNode* FontCache::getGlyph(Unicode::UnicodeChar unicode, FontId font) const
{
GlyphNode* g = (GlyphNode*)fontTable[font].first;
while (g)
{
if (g->unicode == unicode)
{
return g;
}
GlyphNode** next = (GlyphNode**)((uint8_t*)g + SizeGlyphNode);
g = *next;
}
return 0;
}
void FontCache::open()
{
if (reader)
{
reader->open();
}
}
void FontCache::close()
{
if (reader)
{
reader->close();
}
}
void FontCache::initializeCachedFont(TypedText t, CachedFont* font, bool loadGsubOrContextTable /*= false*/)
{
// Get font index from typed text
FontId fontId = t.getFontId();
// Reset to start of file
open();
setPosition(0);
assert(sizeof(touchgfx::BinaryFontData) < MAX_BUFFER_SIZE);
readData(buffer, sizeof(touchgfx::BinaryFontData));
const struct touchgfx::BinaryFontData* binaryFontData = reinterpret_cast<const struct touchgfx::BinaryFontData*>(buffer);
const Font** flashFonts = TypedTextDatabase::getFonts();
const GeneratedFont* flashFont = static_cast<const GeneratedFont*>(flashFonts[fontId]);
*font = CachedFont(reinterpret_cast<const struct touchgfx::BinaryFontData*>(buffer), fontId, this, flashFont);
if (loadGsubOrContextTable && (binaryFontData->offsetToGSUB != 0))
{
setPosition(binaryFontData->offsetToGSUB);
const uint32_t sizeOfGSUB = (binaryFontData->offsetToArabicTable != 0 ? binaryFontData->offsetToArabicTable : binaryFontData->sizeOfFontData) - binaryFontData->offsetToGSUB;
if (top + sizeOfGSUB < gsubStart) // Room for this GSUB table
{
// Round down to aligned address
uint8_t* const gsubPosition = (uint8_t*)((uintptr_t)(gsubStart - sizeOfGSUB) & ~(sizeof(void*) - 1));
readData(gsubPosition, sizeOfGSUB);
font->setGSUBTable(reinterpret_cast<uint16_t*>(gsubPosition));
gsubStart = gsubPosition;
}
else
{
font->setGSUBTable(0);
}
}
if (loadGsubOrContextTable && (binaryFontData->offsetToArabicTable != 0))
{
setPosition(binaryFontData->offsetToArabicTable);
const uint32_t sizeTableData = binaryFontData->sizeOfFontData - binaryFontData->offsetToArabicTable;
if (top + sizeTableData + sizeof(FontContextualFormsTable) < gsubStart) // Room for the ContextualFormsTables
{
// Allocate FontContextualFormsTable first
gsubStart -= sizeof(FontContextualFormsTable);
// Round down to 32bit address
gsubStart = (uint8_t*)((uintptr_t)gsubStart & ~(sizeof(void*) - 1));
FontContextualFormsTable* table = (FontContextualFormsTable*)gsubStart;
font->setContextualFormsTable(table);
gsubStart -= sizeTableData;
readData(gsubStart, sizeTableData);
// Set pointers in table
const uint16_t* const base = (const uint16_t*)gsubStart;
// First elements in binary font are offsets to arrays in 16bit words
table->contextualForms4Long = (FontContextualFormsTable::arrayOf5UnicodesPtr)(base + base[0]);
table->contextualForms3Long = (FontContextualFormsTable::arrayOf5UnicodesPtr)(base + base[1]);
table->contextualForms2Long = (FontContextualFormsTable::arrayOf5UnicodesPtr)(base + base[2]);
table->contextualForms0621_063a = (FontContextualFormsTable::arrayOf4UnicodesPtr)(base + base[3]);
table->contextualForms0641_064a = (FontContextualFormsTable::arrayOf4UnicodesPtr)(base + base[4]);
table->contextualForms06XX = (FontContextualFormsTable::arrayOf5UnicodesPtr)(base + base[5]);
table->contextualForms4LongSize = base[6];
table->contextualForms3LongSize = base[7];
table->contextualForms2LongSize = base[8];
table->contextualForms06XXSize = base[9];
}
else
{
font->setContextualFormsTable(0);
}
}
close();
}
bool FontCache::cacheString(TypedText t, const Unicode::UnicodeChar* string)
{
open();
if (!createSortedString(string))
{
close();
return false;
}
const bool result = cacheSortedString(t);
close();
return result;
}
bool FontCache::cacheLigatures(CachedFont* font, TypedText t, const Unicode::UnicodeChar* string)
{
open();
if (!createSortedLigatures(font, t, string, 0, 0))
{
close();
return false;
}
const bool result = cacheSortedString(t);
close();
return result;
}
bool FontCache::cacheSortedString(TypedText t)
{
setPosition(8); // Skip font index and size
uint32_t glyphNodeOffset;
uint32_t dummy;
readData(&glyphNodeOffset, sizeof(uint32_t)); // offsetToTable
readData(&dummy, sizeof(uint32_t)); // offsetToKerning
readData(&glyphDataOffset, sizeof(uint32_t)); // offsetToGlyphs
readData(&dummy, sizeof(uint32_t)); // offsetToGlyphs
readData(&dummy, sizeof(uint32_t)); // offsetToArabicTable
readData(&numGlyphs, sizeof(uint16_t)); // numberOfGlyphs
FontId fontId = t.getFontId(); // Get font index from typed text
bpp = t.getFont()->getBitsPerPixel(); // Get BPP from standard font
byteAlignRow = t.getFont()->getByteAlignRow(); // Get ByteAlign from font
setPosition(glyphNodeOffset); // Go to glyph nodes for font
currentFileGlyphNumber = 0;
currentFileGlyphNode.unicode = 0; // Force reading of first glyph
const Unicode::UnicodeChar* string = sortedString;
Unicode::UnicodeChar last = 0;
GlyphNode* firstNewGlyph = 0;
bool outOfMemory = false;
while (*string)
{
Unicode::UnicodeChar ch = *string;
if (ch != last)
{
if (!contains(ch, fontId))
{
insert(ch, fontId, outOfMemory);
if (outOfMemory)
{
break;
}
if (firstNewGlyph == 0)
{
firstNewGlyph = (GlyphNode*)fontTable[fontId].last;
}
}
}
last = ch;
string++;
}
cacheData(firstNewGlyph);
return !outOfMemory;
}
bool FontCache::contains(Unicode::UnicodeChar unicode, FontId font) const
{
GlyphNode* g = (GlyphNode*)fontTable[font].first;
while (g)
{
if (g->unicode == unicode)
{
return true;
}
GlyphNode** next = (GlyphNode**)((uint8_t*)g + SizeGlyphNode);
g = *next;
}
return false;
}
void FontCache::insert(Unicode::UnicodeChar unicode, FontId font, bool& outOfMemory)
{
// Insert new glyphnode and glyph after last for font.
uint8_t* oldTop = top;
top = copyGlyph(top, unicode, font, outOfMemory);
if (top == oldTop)
{
return;
}
if (fontTable[font].last == 0)
{
// First glyph
fontTable[font].first = oldTop;
fontTable[font].last = oldTop;
}
else
{
// Set next pointer of old last glyph
uint8_t** old_next = (uint8_t**)(fontTable[font].last + SizeGlyphNode);
*old_next = oldTop;
// Save new glyph as last glyph
fontTable[font].last = oldTop;
}
}
uint8_t* FontCache::copyGlyph(uint8_t* top, Unicode::UnicodeChar unicode, FontId font, bool& outOfMemory)
{
while (currentFileGlyphNumber < numGlyphs && currentFileGlyphNode.unicode < unicode)
{
readData(&currentFileGlyphNode, sizeof(GlyphNode));
currentFileGlyphNumber++;
}
if (currentFileGlyphNode.unicode != unicode)
{
// GlyphNode not found
return top;
}
// GlyphNode found
uint32_t glyphSize = getGlyphSize(&currentFileGlyphNode);
const int alignment = sizeof(void*);
glyphSize = (glyphSize + (alignment - 1)) & ~(alignment - 1);
uint32_t requiredMem = SizeGlyphNode + sizeof(void*) + glyphSize; // GlyphNode + next ptr + glyph
// Is space available before sortedString
if (top + requiredMem > (uint8_t*)sortedString)
{
outOfMemory = true;
return top;
}
*(GlyphNode*)top = currentFileGlyphNode;
// Clear next pointer
uint8_t** next = (uint8_t**)(top + SizeGlyphNode);
*next = 0;
top += requiredMem;
return top;
}
void FontCache::cacheData(GlyphNode* first)
{
GlyphNode* gn = first;
while (gn)
{
uint8_t* p = (uint8_t*)gn;
if (gn->dataOffset != 0xFFFFFFFF)
{
p += SizeGlyphNode;
// Next pointer
p += sizeof(void*);
// Seek and copy
setPosition(glyphDataOffset + gn->dataOffset);
readData(p, getGlyphSize(gn));
// Mark glyphNode as cached
gn->dataOffset = 0xFFFFFFFF;
}
GlyphNode** next = (GlyphNode**)((uint8_t*)gn + SizeGlyphNode);
gn = *next;
}
}
bool FontCache::createSortedString(const Unicode::UnicodeChar* string)
{
int length = Unicode::strlen(string);
// Sorted string is allocated at end of buffer
sortedString = (Unicode::UnicodeChar*)(gsubStart - (length + 1) * 2);
if ((uint8_t*)sortedString < top)
{
// Unable to allocate string buffer in end of memory
return false;
}
int n = 0;
Unicode::UnicodeChar* uc = sortedString;
while (*string)
{
*uc++ = *string++;
n++;
}
*uc = 0;
return sortSortedString(n);
}
bool FontCache::createSortedLigatures(CachedFont* font, TypedText t, const Unicode::UnicodeChar* string, ...)
{
va_list pArg;
va_start(pArg, string);
TextProvider tp;
tp.initialize(string, pArg, font->getGSUBTable(), font->getContextualFormsTable());
va_end(pArg);
Unicode::UnicodeChar ligature;
sortedString = (Unicode::UnicodeChar*)(gsubStart);
if ((uint8_t*)(sortedString - 1) < top)
{
return false;
}
*--sortedString = 0;
int n = 0;
while ((ligature = tp.getNextLigature(t.getTextDirection())) != 0)
{
if ((uint8_t*)(sortedString - 1) < top)
{
return false;
}
*--sortedString = ligature;
n++;
}
return sortSortedString(n);
}
bool FontCache::sortSortedString(int n)
{
Unicode::UnicodeChar* uc = sortedString;
for (int i = 0; i < n - 1; i++)
{
bool swapped = false;
for (int j = 0; j < n - i - 1; j++)
{
if (uc[j] > uc[j + 1])
{
Unicode::UnicodeChar temp = uc[j];
uc[j] = uc[j + 1];
uc[j + 1] = temp;
swapped = true;
}
}
// If no two elements were swapped by inner loop, then break
if (!swapped)
{
break;
}
}
return true;
}
void FontCache::setPosition(uint32_t position)
{
if (reader)
{
reader->setPosition(position);
}
}
void FontCache::readData(void* out, uint32_t numberOfBytes)
{
if (reader)
{
reader->readData(out, numberOfBytes);
}
}
} // namespace touchgfx
@@ -0,0 +1,8 @@
#include <touchgfx/hal/Types.hpp>
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_10_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE = {
// Unicode: [0x003F, question]
0xA0, 0xBB, 0x05, 0x86, 0x10, 0x0D, 0x00, 0x20, 0x0D, 0x00, 0xC2, 0x03, 0x00, 0x49, 0x00, 0x00,
0x13, 0x00, 0x00, 0x4B, 0x00
};
@@ -0,0 +1,243 @@
#include <touchgfx/hal/Types.hpp>
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_20_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE = {
// Unicode: [0x0020, space]
// (Has no glyph data)
// Unicode: [0x002C, comma]
0x10, 0x01, 0xF3, 0x0C, 0xF3, 0x0C, 0x40, 0x0B, 0x90, 0x08, 0xA2, 0x01,
// Unicode: [0x002D, hyphen]
0xC4, 0xCC, 0xCC, 0xF5, 0xFF, 0xFF,
// Unicode: [0x002E, period]
0x10, 0x01, 0xF3, 0x0C, 0xF3, 0x0C,
// Unicode: [0x0030, zero]
0x00, 0x70, 0xFD, 0x7D, 0x00, 0x00, 0x00, 0xFA, 0x8B, 0xFC, 0x0A, 0x00, 0x40, 0xAF, 0x00, 0xA0,
0x4F, 0x00, 0xA0, 0x2F, 0x00, 0x20, 0xAF, 0x00, 0xE0, 0x0D, 0x00, 0x00, 0xED, 0x00, 0xF1, 0x0B,
0x00, 0x00, 0xFB, 0x01, 0xF2, 0x0A, 0x00, 0x00, 0xFA, 0x02, 0xF2, 0x0A, 0x00, 0x00, 0xFA, 0x02,
0xF2, 0x0A, 0x00, 0x00, 0xFA, 0x02, 0xF1, 0x0B, 0x00, 0x00, 0xFB, 0x01, 0xE0, 0x0D, 0x00, 0x00,
0xDD, 0x00, 0xA0, 0x2F, 0x00, 0x20, 0xAF, 0x00, 0x50, 0x9F, 0x00, 0xA0, 0x4F, 0x00, 0x00, 0xFA,
0x8C, 0xFC, 0x0A, 0x00, 0x00, 0x80, 0xFD, 0x7D, 0x00, 0x00,
// Unicode: [0x0031, one]
0x00, 0x10, 0x7E, 0x00, 0xB0, 0x7F, 0x10, 0xFC, 0x7F, 0xE6, 0xBF, 0x7F, 0xDC, 0x54, 0x7F, 0x04,
0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50,
0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F, 0x00, 0x50, 0x7F,
// Unicode: [0x0032, two]
0x00, 0x91, 0xFD, 0xAE, 0x02, 0x00, 0x20, 0xFD, 0x8B, 0xFB, 0x2E, 0x00, 0x90, 0x7F, 0x00, 0x60,
0xAF, 0x00, 0xE0, 0x0E, 0x00, 0x00, 0xFD, 0x00, 0x60, 0x06, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00,
0x00, 0x20, 0xCF, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x6F, 0x00, 0x00, 0x00, 0x00, 0xF9, 0x0B, 0x00,
0x00, 0x00, 0x90, 0xCF, 0x01, 0x00, 0x00, 0x10, 0xFB, 0x1B, 0x00, 0x00, 0x00, 0xC1, 0xAF, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x08, 0x00, 0x00, 0x00, 0x80, 0x9F, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xCF,
0xBB, 0xBB, 0xBB, 0x01, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
// Unicode: [0x0033, three]
0x00, 0x91, 0xED, 0x7C, 0x00, 0x00, 0x10, 0xFD, 0x8A, 0xFC, 0x0A, 0x00, 0x90, 0x6F, 0x00, 0xA0,
0x4F, 0x00, 0xA0, 0x0C, 0x00, 0x50, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5F, 0x00, 0x00, 0x00,
0x31, 0xF8, 0x0C, 0x00, 0x00, 0x00, 0xF9, 0xDF, 0x02, 0x00, 0x00, 0x00, 0x54, 0xE7, 0x4E, 0x00,
0x00, 0x00, 0x00, 0x40, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x61, 0x05, 0x00, 0x00,
0xFB, 0x03, 0xF0, 0x0D, 0x00, 0x00, 0xFD, 0x01, 0xA0, 0x7F, 0x00, 0x80, 0xAF, 0x00, 0x20, 0xFD,
0x8B, 0xFC, 0x1D, 0x00, 0x00, 0x91, 0xFE, 0x8D, 0x01, 0x00,
// Unicode: [0x0034, four]
0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x30, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0x03, 0x00, 0x00, 0x00, 0xF8, 0xFB, 0x03, 0x00, 0x00, 0x30, 0x8F, 0xF8, 0x03, 0x00, 0x00, 0xC0,
0x0D, 0xF8, 0x03, 0x00, 0x00, 0xF7, 0x04, 0xF8, 0x03, 0x00, 0x20, 0x9F, 0x00, 0xF8, 0x03, 0x00,
0xB0, 0x1D, 0x00, 0xF8, 0x03, 0x00, 0xF6, 0x05, 0x00, 0xF8, 0x03, 0x00, 0xFB, 0xFF, 0xFF, 0xFF,
0xFF, 0x02, 0xA8, 0xAA, 0xAA, 0xFD, 0xAB, 0x02, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00,
0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00,
// Unicode: [0x0035, five]
0x00, 0xF8, 0xFF, 0xFF, 0xAF, 0x00, 0x00, 0xFB, 0xBB, 0xBB, 0x7B, 0x00, 0x00, 0xCE, 0x00, 0x00,
0x00, 0x00, 0x10, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x70, 0x7F,
0xEB, 0xAE, 0x02, 0x00, 0x90, 0xFF, 0xAC, 0xFD, 0x3E, 0x00, 0xA0, 0x4E, 0x00, 0x70, 0xCF, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF9, 0x04, 0x20, 0x03, 0x00, 0x00,
0xFA, 0x04, 0xF1, 0x0D, 0x00, 0x00, 0xFD, 0x01, 0xB0, 0x6F, 0x00, 0x70, 0x9F, 0x00, 0x20, 0xFE,
0x8B, 0xFB, 0x1D, 0x00, 0x00, 0x92, 0xFE, 0x8D, 0x01, 0x00,
// Unicode: [0x0036, six]
0x00, 0x50, 0xEC, 0xAE, 0x02, 0x00, 0x00, 0xF8, 0x8D, 0xFA, 0x2E, 0x00, 0x30, 0xBF, 0x01, 0x50,
0xAF, 0x00, 0x90, 0x2F, 0x00, 0x00, 0x89, 0x00, 0xE0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x29,
0xEA, 0xAE, 0x02, 0x00, 0xF3, 0xEA, 0xAD, 0xFC, 0x2E, 0x00, 0xF3, 0xAF, 0x00, 0x70, 0xBF, 0x00,
0xF3, 0x1F, 0x00, 0x00, 0xFD, 0x01, 0xF2, 0x0D, 0x00, 0x00, 0xFA, 0x03, 0xF0, 0x0D, 0x00, 0x00,
0xFA, 0x02, 0xC0, 0x2F, 0x00, 0x00, 0xED, 0x00, 0x60, 0xAF, 0x00, 0x60, 0x9F, 0x00, 0x00, 0xFA,
0x8C, 0xFB, 0x1D, 0x00, 0x00, 0x70, 0xFC, 0x9D, 0x01, 0x00,
// Unicode: [0x0037, seven]
0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xB1, 0xBB, 0xBB, 0xCB, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x90,
0x6F, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x02, 0x00, 0x00, 0x00,
0x60, 0x8F, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x09, 0x00, 0x00,
0x00, 0x00, 0xFB, 0x03, 0x00, 0x00, 0x00, 0x10, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8F, 0x00,
0x00, 0x00, 0x00, 0x80, 0x4F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0,
0x0E, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0C, 0x00, 0x00, 0x00,
// Unicode: [0x0038, eight]
0x00, 0x81, 0xFD, 0x9D, 0x01, 0x00, 0x00, 0xFC, 0x8B, 0xFB, 0x1C, 0x00, 0x60, 0x9F, 0x00, 0x90,
0x6F, 0x00, 0x90, 0x4F, 0x00, 0x30, 0x9F, 0x00, 0x80, 0x6F, 0x00, 0x50, 0x8F, 0x00, 0x20, 0xEE,
0x36, 0xE6, 0x2D, 0x00, 0x00, 0xD3, 0xFF, 0xDF, 0x02, 0x00, 0x10, 0xFB, 0x68, 0xF8, 0x2D, 0x00,
0xA0, 0x4F, 0x00, 0x40, 0xCF, 0x00, 0xF1, 0x0C, 0x00, 0x00, 0xFB, 0x02, 0xF2, 0x0A, 0x00, 0x00,
0xF9, 0x03, 0xF1, 0x0C, 0x00, 0x00, 0xFB, 0x02, 0xB0, 0x6F, 0x00, 0x50, 0xBF, 0x00, 0x20, 0xFE,
0x8B, 0xFB, 0x2E, 0x00, 0x00, 0x92, 0xFD, 0x9E, 0x02, 0x00,
// Unicode: [0x0039, nine]
0x00, 0x91, 0xEE, 0x6C, 0x00, 0x00, 0x20, 0xFD, 0x9C, 0xFB, 0x0A, 0x00, 0xA0, 0x8F, 0x00, 0x80,
0x5F, 0x00, 0xF0, 0x0E, 0x00, 0x00, 0xCE, 0x00, 0xF2, 0x0B, 0x00, 0x00, 0xFB, 0x01, 0xF2, 0x0B,
0x00, 0x00, 0xFC, 0x03, 0xE0, 0x2E, 0x00, 0x20, 0xFF, 0x03, 0x80, 0xCF, 0x13, 0xC3, 0xFE, 0x04,
0x00, 0xFA, 0xFF, 0xBF, 0xF8, 0x03, 0x00, 0x40, 0x88, 0x05, 0xF9, 0x02, 0x00, 0x00, 0x00, 0x00,
0xEC, 0x00, 0xA0, 0x0C, 0x00, 0x20, 0xAF, 0x00, 0x80, 0x5F, 0x00, 0xC1, 0x3F, 0x00, 0x10, 0xFE,
0x89, 0xFD, 0x07, 0x00, 0x00, 0xA2, 0xEE, 0x5C, 0x00, 0x00,
// Unicode: [0x003A, colon]
0xF3, 0x0C, 0xF3, 0x0C, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x01, 0xF3, 0x0C, 0xF3, 0x0C,
// Unicode: [0x003F, question]
0x20, 0xD9, 0xEF, 0x2A, 0x00, 0xD1, 0xBF, 0xB8, 0xEF, 0x03, 0xF9, 0x08, 0x00, 0xF6, 0x0C, 0xEE,
0x00, 0x00, 0xC0, 0x1F, 0x55, 0x00, 0x00, 0xB0, 0x1F, 0x00, 0x00, 0x00, 0xF3, 0x0C, 0x00, 0x00,
0x30, 0xEE, 0x03, 0x00, 0x00, 0xE3, 0x4E, 0x00, 0x00, 0x00, 0xFD, 0x04, 0x00, 0x00, 0x40, 0x9F,
0x00, 0x00, 0x00, 0x60, 0x5F, 0x00, 0x00, 0x00, 0x20, 0x25, 0x00, 0x00, 0x00, 0x10, 0x11, 0x00,
0x00, 0x00, 0x80, 0x8F, 0x00, 0x00, 0x00, 0x80, 0x8F, 0x00, 0x00,
// Unicode: [0x0041, A]
0x00, 0x00, 0xB0, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFE, 0x02, 0x00, 0x00, 0x00, 0x00,
0xF7, 0xF7, 0x07, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0x30, 0xAF, 0x90,
0x4F, 0x00, 0x00, 0x00, 0x80, 0x5F, 0x40, 0xAF, 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0xFE, 0x01,
0x00, 0x00, 0xF4, 0x09, 0x00, 0xF9, 0x07, 0x00, 0x00, 0xFA, 0x04, 0x00, 0xF3, 0x0D, 0x00, 0x10,
0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x60, 0xCF, 0x99, 0x99, 0xB9, 0x9F, 0x00, 0xB0, 0x4F, 0x00,
0x00, 0x20, 0xEF, 0x01, 0xF2, 0x0D, 0x00, 0x00, 0x00, 0xFB, 0x06, 0xF7, 0x08, 0x00, 0x00, 0x00,
0xF5, 0x0C, 0xFD, 0x02, 0x00, 0x00, 0x00, 0xE0, 0x3F,
// Unicode: [0x0042, B]
0xF8, 0xFF, 0xFF, 0xCE, 0x07, 0x00, 0xF8, 0xBD, 0xBB, 0xFC, 0xBF, 0x00, 0xF8, 0x05, 0x00, 0x10,
0xFC, 0x04, 0xF8, 0x05, 0x00, 0x00, 0xF5, 0x08, 0xF8, 0x05, 0x00, 0x00, 0xF5, 0x07, 0xF8, 0x05,
0x00, 0x10, 0xEC, 0x02, 0xF8, 0xBD, 0xBB, 0xFC, 0x4E, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, 0x00,
0xF8, 0x05, 0x00, 0x31, 0xFB, 0x0A, 0xF8, 0x05, 0x00, 0x00, 0xE0, 0x2F, 0xF8, 0x05, 0x00, 0x00,
0xB0, 0x4F, 0xF8, 0x05, 0x00, 0x00, 0xD0, 0x3F, 0xF8, 0x05, 0x00, 0x00, 0xF7, 0x0D, 0xF8, 0xBD,
0xBB, 0xEC, 0xFF, 0x04, 0xF8, 0xFF, 0xFF, 0xDF, 0x3A, 0x00,
// Unicode: [0x0043, C]
0x00, 0x30, 0xD9, 0xEE, 0x6B, 0x00, 0x00, 0x00, 0xF8, 0xDF, 0xCB, 0xFF, 0x0B, 0x00, 0x80, 0xCF,
0x03, 0x00, 0xC2, 0x9F, 0x00, 0xF2, 0x1E, 0x00, 0x00, 0x10, 0xFE, 0x01, 0xF8, 0x07, 0x00, 0x00,
0x00, 0x76, 0x02, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x03, 0x00, 0x00, 0x00, 0x21, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xF2, 0x1E, 0x00,
0x00, 0x20, 0xFE, 0x03, 0x80, 0xDF, 0x03, 0x00, 0xC3, 0x9F, 0x00, 0x00, 0xF9, 0xCF, 0xCB, 0xFF,
0x1B, 0x00, 0x00, 0x40, 0xDA, 0xEF, 0x6B, 0x00, 0x00,
// Unicode: [0x0044, D]
0xF7, 0xFF, 0xFF, 0xDE, 0x29, 0x00, 0x00, 0xF7, 0xBD, 0xBB, 0xEC, 0xFF, 0x05, 0x00, 0xF7, 0x07,
0x00, 0x00, 0xF7, 0x2E, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x80, 0x9F, 0x00, 0xF7, 0x07, 0x00, 0x00,
0x10, 0xEE, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0xFB, 0x03, 0xF7, 0x07, 0x00, 0x00, 0x00, 0xF9,
0x05, 0xF7, 0x07, 0x00, 0x00, 0x00, 0xF9, 0x05, 0xF7, 0x07, 0x00, 0x00, 0x00, 0xFA, 0x05, 0xF7,
0x07, 0x00, 0x00, 0x00, 0xFC, 0x03, 0xF7, 0x07, 0x00, 0x00, 0x10, 0xEF, 0x00, 0xF7, 0x07, 0x00,
0x00, 0x80, 0x9F, 0x00, 0xF7, 0x07, 0x00, 0x00, 0xF7, 0x2E, 0x00, 0xF7, 0xBD, 0xBB, 0xEC, 0xFF,
0x04, 0x00, 0xF7, 0xFF, 0xFF, 0xDE, 0x29, 0x00, 0x00,
// Unicode: [0x0045, E]
0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xF6, 0xBD, 0xBB, 0xBB, 0xBB, 0x0B, 0xF6, 0x07, 0x00, 0x00,
0x00, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x07,
0x00, 0x00, 0x00, 0x00, 0xF6, 0xBD, 0xBB, 0xBB, 0xBB, 0x04, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x06,
0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x07, 0x00, 0x00,
0x00, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xBD,
0xBB, 0xBB, 0xBB, 0x3B, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x4F,
// Unicode: [0x0046, F]
0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xF5, 0xBD, 0xBB, 0xBB, 0xBB, 0x03, 0xF5, 0x08, 0x00, 0x00,
0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08,
0x00, 0x00, 0x00, 0x00, 0xF5, 0xBD, 0xBB, 0xBB, 0x3B, 0x00, 0xF5, 0xFF, 0xFF, 0xFF, 0x4F, 0x00,
0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00,
0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08,
0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x0048, H]
0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00,
0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08,
0x00, 0x00, 0x10, 0xCF, 0xF6, 0xBD, 0xBB, 0xBB, 0xCB, 0xCF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF,
0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00,
0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08,
0x00, 0x00, 0x10, 0xCF, 0xF6, 0x08, 0x00, 0x00, 0x10, 0xCF,
// Unicode: [0x0049, I]
0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C,
0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C, 0xF2, 0x0C,
// Unicode: [0x004B, K]
0xF8, 0x05, 0x00, 0x00, 0xD2, 0x8F, 0x00, 0xF8, 0x05, 0x00, 0x20, 0xFD, 0x08, 0x00, 0xF8, 0x05,
0x00, 0xD1, 0x8F, 0x00, 0x00, 0xF8, 0x05, 0x10, 0xFC, 0x09, 0x00, 0x00, 0xF8, 0x05, 0xC1, 0x9F,
0x00, 0x00, 0x00, 0xF8, 0x15, 0xFB, 0x09, 0x00, 0x00, 0x00, 0xF8, 0xB6, 0xFF, 0x05, 0x00, 0x00,
0x00, 0xF8, 0xFE, 0xFB, 0x2E, 0x00, 0x00, 0x00, 0xF8, 0x9F, 0x90, 0xBF, 0x00, 0x00, 0x00, 0xF8,
0x0A, 0x10, 0xFD, 0x07, 0x00, 0x00, 0xF8, 0x05, 0x00, 0xF3, 0x2F, 0x00, 0x00, 0xF8, 0x05, 0x00,
0x80, 0xCF, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x10, 0xFD, 0x08, 0x00, 0xF8, 0x05, 0x00, 0x00, 0xF3,
0x4F, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x80, 0xDF, 0x01,
// Unicode: [0x004C, L]
0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8,
0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05,
0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00,
0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00, 0x00, 0xF8, 0x05, 0x00, 0x00,
0x00, 0xF8, 0xBD, 0xBB, 0xBB, 0x5B, 0xF8, 0xFF, 0xFF, 0xFF, 0x6F,
// Unicode: [0x004D, M]
0xF8, 0x8F, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x02, 0xF8, 0xCF, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0x02,
0xF8, 0xFE, 0x02, 0x00, 0x00, 0xF3, 0xFE, 0x02, 0xF8, 0xF9, 0x07, 0x00, 0x00, 0xE8, 0xFB, 0x02,
0xF8, 0xE5, 0x0C, 0x00, 0x00, 0xAD, 0xFA, 0x02, 0xF8, 0x95, 0x1F, 0x00, 0x30, 0x5F, 0xFA, 0x02,
0xF8, 0x55, 0x6F, 0x00, 0x80, 0x0E, 0xFA, 0x02, 0xF8, 0x05, 0xBE, 0x00, 0xD0, 0x0A, 0xFA, 0x02,
0xF8, 0x05, 0xFA, 0x01, 0xF3, 0x05, 0xFA, 0x02, 0xF8, 0x05, 0xF5, 0x05, 0xE8, 0x00, 0xFA, 0x02,
0xF8, 0x05, 0xE1, 0x0A, 0xAD, 0x00, 0xFA, 0x02, 0xF8, 0x05, 0xA0, 0x3E, 0x5F, 0x00, 0xFA, 0x02,
0xF8, 0x05, 0x50, 0xCF, 0x1E, 0x00, 0xFA, 0x02, 0xF8, 0x05, 0x10, 0xFF, 0x0A, 0x00, 0xFA, 0x02,
0xF8, 0x05, 0x00, 0xFB, 0x05, 0x00, 0xFA, 0x02,
// Unicode: [0x004E, N]
0xF7, 0x0C, 0x00, 0x00, 0x00, 0xCF, 0xF7, 0x6F, 0x00, 0x00, 0x00, 0xCF, 0xF7, 0xEF, 0x02, 0x00,
0x00, 0xCF, 0xF7, 0xFC, 0x0A, 0x00, 0x00, 0xCF, 0xF7, 0xC5, 0x5F, 0x00, 0x00, 0xCF, 0xF7, 0x35,
0xEF, 0x01, 0x00, 0xCF, 0xF7, 0x05, 0xF8, 0x09, 0x00, 0xCF, 0xF7, 0x05, 0xD1, 0x4F, 0x00, 0xCF,
0xF7, 0x05, 0x40, 0xDF, 0x00, 0xCF, 0xF7, 0x05, 0x00, 0xFA, 0x08, 0xCF, 0xF7, 0x05, 0x00, 0xE1,
0x3F, 0xCF, 0xF7, 0x05, 0x00, 0x60, 0xCF, 0xCF, 0xF7, 0x05, 0x00, 0x00, 0xFB, 0xCF, 0xF7, 0x05,
0x00, 0x00, 0xE2, 0xCF, 0xF7, 0x05, 0x00, 0x00, 0x70, 0xCF,
// Unicode: [0x004F, O]
0x00, 0x30, 0xD9, 0xEF, 0x6C, 0x01, 0x00, 0x00, 0xF7, 0xDF, 0xCB, 0xFE, 0x3D, 0x00, 0x70, 0xDF,
0x04, 0x00, 0x81, 0xEF, 0x02, 0xF2, 0x2E, 0x00, 0x00, 0x00, 0xF8, 0x0A, 0xF8, 0x07, 0x00, 0x00,
0x00, 0xD0, 0x2F, 0xFC, 0x02, 0x00, 0x00, 0x00, 0x80, 0x6F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x60,
0x8F, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x50, 0x9F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x60, 0x8F, 0xFC,
0x02, 0x00, 0x00, 0x00, 0x80, 0x6F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0xD0, 0x2F, 0xE2, 0x2E, 0x00,
0x00, 0x00, 0xF7, 0x0B, 0x60, 0xDF, 0x04, 0x00, 0x81, 0xEF, 0x02, 0x00, 0xF6, 0xDF, 0xBB, 0xFE,
0x3D, 0x00, 0x00, 0x20, 0xD9, 0xEE, 0x6C, 0x01, 0x00,
// Unicode: [0x0050, P]
0xF7, 0xFF, 0xFF, 0xEF, 0x5B, 0x00, 0xF7, 0xBD, 0xBB, 0xDB, 0xFF, 0x07, 0xF7, 0x07, 0x00, 0x00,
0xF4, 0x1F, 0xF7, 0x07, 0x00, 0x00, 0xA0, 0x6F, 0xF7, 0x07, 0x00, 0x00, 0x80, 0x7F, 0xF7, 0x07,
0x00, 0x00, 0xA0, 0x5F, 0xF7, 0x07, 0x00, 0x00, 0xF5, 0x1E, 0xF7, 0xBD, 0xBB, 0xDC, 0xFF, 0x06,
0xF7, 0xFF, 0xFF, 0xEF, 0x4A, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00,
0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x07,
0x00, 0x00, 0x00, 0x00, 0xF7, 0x07, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x0052, R]
0xF6, 0xFF, 0xFF, 0xEF, 0xAD, 0x02, 0x00, 0xF6, 0xAC, 0xAA, 0xBA, 0xFE, 0x2E, 0x00, 0xF6, 0x07,
0x00, 0x00, 0xA0, 0xAF, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xEF, 0x00, 0xF6, 0x07, 0x00, 0x00,
0x00, 0xFF, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x40, 0xCF, 0x00, 0xF6, 0x07, 0x00, 0x10, 0xD5, 0x6F,
0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x00, 0xF6, 0xBD, 0xCB, 0xFF, 0x29, 0x00, 0x00, 0xF6,
0x07, 0x00, 0xD2, 0x5F, 0x00, 0x00, 0xF6, 0x07, 0x00, 0x30, 0xFF, 0x04, 0x00, 0xF6, 0x07, 0x00,
0x00, 0xF7, 0x1D, 0x00, 0xF6, 0x07, 0x00, 0x00, 0xC0, 0x9F, 0x00, 0xF6, 0x07, 0x00, 0x00, 0x30,
0xFF, 0x03, 0xF6, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x0D,
// Unicode: [0x0054, T]
0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xB6, 0xBB, 0xEB, 0xCF, 0xBB, 0x9B, 0x00, 0x00, 0xC0, 0x1F,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00,
0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F,
0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00,
// Unicode: [0x0055, U]
0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00,
0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07,
0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF,
0xF6, 0x07, 0x00, 0x00, 0x10, 0xCF, 0xF5, 0x08, 0x00, 0x00, 0x20, 0xCF, 0xF4, 0x09, 0x00, 0x00,
0x40, 0xAF, 0xF1, 0x1D, 0x00, 0x00, 0x80, 0x7F, 0xB0, 0xAF, 0x01, 0x00, 0xE5, 0x2F, 0x20, 0xFD,
0xCF, 0xEC, 0xFF, 0x06, 0x00, 0x81, 0xEC, 0xDF, 0x3A, 0x00,
// Unicode: [0x0056, V]
0xFB, 0x05, 0x00, 0x00, 0x00, 0xE0, 0x1E, 0xF5, 0x0A, 0x00, 0x00, 0x00, 0xF4, 0x09, 0xE1, 0x1E,
0x00, 0x00, 0x00, 0xFA, 0x04, 0x90, 0x5F, 0x00, 0x00, 0x10, 0xDE, 0x00, 0x40, 0xAF, 0x00, 0x00,
0x50, 0x8F, 0x00, 0x00, 0xFD, 0x01, 0x00, 0xB0, 0x2F, 0x00, 0x00, 0xF8, 0x05, 0x00, 0xF1, 0x0B,
0x00, 0x00, 0xF2, 0x0B, 0x00, 0xF6, 0x06, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0xEB, 0x01, 0x00, 0x00,
0x60, 0x6F, 0x20, 0xAF, 0x00, 0x00, 0x00, 0x10, 0xBF, 0x70, 0x4F, 0x00, 0x00, 0x00, 0x00, 0xFA,
0xC1, 0x0D, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xF7, 0x08, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFE, 0x02,
0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00,
// Unicode: [0x0058, X]
0xD1, 0x5F, 0x00, 0x00, 0x00, 0xF9, 0x07, 0x40, 0xEF, 0x01, 0x00, 0x50, 0xBF, 0x00, 0x00, 0xF8,
0x0A, 0x00, 0xE2, 0x2E, 0x00, 0x00, 0xD0, 0x5F, 0x00, 0xFB, 0x05, 0x00, 0x00, 0x30, 0xEF, 0x71,
0x9F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFB, 0x1D, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00,
0x00, 0x00, 0x00, 0x90, 0xEF, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFE, 0x0C, 0x00, 0x00, 0x00,
0x10, 0xFE, 0xC2, 0x7F, 0x00, 0x00, 0x00, 0xB0, 0x7F, 0x30, 0xFF, 0x03, 0x00, 0x00, 0xF6, 0x0B,
0x00, 0xF7, 0x0C, 0x00, 0x30, 0xEF, 0x02, 0x00, 0xC0, 0x8F, 0x00, 0xC0, 0x6F, 0x00, 0x00, 0x20,
0xFF, 0x03, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0xF7, 0x0D,
// Unicode: [0x0061, a]
0x00, 0xA3, 0xFD, 0xBE, 0x05, 0x00, 0x30, 0xEE, 0x8A, 0xFA, 0x4F, 0x00, 0xB0, 0x3F, 0x00, 0x50,
0x9F, 0x00, 0x50, 0x06, 0x00, 0x10, 0xBF, 0x00, 0x00, 0x10, 0x64, 0xC8, 0xBF, 0x00, 0x20, 0xFA,
0xFF, 0xAD, 0xBF, 0x00, 0xD0, 0x9F, 0x14, 0x10, 0xBF, 0x00, 0xF3, 0x0B, 0x00, 0x40, 0xBF, 0x00,
0xF3, 0x0B, 0x00, 0xC1, 0xBF, 0x00, 0xC0, 0xBF, 0x87, 0xED, 0xCE, 0x00, 0x20, 0xD9, 0xDE, 0x2A,
0xFA, 0x02,
// Unicode: [0x0078, x]
0xF4, 0x1D, 0x00, 0xC0, 0x4F, 0x90, 0x8F, 0x00, 0xF8, 0x08, 0x10, 0xFD, 0x33, 0xCF, 0x00, 0x00,
0xF4, 0xDB, 0x3F, 0x00, 0x00, 0x90, 0xFF, 0x07, 0x00, 0x00, 0x40, 0xFF, 0x04, 0x00, 0x00, 0xD0,
0xEE, 0x0D, 0x00, 0x00, 0xF8, 0x77, 0x8F, 0x00, 0x30, 0xCF, 0x00, 0xFD, 0x03, 0xD0, 0x3F, 0x00,
0xF4, 0x0D, 0xF8, 0x09, 0x00, 0x90, 0x8F,
// Unicode: [0x007A, z]
0xF3, 0xFF, 0xFF, 0xFF, 0x4F, 0x71, 0x77, 0x77, 0xF8, 0x1E, 0x00, 0x00, 0x10, 0xFC, 0x04, 0x00,
0x00, 0xA0, 0x6F, 0x00, 0x00, 0x00, 0xF8, 0x0A, 0x00, 0x00, 0x50, 0xCF, 0x00, 0x00, 0x00, 0xE3,
0x2E, 0x00, 0x00, 0x10, 0xFD, 0x04, 0x00, 0x00, 0xB0, 0x6F, 0x00, 0x00, 0x00, 0xF7, 0x8D, 0x88,
0x88, 0x58, 0xF9, 0xFF, 0xFF, 0xFF, 0x9F
};
@@ -0,0 +1,471 @@
#include <touchgfx/hal/Types.hpp>
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_40_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE = {
// Unicode: [0x002B, plus]
0x00, 0x00, 0x00, 0x00, 0xBB, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x2F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x43, 0x44,
0x44, 0x44, 0xFF, 0x7F, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x002D, hyphen]
0x86, 0x88, 0x88, 0x88, 0x88, 0x18, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFB, 0xFF, 0xFF, 0xFF,
0xFF, 0x1F, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
// Unicode: [0x0030, zero]
0x00, 0x00, 0x00, 0xA5, 0xED, 0xDE, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xFF, 0xFF,
0xFF, 0x2C, 0x00, 0x00, 0x00, 0x30, 0xFE, 0xFF, 0xEF, 0xFE, 0xFF, 0xEF, 0x02, 0x00, 0x00, 0xD1,
0xFF, 0x8F, 0x02, 0x20, 0xFA, 0xFF, 0x1D, 0x00, 0x00, 0xF8, 0xFF, 0x06, 0x00, 0x00, 0x70, 0xFF,
0x7F, 0x00, 0x10, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xEF, 0x01, 0x60, 0xFF, 0x4F, 0x00,
0x00, 0x00, 0x00, 0xF3, 0xFF, 0x05, 0xA0, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0A,
0xD0, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x0D, 0xF1, 0xFF, 0x08, 0x00, 0x00, 0x00,
0x00, 0x80, 0xFF, 0x1F, 0xF3, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x3F, 0xF4, 0xFF,
0x05, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x4F, 0xF5, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x50,
0xFF, 0x4F, 0xF5, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x5F, 0xF5, 0xFF, 0x04, 0x00,
0x00, 0x00, 0x00, 0x40, 0xFF, 0x5F, 0xF5, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x4F,
0xF4, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x4F, 0xF3, 0xFF, 0x06, 0x00, 0x00, 0x00,
0x00, 0x60, 0xFF, 0x2F, 0xF1, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0xD0, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x0D, 0xA0, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0x0A, 0x60, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x06, 0x10, 0xFE, 0xAF, 0x00,
0x00, 0x00, 0x00, 0xFA, 0xEF, 0x01, 0x00, 0xF9, 0xFF, 0x07, 0x00, 0x00, 0x70, 0xFF, 0x8F, 0x00,
0x00, 0xD1, 0xFF, 0x9F, 0x02, 0x20, 0xF9, 0xFF, 0x1D, 0x00, 0x00, 0x30, 0xFE, 0xFF, 0xEF, 0xFE,
0xFF, 0xEF, 0x03, 0x00, 0x00, 0x00, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00,
0x00, 0xA5, 0xED, 0xDF, 0x5A, 0x00, 0x00, 0x00,
// Unicode: [0x0031, one]
0x00, 0x00, 0x00, 0x00, 0xFA, 0x0E, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xF4,
0xFF, 0x0E, 0x00, 0x00, 0x40, 0xFE, 0xFF, 0x0E, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x0E, 0x00, 0xB3,
0xFF, 0xFF, 0xFF, 0x0E, 0x92, 0xFF, 0xFF, 0xBD, 0xFF, 0x0E, 0xFA, 0xFF, 0xAF, 0x91, 0xFF, 0x0E,
0xFA, 0xDF, 0x04, 0x90, 0xFF, 0x0E, 0xDA, 0x06, 0x00, 0x90, 0xFF, 0x0E, 0x02, 0x00, 0x00, 0x90,
0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00,
0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E,
0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90,
0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00,
0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E,
0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90,
0xFF, 0x0E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0E,
// Unicode: [0x0032, two]
0x00, 0x00, 0x10, 0xB7, 0xED, 0xEF, 0x8C, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xAF, 0x01, 0x00, 0x00, 0xB0, 0xFF, 0xFF, 0xEF, 0xFE, 0xFF, 0xFF, 0x1D, 0x00, 0x00, 0xF9,
0xFF, 0x6E, 0x01, 0x10, 0xD5, 0xFF, 0xCF, 0x00, 0x30, 0xFF, 0xDF, 0x01, 0x00, 0x00, 0x10, 0xFC,
0xFF, 0x05, 0x80, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0B, 0xD0, 0xFF, 0x0C, 0x00,
0x00, 0x00, 0x00, 0xA0, 0xFF, 0x0F, 0xF1, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F,
0x20, 0x54, 0x03, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xD0, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0x08, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0xFD, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF,
0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xA0, 0xFF, 0xDF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFB, 0xFF, 0x2D, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xCF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0xFF,
0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x90, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0x4E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xA0, 0xFF, 0xDF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x1C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xDF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xFF, 0x8F, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x15, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x2F, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFB, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F,
// Unicode: [0x003F, question]
0x00, 0x00, 0x10, 0xB7, 0xED, 0xDF, 0x8B, 0x02, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xAF, 0x01, 0x00, 0x00, 0xB0, 0xFF, 0xFF, 0xEF, 0xFE, 0xFF, 0xFF, 0x2D, 0x00, 0x00, 0xF9,
0xFF, 0x7E, 0x01, 0x10, 0xD6, 0xFF, 0xDF, 0x01, 0x30, 0xFF, 0xEF, 0x03, 0x00, 0x00, 0x10, 0xFC,
0xFF, 0x08, 0x90, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xFF, 0x0E, 0xE0, 0xFF, 0x0D, 0x00,
0x00, 0x00, 0x00, 0x90, 0xFF, 0x2F, 0xF2, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x3F,
0x10, 0x43, 0x02, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0xCF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF,
0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xDF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFB, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xBF, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFB, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x9F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x0041, A]
0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFA, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF,
0xEB, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x97, 0xFF,
0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x33, 0xFF, 0x5F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xDF, 0x00, 0xFD, 0xBF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0x8F, 0x00, 0xF7, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x60, 0xFF, 0x2F, 0x00, 0xF1, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xFF, 0x0B, 0x00, 0xA0, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3,
0xFF, 0x06, 0x00, 0x40, 0xFF, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xEF, 0x01,
0x00, 0x00, 0xFD, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0x9F, 0x00, 0x00, 0x00,
0xF7, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF2, 0xFF,
0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x2F, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x8F, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x1E, 0x11, 0x11,
0x11, 0x11, 0x11, 0xB1, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0xFE, 0xEF, 0x01, 0x00, 0x00, 0xFD, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF,
0x06, 0x00, 0x40, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFF, 0x0D, 0x00,
0xA0, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0x4F, 0x00, 0xF1, 0xFF,
0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xAF, 0x00, 0xF7, 0xFF, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0x02, 0xFD, 0xFF, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x08,
// Unicode: [0x0042, B]
0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x9C, 0x04, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x03, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x4F, 0x00, 0x00, 0xF1, 0xFF, 0x5C, 0x55, 0x55, 0x55, 0x76, 0xFA, 0xFF, 0xEF, 0x02, 0x00,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFC, 0xFF, 0x09, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0E, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0xB0, 0xFF, 0x2F, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0x2F, 0x00,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x0E, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE1, 0xFF, 0x09, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x20,
0xFC, 0xFF, 0x02, 0x00, 0xF1, 0xFF, 0x5C, 0x55, 0x55, 0x55, 0x76, 0xFA, 0xFF, 0x5F, 0x00, 0x00,
0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x03, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x17, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xDF, 0x03, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x10, 0x74, 0xFE, 0xFF, 0x2E, 0x00,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xBF, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0xFF, 0x02, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x06, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x08,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x07, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0x05, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x30, 0xFF, 0xFF, 0x01, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xAF, 0x00,
0xF1, 0xFF, 0x5C, 0x55, 0x55, 0x55, 0x65, 0xC8, 0xFF, 0xFF, 0x2E, 0x00, 0xF1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3C, 0x00, 0x00, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAD, 0x38, 0x00, 0x00, 0x00,
// Unicode: [0x0043, C]
0x00, 0x00, 0x00, 0x00, 0x73, 0xDA, 0xFE, 0xDE, 0x7A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x01, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x20, 0xFD, 0xFF, 0xDF, 0x69, 0x44, 0x74, 0xFB,
0xFF, 0xFF, 0x05, 0x00, 0x00, 0xD1, 0xFF, 0xEF, 0x06, 0x00, 0x00, 0x00, 0x30, 0xFC, 0xFF, 0x2E,
0x00, 0x00, 0xFB, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xBF, 0x00, 0x50, 0xFF,
0xEF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0xFF, 0x04, 0xC0, 0xFF, 0x5F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x09, 0xF3, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA1, 0x47, 0x01, 0xF7, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFA, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD,
0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFC, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xA0, 0x8C, 0x15, 0xF1, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE0, 0xFF, 0x2F, 0xB0, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF,
0x0B, 0x40, 0xFF, 0xEF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0xFF, 0x05, 0x00, 0xFB,
0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xCF, 0x00, 0x00, 0xE2, 0xFF, 0xEF, 0x05,
0x00, 0x00, 0x00, 0x40, 0xFD, 0xFF, 0x2E, 0x00, 0x00, 0x30, 0xFE, 0xFF, 0xDF, 0x58, 0x34, 0x75,
0xFC, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E,
0x00, 0x00, 0x00, 0x00, 0x10, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x95, 0xEC, 0xFE, 0xDE, 0x6A, 0x01, 0x00, 0x00, 0x00,
// Unicode: [0x0044, D]
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x7A, 0x02, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x02, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x5E, 0x00, 0x00, 0xFE, 0xEF, 0x55, 0x55, 0x55, 0x65, 0x97, 0xFD, 0xFF, 0xFF, 0x05, 0x00,
0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFD, 0xFF, 0x3F, 0x00, 0xFE, 0xDF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xCF, 0x00, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xFE, 0xFF, 0x05, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x0B,
0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0xFE, 0xDF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0xFF, 0x8F, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0x9F,
0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xBF, 0xFE, 0xDF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xBF, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0xFF, 0xBF, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xAF,
0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x9F, 0xFE, 0xDF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x7F, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xB0, 0xFF, 0x3F, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0E,
0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x09, 0xFE, 0xDF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0xFE, 0xFF, 0x03, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC1, 0xFF, 0xAF, 0x00, 0xFE, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFD, 0xFF, 0x2E, 0x00,
0xFE, 0xEF, 0x55, 0x55, 0x55, 0x65, 0xA7, 0xFD, 0xFF, 0xFF, 0x04, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x9F, 0x02, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xCE, 0x69, 0x01, 0x00, 0x00, 0x00,
// Unicode: [0x0045, E]
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0D, 0xFC, 0xFF, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x05, 0xFC, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x45, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0xFC,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x35, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFC, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x8F,
// Unicode: [0x0048, H]
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFC, 0xFF, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0xF6, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
// Unicode: [0x0049, I]
0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4,
0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF,
0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08,
0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4,
0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF, 0x08, 0xF4, 0xFF,
0x08, 0xF4, 0xFF, 0x08,
// Unicode: [0x004C, L]
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF1, 0xFF, 0x5C, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x04, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x0C, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xF1, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0C,
// Unicode: [0x004E, N]
0xFE, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xFF, 0x1D, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09,
0xFE, 0xFF, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xFF, 0xFF, 0xAF,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xBF, 0xFE, 0xFF, 0x06, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0xF4, 0xFF, 0x2E, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09,
0xFE, 0xAF, 0x90, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x10, 0xFD,
0xFF, 0x06, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0xF4, 0xFF, 0x2E, 0x00, 0x00,
0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x80, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x09,
0xFE, 0xAF, 0x00, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00,
0xF3, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x80, 0xFF, 0xCF, 0x00,
0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x08, 0x00, 0xF0, 0xFF, 0x09,
0xFE, 0xAF, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00,
0x00, 0x70, 0xFF, 0xDF, 0x01, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF,
0x09, 0xF0, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xFF, 0x4F, 0xF0, 0xFF, 0x09,
0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0xDF, 0xF1, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFB, 0xFF, 0xFA, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2,
0xFF, 0xFF, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0xFF, 0x09,
0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE1, 0xFF, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x50, 0xFF, 0xFF, 0x09, 0xFE, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x09,
// Unicode: [0x004F, O]
0x00, 0x00, 0x00, 0x00, 0x20, 0xA6, 0xEC, 0xEF, 0xBD, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x30, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1,
0xFF, 0xFF, 0xBF, 0x57, 0x44, 0x96, 0xFE, 0xFF, 0xEF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF,
0x9F, 0x02, 0x00, 0x00, 0x00, 0x71, 0xFE, 0xFF, 0x2E, 0x00, 0x00, 0x00, 0x90, 0xFF, 0xEF, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xCF, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x3E, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0xFD, 0xFF, 0x07, 0x00, 0x00, 0xFA, 0xFF, 0x06, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF4, 0xFF, 0x0E, 0x00, 0x20, 0xFF, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xB0, 0xFF, 0x6F, 0x00, 0x60, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x50, 0xFF, 0xAF, 0x00, 0xA0, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0xFF, 0xEF, 0x00, 0xD0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFC, 0xFF, 0x02, 0xE0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFA, 0xFF, 0x03, 0xF0, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9,
0xFF, 0x04, 0xF1, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF,
0x04, 0xF0, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0x03,
0xD0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x02, 0xB0,
0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xEF, 0x00, 0x70, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xBF, 0x00, 0x20, 0xFF, 0xDF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x6F, 0x00, 0x00, 0xFB, 0xFF, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x1E, 0x00, 0x00, 0xF3, 0xFF, 0x3F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFD, 0xFF, 0x07, 0x00, 0x00, 0x90, 0xFF, 0xEF, 0x04, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xDF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x8F, 0x01, 0x00,
0x00, 0x00, 0x60, 0xFE, 0xFF, 0x2E, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0xAE, 0x46, 0x43,
0x96, 0xFE, 0xFF, 0xEF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xA7, 0xED, 0xEF, 0xBD, 0x37, 0x00,
0x00, 0x00, 0x00, 0x00,
// Unicode: [0x0051, Q]
0x00, 0x00, 0x00, 0x00, 0x30, 0xB8, 0xED, 0xEF, 0xAD, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x50, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3,
0xFF, 0xFF, 0xAE, 0x56, 0x54, 0xA7, 0xFF, 0xFF, 0xCF, 0x01, 0x00, 0x00, 0x00, 0x20, 0xFE, 0xFF,
0x7E, 0x01, 0x00, 0x00, 0x00, 0x91, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xCF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x1D, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x0B, 0x00, 0x50, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xD0, 0xFF, 0x3F, 0x00, 0xA0, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x30, 0xFF, 0xBF, 0x00, 0xF1, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xEF, 0x00, 0xF3, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFD, 0xFF, 0x00, 0xF4, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0xFF, 0x01, 0xF4, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF,
0x01, 0xF3, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01,
0xF1, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0xE0,
0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xBF, 0x00, 0xA0, 0xFF,
0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x8F, 0x00, 0x50, 0xFF, 0xBF,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0x3F, 0x00, 0x00, 0xFD, 0xFF, 0x04,
0x00, 0x00, 0x00, 0xC0, 0x7C, 0x01, 0x00, 0xF7, 0xFF, 0x0C, 0x00, 0x00, 0xF6, 0xFF, 0x1D, 0x00,
0x00, 0x00, 0xF2, 0xFF, 0x6E, 0x40, 0xFE, 0xFF, 0x04, 0x00, 0x00, 0xC0, 0xFF, 0xDF, 0x02, 0x00,
0x00, 0xD4, 0xFF, 0xFF, 0xEB, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x20, 0xFD, 0xFF, 0x7E, 0x00, 0x00,
0x00, 0xB3, 0xFF, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xFF, 0x9E, 0x46, 0x43,
0xA6, 0xFF, 0xFF, 0xEF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x6A, 0xFE, 0xFF, 0x6D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0xB8, 0xED, 0xEF, 0xAD, 0x26, 0x00,
0xB2, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xD5, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0x00,
// Unicode: [0x0052, R]
0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0x04, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x03, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0xFD, 0xEF, 0x22, 0x22, 0x22, 0x22, 0x32, 0x64, 0xFB,
0xFF, 0xDF, 0x00, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0xFF, 0x06,
0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x0B, 0x00, 0xFD, 0xEF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0E, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF1, 0xFF, 0x0E, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF,
0x0B, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0x05, 0x00, 0xFD,
0xEF, 0x00, 0x00, 0x00, 0x00, 0x10, 0x52, 0xFA, 0xFF, 0xBF, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x8E, 0x01, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x6A, 0x01,
0x00, 0x00, 0x00, 0xFD, 0xEF, 0x44, 0x44, 0x44, 0xC6, 0xFF, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x00,
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x6F, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEF, 0x00,
0x00, 0x00, 0x00, 0x60, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xDF, 0x01, 0x00, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFF, 0x09, 0x00,
0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x4F, 0x00, 0x00, 0xFD, 0xEF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0xDF, 0x00, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0x08, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x3F, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xFF,
0xCF, 0x00, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x06, 0xFD,
0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0x2E,
// Unicode: [0x0053, S]
0x00, 0x00, 0x00, 0x41, 0xC9, 0xED, 0xDE, 0x9C, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x19, 0x00, 0x00, 0x00, 0x10, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xDF, 0x03, 0x00, 0x00, 0xB0, 0xFF, 0xFF, 0x8C, 0x56, 0x65, 0xC8, 0xFF, 0xFF, 0x2E, 0x00,
0x00, 0xF6, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0xAF, 0x00, 0x00, 0xFC, 0xFF, 0x03,
0x00, 0x00, 0x00, 0x00, 0x20, 0xFE, 0xFF, 0x03, 0x00, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF7, 0xFF, 0x07, 0x10, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xFF, 0x0A,
0x00, 0xFE, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x45, 0x02, 0x00, 0xFB, 0xFF, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0xCF, 0x16, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0xFF, 0xFF, 0x8C, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD8,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xEB, 0xFF, 0xFF,
0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xEA, 0xFF, 0xFF, 0xCF, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, 0x2F, 0x41, 0x75, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x70, 0xFF, 0x6F, 0xF2, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0x8F,
0xE0, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0x8F, 0xB0, 0xFF, 0x6F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0x6F, 0x50, 0xFF, 0xEF, 0x04, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE2, 0xFF, 0x1F, 0x00, 0xFB, 0xFF, 0x9F, 0x02, 0x00, 0x00, 0x00, 0x60, 0xFE, 0xFF, 0x09,
0x00, 0xD1, 0xFF, 0xFF, 0xDF, 0x79, 0x66, 0xA7, 0xFE, 0xFF, 0xCF, 0x01, 0x00, 0x20, 0xFC, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x70, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xB8, 0xED, 0xFF, 0xCE, 0x59, 0x00, 0x00, 0x00,
// Unicode: [0x0054, T]
0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xAF, 0x50, 0x55, 0x55, 0x55, 0x55, 0xFB, 0xFF, 0x57, 0x55, 0x55, 0x55, 0x35,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x0055, U]
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF2, 0xFF, 0x0A, 0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A,
0xFD, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x0A, 0xFC, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0x09, 0xFB, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF4, 0xFF, 0x08, 0xF9, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x06,
0xF7, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0x04, 0xF3, 0xFF, 0x0D, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0x01, 0xD0, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00,
0xB0, 0xFF, 0xAF, 0x00, 0x60, 0xFF, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x30, 0xFB, 0xFF, 0x3F, 0x00,
0x00, 0xFB, 0xFF, 0xFF, 0x8B, 0x67, 0x97, 0xFC, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xB1, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xCF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xEC, 0xFE, 0xDE, 0x8B, 0x03, 0x00, 0x00, 0x00,
// Unicode: [0x0056, V]
0xFA, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0x03, 0xF4, 0xFF,
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xCF, 0x00, 0xD0, 0xFF, 0x3F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x6F, 0x00, 0x70, 0xFF, 0x8F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x1E, 0x00, 0x10, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF3, 0xFF, 0x09, 0x00, 0x00, 0xFA, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF9, 0xFF, 0x03, 0x00, 0x00, 0xF4, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCF,
0x00, 0x00, 0x00, 0xD0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x6F, 0x00, 0x00,
0x00, 0x70, 0xFF, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x10,
0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF,
0x02, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFF, 0x07, 0x00,
0x00, 0x00, 0x00, 0xFD, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0x0D, 0x00, 0x00, 0x00,
0x40, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xA0, 0xFF,
0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0xE1, 0xFF, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xEF, 0x00, 0x00, 0x00, 0xF6, 0xFF, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF4, 0xFF, 0x05, 0x00, 0x00, 0xFC, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xD0, 0xFF, 0x0A, 0x00, 0x20, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0x6F,
0x00, 0xE0, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xCF, 0x00, 0xF4,
0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0x02, 0xF9, 0xBF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0xFE, 0x5F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x5C, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xBF, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFB, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF5, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// Unicode: [0x005A, Z]
0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x53, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xFD, 0xFF, 0x0C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0xEF, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFF, 0x8F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFE, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC1, 0xFF, 0xCF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF,
0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x30, 0xFE, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xFF, 0xAF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x90, 0xFF, 0xEF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7,
0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0x06, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0xFD, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xDF,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x2E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0xEF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF2, 0xFF, 0xAF, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x25, 0xF3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x7F, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F
};
@@ -0,0 +1,310 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <fonts/GeneratedFont.hpp>
#include <fonts/CompressedFontCache.hpp>
#include <math.h>
#include <stddef.h>
namespace touchgfx
{
GeneratedFont::GeneratedFont(const GlyphNode* glyphs, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataInternalFlash, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable)
: ConstFont(glyphs, numGlyphs, height, baseline, pixAboveTop, pixBelowBottom, bitsPerPixel, byteAlignRow, maxLeft, maxRight, fallbackChar, ellipsisChar),
glyphData(glyphDataInternalFlash),
kerningData(kerningList),
gsubTable(gsubData),
arabicTable(formsTable)
{
}
const uint8_t* GeneratedFont::getPixelData(const GlyphNode* glyph) const
{
// Read dataOffset as 16bit, as it may be unaligned
volatile const uint16_t* dataOffset = (const uint16_t*)((const uint8_t*)glyph + offsetof(GlyphNode, dataOffset));
uint32_t offset = dataOffset[0];
offset |= dataOffset[1] << 16;
const uint8_t* const* table = (const uint8_t* const*)glyphData;
const uint8_t* pixels = table[glyph->unicode / 2048];
return pixels + offset;
}
int8_t GeneratedFont::getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const
{
if (!glyph || glyph->kerningTableSize == 0)
{
return 0;
}
const KerningNode* kerndata = kerningData + glyph->kerningTablePos();
for (uint16_t i = glyph->kerningTableSize; i > 0; i--, kerndata++)
{
if (prevChar == kerndata->unicodePrevChar)
{
return kerndata->distance;
}
if (prevChar < kerndata->unicodePrevChar)
{
break;
}
}
return 0;
}
const GlyphNode* FusedFont::getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const
{
if (unicode < 0xAC00 || unicode > 0xD7A3)
{
return GeneratedFont::getGlyph(unicode, pixelData, bitsPerPixel);
}
else
{
fusedNode.unicode = unicode;
bitsPerPixel = 1;
pixelData = 0;
return const_cast<const GlyphNode*>(&fusedNode);
}
}
GlyphNode GeneratedVectorFont::glyphNode; // Static member
GeneratedVectorFont::GeneratedVectorFont(uint16_t baseline, float scale, const VectorFontNode* vectorGlyphs, const VectorFontData& fontData,
const uint16_t* const* glyphData, const VectorKerningNode* kerning,
const uint16_t* const gsubData, const FontContextualFormsTable* formsTable)
: Font((int)ceilf((fontData.maxBelowBottom + fontData.baselineHeight) * scale), baseline,
(uint8_t)ceilf(fontData.maxAboveTop * scale),
(uint8_t)ceilf(fontData.maxBelowBottom * scale), 0 /*bitsPerPixel*/, 0 /*byteAlignRow*/,
(uint8_t)ceilf(fontData.maxLeft * scale),
(uint8_t)ceilf(fontData.maxRight * scale),
fontData.fallbackChar,
fontData.ellipsisChar),
scaleFactor(scale), vectorNodes(vectorGlyphs), vectorTable(glyphData), kerningTable(kerning),
arabicTable(formsTable), numberOfGlyphs(fontData.numberOfGlyphs)
{
if (gsubData[0] != 0)
{
gsubTable = gsubData;
}
else
{
gsubTable = 0;
}
}
const GlyphNode* GeneratedVectorFont::getGlyph(Unicode::UnicodeChar unicode) const
{
const VectorFontNode* const node = find(unicode);
if (node == 0)
{
return 0;
}
else
{
return getGlyphNode(node);
}
}
const GlyphNode* GeneratedVectorFont::getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const
{
const VectorFontNode* const node = find(unicode);
if (node == 0)
{
return 0;
}
else
{
const uint16_t* contourData = &(vectorTable[unicode / 2048][node->dataOffset]);
pixelData = (const uint8_t*)contourData;
bitsPerPixel = 0xFF;
return getGlyphNode(node);
}
}
const GlyphNode* GeneratedVectorFont::getGlyphNode(const VectorFontNode* node) const
{
glyphNode.dataOffset = 0;
uint8_t flags = 0;
//Convert data from VectorFontNode to glyphNode using scaleFactor
glyphNode.unicode = node->unicode;
const int width = (node->width == 0) ? 0 : ((int)ceilf(node->width * scaleFactor) + 1);
glyphNode._width = width; // Save low 8 bit
// Set flags bits for values above 8 bit
if (width > 255)
{
flags |= GLYPH_DATA_WIDTH_BIT8;
}
const int height = (int)ceilf(node->height * scaleFactor);
glyphNode._height = height;
if (height > 255)
{
flags |= GLYPH_DATA_HEIGHT_BIT8;
}
const int top = (int)ceilf(node->top * scaleFactor);
glyphNode._top = top;
if (top > 255)
{
flags |= ((top & 0x300) >> 3); // GLYPH_DATA_TOP_BIT8 + 9
}
const int left = (int)(node->left * scaleFactor);
glyphNode.left = left;
const int advance = (int)(node->advance * scaleFactor + 0.5f);
glyphNode._advance = advance;
if (advance > 255)
{
flags |= GLYPH_DATA_ADVANCE_BIT8;
}
glyphNode._kerningTablePos = (uint8_t)node->kerningTablePos;
if (node->kerningTablePos > 255)
{
flags |= (node->kerningTablePos >> 8) & GLYPH_DATA_KERNINGTABLEPOS_BIT8_10;
}
glyphNode.kerningTableSize = node->kerningTableSize;
glyphNode.flags = flags;
return &glyphNode;
}
int8_t GeneratedVectorFont::getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const
{
if (!glyph || glyph->kerningTableSize == 0)
{
return 0;
}
const VectorKerningNode* kerndata = kerningTable + glyph->kerningTablePos();
for (uint16_t i = glyph->kerningTableSize; i > 0; i--, kerndata++)
{
if (prevChar == kerndata->unicodePrevChar)
{
const float scaledDistance = kerndata->distance * scaleFactor;
return (int)(scaledDistance >= 0.0f ? (scaledDistance + 0.5f) : (scaledDistance - 0.5f));
}
if (prevChar < kerndata->unicodePrevChar)
{
break;
}
}
return 0;
}
const VectorFontNode* GeneratedVectorFont::find(Unicode::UnicodeChar unicode) const
{
// Some fonts does not have a glyphList. Cannot be searched...
if (vectorNodes == 0)
{
return 0;
}
int32_t min = 0;
int32_t max = numberOfGlyphs - 1;
int32_t mid = min + (unicode - vectorNodes[min].unicode); // Linear up from [min].unicode
if (mid < min)
{
// Unicode < [min].unicode => not found
return (VectorFontNode*)0;
}
if (mid > max)
{
// Linear up ends too high
mid = max - (vectorNodes[max].unicode - unicode); // Linear down from [max].unicode
if (mid > max)
{
// Unicode > [max].unicode => not found
return (VectorFontNode*)0;
}
if (mid < min)
{
// Linear down ends too low, take the middle element
mid = (min + max) / 2;
}
}
while (min <= max)
{
const Unicode::UnicodeChar midUnicode = vectorNodes[mid].unicode;
if (unicode == midUnicode)
{
// Found at [mid]
return vectorNodes + mid;
}
if (unicode < midUnicode)
{
// Unicode is in lower half
max = mid - 1;
if (max < min)
{
// Range is empty => not found
break;
}
// We adjusted max, try linear down from [max].unicode
mid = max - (vectorNodes[max].unicode - unicode);
if (mid > max)
{
// Unicode > [max].unicode => not found
break;
}
if (mid < min)
{
// Linear down ends too low, take the middle element
mid = (min + max) / 2;
}
}
else
{
// Unicode is in upper half
min = mid + 1;
if (min > max)
{
// Range is empty => not found
break;
}
// We adjusted min, try linear up from [min].unicode
mid = min + (unicode - vectorNodes[min].unicode);
if (mid < min)
{
// Unicode < [min].unicode => not found
break;
}
if (mid > max)
{
// Linear up ends too high, take the middle element
mid = (min + max) / 2;
}
}
}
return (VectorFontNode*)0;
}
CompressedMappedFont::CompressedMappedFont(const GlyphNode* glyphs, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataInternalFlash, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable)
: GeneratedFont(glyphs, numGlyphs, height, baseline, pixAboveTop, pixBelowBottom, bitsPerPixel, byteAlignRow, maxLeft, maxRight, glyphDataInternalFlash, kerningList, fallbackChar, ellipsisChar, gsubData, formsTable)
{
}
const GlyphNode* CompressedMappedFont::getGlyph(Unicode::UnicodeChar unicode) const
{
return find(unicode);
}
const uint8_t* CompressedMappedFont::getPixelData(const GlyphNode* glyph) const
{
const uint8_t* pixelData = CompressedFontCache::hasCachedGlyph(glyph);
if (pixelData)
{
return pixelData;
}
const uint8_t* const* table = (const uint8_t* const*)glyphData;
const uint8_t* compressedData = &(table[glyph->unicode / 2048][glyph->dataOffset & 0x3FFFFFFF]);
return CompressedFontCache::cacheGlyph(glyph, compressedData);
}
} // namespace touchgfx
@@ -0,0 +1,6 @@
#include <touchgfx/Font.hpp>
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_10_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE = {
{ 0, 0 }
};
@@ -0,0 +1,31 @@
#include <touchgfx/Font.hpp>
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_20_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE = {
{ 0x0041, -1 }, // (First char = [0x0041, A], Second char = [0x0020, space], Kerning dist = -1)
{ 0x004C, -1 }, // (First char = [0x004C, L], Second char = [0x0020, space], Kerning dist = -1)
{ 0x0046, -2 }, // (First char = [0x0046, F], Second char = [0x002C, comma], Kerning dist = -2)
{ 0x0050, -2 }, // (First char = [0x0050, P], Second char = [0x002C, comma], Kerning dist = -2)
{ 0x0054, -2 }, // (First char = [0x0054, T], Second char = [0x002C, comma], Kerning dist = -2)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x002C, comma], Kerning dist = -1)
{ 0x0054, -1 }, // (First char = [0x0054, T], Second char = [0x002D, hyphen], Kerning dist = -1)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x002D, hyphen], Kerning dist = -1)
{ 0x0046, -2 }, // (First char = [0x0046, F], Second char = [0x002E, period], Kerning dist = -2)
{ 0x0050, -2 }, // (First char = [0x0050, P], Second char = [0x002E, period], Kerning dist = -2)
{ 0x0054, -2 }, // (First char = [0x0054, T], Second char = [0x002E, period], Kerning dist = -2)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x002E, period], Kerning dist = -1)
{ 0x0031, -1 }, // (First char = [0x0031, one], Second char = [0x0031, one], Kerning dist = -1)
{ 0x0054, -2 }, // (First char = [0x0054, T], Second char = [0x003A, colon], Kerning dist = -2)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x003A, colon], Kerning dist = -1)
{ 0x0020, -1 }, // (First char = [0x0020, space], Second char = [0x0041, A], Kerning dist = -1)
{ 0x0046, -1 }, // (First char = [0x0046, F], Second char = [0x0041, A], Kerning dist = -1)
{ 0x0050, -1 }, // (First char = [0x0050, P], Second char = [0x0041, A], Kerning dist = -1)
{ 0x0054, -1 }, // (First char = [0x0054, T], Second char = [0x0041, A], Kerning dist = -1)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x0041, A], Kerning dist = -1)
{ 0x0041, -1 }, // (First char = [0x0041, A], Second char = [0x0054, T], Kerning dist = -1)
{ 0x004C, -1 }, // (First char = [0x004C, L], Second char = [0x0054, T], Kerning dist = -1)
{ 0x0041, -1 }, // (First char = [0x0041, A], Second char = [0x0056, V], Kerning dist = -1)
{ 0x004C, -1 }, // (First char = [0x004C, L], Second char = [0x0056, V], Kerning dist = -1)
{ 0x0054, -2 }, // (First char = [0x0054, T], Second char = [0x0061, a], Kerning dist = -2)
{ 0x0056, -1 }, // (First char = [0x0056, V], Second char = [0x0061, a], Kerning dist = -1)
};
@@ -0,0 +1,17 @@
#include <touchgfx/Font.hpp>
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_40_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE = {
{ 0x0054, -2 }, // (First char = [0x0054, T], Second char = [0x002D, hyphen], Kerning dist = -2)
{ 0x0056, -2 }, // (First char = [0x0056, V], Second char = [0x002D, hyphen], Kerning dist = -2)
{ 0x0031, -3 }, // (First char = [0x0031, one], Second char = [0x0031, one], Kerning dist = -3)
{ 0x0054, -3 }, // (First char = [0x0054, T], Second char = [0x0041, A], Kerning dist = -3)
{ 0x0056, -3 }, // (First char = [0x0056, V], Second char = [0x0041, A], Kerning dist = -3)
{ 0x0054, -1 }, // (First char = [0x0054, T], Second char = [0x004F, O], Kerning dist = -1)
{ 0x0041, -3 }, // (First char = [0x0041, A], Second char = [0x0054, T], Kerning dist = -3)
{ 0x004C, -3 }, // (First char = [0x004C, L], Second char = [0x0054, T], Kerning dist = -3)
{ 0x0052, -1 }, // (First char = [0x0052, R], Second char = [0x0054, T], Kerning dist = -1)
{ 0x0041, -3 }, // (First char = [0x0041, A], Second char = [0x0056, V], Kerning dist = -3)
{ 0x004C, -3 }, // (First char = [0x004C, L], Second char = [0x0056, V], Kerning dist = -3)
{ 0x0052, -1 }, // (First char = [0x0052, R], Second char = [0x0056, V], Kerning dist = -1)
};
@@ -0,0 +1,122 @@
// Autogenerated, do not edit
#include <fonts/GeneratedFont.hpp>
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_10_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE = {
{ 0, 0x003F, 5, 7, 7, 0, 6, 0, 0, 0x00 } // question
};
// arial_10_4bpp
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_10_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE;
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_10_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE;
FONT_SEARCHTABLE_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t* const unicodes_arial_10_4bpp[] FONT_SEARCHTABLE_LOCATION_FLASH_ATTRIBUTE = {
unicodes_arial_10_4bpp_0
};
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_10_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE;
static const touchgfx::Unicode::UnicodeChar contextualForms4Long[][5] = {
// key, isol, key2
{ /*0627 0644 0644 0647*/ 0x02ED, 0xFDF2, 0x0644, 0x0000, 0x0000 } // ARABIC LIGATURE ALLAH
};
static const touchgfx::Unicode::UnicodeChar contextualForms3Long[][5] = {
// key, isol, fina, init, medi
{ /*0020 064C 0651*/ 0xD4F5, 0xFC5E, 0x0000, 0x0000, 0x0000 }, // ARABIC LIGATURE SHADDA WITH DAMMATAN
{ /*0020 064D 0651*/ 0xD51D, 0xFC5F, 0x0000, 0x0000, 0x0000 }, // ARABIC LIGATURE SHADDA WITH KASRATAN
{ /*0020 064E 0651*/ 0xD545, 0xFC60, 0x0000, 0x0000, 0x0000 }, // ARABIC LIGATURE SHADDA WITH FATHA
{ /*0020 064F 0651*/ 0xD56D, 0xFC61, 0x0000, 0x0000, 0x0000 }, // ARABIC LIGATURE SHADDA WITH DAMMA
{ /*0020 0650 0651*/ 0xD595, 0xFC62, 0x0000, 0x0000, 0x0000 } // ARABIC LIGATURE SHADDA WITH KASRA
};
static const touchgfx::Unicode::UnicodeChar contextualForms2Long[][5] = {
// key, isol, fina, init, medi
{ /*0644 0622*/ 0x4422, 0xFEF5, 0xFEF6, 0x0000, 0x0000 }, // ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
{ /*0644 0623*/ 0x4423, 0xFEF7, 0xFEF8, 0x0000, 0x0000 }, // ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
{ /*0644 0625*/ 0x4425, 0xFEF9, 0xFEFA, 0x0000, 0x0000 }, // ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
{ /*0644 0627*/ 0x4427, 0xFEFB, 0xFEFC, 0x0000, 0x0000 } // ARABIC LIGATURE LAM WITH ALEF
};
static const touchgfx::Unicode::UnicodeChar contextualForms0621_063a[][4] = {
// isol, fina, init, medi
{ /*0621*/ 0xFE80, 0x0000, 0x0000, 0x0000 }, // ARABIC LETTER HAMZA
{ /*0622*/ 0xFE81, 0xFE82, 0x0000, 0x0000 }, // ARABIC LETTER ALEF WITH MADDA ABOVE
{ /*0623*/ 0xFE83, 0xFE84, 0x0000, 0x0000 }, // ARABIC LETTER ALEF WITH HAMZA ABOVE
{ /*0624*/ 0xFE85, 0xFE86, 0x0000, 0x0000 }, // ARABIC LETTER WAW WITH HAMZA ABOVE
{ /*0625*/ 0xFE87, 0xFE88, 0x0000, 0x0000 }, // ARABIC LETTER ALEF WITH HAMZA BELOW
{ /*0626*/ 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C }, // ARABIC LETTER YEH WITH HAMZA ABOVE
{ /*0627*/ 0xFE8D, 0xFE8E, 0x0000, 0x0000 }, // ARABIC LETTER ALEF
{ /*0628*/ 0xFE8F, 0xFE90, 0xFE91, 0xFE92 }, // ARABIC LETTER BEH
{ /*0629*/ 0xFE93, 0xFE94, 0x0000, 0x0000 }, // ARABIC LETTER TEH MARBUTA
{ /*062A*/ 0xFE95, 0xFE96, 0xFE97, 0xFE98 }, // ARABIC LETTER TEH
{ /*062B*/ 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C }, // ARABIC LETTER THEH
{ /*062C*/ 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0 }, // ARABIC LETTER JEEM
{ /*062D*/ 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4 }, // ARABIC LETTER HAH
{ /*062E*/ 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8 }, // ARABIC LETTER KHAH
{ /*062F*/ 0xFEA9, 0xFEAA, 0x0000, 0x0000 }, // ARABIC LETTER DAL
{ /*0630*/ 0xFEAB, 0xFEAC, 0x0000, 0x0000 }, // ARABIC LETTER THAL
{ /*0631*/ 0xFEAD, 0xFEAE, 0x0000, 0x0000 }, // ARABIC LETTER REH
{ /*0632*/ 0xFEAF, 0xFEB0, 0x0000, 0x0000 }, // ARABIC LETTER ZAIN
{ /*0633*/ 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4 }, // ARABIC LETTER SEEN
{ /*0634*/ 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8 }, // ARABIC LETTER SHEEN
{ /*0635*/ 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC }, // ARABIC LETTER SAD
{ /*0636*/ 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0 }, // ARABIC LETTER DAD
{ /*0637*/ 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4 }, // ARABIC LETTER TAH
{ /*0638*/ 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8 }, // ARABIC LETTER ZAH
{ /*0639*/ 0xFEC9, 0xFECA, 0xFECB, 0xFECC }, // ARABIC LETTER AIN
{ /*063A*/ 0xFECD, 0xFECE, 0xFECF, 0xFED0 } // ARABIC LETTER GHAIN
};
static const touchgfx::Unicode::UnicodeChar contextualForms0641_064a[][4] = {
// isol, fina, init, medi
{ /*0641*/ 0xFED1, 0xFED2, 0xFED3, 0xFED4 }, // ARABIC LETTER FEH
{ /*0642*/ 0xFED5, 0xFED6, 0xFED7, 0xFED8 }, // ARABIC LETTER QAF
{ /*0643*/ 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC }, // ARABIC LETTER KAF
{ /*0644*/ 0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0 }, // ARABIC LETTER LAM
{ /*0645*/ 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4 }, // ARABIC LETTER MEEM
{ /*0646*/ 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8 }, // ARABIC LETTER NOON
{ /*0647*/ 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC }, // ARABIC LETTER HEH
{ /*0648*/ 0xFEED, 0xFEEE, 0x0000, 0x0000 }, // ARABIC LETTER WAW
{ /*0649*/ 0xFEEF, 0xFEF0, 0x0000, 0x0000 }, // ARABIC LETTER ALEF MAKSURA / ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA
{ /*064A*/ 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4 } // ARABIC LETTER YEH
};
static const touchgfx::Unicode::UnicodeChar contextualForms06XX[][5] = {
// key, isol, fina, init, medi
{ /*0671*/ 0x0671, 0xFB50, 0x0000, 0x0000, 0x0000 }, // ARABIC LETTER ALEF WASLA
{ /*067E*/ 0x067E, 0xFB56, 0xFB57, 0xFB58, 0xFB59 }, // ARABIC LETTER PEH
{ /*0686*/ 0x0686, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D }, // ARABIC LETTER TCHEH
{ /*0698*/ 0x0698, 0xFB8A, 0xFB8B, 0x0000, 0x0000 }, // ARABIC LETTER JEH
{ /*06A4*/ 0x06A4, 0xFB6A, 0x0000, 0x0000, 0x0000 }, // ARABIC LETTER VEH
{ /*06A9*/ 0x06A9, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91 }, // ARABIC LETTER KEHEH
{ /*06AF*/ 0x06AF, 0xFB92, 0xFB93, 0xFB94, 0xFB95 }, // ARABIC LETTER GAF
{ /*06CC*/ 0x06CC, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF } // ARABIC LETTER FARSI YEH
};
extern const touchgfx::FontContextualFormsTable arial_contextualFormsTable;
const touchgfx::FontContextualFormsTable arial_contextualFormsTable =
{
contextualForms4Long,
contextualForms3Long,
contextualForms2Long,
contextualForms0621_063a,
contextualForms0641_064a,
contextualForms06XX,
sizeof(contextualForms4Long)/sizeof(contextualForms4Long[0]),
sizeof(contextualForms3Long)/sizeof(contextualForms3Long[0]),
sizeof(contextualForms2Long)/sizeof(contextualForms2Long[0]),
sizeof(contextualForms06XX)/sizeof(contextualForms06XX[0])
};
touchgfx::GeneratedFont& getFont_arial_10_4bpp();
touchgfx::GeneratedFont& getFont_arial_10_4bpp()
{
static touchgfx::GeneratedFont arial_10_4bpp(glyphs_arial_10_4bpp, 1, 10, 10, 0, 0, 4, 1, 0, 0, unicodes_arial_10_4bpp, kerning_arial_10_4bpp, 63, 0, 0, &arial_contextualFormsTable);
return arial_10_4bpp;
}
@@ -0,0 +1,65 @@
// Autogenerated, do not edit
#include <fonts/GeneratedFont.hpp>
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_20_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE = {
{ 0, 0x0020, 0, 0, 0, 0, 6, 0, 2, 0x00 }, // space
{ 0, 0x002C, 3, 6, 3, 1, 6, 2, 4, 0x00 }, // comma
{ 12, 0x002D, 6, 2, 6, 0, 7, 6, 2, 0x00 }, // hyphen
{ 18, 0x002E, 3, 3, 3, 1, 6, 8, 4, 0x00 }, // period
{ 24, 0x0030, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // zero
{ 114, 0x0031, 6, 15, 15, 2, 11, 12, 1, 0x00 }, // one
{ 159, 0x0032, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // two
{ 249, 0x0033, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // three
{ 339, 0x0034, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // four
{ 429, 0x0035, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // five
{ 519, 0x0036, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // six
{ 609, 0x0037, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // seven
{ 699, 0x0038, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // eight
{ 789, 0x0039, 11, 15, 15, 0, 11, 0, 0, 0x00 }, // nine
{ 879, 0x003A, 3, 11, 11, 1, 6, 13, 2, 0x00 }, // colon
{ 901, 0x003F, 10, 15, 15, 1, 11, 0, 0, 0x00 }, // question
{ 976, 0x0041, 14, 15, 15, 0, 13, 15, 5, 0x00 }, // A
{ 1081, 0x0042, 12, 15, 15, 1, 13, 0, 0, 0x00 }, // B
{ 1171, 0x0043, 13, 15, 15, 1, 14, 0, 0, 0x00 }, // C
{ 1276, 0x0044, 13, 15, 15, 1, 14, 0, 0, 0x00 }, // D
{ 1381, 0x0045, 12, 15, 15, 1, 13, 0, 0, 0x00 }, // E
{ 1471, 0x0046, 11, 15, 15, 1, 12, 0, 0, 0x00 }, // F
{ 1561, 0x0048, 12, 15, 15, 1, 14, 0, 0, 0x00 }, // H
{ 1651, 0x0049, 3, 15, 15, 1, 6, 0, 0, 0x00 }, // I
{ 1681, 0x004B, 13, 15, 15, 1, 13, 0, 0, 0x00 }, // K
{ 1786, 0x004C, 10, 15, 15, 1, 11, 0, 0, 0x00 }, // L
{ 1861, 0x004D, 15, 15, 15, 1, 17, 0, 0, 0x00 }, // M
{ 1981, 0x004E, 12, 15, 15, 1, 14, 0, 0, 0x00 }, // N
{ 2071, 0x004F, 14, 15, 15, 1, 16, 0, 0, 0x00 }, // O
{ 2176, 0x0050, 12, 15, 15, 1, 13, 0, 0, 0x00 }, // P
{ 2266, 0x0052, 13, 15, 15, 1, 14, 0, 0, 0x00 }, // R
{ 2371, 0x0054, 12, 15, 15, 0, 12, 20, 2, 0x00 }, // T
{ 2461, 0x0055, 12, 15, 15, 1, 14, 0, 0, 0x00 }, // U
{ 2551, 0x0056, 14, 15, 15, 0, 13, 22, 2, 0x00 }, // V
{ 2656, 0x0058, 13, 15, 15, 0, 13, 0, 0, 0x00 }, // X
{ 2761, 0x0061, 11, 11, 11, 0, 11, 24, 2, 0x00 }, // a
{ 2827, 0x0078, 10, 11, 11, 0, 10, 0, 0, 0x00 }, // x
{ 2882, 0x007A, 10, 11, 11, 0, 10, 0, 0, 0x00 } // z
};
// arial_20_4bpp
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_20_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE;
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_20_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE;
FONT_SEARCHTABLE_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t* const unicodes_arial_20_4bpp[] FONT_SEARCHTABLE_LOCATION_FLASH_ATTRIBUTE = {
unicodes_arial_20_4bpp_0
};
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_20_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE;
extern const touchgfx::FontContextualFormsTable arial_contextualFormsTable;
touchgfx::GeneratedFont& getFont_arial_20_4bpp();
touchgfx::GeneratedFont& getFont_arial_20_4bpp()
{
static touchgfx::GeneratedFont arial_20_4bpp(glyphs_arial_20_4bpp, 38, 23, 20, 0, 0, 4, 1, 0, 1, unicodes_arial_20_4bpp, kerning_arial_20_4bpp, 63, 0, 0, &arial_contextualFormsTable);
return arial_20_4bpp;
}
@@ -0,0 +1,50 @@
// Autogenerated, do not edit
#include <fonts/GeneratedFont.hpp>
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_40_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE = {
{ 0, 0x002B, 20, 19, 24, 2, 23, 0, 0, 0x00 }, // plus
{ 190, 0x002D, 12, 4, 13, 1, 13, 0, 2, 0x00 }, // hyphen
{ 214, 0x0030, 20, 28, 28, 1, 22, 0, 0, 0x00 }, // zero
{ 494, 0x0031, 11, 28, 28, 4, 22, 2, 1, 0x00 }, // one
{ 662, 0x0032, 20, 28, 28, 1, 22, 0, 0, 0x00 }, // two
{ 942, 0x003F, 20, 28, 28, 1, 22, 0, 0, 0x00 }, // question
{ 1222, 0x0041, 27, 28, 28, 0, 27, 3, 2, 0x00 }, // A
{ 1614, 0x0042, 23, 28, 28, 2, 27, 0, 0, 0x00 }, // B
{ 1950, 0x0043, 26, 28, 28, 2, 29, 0, 0, 0x00 }, // C
{ 2314, 0x0044, 24, 28, 28, 3, 29, 0, 0, 0x00 }, // D
{ 2650, 0x0045, 22, 28, 28, 3, 27, 0, 0, 0x00 }, // E
{ 2958, 0x0048, 23, 28, 28, 3, 29, 0, 0, 0x00 }, // H
{ 3294, 0x0049, 5, 28, 28, 3, 11, 0, 0, 0x00 }, // I
{ 3378, 0x004C, 19, 28, 28, 2, 22, 0, 0, 0x00 }, // L
{ 3658, 0x004E, 23, 28, 28, 3, 29, 0, 0, 0x00 }, // N
{ 3994, 0x004F, 29, 28, 28, 1, 31, 5, 1, 0x00 }, // O
{ 4414, 0x0051, 29, 30, 28, 1, 31, 0, 0, 0x00 }, // Q
{ 4864, 0x0052, 26, 28, 28, 3, 29, 0, 0, 0x00 }, // R
{ 5228, 0x0053, 24, 28, 28, 1, 27, 0, 0, 0x00 }, // S
{ 5564, 0x0054, 24, 28, 28, 0, 24, 6, 3, 0x00 }, // T
{ 5900, 0x0055, 23, 28, 28, 3, 29, 0, 0, 0x00 }, // U
{ 6236, 0x0056, 27, 28, 28, 0, 27, 9, 3, 0x00 }, // V
{ 6628, 0x005A, 24, 28, 28, 0, 24, 0, 0, 0x00 } // Z
};
// arial_40_4bpp
FONT_TABLE_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::GlyphNode glyphs_arial_40_4bpp[] FONT_TABLE_LOCATION_FLASH_ATTRIBUTE;
FONT_GLYPH_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t unicodes_arial_40_4bpp_0[] FONT_GLYPH_LOCATION_FLASH_ATTRIBUTE;
FONT_SEARCHTABLE_LOCATION_FLASH_PRAGMA
KEEP extern const uint8_t* const unicodes_arial_40_4bpp[] FONT_SEARCHTABLE_LOCATION_FLASH_ATTRIBUTE = {
unicodes_arial_40_4bpp_0
};
FONT_KERNING_LOCATION_FLASH_PRAGMA
KEEP extern const touchgfx::KerningNode kerning_arial_40_4bpp[] FONT_KERNING_LOCATION_FLASH_ATTRIBUTE;
extern const touchgfx::FontContextualFormsTable arial_contextualFormsTable;
touchgfx::GeneratedFont& getFont_arial_40_4bpp();
touchgfx::GeneratedFont& getFont_arial_40_4bpp()
{
static touchgfx::GeneratedFont arial_40_4bpp(glyphs_arial_40_4bpp, 23, 42, 40, 0, 0, 4, 1, 0, 0, unicodes_arial_40_4bpp, kerning_arial_40_4bpp, 63, 0, 0, &arial_contextualFormsTable);
return arial_40_4bpp;
}
@@ -0,0 +1,236 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <touchgfx/hal/FlashDataReader.hpp>
#include <fonts/ApplicationFontProvider.hpp>
#include <fonts/CompressedUnmappedFontCache.hpp>
#include <fonts/UnmappedDataFont.hpp>
namespace touchgfx
{
GlyphNode UnmappedDataFont::glyphNodeBuffer;
UnmappedDataFont::UnmappedDataFont(const GlyphNode* glyphs, const uint16_t* unicodeList, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataList, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable)
: Font(height, baseline, pixAboveTop, pixBelowBottom, bitsPerPixel, byteAlignRow, maxLeft, maxRight, fallbackChar, ellipsisChar),
glyphList(glyphs),
listSize(numGlyphs),
unicodes(unicodeList),
glyphDataList(glyphDataList),
kerningData(kerningList),
gsubTable(gsubData),
arabicTable(formsTable)
{
}
const GlyphNode* UnmappedDataFont::getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const
{
int index = lookupUnicode(unicode);
if (index != -1)
{
// Read glyphNode from unmapped flash
touchgfx::FlashDataReader* const flashReader = ApplicationFontProvider::getFlashReader();
if (flashReader)
{
flashReader->copyData(glyphList + index, &glyphNodeBuffer, sizeof(GlyphNode));
pixelData = getPixelData(const_cast<const GlyphNode*>(&glyphNodeBuffer));
bitsPerPixel = getBitsPerPixel();
return &glyphNodeBuffer;
}
}
return 0;
}
const uint8_t* UnmappedDataFont::getPixelData(const GlyphNode* glyph) const
{
const uint8_t* const* table = (const uint8_t* const*)glyphDataList;
return &(table[glyph->unicode / 2048][glyph->dataOffset]);
}
int8_t UnmappedDataFont::getKerning(Unicode::UnicodeChar prevChar, const GlyphNode* glyph) const
{
if (!glyph || glyph->kerningTableSize == 0)
{
return 0;
}
const KerningNode* kerndata = kerningData + glyph->kerningTablePos();
for (uint16_t i = glyph->kerningTableSize; i > 0; i--, kerndata++)
{
if (prevChar == kerndata->unicodePrevChar)
{
return kerndata->distance;
}
if (prevChar < kerndata->unicodePrevChar)
{
break;
}
}
return 0;
}
int UnmappedDataFont::lookupUnicode(uint16_t unicode) const
{
int32_t min = 0;
int32_t max = listSize - 1;
int32_t mid = min + (unicode - unicodes[min]); // Linear up from [min].unicode
if (mid < min)
{
// Unicode < unicodes[min] => not found
return -1;
}
if (mid > max)
{
// Linear up ends too high
mid = max - (unicodes[max] - unicode); // Linear down from [max].unicode
if (mid > max)
{
// Unicode > unicodes[max] => not found
return -1;
}
if (mid < min)
{
// Linear down ends too low, take the middle element
mid = (min + max) / 2;
}
}
while (min <= max)
{
if (unicode == unicodes[mid])
{
// Found at [mid]
return mid;
}
if (unicode < unicodes[mid])
{
// Unicode is in lower half
max = mid - 1;
if (max < min)
{
// Range is empty => not found
break;
}
// We adjusted max, try linear down from [max].unicode
mid = max - (unicodes[max] - unicode);
if (mid > max)
{
// Unicode > [max].unicode => not found
break;
}
if (mid < min)
{
// Linear down ends too low, take the middle element
mid = (min + max) / 2;
}
}
else
{
// Unicode is in upper half
min = mid + 1;
if (min > max)
{
// Range is empty => not found
break;
}
// We adjusted min, try linear up from [min].unicode
mid = min + (unicode - unicodes[min]);
if (mid < min)
{
// Unicode < [min].unicode => not found
break;
}
if (mid > max)
{
// Linear up ends too high, take the middle element
mid = (min + max) / 2;
}
}
}
return -1;
}
CompressedUnmappedDataFont::CompressedUnmappedDataFont(const GlyphNode* glyphs, const uint16_t* unicodes, uint16_t numGlyphs, uint16_t height, uint16_t baseline, uint8_t pixAboveTop, uint8_t pixBelowBottom, uint8_t bitsPerPixel, uint8_t byteAlignRow, uint8_t maxLeft, uint8_t maxRight, const uint8_t* const* glyphDataList, const KerningNode* kerningList, const Unicode::UnicodeChar fallbackChar, const Unicode::UnicodeChar ellipsisChar, const uint16_t* const gsubData, const FontContextualFormsTable* formsTable)
: UnmappedDataFont(glyphs, unicodes, numGlyphs, height, baseline, pixAboveTop, pixBelowBottom, bitsPerPixel, byteAlignRow, maxLeft, maxRight, glyphDataList, kerningList, fallbackChar, ellipsisChar, gsubData, formsTable)
{
}
const GlyphNode* CompressedUnmappedDataFont::getGlyph(Unicode::UnicodeChar unicode) const
{
const int index = lookupUnicode(unicode);
if (index != -1)
{
const GlyphNode* glyphNode = glyphList + index;
// Is the GlyphNode already cached
const GlyphNode* cachedNode = CompressedUnmappedFontCache::hasCachedGlyphNode(glyphNode);
if (cachedNode)
{
return cachedNode;
}
// Read glyphNode from unmapped flash
touchgfx::FlashDataReader* const flashReader = ApplicationFontProvider::getFlashReader();
if (flashReader)
{
GlyphNode* newGlyphNode = CompressedUnmappedFontCache::cacheGlyphNode(glyphNode);
flashReader->copyData(glyphList + index, (uint8_t*)newGlyphNode, sizeof(GlyphNode));
return newGlyphNode;
}
}
return 0;
}
const GlyphNode* CompressedUnmappedDataFont::getGlyph(Unicode::UnicodeChar unicode, const uint8_t*& pixelData, uint8_t& bitsPerPixel) const
{
const int index = lookupUnicode(unicode);
if (index != -1)
{
const GlyphNode* glyphNode = glyphList + index;
const uint8_t* pixels = 0;
const GlyphNode* cachedNode = CompressedUnmappedFontCache::hasCachedGlyphData(glyphNode, pixels);
if (pixels)
{
pixelData = pixels;
bitsPerPixel = 4;
return cachedNode;
}
// Cache glyphNode if not found already
if (cachedNode == 0)
{
cachedNode = getGlyph(unicode);
}
if (cachedNode->width() == 0)
{
bitsPerPixel = 4;
pixelData = 0;
return cachedNode;
}
// Read data from unmapped flash
touchgfx::FlashDataReader* const flashReader = ApplicationFontProvider::getFlashReader();
if (flashReader)
{
const uint8_t* const* table = (const uint8_t* const*)glyphDataList;
const uint32_t dataOffset = cachedNode->dataOffset & 0x3FFFFFFF;
const uint8_t* compressedData = &(table[unicode / 2048][dataOffset]);
const uint8_t* cachedData = CompressedUnmappedFontCache::cacheGlyphData(glyphNode, compressedData, flashReader);
if (cachedData)
{
bitsPerPixel = 4;
pixelData = cachedData;
return cachedNode;
}
}
}
return 0;
}
const uint8_t* CompressedUnmappedDataFont::getPixelData(const GlyphNode* glyph) const
{
return 0;
}
} // namespace touchgfx
@@ -0,0 +1,11 @@
/* DO NOT EDIT THIS FILE */
/* This file is autogenerated by the text-database code generator */
#include <touchgfx/VectorFontRendererImpl.hpp>
void touchgfx::VectorFontRendererImpl::getVectorFontBuffers(float*& pointArray, int& pointArraySize, uint8_t*& commandArray, int& commandArraySize)
{
pointArray = 0;
pointArraySize = 0;
commandArray = 0;
commandArraySize = 0;
}