SOUI4里使用字体回退

在新版本的SOUI里render-skia导出了一个新的函数用于字体回退功能。Render_Skia_SetFontFallback

函数原型如下:

EXTERN_C void SOUI_COM_API Render_Skia_SetFontFallback(FontFallback fontFallback);

因为我的工程是使用动态库,这里可以直接获取到这个导出函数来实现字体回退功能。

这里使用一个粗制实现显示藏文的功能

#include <interface/SRender-i.h>
#include <usp10.h>
#include <map>
#pragma comment(lib, "usp10.lib")typedef void (*Render_Skia_SetFontFallback)(FontFallback);class SFontFallback {public:static std::map<wchar_t, std::string> m_FontFallbackList;static HDC fDDC;public:static BOOL FontFallback(LPCSTR u8FontName, wchar_t text, char u8FontNameFallback[100], int *charset){auto ite = m_FontFallbackList.find(text);if (ite != m_FontFallbackList.end()){strcpy_s(u8FontNameFallback, 100, ite->second.c_str());}if (!fDDC){return FALSE;}// Use uniscribe to detemine glyph index for non-BMP characters.static const int numWCHAR = 2;static const int maxItems = 20;// MSDN states that this can be NULL, but some things don't work then.SCRIPT_CONTROL sc = { 0 };// Add extra item to SCRIPT_ITEM to work around a bug (now documented).// https://bugzilla.mozilla.org/show_bug.cgi?id=366643SCRIPT_ITEM si[maxItems + 1];int numItems;if (S_OK != ScriptItemize(&text, numWCHAR, maxItems, &sc, NULL, si, &numItems)){return FALSE;}// Sometimes ScriptShape cannot find a glyph for a non-BMP and returns 2 space glyphs.static const int maxGlyphs = 20;SCRIPT_VISATTR vsa[maxGlyphs];WORD outGlyphs[maxGlyphs];WORD logClust[maxGlyphs];int numGlyphs=0;HFONT fFont = ::CreateFont(0, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"Microsoft Himalaya");if (!fFont){return FALSE;}SelectObject(fDDC, fFont);SCRIPT_CACHE fSC=NULL;if (0 == ScriptShape(fDDC, &fSC, &text, numWCHAR, maxGlyphs, &si[0].a, outGlyphs, logClust, vsa, &numGlyphs)){if (fSC){::ScriptFreeCache(&fSC);}DeleteObject(fFont);m_FontFallbackList[text] = "Microsoft Himalaya";strcpy_s(u8FontNameFallback, 100, "Microsoft Himalaya");return TRUE;}if (fSC){::ScriptFreeCache(&fSC);}DeleteObject(fFont);return FALSE;}SFontFallback(){       HMODULE _hMod=NULL;
#ifdef _DEBUG_hMod = GetModuleHandle(L"render-skiad.dll");
#else_hMod = GetModuleHandle(L"render-skia.dll");
#endif // _DEBUGif (!_hMod)return;Render_Skia_SetFontFallback pRender_Skia_SetFontFallback = (Render_Skia_SetFontFallback)GetProcAddress(_hMod, "Render_Skia_SetFontFallback");if (!pRender_Skia_SetFontFallback){return;}pRender_Skia_SetFontFallback(FontFallback); fDDC = ::CreateCompatibleDC(NULL);       }~SFontFallback(){::DeleteDC(fDDC);       }
};HDC SFontFallback::fDDC = NULL;
std::map<wchar_t, std::string> SFontFallback::m_FontFallbackList;

然后在合适的地方定义一个SFontFallback nonameFontFallback;即可实现显示藏文功能。使用效果如下图

使用前后对比图(CSDN上传自动加了水印,但是仔细看还是可以看到效果的,不使用回退将显示方框,使用后正确显示)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用微信小程序实现远程控制4路控制器/断路器

如何用微信小程序实现远程控制4路控制器/断路器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制4路控制器/断路器&#xff0c;支持4路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xf…

内容与图像一对多问题解决

场景复现 分析&#xff1a; 其实这是两给表&#xff0c;一个内容表&#xff0c;一个图片表&#xff0c;一对多的关系。 解决思路: 1. 先上传图片拿到图片的List集合ids&#xff0c;返回值是集合的ids&#xff0c;给到前端 2. 再添加内容表的数据生成了id&#xff0c;遍历查…

佳博打印机如何设置打印模式为热敏模式

1、打开电脑搜索框&#xff0c;如下图输入打印机: 2、点击打印机设置&#xff0c;如下图&#xff1a; 3、点击打印机首选项&#xff0c;如下图&#xff1a; 4、点击下图“卷”进行设置 也可对打印机间距高度进行调整

【深度学习】探秘PSD:合成到真实去雾框架的实例解析

揭秘PSD&#xff1a;合成到真实去雾框架的革新 一、PSD框架的提出背景二、PSD框架的原理与网络结构三、PSD框架的实现与代码示例四、结论与展望 在图像处理领域&#xff0c;去雾技术一直是一个备受关注的研究热点。然而&#xff0c;传统的去雾方法在面对真实世界的模糊图像时&a…

腐烂的橘子

代码实现&#xff1a; int orangesRotting(int **grid, int gridRowSize, int *gridColSizes) {int good 0, bad 0, t 0;for (int i 0; i < gridRowSize; i) {for (int j 0; j < gridColSizes[0]; j) {if (grid[i][j] 1) { // 记录好橘子数good;} else if (grid[i…

ABB机器人程序类型介绍

ABB机器人编程语言为rapid语言&#xff0c;在例行程序中可分为三类&#xff1a;普通程序、功能程序和中断程序。例如新建一个例行程序&#xff0c;会选择一个程序类型&#xff0c;三种类型的区别如下&#xff1a; 1、普通程序&#xff08;procedures&#xff09;&#xff1a;常…

代码大师的工具箱:现代软件开发利器

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Ubuntu 超级终端Terminator常用使用技巧

Ubuntu 超级终端Terminator常用使用技巧 Terminator 是一款功能强大的终端模拟器&#xff0c;它特别适合于需要同时管理多个终端会话的用户。以下是如何在 Ubuntu 上使用 Terminator 的详细指南&#xff1a; 安装 Terminator 如果你的系统尚未安装 Terminator&#xff0c;你…

anaconda 环境配置

官方网站下载地址&#xff1a; https://www.anaconda.com/download/ 国内清华镜像下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 配置国内环境: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ …

人工智能生成图像的兴起:区分事实与虚构

人工智能生成图像的兴起&#xff1a;区分事实与虚构 概述 在人工智能 (AI) 已融入我们日常生活的时代&#xff0c;人工智能生成图像的快速发展引发了人们对数字内容真实性的担忧。最近&#xff0c;人工智能生成的图像甚至欺骗了最敏锐的眼睛&#xff0c;这引发了人们对批判性…

什么是抽样调查

抽样调查是政府统计工作和市场调查中普遍采用的方法&#xff0c;我国《统计法》中明确规定&#xff1a;搜集、整理统计资料&#xff0c;应当以周期性普查为基础&#xff0c;以经常性抽样调查为主体&#xff0c;综合运用全面调查、重点调查等方法&#xff0c;并充分利用行政记录…

黑盒测试中的边界值分析

黑盒测试是一种基于需求和规格的测试方法&#xff0c;它主要关注软件系统输出的正确性和完整性&#xff0c;而不考虑内部代码的实现方式。在黑盒测试中&#xff0c;边界值分析是一种重要的测试技术&#xff0c;它可以帮助测试人员有效地发现输入和输出的问题。本文将从什么是边…

探索未知:风靡硅谷开发者的 Unstructured Data Meetup 即将登陆中国

“最硅谷”的 Unstructured Data Meetup 即将来袭&#xff01; 众所周知&#xff0c;AI 三要素包括&#xff1a;算力、算法和数据。数据的价值愈发凸显&#xff0c;而其中非结构化数据更是备受关注。IDC 预测&#xff0c;到 2025 年&#xff0c;全球数据总量中将有超过 80% 的数…

基于SSM的宠物领养系统的设计与实现

摘要 在当前社会&#xff0c;随着人们生活水平的提高&#xff0c;越来越多的家庭和个人开始养宠物。然而&#xff0c;由于各种原因&#xff0c;一些宠物被遗弃或需要救助&#xff0c;同时也有许多潜在的宠物领养者希望通过正规途径领养宠物。本次设计为宠物救助组织、寻找新家…

蓝桥杯2024【第十五届省赛】Python B (78分题解)

第三年蓝球杯&#xff0c;感觉题目比往年简单多了。题量合适够我这种菜鸟解答... ... 大概可能有45分&#xff0c;希望进省一大三最后i一次机会了55555 进省一了耶耶耶 试题 A: 穿越时空之门&#xff08;满分&#xff09; 本题总分&#xff1a;5 分 【问题描述】 随着 202…

Python深度学习基于Tensorflow(7)视觉处理基础

文章目录 视觉基础图像基础卷积层&#xff1a;图像的中全连接层的优化卷积核tf.keras中的卷积函数池化层 现代经典网络DenseNet 数据增强 图像的本质是一个矩阵&#xff0c; 矩阵中的一个点就是一个像素&#xff0c;如果像素大小为 1000 1000 1000 \times 1000 10001000&…

Scala、Spark SQL 常用方法

目录 数组常用方法 列表操作常用方法 Scala中常用的查看列表元素的方法有head、init、last、tail和take()。 合并两个列表还可以使用concat()方法。 集合操作常用方法 map()方法 foreach()方法 filter()方法 flatten()方法 groupBy()方法 ​编辑 从内存中读取数据创建…

二叉树之左叶子的和

题目&#xff1a; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root […

时间瑾眼中的IT行业现状与未来趋势

文章目录 技术革新与行业应用IT行业的人才培养与教育人工智能与机器学习的演进数据安全与隐私保护可持续发展与绿色技术社会责任与道德规范 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链…

朋友在阿里测试岗当HR,给我整理的面试题文档

以下是软件测试相关的面试题及答案&#xff0c;欢迎大家参考! 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&…