freetype glyph指标的多个字体尺寸

FreeType Glyph Metrics Caching of multiple Font sizes

本文关键字:字体 glyph freetype      更新时间:2023-10-16

情况:

我有一个项目将产品信息渲染到给定的模板(自定义XML格式),然后以自定义的二进制LCD格式(简化步骤)

渲染并转换它

我们的客户现在想要自动拟合文本容器。(客户给出一个特定大小的,各种字符串必须使自动固定适合该容器

为此,我必须计算多个字体大小的字符串宽度(freetype:每个char/glyph)(例如100pt不合适,99pt不合适,98pt不适合...,...,...,65pt fit!)

问题:

问题是,每个自动拟合元素需要花费大量时间(约20-30毫秒),而我的整个应用程序只有〜100ms。(因此,当客户增加5个自动元素时,已经保证超过约100毫秒)

尝试:

使用字体文件并计算从1pt到100pt的字体尺寸的每个Unicode-thacter的宽度,它可以计算每个Unicode-thacter的宽度。然后,它从这样的数据中生成C源代码:

//
#define  COUNT_SIZES  100    // Font-Size 1-100
#define  COUNT_CHARS  65536  // Full Unicode Table
int char_sizes[COUNT_SIZES][COUNT_CHARS] = 
{
   {1,1,2,2,3,1,1,2,2,3,1,2,2,1,2,2,3,1,2,.......// 65536
   {2,2,3,3,4,2,1,3,3,4,2,3,3,2,3,3,4,2,3,.......// 65536
   {2,3,4,3,5,2,2,4,4,5,2,4,4,2,4,3,5,3,3,.......// 65536
   // ...
   // 100 font sizes
};

在动态液体中编译的(.SO)的大小为25 MB,需要约50ms的" dlload",而〜10ms则为" dlsym"(waaaaaaay太多!)

以相同的方式,但只有ASCII表(因此只有128个65536中的128个)将" dlload"和〜100µs的" dlsym"(非常好!)

用于" dlload"和〜100µs的〜500µs

我的下一个尝试是将字体调查生成器集成到我的项目中,而仅缓存我需要的特定客户的字形(欧洲客户需要约500个字形,亚洲一个(例如传统中文)需要〜2500(只有示例,不确定,甚至需要更多)

但是,在我进行艰苦的旅程(:()之前,我想问一下您是否知道一种更好的方法?

我不敢相信这是不可能的,浏览器应该如何在不加载几秒钟的情况下显示Lorem Ipsum?:D

关于如何解决此绩效问题的任何想法?

在数据缓存的任何信息链接中,可以极端快速访问缓存(有点lt; 1ms)?

系统信息:

  • unix (Ubuntu 16.04) 64bit
  • x86 ARM 架构存在!

我使用这些库找到了一种可能的方法:

  • ICU (对于Unicode)
  • freetype (对于字形)
  • harfbuzz (用于布局)

github项目:harfbuzz-icu-freetype

松散的构建说明:

  • cmakelists中的搜索选项.txt option(WITH_XX "DESCRIPT." ON/OFF)
  • 启用CMake使用-Dcmake -DWITH_ZLIB=ON -DWITH_Harfbuzz=ON ..
  • mkdir build && cd build && cmake [option [option [...]]] ..
  • make -j $count_of_cpu_cores && sudo make install

Google for Some Harfbuzz布局教程/指南