GUI原理4 - 矢量字体
GUI汉字显示原理

GUI汉字显示原理1、在UCGUI中有两种类型字体, 一种是等宽字体(Monospaced Font),即字体当中所有字都是同一宽度,它在UCGUI中的相应结构体是GUI_FONT_MONO, 一种是均衡字体(Proportional font), 这种字体中的字都有自己独立的宽度, 字体内的每个字都可以有不同宽度, 它在UCGUI中的相应结构体是GUI_FONT_PROP, 对于等宽字体, 一般都是将所有字的点阵存放在一个数组中, 因为每个字都宽度相同. 对于均衡字体, 则要单独用数组来定义每个字符的点阵, 然后将每一个字符的宽高及点阵存为一个数组即字符信息(ucgui中对应结体为GUI_CHARINFO), 所有字符信息再存到一个数组当即称为字符集, 它包含每个字的字符信息(点阵高宽及一行占几个字节), 所谓一行占几个字节, 是指这个字体的点阵每一行有多少个字节, 它与宽度高度单位不同, 宽度高度的单位是象素数.2.另外特别指出的是, 在等宽字体中不仅所有字符宽度相同,高宽也是相等的; 对于均衡字体, 不仅可以宽度不同, 高度也可以不同, 每一行有多少个字节自然也不同, 在均衡字体中每一个字符都单独定义之后才组成字体的字符集.3.字符集的问题, 在UCGUI中每种字体含的字符集不同, 这个可以参看UCGUI手册中的"Standard Font"一章,这一章中对于字符集有如下描述:ASCII: Only ASCII characters 0x20-0x7E (0x7F).[仅包含0x20-0x7E这个范围内的ansii字符]1: ASCII characters and European extensions 0xA0 - 0xFF.[除0x20-0x7E这个范围内的ansii字符, 还有0xA0 - 0xFF这个范围内的欧洲字符集, 这里要指出美国英语只用到0x20-0x7E, 它只考虑了自己的须求, 没有考虑其它国家的须求, 在欧洲是有拉丁字符的, 所以欧洲国家扩展了剩余的0xA0 - 0xFF这个范围内的来表示欧洲的字符集, 其实我们国家的汉字也是在这个范围内扩展的, 不过我们用的是二个字节来表示一个汉字, 是因为汉字太多, 这区区94个值无法满足汉字的须求, 94*94就差不多了. 汉字用到的第一个值为0xb0a1(啊), 最后一个为0xf7fe(齄), 在机内码1当中只用到a1+15~a0+86这个范围的, 关于机内码是这个意思: 对于"啊"字模,机内码:(0xb0,0xa1), 0xb0为"啊"字的机内码1,0xa1为机内码2. 对于机内码2合使用是0xa1~0xff这个范围内的所有值, 关于机内码及汉字显示的原理及汉字库的构成, 本论坛中有专门的一篇文章介绍--"ucgui中处理汉字显示的说明", 请查看此贴, 这里不多说了, 所以范围是这样确定的.]HK: Hiragana and Katakana[日文平假名与片假名].1HK: ASCII, European extensions, Hiragana and Katakana[ansii,欧洲字符集,日文平假与片假].D: Digit fonts[数字及运算符号集].以上的ASCII/1/HK/1Hk/D都是字符集的简单代号.3. 回过头来再看你的GUI_Font__21_Prop2,GUI_Font__21_Prop1. 那么很容易理解,GUI_Font__21_Prop2是欧洲字符集, 范围当然是0xa0-0xff. GUI_Font__21_Prop1中存的是ASCII字符集. 至于GUI_Font__21_CharInfo中则存的是全部的字符集的点阵信息, 包含所有字符信息. 最后, 将字体中包含的所有字符集用链表连接起来. 再将这个链表头指针存到字体结构(GUI_FONT)中的存放均衡字体的指针(const GUI_FONT_PROP* pProp)当中, 这样在处理字符的显示, 可以在这链表中查找所要显示的字符是在哪一个字符集中, 从而找到它的字符信息(即点阵数据及宽高).typedef struct {GUI_DISPCHAR* pfDispChar;GUI_GETCHARDISTX* pfGetCharDistX;GUI_GETFONTINFO* pfGetFontInfo;GUI_ISINFONT* pfIsInFont;tGUI_ENC_APIList* pafEncode;U8 YSize;U8 YDist;U8 XMag;U8 YMag;union {//此联合处存放均衡或是待宽字符集信息...void *pFontData;const GUI_FONT_MONO* pMono;const GUI_FONT_PROP* pProp;} p;U8 Baseline;} GUI_FONT;在GUI_Font__21_Prop1中的(void GUI_FLASH *)&GUI_Font__21_Prop2/* pointer to next GUI_FONT_PROP */在GUI_Font__21_Prop2中的(void GUI_FLASH *)&GUI_Font__21_Prop3/* pointer to next GUI_FONT_PROP */在GUI_FONT_MONO当中的成员next就是指向一下字符集的...这个链表是人工写成的.....链表最后一个成员的next指向空....这个链表的构造, 其实还是为了使用, 所以要理解它, 就要理解是如何用的.均衡字体的显示, 是在GUIPROPAA_DispChar这个函数中处理的, 要理解链表的构造就要理解这个函数,下面做简要的分析....void GUIPROPAA_DispChar(U16P c) {int BytesPerLine;GUI_DRAWMODE DrawMode = GUI_Context.TextMode;const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);if (pProp) {GUI_DRAWMODE OldDrawMode;const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First);BytesPerLine = pCharInfo->BytesPerLine;OldDrawMode = LCD_SetDrawMode(DrawMode);Draw ( GUI_Context.DispPosX, GUI_Context.DispPosY,(pCharInfo->XSize+1)/2,GUI_Context.pAFont->YSize,BytesPerLine,(U8 const*) pCharInfo->pData);LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */ GUI_Context.DispPosX += (pCharInfo->XDist+1)/2;}}而理解GUIPROPAA_DispChar的重点, 就是要理解它当中调用的用来寻找要显示的字符的字符信息的函数GUIPROP_FindChar, GUIPROP_FindChar主要是寻找字符所在的字符集(其实这个字符集在汉字应用当中,有些不同.在hzk12.c中, 作者是将汉字接区来分集的, 下面我们以hzk12.c 中的构造来讲解字符集链表:hzk12.c 中共分成(0xa1a1~0xa1fe),(0xa2a1~0xa2fe)...(0xf7a1~0xf7fe)共分成86个字集, 另外加上(0x0020, 0x007f)这个ANSCII字符集, hzk12.c中的链表中就其有87个字符集, 这里的字符集的意义就不再是一个标准的字符集了, 而只能称之为字符的集合而已, 没有严格意义上的字符集的意思).hzk12.c中, 字符集链表构成为: 字符集链表第一个元素为ascii字符集,第二个为机内码处于(0xa1a1~0xa1fe)间的汉字集, 最后一个为(0xf7a1,0xf7fe)....了解了汉字库的这个字符集链表的构成, 那么现在来看一下如何寻找一个要显示的字符处于哪个字符集当中, 找了那个字符集才能找到这个字符的字符信息....static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) {for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) {if ((c>=pProp->First) && (c<=pProp->Last))break;}return pProp;}GUIPROP_FindChar 其实就是查找字符的机内码是位于哪个字符集之间, 比如寻找"啊"字, 机内码为0xb0a1,那么由上查找, 就可以知道它是位于链表中第16(0xb0-0xa1=16)个字符集(机内码处于0xb0a1~0xb0fe)当中, 那么就返回这个字符集的指针. 找到了要显示的字符所处的字符集, 再根据:const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First);c-pProp->First即为该字符在此字符集中的偏移, pProp->paCharInfo为该字符集中第一个字符地址...这样就找到了要显示的字符的字符信息了(宽高及点阵数等), 理解了这个过程, 那么反过来理解这个字符集为何要如此构造, 就比较容易了...比如说: 为什么要将汉字分成86个字符集合? 这是由于汉字的机内码并没有用到所有的0xffff--xa1a1=0x5e5e中连续的值, 而是间断的, 0xa1a1~0xa1fe用到了, 0xa200~0xa2a1这段当中的值不能用(因为机内码2小于0xa1了), 只能用0xa2a1~0xa2fe, 所以这个特性决定了汉字的机内码分布是显区段的, 不能用一个单一的GUI_FONT_PROP 结点来表示出所有的字符集, 因为汉字是区间分布的, 不是连续的.比如说, 如下所示:GUI_FLASH const GUI_FONT_PROP GUI_FontHZ12_Propa1= {0xa1a1,0xfefe,&GUI_FontHZ12_CharInfo[ 96],(void *)&GUI_FontHZ12_Propa2};用以下一个结点来表示所有汉字, 如同ACSII, 那么我们分析一下它为什么不可以:首先对于区间(0xa1a1~0xa1fe)这第一个区间, 在以上的结构下, 这个区间内的字符还是能够正确找到所要显示的字符信息. 但对于(0xa2a1~0xa2fe)这个区间的, pProp->paCharInfo+(c-pProp->First)显然无法找到字符信息. 这是GUI_FontHZ12_CharInfo 这个所有字符信息集数组的结构决定的, 因为汉字未用的区间的在它上面没有体现, 它上面存放的是将分隔开的汉字区间连在一起的, 这样你就无法根据pProp->paCharInfo+(c-pProp->First)来找到字符的位置了....[ucgui原创]在UCGUI中增加汉字显示的说明.在UCGUI中增加汉字显示的说明.作者: ucguiemail:*************home:版本: v1.0.0.1UCGUI中本身只支持E,没有提供中文的字库的.C源码文件, 但是我们可以通过下面的方式来实现汉字的显示...我们知道, 在DOS下经常利用点阵来显示汉字. 带汉字显示的程序,很多都会自己带上汉字库, 这个字库里放的就是每个汉字的点阵.一. 汉字的显示原理之一 -----------------点阵汉字.简单的理解, 所谓一个字的点阵. 其实就是指这个汉字用多少个象素点来描述. 每个象素点显示为什么颜色, 通常情况下, HZK16采用的是16*16点阵, 即256个象素点描述一个汉字.这些点的颜色分为两种, 一种是前景色, 一种是显示为背景色.那么,关于那些点显示为前景色, 那些点显示为背景色, 是如何得知的呢??可以这样来考虑, 你在纸上比较正正方方的写一个规则的楷字, 然后在这个字的从上到下,左到右, 分别画十七条直线, 那么这个字就被放置于一个16*16的方格之内, 这样我们就可以很明显的看出, 16*16的方格内的具体哪些点有笔划经过, 有笔划经过与没笔化经过的即就是应该被分别填充上前景色与背景色的点.现在,找到了一个汉字的点阵, 那么还须要用数据来记录点阵的信息, 通常情况下, 我们会用32个字节来表示16*16点阵的汉字, 即每一行用二个字节来记录十六个象素点的色色彩情况, 0表示背景色, 1表示前景色. 16行其须要32个字节.点阵汉字的原理同时也决定了它的缺点, 他不具务放大特性, 因为它的显示是基于被定死的点阵, 放大后, 会产生明显的锯齿,非常的难看, 当然, 可以进行一些光滑处理, 但基本上没有多在的改观.但点阵汉字简易, 对于复杂汉字, 它比矢量显示汉字法更快带.矢量显示是基于记录汉字的笔化的. 对于简单的汉字它比较占优势, 容易放大处理. 但对于复杂的汉字, 表示起来, 则笔化太多..复杂.二. 关于字库的建立及其原理.现在讲完了汉字点阵. 也说了一个汉字点阵的存放方式, 但具体的点阵如何存放, 读者也应该了解.通常情况下, 一般的DOS下的程序都会提供一个汉字库, 这样在脱离汉字平台(如UCDO)的支持下也可以进行汉字显示, 但是这样会存一个问题, 就是如果每个DOS下的程序员都这么做的话, 就会造成一定的磁盘空间浪费. 所以有的DOS下的程序,针对自己所需要的汉字, 就会定制自己的小型字库, 那么字库的制作到底应该如何进行呢? 下面我们将就这个问题进行一些基本的讨论.众所周知,一个ASCII字符占一个字节,它的数值从0到255, 那么汉字字符将如何与ASCII字符区别开来呢?实际上,仔细观察ASCII字符表,从第161(即0xa1)个字符开始,后面的字符并不经常为E文所使用。
Gui的原理

Gui的原理GUI的原理。
GUI,全称为图形用户界面(Graphical User Interface),是一种通过图形方式展示信息、接收用户输入的界面。
它是现代计算机系统中最常见的用户界面形式,几乎所有的操作系统和应用程序都采用了GUI。
GUI的设计和实现涉及到许多原理和技术,下面将就GUI的原理进行详细介绍。
首先,GUI的原理可以从两个方面来理解,一是用户界面的设计原理,二是用户界面的实现原理。
在用户界面的设计原理方面,GUI的设计需要考虑到用户的习惯和心理,要使界面布局合理,色彩搭配和谐,操作简单直观。
在用户界面的实现原理方面,GUI的实现需要通过图形库或者图形接口来实现,这些图形库或者图形接口提供了一系列的函数和方法来绘制图形界面,处理用户输入等操作。
其次,GUI的原理涉及到了许多基本概念和技术。
其中,最基本的概念就是窗口、控件和事件。
窗口是GUI程序的基本组成部分,可以包含其他控件,控件是窗口中的各种元素,如按钮、文本框、下拉框等,事件是用户的操作,如鼠标点击、键盘输入等。
GUI的原理还包括布局管理、图形绘制、事件处理等技术,布局管理用于控制控件的位置和大小,图形绘制用于绘制各种图形元素,事件处理用于响应用户的操作。
另外,GUI的原理也与计算机图形学和人机交互等领域有着密切的关系。
计算机图形学是研究如何利用计算机生成和处理图形图像的学科,它为GUI的实现提供了基础理论和技术支持。
人机交互是研究人与计算机之间的交互方式和技术的学科,它为GUI的设计提供了理论指导和实践经验。
最后,GUI的原理对于软件开发和用户体验有着重要的意义。
在软件开发中,GUI的设计和实现是至关重要的,它直接关系到软件的易用性和用户体验。
一个好的GUI可以提高用户的工作效率,增强用户的满意度,从而提升软件的市场竞争力。
因此,深入理解GUI的原理对于软件开发人员和用户界面设计师来说是非常重要的。
综上所述,GUI的原理涉及到用户界面的设计和实现两个方面,涉及到窗口、控件、事件等基本概念和技术,与计算机图形学和人机交互等领域有着密切的关系,对软件开发和用户体验有着重要的意义。
编程语言中的GUI开发技巧

编程语言中的GUI开发技巧Graphical User Interface(图形用户界面,简称GUI)是现代软件开发中的重要组成部分。
GUI使得用户能够通过图形化界面与计算机进行交互,提供了更直观、友好的用户体验。
本文将介绍编程语言中的一些GUI开发技巧,帮助开发人员更好地设计和实现GUI应用程序。
一、UI设计原则好的GUI设计应该符合以下原则:1. 简洁明了:避免界面上的冗余和复杂,使用户能够快速理解并操作界面。
2. 一致性:保持界面元素的统一和一致性,减少用户学习成本。
3. 可视化:提供直观、图形化的界面元素,方便用户进行操作和导航。
4. 弹性布局:支持不同分辨率、屏幕尺寸和方向的自适应布局,以适应不同设备。
5. 反馈机制:及时地给用户反馈操作结果,减少用户的不确定感。
二、选择合适的GUI库或框架不同编程语言提供了各种GUI库或框架,开发人员可以根据项目需求和个人喜好选择合适的工具。
以下是一些常见的GUI开发工具:1. Java:Swing、JavaFX2. C++:Qt、GTK+3. Python:Tkinter、PyQt、wxPython4. C#:Windows Forms、WPF5. JavaScript:React、Angular、Vue选择合适的GUI工具可以提高开发效率和应用程序性能,同时避免重新造轮子。
三、响应式布局和自适应设计响应式布局(Responsive Layout)是指根据设备的屏幕尺寸自动调整UI布局,以适应不同的显示情况。
自适应设计(Adaptive Design)是指根据设备或屏幕的特点进行UI布局的调整。
为了实现响应式布局和自适应设计,可以采用以下技巧:1. 使用相对布局:使用百分比或弹性布局来代替固定像素布局,以便UI元素能够自动适应不同的屏幕尺寸。
2. 媒体查询(Media Queries):通过CSS中的媒体查询,根据不同的屏幕尺寸或设备特性应用不同的样式,以实现不同风格和布局。
lvgl 字体渲染原理

lvgl 字体渲染原理字体渲染是指将字符或文字信息转化为可视化的字形形状并显示在屏幕上的过程。
在lvgl(LittlevGL)中,字体渲染是实现图形用户界面(GUI)的重要组成部分。
通过字体渲染,可以在屏幕上显示不同大小、样式和颜色的文本。
在lvgl中,字体的渲染原理可以分为三个主要步骤:字体加载、字符生成和字形显示。
下面将一步一步回答关于lvgl字体渲染原理的问题。
1. 字体加载:在lvgl中,字体需要先加载到内存中。
通常,字体文件会以二进制形式存储在外部存储器(如SD卡)或芯片内部存储器中。
在字体加载时,程序会读取字体文件的字节数据,然后解析该数据以获取字体的相关信息,如字符编码、字符宽度、字符高度等。
2. 字符生成:一旦字体加载完毕,程序就会根据需要生成特定字符的字形形状。
生成字符形状的过程通常涉及到矢量图形渲染技术。
在lvgl中,字体的渲染方式有两种:位图字体和轮廓字体。
位图字体是将字符形状存储为位图图像的形式,每个像素代表一个点的状态,可以直接用来显示;轮廓字体是通过矢量图形描述字符的轮廓,可以根据需要进行缩放和旋转。
对于位图字体,程序会根据字符编码和字体信息在内存中查找相应的位图数据,并将该数据转化为像素点的显示状态,将其显示在屏幕上。
对于轮廓字体,程序会根据字符编码和字体信息绘制相应的矢量轮廓,然后根据需要进行填充或描边操作,并将最终的轮廓图形转化为像素点的显示状态,将其显示在屏幕上。
3. 字形显示:字形显示是将生成的字符形状在屏幕上进行实际显示的过程。
在lvgl中,通常使用像素级别的绘制操作来实现字形显示。
根据生成的字符形状,程序会根据像素点的状态逐个绘制像素,从而在屏幕上显示出字符的形状。
在字形显示过程中,还可能涉及到一些特殊效果的处理,如字体的阴影、描边、渐变等。
这些效果通常需要对字体渲染算法进行特殊的处理,使得显示效果更加丰富和生动。
总结:lvgl字体渲染主要通过字体加载、字符生成和字形显示这三个步骤来实现。
Unity修改GUI字体

8.
9. // 显示文字
10.
bel( Rect(0,100,100,100), "show text" );
11.
}
根据需要先在 inspector 面板修改字体 ttf 文件的属性,例如字体
大小等,然后将 Assert 中的字体拖入 customFont 变量则可替换字体。
根据需要先在inspector面板修改字体ttf文件的属性例如字体大小等然后将assert中的字体拖入customfont变量则可替换字体
Unity 修改 GUI 字体
参考文章: Unity3D 修改 Font 字体 Unity GUI 设置字体大小
1、用 GUIStyle 来设置字体样式 1. <pre name="code" class="csharp"><pre name="code" c lass="csharp">void OnGUI() 2. { 3. GUIStyle fontStyle = new GUIStyle(); 4. fontStyle.normal.background = null; //设置背景填充 5. fontStyle.normal.textColor= new Color(1,0,0); //设置字体 颜色 6. fontStyle.fontSize = 40; //字体大小 7. bel(new Rect(0, 0, 200, 200), "Hello Font", fontStyle ); 8. }
Gui的原理

Gui的原理GUI的原理。
GUI,全称为图形用户界面,是指使用图形方式显示计算机操作界面的技术。
它是用户和计算机之间的桥梁,使得用户可以通过图形化的方式与计算机进行交互操作。
GUI的出现极大地简化了用户与计算机的交互过程,使得计算机操作变得更加直观和便捷。
那么,GUI的原理是什么呢?首先,GUI的原理是建立在图形化显示技术之上的。
它利用计算机的显示设备,如显示器、屏幕等,将各种操作界面、图标、按钮等元素以图形化的方式呈现给用户。
这样,用户可以通过鼠标、触摸屏等输入设备来进行操作,而不再需要记忆和输入复杂的命令。
其次,GUI的原理是基于人机交互的。
它考虑到了人的视觉、听觉、触觉等感官特点,设计出了直观、友好的操作界面,使得用户可以通过简单的点击、拖拽等操作完成复杂的任务。
这种人机交互的原理,使得GUI成为了计算机操作界面的主流形式。
此外,GUI的原理还包括了用户体验的设计。
它不仅考虑了操作界面的布局、颜色、字体等视觉因素,还考虑了用户在使用过程中的心理感受和行为习惯。
通过科学的用户体验设计,GUI可以使用户在操作计算机时感到舒适、自然,从而提高工作效率。
另外,GUI的原理还涉及到了软件工程和计算机图形学等方面的知识。
它需要借助于各种图形库、界面库等技术来实现图形化显示和用户交互功能。
同时,GUI的原理也需要考虑到不同操作系统、不同分辨率的显示设备等因素,以确保在不同环境下都能良好运行。
总的来说,GUI的原理是基于图形化显示技术、人机交互原理和用户体验设计的。
它使得计算机操作变得更加直观、便捷,成为了现代计算机界面的主要形式。
通过深入理解GUI的原理,我们可以更好地设计和开发出符合用户需求的图形用户界面,提高用户的工作效率和使用体验。
gui基本原理

gui基本原理GUI基本原理1. 什么是GUIGUI(Graphical User Interface),即图形用户界面,是一种人机交互界面,使用图形和图像来显示信息、实现操作。
与之相对应的是命令行界面(CLI),用户通过输入命令来操作。
2. GUI的基本组成GUI由以下几个基本组成部分构成:•窗口(Window):用户界面的基本单元,用于显示和接受用户操作。
窗口可以包含标题栏、菜单栏、工具栏、状态栏等。
•控件(Widget):窗口中的各种元素,用于展示信息和接受用户输入。
常见的控件有按钮、文本框、下拉框等。
•布局管理器(Layout Manager):用于控制窗口内控件的布局方式,如居中、靠左等。
•事件处理(Event Handling):用户的操作会触发相应的事件,通过事件处理机制,可以响应、处理这些事件,实现用户与应用程序的交互。
3. GUI的工作原理GUI的工作原理可以分为以下几个步骤:1.绘制窗口:首先,应用程序创建一个窗口对象,并通过操作系统调用,绘制窗口的基本框架和样式。
2.加载控件:界面设计师根据需求,在窗口中加载各种控件,设定控件的属性和样式。
3.事件循环:一旦窗口加载完成,应用程序就进入事件循环中。
在事件循环中,应用程序不断监听用户的操作,如鼠标点击、键盘输入等。
4.事件处理:当用户进行某种操作时,操作系统会根据操作类型生成相应的事件。
应用程序通过事件处理机制,捕获并处理这些事件,如执行相应的操作、更新窗口内容等。
5.刷新窗口:在事件处理过程中,应用程序可能需要更新窗口内容、样式等。
一旦更新完成,应用程序通过操作系统调用,将最新的窗口信息绘制出来。
6.循环更新:一旦窗口更新完成,应用程序再次进入事件循环,等待用户的下一次操作。
GUI的工作就是不断重复这个过程,实现用户与应用程序的交互。
4. GUI的优势和应用场景GUI相比于CLI具有以下优势:•直观性:通过图形和图像的展示,用户能够更直观地理解和操作应用程序。
嵌入式GUI方案比较

嵌入式GUI 方案比较一.嵌入式GUI 概况概况随着嵌入式系统的广泛应用,PDA 、机顶盒、DVD/VCD 播放机及WAP 手机已经迅速普及。
图形用户界面(GUI )的广泛流行,是当今计算机技术的重大成就之一。
嵌入式GUI 为嵌入式系统提供了一种应用于特殊场合的人机交互接口。
它极大地方便了非专业用户的使用,因此实时嵌入式系统对GUI 的需求越来越明显,而这一切均要求有一个高性能、高可靠的GUI 的支持。
的支持。
综上所述,GUI 在嵌入式系统或者实时系统中的地位将越来越重要,这些系统对 GUI 的基本要求包括:的基本要求包括:1.轻型、占用资源少。
.轻型、占用资源少。
2.高性能。
.高性能。
3.高可靠性。
.高可靠性。
4.可配置。
.可配置。
二.目前,主流的嵌入式Linux 系统的GUI 解决方案有:解决方案有:1. MicroWindows MicroWindows 是一个著名的开放源码的嵌入式GUI 软件。
MicroWindows提供了现代图形窗口系统的一些特性。
MicroWindows MicroWindows APIAPI 接口支持类Win32 API ,接口试图和Win32完全兼容。
它还实现了一些Win32用户模块功能。
MicroWindows 采用分层设计方法,以便不同的层面能够在需要的时候改写,基本上用本上用 C 语言实现。
MicroWindows 能够在没有任何操作系统或其他图形系统的支持下运行,它能对裸显示设备进行直接操作。
这样,MicroWindows 就显得十分小巧,便于移植到各种硬件和软件系统上。
MicroWindows 已经支持已经支持 Intel 16位和32位CPU 、MIPS R4000 以及以及 ARM 芯片;但作为一个窗口系统,该项目提供的窗口处理功能还需要进一步完善,提供的窗口处理功能还需要进一步完善,比如控件或构件的实现还很不完备,比如控件或构件的实现还很不完备,比如控件或构件的实现还很不完备,键键盘和鼠标等的驱动还很不完善。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说起矢量字体,不得不说一下多边形填充原理。
本来是想将多边形填充作为单独的一节内容,可惜说得太细我累大家也累。
多边形填充最需要关注的就是斜率,计算每条边的斜率,从而得到每条边在每一行上的切点。
然后从左到右,将各切点连接起来,逐行进行。
多边形有两种填充方式,Alternate和Winding。
矢量字体主要用的前一种方式,而winding会将所有的切点都连接起来,没有了中间的分隔区域。
比如,在Alternate模式下,从最左边的切点1,会连接切点2,然后从切点3连接到切点4,而2到3是不连接的。
这样就形成了一个空洞,也是矢量字的奥秘所在。
Winding模式会将所有的切点都连接起来,即从最左边的一直画到最右边。
FillMode
多边形组——PolyPolygon
将多个多边形组合成一个组,从而形成复杂的多边形组。
同样,这个组也依赖于FillMode的填充模式。
下面我们来看一下中文的“口”是如何写出来的。
“口”由两条多边形组合而成,根据FillMode为Alternate,相重叠的部分不显示。
用笔在字的中央画一条横线,就可以找到4个交点,而交点2到3是不连接的,这样就形成了“口”中间的洞。
微软Arial字体中“S”的曲线
微软的Arial字体中存储的“S”,就是多个Bezier3点组成的。
点41是锚点,而40和42是控制点,来控制通过41的曲线的张力。
在点的定义上,有on curve和not on curve两种,通常将在曲线上的点定为锚点,而不在曲线上的点为控制点。
这是我年初的时候,为了研究矢量字体,将字母P用微软的方式输出后,再读取字库点阵数据,使用红叉画出字库中所有的点。
P是由两条Bezier曲线包围而成的,第二条起着切割的目的,已形成P中间的圆洞。
看看字母“B”的填充。
字体是如何保证对齐的呢?原来在字库内部,有一个基准线,就好像信纸的虚线,用来水平方向对齐的,同样,也有个垂直方向的基准线。
每个字都有上浮和下沉的高度,这也是该字的最上和最下的点所处的位置。
矢量字在不同字号下,根据点阵尺寸,显示的精细程度也不一样。
我们这里将“8”放大了看,在小字号和大字号下的效果。
在不同的字号下,根据最简单的缩放原理,将所有的点缩放到合适的位置,再确定曲线。
这时候,一条边就占据不了整列像素,或者一条边压在了两列像素的中间,这样就造成了灰色的线条。
而这并不是我们想要的效果,Photoshop通过USM锐化滤镜,将虚边得以逐步清晰,以达到所要的矢量字。
苹果系统通过调整整体点阵的位置,将所有的点适当便宜半个像素以内的位置,可以实现较为清晰的字体。
如果在关
闭了消除锯齿方式,则有些边线由于占据不了半个像素,而不能够显示,这就形成了所谓的缺边或者缺笔划。
有些软件,比如Adobe Acrobat,通过一种较为复杂的方式,以实现矢量字的清晰。
将某些关联的点作为一个segment,并且局部偏移到邻近的整数位,而其他部分不动。
这种方法目前较为流行,可以实现比苹果和ps还要清晰的矢量效果。
为什么我们通常看到的齿条文字这么清晰呢
微软的TTF为了保证小字号下的清晰,可谓是用尽了方法。
首先,在庞大的字库,内置了数个字号的点阵字,接着才是矢量字。
比如宋体,内置了12、14、16、18等几个点阵字库,在这些之外才使用矢量字库来渲染。
这也是为什么一个TTF文件要几兆甚至几十兆的容量,不过内嵌的点阵字越多,在不同字号下实现的效果自然越好。
别小看了这些点阵字,每一个都是平面设计师在工具上画的,并非由软件生成。
唉,可怜的设计师啊~~~~~~
不过,有个特例。
比如Arial字体,内部全是矢量字,但各种尺寸下都是这么清晰。
为什么呢?
原来,微软在字库中加入了解释程序,interpreter,一种专门用于字库渲染的脚本命令。
在不同的字号下,都有相应的语句,将矢量字得以最清晰化。
这是一种复杂的技术,微软也觉得不能广泛使用,所以只有在部分的英文字库中才有,
而且该脚本对应每个字都有一段代码,容量非常大,用在汉字上几乎是不可能,除非是整个文字不多于100个才能使用。
interpreter就是这么神奇,他也是目前最好的技术,能够将矢量字渲染的和点阵字一样的清晰。
他将某些边线的距离拉开,而将另一部分收缩,总之是按照人的想法来做的,这也是编好的程序。
我用一种新的方式,保证了任何字号下的清晰。
目前还在做实验,希望将来能够做成PS的插件,或者做成个工具,输出成PNG格式。
这样,设计师就能够显示最清晰的矢量字体了,免得用PS输出的看不清。
矢量字体的终极技术
在1998年的时候,微软声称发明了一种新的技术,能在LCD上将矢量字体的清晰度提高到300%。
而后,出现了名为Microsoft Reader的软件,我还用过几个版本。
Adobe也不甘示弱,随即在Acrobat 4中对CoolType进行了支持,而Linux的FreeType库也开始支持次像素平滑。
据我多年的研究观察,Acrobat做的最好,最灵活,而微软的缺少适当的调节工具,Linux的次像素平滑简直就是垃圾,照虎画猫。
ClearType使用彩色来描边,显示对比度越是强的文字,比如白底黑字或者黑底白字,都是最清晰的。
其实,理论上ClearType 能够将显示精度提到到300%,但实际上只能达到200%左右。
一般来说,液晶显示器的点阵分布都非常均匀,每个点都是由红绿蓝3色排列而成。
我们通常要显示一个白色,需要将红绿蓝都点亮,而黑色是都不显示。
ClearType将点的概念再次扩展,把邻近的两个点3色混淆,借前一个点的颜色而忽略后一点的某种颜色。
这样,就可以把传统的一个点的最小单位扩展到1/3个点的单位。
在使用ClearType技术后,原来的字体渲染将更加清晰,当然,只限于LCD显示器,CRT会更加模糊。
ClearType还有一个关键的技术,就是Linux的次像素平滑没有学去的地方,一定要考虑到红绿蓝的颜色亮度平衡。
一般来说,绿色的亮度最高,而蓝色的最低,所以我们要在显示绿色的时候加点红色和蓝色来调低亮度,而显示蓝色的时候要加入绿色和红色来增加亮度。
这种做法也可以使边界的彩边不是那么明显,看起来更像是黑色的字。
不过,这种做法使得原本可以提高显示精细程度到300%的技术,降低了许多,不过还是要高于200%。
下面我最满意的矢量字效果,这是试验程序截图,以后做成PS的插件,供大家免费下载使用。
注:仅限LCD显示器观看,否则效果只会更差。