parse.h#ifndef FONT_SUBSET_EXPORT_H #define FONT_SUBSET_EXPORT_H #ifndef FONT_SUBSET_API # ifdef FONT_SUBSET_LIBRATY # ifdef _MSC_VER # if defined FONT_SUBSET_LIBRATY # define FONT_SUBSET_API __declspec(dllexport) # else # define FONT_SUBSET_API __declspec(dllimport) # endif # else # define FONT_SUBSET_API __attribute__((visibility(default))) # endif # else # define FONT_SUBSET_API # endif #endif struct FontTTCByteData{ unsigned char *buffer nullptr; unsigned int length 0; }; struct FontSubSetByteDatas { struct One{ unsigned char *buffer nullptr; unsigned int length 0; char* familyName nullptr; unsigned int nameLength 0; } *subsets; unsigned int size 0; }; FONT_SUBSET_API FontSubSetByteDatas createSubsetFonts(FontTTCByteData ttcSteam); FONT_SUBSET_API FontSubSetByteDatas createSubsetFonts(const char* path); FONT_SUBSET_API void releaseSubsetFonts(FontSubSetByteDatas datas); FONT_SUBSET_API bool isTTC(FontTTCByteData ttcSteam); #endif // FONT_SUBSET_EXPORT_Hparse.cpp#include sfntly/data/memory_byte_array.h #include sfntly/font_factory.h #include sfntly/port/file_input_stream.h #include sfntly/port/memory_output_stream.h #include sfntly/table/core/name_table.h #include sfntly/tag.h #include iostream #include unicode/ustring.h #include parseTTC.h #include sfntly/port/memory_input_stream.h FONT_SUBSET_API FontSubSetByteDatas createSubsetFonts(sfntly::InputStream* inputStream) { using namespace sfntly; FontFactoryPtr factory; factory.Attach(FontFactory::GetInstance()); // File based FontBuilderArray font_builder_array; factory-LoadFontsForBuilding(inputStream, font_builder_array); // 创建输出流数组 FontSubSetByteDatas fontSubSetByteDatas; fontSubSetByteDatas.subsets new FontSubSetByteDatas::One[font_builder_array.size()]; fontSubSetByteDatas.size font_builder_array.size(); for (int index 0; index fontSubSetByteDatas.size; index) { const auto font_builder font_builder_array.at(index); NameTableBuilderPtr name_builder down_castNameTable::Builder*( font_builder-GetTableBuilder(Tag::name)); // // Change the font name. // auto findName name_builder-Has(PlatformId::kWindows, // WindowsEncodingId::kUnicodeUCS2, // WindowsLanguageId::kEnglish_UnitedStates, // NameId::kFontFamilyName); NameEntryBuilderPtr neb name_builder-NameBuilder(PlatformId::kWindows, WindowsEncodingId::kUnicodeUCS2, WindowsLanguageId::kEnglish_UnitedStates, NameId::kFontFamilyName); UChar* name neb-name_entry()-Name(); // U_STRING_DECL(new_name, Timothy, 7); // neb-SetName(new_name); // Build the font. FontPtr font; font.Attach(font_builder-Build()); // auto digest font-digest(); // Serialize and reload the serialized font. MemoryOutputStream os; factory-SerializeFont(font, os); // ByteArrayPtr new_ba new MemoryByteArray(os.Get(), os.Size()); auto fileStream new unsigned char[os.Size()]; std::copy(os.Get(), os.Get() os.Size(), fileStream); int32_t nameLen u_strlen(name); auto asciiName new char[nameLen * 2]; u_austrncpy(asciiName, name, nameLen 1); // auto copyChar u_austrncpy(asciiName, name, nameLen 1); // auto asciiNameLen strlen(copyChar); // asciiName[asciiNameLen 1] \0; fontSubSetByteDatas.subsets[index].familyName asciiName; fontSubSetByteDatas.subsets[index].nameLength strnlen_s(asciiName, nameLen * 2); fontSubSetByteDatas.subsets[index].buffer fileStream; fontSubSetByteDatas.subsets[index].length os.Size(); delete[] name; } return fontSubSetByteDatas; } FONT_SUBSET_API FontSubSetByteDatas createSubsetFonts(const char* path) { using namespace sfntly; sfntly::FileInputStream is; if(!is.Open(path)) { std::cout path file open is fail std::endl; return {}; } std::shared_ptrvoid finally(nullptr, [is](...) { is.Close(); }); return createSubsetFonts(is); } FONT_SUBSET_API FontSubSetByteDatas createSubsetFonts(FontTTCByteData ttcSteam) { using namespace sfntly; sfntly::MemoryInputStream memoryInputStream; memoryInputStream.Attach(ttcSteam.buffer, ttcSteam.length); return createSubsetFonts(memoryInputStream); } FONT_SUBSET_API void releaseSubsetFonts(FontSubSetByteDatas datas) { for (int i 0; i datas.size; i) { delete[] datas.subsets[i].buffer; delete[] datas.subsets[i].familyName; } delete[] datas.subsets; } FONT_SUBSET_API bool isTTC(FontTTCByteData ttcSteam) { using namespace sfntly; sfntly::MemoryInputStream memoryInputStream; memoryInputStream.Attach(ttcSteam.buffer, ttcSteam.length); std::vectoruint8_t tag(4); memoryInputStream.Read(tag); memoryInputStream.Unread(tag); return Tag::ttcf GenerateTag(tag[0], tag[1], tag[2], tag[3]); } FONT_SUBSET_API std::string getFontFormat(FontTTCByteData ttcSteam) { using namespace sfntly; sfntly::MemoryInputStream memoryInputStream; memoryInputStream.Attach(ttcSteam.buffer, ttcSteam.length); std::vectoruint8_t tag(4, 0); memoryInputStream.Read(tag); memoryInputStream.Unread(tag); auto format GenerateTag(tag[0], tag[1], tag[2], tag[3]); if(0x00010000 format) return ttf; if(0x4f54544f format) return otf; return std::string((char*)tag[0], 4); }main.cpp#include parse.h #include iostream #include fstream int main() { const char* path C:\\Users\\Downloads\\msyh.ttc; auto fontDatas createSubsetFonts(path); if(0 fontDatas.size) { std::cout path parse fail! std::endl; return 1; } for (int i 0; i fontDatas.size; i) { // write file std::ofstream outFile((const char*)fontDatas.subsets[i].familyName, std::ios::binary); if (!outFile) { // error continue; } outFile.write(reinterpret_castconst char*(fontDatas.subsets[i].buffer), fontDatas.subsets[i].length * sizeof(uint8_t)); outFile.close(); } releaseSubsetFonts(fontDatas); return 0; }参考https://github.com/googlei18n/sfntlyhttps://pkg.go.dev/golang.org/x/image/font/sfnt#CollectionC字体库开发之字体列表十一-CSDN博客创作不易小小的支持一下吧
企业数字化 ERP 产品动态
相关推荐
输入网址后发生了什么:从HTTPS请求到页面绘制 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 10:45:42
【12】火焰烟雾数据集(有v5/v8模型)/YOLO火焰烟雾检测 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 10:45:42
【9】工程车辆数据集(有v5/v8模型)/YOLO工程车辆检测 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 10:45:42
Wan2GP 安装完整指南:6GB 显存也能跑视频生成,附高频踩坑绕法 Wan2GP 安装完整指南:6GB 显存也能跑视频生成,附高频踩坑绕法 【免费下载链接】WanGP A fast AI Video Generator for the GPU Poor. Supports Minimax H3, LTX-2.3/2.5, Wan 2.1/2.2, Qwen Image 1/2, Krea 2, Hunyuan Video, LTX Video and Flux. 项… · 2026/11/5 9:57:30
一条命令装进 DeepSeek Harness:dsh-market 插件市场的四个真实场景 一条命令装进 DeepSeek Harness:dsh-market 插件市场的四个真实场景 【免费下载链接】dsh-market The plugin market inside DeepSeek Harness — browse, search, one-click install DSH 可视化插件市场 项目地址: https://gitcode.com/gh_mirrors/ds/dsh-marke… · 2026/11/5 9:57:30
提升PR效率10倍:CodiumAI PR-Agent代码建议功能深度剖析 提升PR效率10倍:CodiumAI PR-Agent代码建议功能深度剖析 【免费下载链接】pr-agent 🚀 PR Agent: The Original Open-Source PR Reviewer. This project is not the Qodo free tier. 项目地址: https://gitcode.com/GitHub_Trending/pr/pr-agent
… · 2026/11/5 9:48:28
【亲测免费】 Distil-Whisper: distil-large-v2的安装与使用教程 Distil-Whisper: distil-large-v2的安装与使用教程 【免费下载链接】distil-large-v2 项目地址: https://ai.gitcode.com/hf_mirrors/distil-whisper/distil-large-v2
引言
随着语音识别技术在各个领域的广泛应用,高效、准确的语音识别模型成为了研究人员和… · 2026/11/5 9:46:26
10款开源Android游戏完整指南:从离线解谜到Roguelike地牢,按上手成本一次选齐 10款开源Android游戏完整指南:从离线解谜到Roguelike地牢,按上手成本一次选齐 【免费下载链接】open-source-android-apps Open-Source Android Apps 项目地址: https://gitcode.com/gh_mirrors/op/open-source-android-apps
本清单收录10款可装进… · 2026/11/5 9:46:26
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38