1. 问题简介

当js应用中使用text组件显示文字时,存在不显示问题,在其他位置或者通过变更复显也无法显示。

OpenHarmony版本:master
设备: LiteOS-M 设备
日期:2025-11-05

2. 问题详情

  1. 文字送显前会获取文字数据Bitmap,在获取Bitmap时,会优先从文字缓存中获取(这里主要介绍矢量字体库):

foundation/arkui/ui_lite/frameworks/font/ui_font_vector.cpp

img

  1. 当从字体缓存(fontCacheManager)中无法获取到Bitmap时,就会先从字体库中获取后保存到缓存中,再从缓存中获取:

img

  1. 从字体中获取数据后,写入到缓存(bufInfo.virAddr)中:

img

这里的缓存写入存在一个问题,当字体数据faceInfo.face->glyph->bitmap.buffer为空时,前面就已经在bitmap.buffer保存了部分数据,这会导致缓存数据不完整,从而在读取文字数据时返回空导致不显示

3. 处理方法

加载字体库时,通过三方库freetype的FT_Load_Glyph接口获取字体数据,保存到ftFaces_[fontId]中并最终作为faceInfo传递到SetFace方法中。

img

这里没有对ftFaces_[fontId]内的bitmap.buffer进行判空校验,如果bitmap.buffer为空这里应该返回INVALID_RET_VALUE,因此添加判空

img

4. 总结

当三方库freetype返回的字体数据时,需要对其进行判空校验,若将错误数据存入缓存,后续文字显示都会存在问题。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐