使用二进制字体需要将整个字体加载到存储器。 在某些情况下,如果字体很大,如大字号中文字体,则这样做可能不可取。
字体缓存使应用能够从外部存储器只能加载显示字符串所需的字母。 这意味着整个字体无需保存到在可寻址闪存或RAM上,而是只需保存在更大的文件系统上。
字体文件阅读器
- FileDataReader.hpp
-
- #ifndef FILEDATAREADER_HPP
- #define FILEDATAREADER_HPP
- #include
- #include
-
- using namespace touchgfx;
-
- class FileDataReader : public FontDataReader
- {
- public:
- virtual ~FileDataReader() { }
- virtual void open()
- {
- fp = fopen("generated/fonts/bin/Font_verdana_20_4bpp.bin", "rb");
- }
- virtual void close()
- {
- fclose(fp);
- }
- virtual void setPosition(uint32_t position)
- {
- fseek(fp, position, SEEK_SET);
- }
- virtual void readData(void* out, uint32_t numberOfBytes)
- {
- fread(out, numberOfBytes, 1, fp);
- }
- private:
- FILE* fp;
- };
-
- #endif // FRONTENDAPPLICATION_HPP
创建FontCache、存储缓冲区和文件系统阅读器对象,然后安装CachedFont:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
-
- uint8_t fontdata[5120];
- FileDataReader reader;
- FontCache fontCache;
- CachedFont cachedFont; //Cached Font object
-
- LOCATION_PRAGMA_NOLOAD("TouchGFX_Cache")
- uint16_t Cache[1024 * 604] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Cache");
-
- FrontendApplication::FrontendApplication(Model& m, FrontendHeap& heap)
- : FrontendApplicationBase(m, heap)
- {
- #ifdef SIMULATOR
- const uint32_t cacheSize = 0x300000; //3 MB, as example
- uint16_t* const cacheStartAddr = (uint16_t*)malloc(cacheSize);
- Bitmap::setCache(cacheStartAddr, cacheSize, 4);
- #else
- Bitmap::setCache(Cache, sizeof(Cache));
- #endif
-
- //setup the font cache with buffer and size; and file reader object
- fontCache.setMemory(fontdata, sizeof(fontdata));
- fontCache.setReader(&reader);
- TypedText text = TypedText(T___SINGLEUSE_2OJQ);
- fontCache.initializeCachedFont(text, &cachedFont);
-
- //replace the linked in font in TouchGFX with cachedFont
- TypedTextDatabase::setFont(Typography::DEFAULT, &cachedFont);
-
- Unicode::UnicodeChar* str = const_cast
(text.getText()); - fontCache.cacheString(text, str);
- }
运行模拟器
