完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转stemwin教程
本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体的缺点就是不适合用在小型嵌入式系统中,极其消耗内存。 22. 1 XBF格式字体生成方法 22. 2 移植到开发板显示 22. 3 总结 22.1 矢量字体介绍 下面的内容来自百度百科和wiki百科(两个内容居然一模一样),讲的非常好,特此转载过来。 目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是与平台无关的。 Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标准是基于PostScript Description Language(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。 TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。 Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说 Type1比TrueType要小10%左右。这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。由于现代大部分打印机都是使用PDL作为打印描述语言,所以Type1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。 这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。 |
|
相关推荐
|
|
第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。Windows家族只有OS/2和windows 2000及之后的版本从操作系统级别开始支持Type1。由于这个问题,Adobe只好在其所有的产品中嵌入Adobe Type Manager(ATM)作为渲染引擎。
OpenType则是Type1与TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是Adobe、Microsoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows 2000开始,正式支持OpenType。打开系统的字体目录(一般是C:WindowsFonts或C:WinntFonts),可以看到:一个红色A的图标的是点阵字体,两个重叠的T的图标是TrueType字体,一个O的图标就是OpenType字体。 矢量字体扩展名ttf。点阵字体的扩展名是fon. 下面是XP系统中字体的部分截图: |
|
|
|
|
|
22.2 STemWin对矢量字体的支持
TrueType为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType字体基于矢量图形。矢量表示的优势在于无损的可扩展性。这意味着,每个字符在绘制前需要光栅化为位图。为避免每次绘制字符时都进行光栅化,通常用字体引擎缓存位图数据。这要求CPU速度快、RAM足够。发货时不含emWin TTF包。该项内容可在www.segger.com/link/emwin_freetype.zip下免费获得。 emWin对TTF支持的实施基于来自David Turner、Robert Wilhelm和Werner Lembergr的FreeType字体库,该库可在www.freetype.org下免费获得。emWin对该库的使用符合GUITrueTypeFTL. txt下的FreeType许可。emWin对该库进行了少许改编,添加了带有GUI函数的 “粘贴”层。 TrueType矢量字体的硬件要求如下:
|
|
|
|
|
|
这个DEMO程序的代码如下:
复制代码 #ifndef SKIP_TEST #include #include #include "GUI.h" /********************************************************************* * * Static data * ********************************************************************** */ static unsigned _aHeight [] = {16, 20, 32, 48}; // Array of heights used to show text static GUI_TTF_CS _aCS [GUI_COUNTOF(_aHeight)]; // Each GUI font needs its own GUI_TTF_CS structure static GUI_FONT _aFont [GUI_COUNTOF(_aHeight)]; // Array of GUI fonts static char _acFamily [200]; static char _acStyle [200]; /********************************************************************* * * Static code * ********************************************************************** */ /********************************************************************* * * _ShowText */ static void _ShowText(void) {(1) int i; GUI_Clear(); i = 0; GUI_TTF_GetFamilyName(&_aFont[i], _acFamily, sizeof(_acFamily));(2) GUI_TTF_GetStyleName(&_aFont[i], _acStyle, sizeof(_acStyle)); GUI_SetFont(&GUI_Font20_1); GUI_DispString(_acFamily); GUI_DispString(", "); GUI_DispString(_acStyle); GUI_DispNextLine(); GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff); GUI_SetFont(&_aFont[i]); GUI_DispString("abcdefghijklmnopqrstuvwxyzn"); GUI_DispString("ABCDEFGHIJKLMNOPQRSTUVWXYZn"); GUI_DispString("123456789.:,;(:*!?')n"); GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff); for (i = 0; i < GUI_COUNTOF(_aHeight); i++) { GUI_SetFont(&_aFont[i]); GUI_DispString("The quick brown fox jumps over the lazy dog. 1234567890n"); } GUI_Delay(1000); } /********************************************************************* * * _CreateFonts */ static int _CreateFonts(const U8 * pData, U32 NumBytes) {(3) int i; GUI_TTF_DATA TTF_Data; // Only one GUI_TTF_DATA structure is used per font face TTF_Data.pData = pData; // Set pointer to file data TTF_Data.NumBytes = NumBytes; // Set size of file for (i = 0; i < GUI_COUNTOF(_aHeight); i++) { // // Initialize GUI_TTF_CS members // _aCS[i].PixelHeight = _aHeight[i]; _aCS[i].pTTF = &TTF_Data; // // Create GUI font // if (GUI_TTF_CreateFont(&_aFont[i], &_aCS[i])) {(4) return 1; } } return 0; } /********************************************************************* * * _cbFontDemo * * Function description * The function uses the given pointer to a true type font for creating * a couple of GUI fonts and showing the outline of the TTF font. * * Parameters: * pData - Location of font file * NumBytes - Size of font file */ static void _cbFontDemo(const U8 * pData, U32 NumBytes) {(5) _CreateFonts(pData, NumBytes); // Create fonts _ShowText(); // Show some text GUI_TTF_DestroyCache(); // Clear the TTF cache } /********************************************************************* * * _IterateOverAllFiles * * Function description * The function iterates over all files of the given folder and the * given mask, reads the contents of the file and calls the function * pfDoSomething() with location and size of file data. * Can be used under Win32 environment only. */ static void _IterateOverAllFiles(const char * sFolder, const char * sMask, void (* pfDoSomething)(const U8 * pData, U32 NumBytes)) {(6) GUI_RECT Rect = {0, 10, 1000, 1000}; char acMask[_MAX_PATH]; char acFile[_MAX_PATH]; WIN32_FIND_DATA Context; HANDLE hFind; HANDLE hFile; U8 * pData; DWORD NumBytes; DWORD NumBytesRead; sprintf(acMask, "%s\%s", sFolder, sMask); hFind = FindFirstFile(acMask, &Context); if (hFind != INVALID_HANDLE_VALUE) { do { sprintf(acFile, "%s\%s", sFolder, Context.cFileName); hFile = CreateFile(acFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile != INVALID_HANDLE_VALUE) { NumBytes = GetFileSize(hFile, NULL); pData = (U8 *)malloc(NumBytes); ReadFile(hFile, pData, NumBytes, &NumBytesRead, NULL); pfDoSomething(pData, NumBytes); free(pData); } CloseHandle(hFile); } while (FindNextFile(hFind, &Context)); } } /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * MainTask */ void MainTask(void) { char acPath[200]; GUI_Init(); // // Set colors and text mode // GUI_SetBkColor(GUI_WHITE); GUI_SetColor(GUI_BLACK); GUI_SetTextMode(GUI_TM_TRANS); // // Get windows system directory and extend it with 'Font'(7) // GetWindowsDirectory(acPath, sizeof(acPath)); strcat(acPath, "\Fonts"); // // Iterate over files and call _cbFontDemo for each file // while (1) { _IterateOverAllFiles(acPath, "*.ttf", _cbFontDemo); } } #endif |
|
|
|
|
|
1. 这个函数用于文本显示。
2. 函数:GUI_TTF_GetFamilyName 将返回字体文件中定义的字体系列名称 函数:GUI_TTF_GetStyleName 此函数将返回字体文件中定义的样式名称 (粗体、常规等) 3. 用于字体的创建,注意字体的创建方法 4. 用于实现字体创建的函数,函数中两个成员介绍如下: GUI_TTF_CS
GUI_TTF_DATA
5. 字体演示主要运行的程序。注意函数GUI_TTF_DestroyCache 用于释放TTF缓存系统分配的所有内存并解除该缓存。 |
||
|
||
|
||
6. 通过这个程序实现电脑系统中矢量字体的轮番显示。
7. 获取电脑系统中字体存储的路径。 实际显示效果如下(这里只贴了一个截图) |
|
|
|
|
|
22.4 移植到开发板上显示
22.4.1 第一步:从官网下载矢量库 下载地址:www.segger.com/link/emwin_freetype.zip 22.4.2 第二步:添加到emWin工程中(MDK) 添加上后需要再添加相应的工程路径: |
|
|
|
|
|
22.4.3 第三步:修改Heap的大小
由于要使用非emWin自带的molloc和free函数,下面是修改的位置和大小: 这个地方一定得大点,要不字体无法显示。 |
|
|
|
|
|
22.4.4 第四步:主程序
复制代码 /* ********************************************************************************************************* * 函 数 名: MainTask * 功能说明: GUI主函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void MainTask(void) { OS_ERR err; char *_acBuffer; GUI_TTF_CS Cs0, Cs1, Cs2, Cs3; GUI_TTF_DATA Data; GUI_FONT Font0, Font1, Font2, Font3; GUI_HMEM hMem; GUI_Init(); GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_RED); /* 申请一块内存空间 并且将其清零 */ (1) hMem = GUI_ALLOC_AllocZero(1024*1500); /* 将申请到内存的句柄转换成指针类型 */ _acBuffer = GUI_ALLOC_h2p(hMem); /* 打开文件 */ OSSchedLock(&err); result = f_open(&file, "seg.ttf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); (2) result = f_read(&file, _acBuffer, file.fsize, &bw); OSSchedUnlock(&err); /* Set parameters for accessing the font file */ Data.pData = _acBuffer; /* Address */ Data.NumBytes = file.fsize; /* Size */ /* Set creation parameters of first font */ Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs0.PixelHeight = 24; /* Pixel height */(3) Cs0.FaceIndex = 0; /* Initialize to 0 */ /* Set creation parameters of second font */ Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs1.PixelHeight = 48; /* Pixel height */ Cs1.FaceIndex = 0; /* Initialize to 0 */ /* Set creation parameters of first font */ Cs2.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs2.PixelHeight = 96; /* Pixel height */ Cs2.FaceIndex = 0; /* Initialize to 0 */ /* Set creation parameters of second font */ Cs3.pTTF = &Data; /* Use address of GUI_TTF_DATA */ Cs3.PixelHeight = 144; /* Pixel height */ Cs3.FaceIndex = 0; /* Initialize to 0 */ /* Create 4 fonts */ GUI_TTF_CreateFont(&Font0, &Cs0);(4) GUI_TTF_CreateFont(&Font1, &Cs1); GUI_TTF_CreateFont(&Font2, &Cs2); GUI_TTF_CreateFont(&Font3, &Cs3); /* Draw something using the fonts */ GUI_SetFont(&Font0); GUI_DispStringAt("ABC1234", 0, 0); GUI_SetFont(&Font1); GUI_DispStringAt("ABC1234", 0, 24); GUI_SetFont(&Font2); GUI_DispStringAt("ABC1234", 0, 24+48); GUI_SetFont(&Font3); GUI_DispStringAt("ABC1234", 0, 24+48+96); GUI_DispStringAt("ARMFLY", 0, 24+48+96+144); while(1) { GUI_Delay(100); } } 1. 申请动态内存用于加载字库。 2. 将矢量字体从SD卡中加载到外接SRAM中。 3. 设置矢量字体点阵大小。 4. 创建四种大小的矢量字体。 |
|
|
|
|
|
22.4.5 第五步:矢量字体放到SD卡中
由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。 放到SD卡后,在屏上的实际显示效果如下: 特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。 |
|
|
|
|
|
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
515 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
515 浏览 0 评论
780 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1360 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
572 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11756 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 20:45 , Processed in 0.857482 second(s), Total 90, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号