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,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;
}