将字体链接到应用的基本原则的主要优势是应用始终会自动包含应用中使用的更新文本和字体排印。 因此,使用起来十分容易和安全。 其缺点在于字体会使应用的体积变大。

为了缓解这个问题,TouchGFX允许应用使用二进制字体。 这些字体不链接到应用,而是独立于应用保存为单独的文件。 应用在运行时间将这些文件加载并提供给TouchGFX。 举例来说,应用可以从外部存储器(如SD卡)加载字体,也可以从互联网下载字体。

创建TextArea

TouchGFX之二进制字体-LMLPHP

TouchGFX之二进制字体-LMLPHP

配置字体转换器以生成二进制字体

TouchGFX之二进制字体-LMLPHP

安装二进制字体

FrontendApplication.hpp

#include <gui/common/FrontendApplication.hpp>
#include <BitmapDatabase.hpp>
#include <stdio.h>
#include <fonts/GeneratedFont.hpp>
#include <texts/TypedTextDatabase.hpp>
#include <fonts/ApplicationFontProvider.hpp>

LOCATION_PRAGMA_NOLOAD("TouchGFX_Cache")
uint16_t Cache[1024 * 604] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Cache");

LOCATION_PRAGMA_NOLOAD("TouchGFX_Fontdata")
uint8_t fontdata[10000] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Fontdata");
BinaryFont bf;

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);
	
    FILE* font = fopen("generated/fonts/bin/Font_verdana_20_4bpp.bin", "rb");
    if (font)
    {
        //read data from the file
        fread(fontdata, 1, 10000, font);
        fclose(font);

        //initialize BinaryFont object in bf using placement new
        new (&bf) BinaryFont((const struct touchgfx::BinaryFontData*)fontdata);

        //replace application font 'DEFAULT' with the binary font
        TypedTextDatabase::setFont(Typography::DEFAULT, &bf); //verdana_20_4bpp
    }
#else
    Bitmap::setCache(Cache, sizeof(Cache));
#endif
}

运行模拟器

TouchGFX之二进制字体-LMLPHP

09-30 01:17