前言

我们的项目是基于google skia的渲染引擎
然后skia关于文字处理这块 是用的 freetype + harfbuzz
不太清楚的可以先了解下这些库的背景,这里就不说了

怎么解析字体文件获取fontFamily , fontStyle呢?

1.既然我们引入了skia 就不太单独引入第三方的库了
就用skia 来解析 fontFamily , fontStyle

看一段代码

  1. 生成 SkFontStyleSet * ,传入的是字体文件的数据
#include "include/core/SkStream.h"
#include "src/core/SkFontDescriptor.h"
#include "src/ports/SkFontHost_FreeType_common.h"
#include "src/ports/SkFontMgr_custom.h"SkFontStyleSet * genSkFontStyleSet (sk_sp<SkData> data){static SkTypeface_FreeType::Scanner scanner;static auto baseFntMgr = SkFontMgr_Custom::RefDefault();auto stream = std::make_unique<SkMemoryStream>(data);int numFaces;if (!scanner.recognizedFont(stream.get(), &numFaces)) {//SkDebugf("---- failed to open <%d> as a font\n",stream.get());return nullptr;}SkFontStyleSet_Custom *pNewSet = nullptr;for (int faceIndex = 0; faceIndex < numFaces; ++faceIndex) {bool isFixedPitch;SkString realname;SkFontStyle style = SkFontStyle(); // avoid uninitialized warningif (!scanner.scanFont(stream.get(), faceIndex,&realname, &style, &isFixedPitch, nullptr)){// SkDebugf("---- failed to open <%d> <%d> as a font\n", stream.get(),faceIndex);return nullptr;}if (nullptr == pNewSet) pNewSet = new SkFontStyleSet_Custom(realname);auto fontData = std::make_unique<SkFontData>(stream->fork(), faceIndex, nullptr, 0);pNewSet->appendTypeface(sk_make_sp<SkTypeface_Stream>(std::move(fontData),style, isFixedPitch,true, realname));}return pNewSet;
}
  1. 通过 SkFontStyleSet 获取字体的 fontfamily 和 fontstyle
auto set = genSkFontStyleSet(fontData);
for (auto i = 0; i < set->count(); i++) {SkFontStyle fontStyle;set->getStyle(i, &fontStyle, nullptr);   //这个接口拿的fontStyleName,测试都是空SkTypeface *typeface = set->createTypeface(i);if (nullptr == typeface) {continue;}SkString fontFamily;typeface->getFamilyName(&fontFamily);if (fontFamily.size() == 0) {continue;}SkString postscriptName;typeface->getPostScriptName(&postscriptName);}

这里注意 我们familyName 和 postscriptName 都可以拿出来
但是fontStyleName 是空, 任何字体都是空
skia的bug
那么就拖拽skia源码的,新增接口通过freetype 把styleName 取出来

代码如下
本地测试的demo

FT_Library lib;int error = FT_Init_FreeType(&lib);if (error){return 0;}FT_Face face;error = FT_New_Face(lib, "E:/testFont/PingFangTC-Thin.ttf", 0, &face);auto num = face->num_faces;if (error){return 0;}auto styleName = face->style_name;auto familyName = face->family_name;auto postScriptName = FT_Get_Postscript_Name(face);

封装成我需要的 修改到skia源码中
\skia\src\ports\SkFontHost_FreeType_common.cpp

bool SKTypeface_freetypeHelper::getStyleNamesByFontData(sk_sp<SkData> fontData,SkTArray<SkString>& styleNames) {static bool s_firstInitFlag = true;static FT_Library lib;int error = 0;if (s_firstInitFlag) {s_firstInitFlag = false;error = FT_Init_FreeType(&lib);}if (error) {s_firstInitFlag = true;return false;}FT_Face face;error = FT_New_Memory_Face(lib, fontData->bytes(), fontData->size(), 0, &face);if (error) {return false;}for (auto i = 0; i < face->num_faces; i++) {FT_Face face;error = FT_New_Memory_Face(lib, fontData->bytes(), fontData->size(), i, &face);if (error) {continue;}if (face->style_name) {styleNames.push_back(SkString(face->style_name));}}return !styleNames.empty();
}

现在就都能正常读取了 一切都搞定了
但是有的字体人家带翻译 比如中文的字体名字,我们读到的是英文本地化做的不好啊

怎么读字体的多语言的 fontfamily 和 fontstyle?

像这个 fontCreator的截图 一个字体好几个翻译都能读到

freetype 不支持 本地语言!
人家文档都说了很清楚了

skia 支持fontfamily 的多语言

通过 LocalizedStrings* createFamilyNameIterator() const;

demo 代码

std::string xxx(sk_sp<SkTypeface> typeface)
{if (nullptr == typeface)return std::string();SkTypeface::LocalizedString localozedString;auto                        it = (typeface)->createFamilyNameIterator();while (it->next(&localozedString)) { //遍历取出 会比较多 有 en-us ,zh-cn 等等好几个 localozedString.fString.c_str(); //fontFamilylocalozedString.fLanguage.c_str(); //language//vector.pusb_back}}

skia 虽然提供了 family的多语言读取 但是 没有style的
我准备通过harfbuzz 来读,目前还在调研当中
后续补充…

harfbuzz 在windows下编译过后 写了个demo测试了下

关键的就是这个hb_ot_name_get_utf8
参数一个 是language 这个是按照 BCP 47规范表来传字符串

参数还有一个是 数字2 代表啥? hb_ot_name_id
就是你想读取字体的什么内容
你看有 copyright 有 family style fullName 等等 如下

这个搞完 跑起来英文的名字可以拿到,中文的就是读取不出来,我用第三方软件 High-Logic FontCreator
就可以解析到这个中文, 时间原因这个先不继续深研究了 搁置了… 有清楚大佬评论指点一下 多谢

通过skia/freetype 解析字体获取fontfamily fontstyle name 支持多语言翻译相关推荐

  1. CSS——字体(font-family,font-style,font-size注意要点)

    font-family--设置字体(宋体.黑体之类的) font-style--设置字体风格(也就是正常显示还是斜着显示) normal - 文本正常显示 italic - 文本斜体显示 obliqu ...

  2. FreeType解析矢量字体存在的问题以及优化技巧

    目录 一.前言 二.FreeType 存在的问题 三.针对 FreeType 存在问题的优化技巧 3.1 提高 FreeType 解析字体的精度 3.2 关闭 auto\_hint 四.总结 一.前言 ...

  3. stb_truetype解析ttf字体获取顶点信息

    简介: TTF(TrueTypeFont)是一种字库名称.TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,同时也是最常用的一种字体文件表示方式.Tru ...

  4. 用freetype开源字体库,实现在图片上字体大小

    掌握truetype字体原理,利用freetype开源字体库,实现在图片上书写一行字体大小变化的诗句(比如首字体增大). 首先,在树莓派上安装freetype: 下载好: 传输文件,并且安装好: 解压 ...

  5. java解析pdf获取pdf中内容信息

    java解析pdf获取pdf中内容信息 今日项目中需要将pdf中的数据获取到进行校验数据,于是前往百度翻来覆去找到以下几种办法,做个笔记,方便日后查询. 废话不多说,我要直接上代码装逼了 第一种 使用 ...

  6. 基于嵌入式linux的freetype矢量字体简单显示的实现

    一.freetype简介 FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能.它支持单色位图.反 ...

  7. 【CSS】CSS 文本样式 ② ( font 字体设置 | CSS 2.0手册使用 | font-weight 字体粗细设置 | font-style 字体斜体设置 | font 字体样式综合写法 )

    文章目录 一. CSS 2.0手册使用 1. 按照文档层次查找 2. 搜索关键字查找文档 二. font-weight 字体粗细设置 1. 语法简介 2. 代码示例 三. font-style 字体斜 ...

  8. python爬虫小说代码示例-Python从零开始写爬虫-4 解析HTML获取小说正文

    Python从零开始写爬虫-4 解析HTML获取小说正文 在上一节中, 我们已经学会如何获取小说的目录, 这一节我们将学习如何通过正则表达式(在第二节学习过)来获取小说正文. 首先, 先随便选择一个章 ...

  9. android json 解析图片,JSON解析并获取android中的图像

    我想解析包含字符串和图像的JSON对象.我的代码正在工作,但它加载图像太慢.我想加载另一个asynctask或服务的图像,以减少加载时间.我怎样才能做到这一点?哪一个是最好的方法使用asynctask ...

最新文章

  1. Flutter开发之Debug调试(十)
  2. avformat_alloc_output_context2 -22错误
  3. 【深度学习】医学图像分割多标签损失函数和极坐标变换
  4. unity2019,打包APK时的gradle错误问题
  5. C#LeetCode刷题之#653-两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)
  6. 使用Eclipse切换TFS工作区
  7. 有多少漏洞都会重来:从ElasticSearch到MongoDB和Redis
  8. oracle 多路径 SAN,前言 - Oracle Solaris 管理:SAN 配置和多路径
  9. FastSocket学习笔记~再说客户端与服务端的组成
  10. 再也不用手写爬虫了!推荐5款自动爬取数据的神器!
  11. android 自定义控件viewgroup,Android 之 自定义控件 之 ViewGroup
  12. Cloudera Manager API使用(附代码)
  13. java获取当天是周几
  14. mysql系列之复制2----主从同步部署
  15. C语言输入学生成绩算平均值
  16. Java Security:Java加密框架(JCA)简要说明
  17. 【KG】TransE 及其实现
  18. RT-Thread 嵌入式人工智能教学在线研讨会,就在本周六!
  19. 文本挖掘----基于OCR的文档关键字提取
  20. 新手必学的几个视频剪辑技巧

热门文章

  1. Web Uploader学习及使用
  2. PMP之十五矩阵术语概念总结
  3. DJSF1352RN直流电能表在某新加坡光伏储能系统中的应用
  4. Android POI 百度地图——周边检索
  5. 清新黑板手绘PPT模板
  6. 【生成模型】DDPM概率扩散模型(原理+代码)
  7. python zip暴力破解
  8. C#如何正确的释放资源
  9. linux系统中的基础监控(硬盘,内存,系统负载,CPU,网络等)
  10. 使用Veritas Volume Replicator(VVR)对Oracle数据库进行容灾