freetype glyph指标的多个字体尺寸
FreeType Glyph Metrics Caching of multiple Font sizes
情况:
我有一个项目将产品信息渲染到给定的模板(自定义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
使用-D
:cmake -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布局教程/指南
- 在C++中测量postscript字体宽度
- 如何在Directwrite中获得给定字体的可用OpenType功能
- SetCurrentConsoleFontEx() 不适用于自定义安装的字体
- C++ wxWidgets:在创建小部件后设置字体
- C++ wxWidgets:更改大小器的字体
- C++ 位图中的 ttc 字体
- 从 QFontDatabase 设置 QFont 将所有标签设置为等宽字体?Qt C++
- 更改 Windows GUI 中静态文本框的字体大小
- SFML 中的字体.信息不显示在屏幕上.显示的不是信息,而是点
- 如何获取控制面板设置值,如字体大小
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 通知 Windows 系统应用程序字体已被卸载/删除
- 使用 Visual Studio C++ 在控制台中控制字体和字符集
- OpenGL中使用Freetype进行字体渲染的问题不起作用
- CDialog 的标题/标题的字体样式
- 如何获取字体数据以嵌入到 PDF 中?
- 我可以存储字体名吗?
- 如何获取具有 Freetype2 的真正类型字体支持的代码点列表 C++
- freetype glyph指标的多个字体尺寸