文档库 最新最全的文档下载
当前位置:文档库 › freetype使用帮助

freetype使用帮助

freetype使用帮助
freetype使用帮助

Freetype字体引擎分析与指南

Cathy.zheng

1.FreeType字形约定

1.1基本印刷概念

1.1.1字体文件、格式和信息

字体是一组可以被显示和打印的多样的字符映像,在单个字体中共享一些共有的特性,包括外表、风格、衬线等。按印刷领域的说法,它必须区别一个字体家族和多种字体外观,后者通常是从同样的模板而来,但是风格不同。例如,Palatino Regular 和 Palatino Italic是两种不同的外观,但是属于同样的家族Palatino。

单个字体术语根据上下文既可以指家族也可指外观。例如,大多文字处理器的用户用字体指不同的字体家族,然而,大多这些家族根据它们的格式会通过多个数据文件实现。对于 TrueType来讲,通常是每个外观一个文件(arial.ttf对应Arial Regular外观,ariali.ttf对应Arial Italic外观)这个文件也叫字体,但是实际上只是一个字体外观。

数字字体是一个可以包含一个和多个字体外观的数据文件,它们每个都包含字符映像、字符度量,以及其他各种有关文本布局和特定字符编码的重要信息。对有些难用的格式,像Adobe的Type1,一个字体外观由几个文件描述(一个包含字符映象,一个包含字符度量等)。在这里我们忽略这种情况,只考虑一个外观一个文件的情况,不过在FT2.0中,能够处理多文件字体。

为了方便说明,一个包含多个外观的字体文件我们叫做字体集合,这种情况不多见,但是多数亚洲字体都是如此,它们会包含两种或多种表现形式的映像,例如横向和纵向布局。

1.1.2字符映象和图

字符映象叫做字形,根据书写、用法和上下文,单个字符能够有多个不同的映象,即多个字形。多个字符也可以有一个字形(例如Roman)。字符和字形之间的关系可能是非常复杂,本文不多述。而且,多数字体格式都使用不太难用的方案存储和访问字形。为了清晰的原因,当说明FT时,保持下面的观念

z一个字体文件包含一组字形,每个字形可以存成位图、向量表示或其他结构(更可缩放的格式使用一种数学表示和控制数据/程序的结合方式)。这些字形可以以任意顺序存在字体文件中,通常通过一个简单的字形索引访问。

z字体文件包含一个或多个表,叫做字符图,用来为某种字符编码将字符码转换成字形索引,例如ASCII、Unicode、Big5等等。单个字体文件可能包含多个字符图,例如大多TrueType字体文件都会包含一个Apple 特定的字符图和Unicode字符图,使它在Mac和Windows平台都可以使用。

1.1.3字符和字体度量

每个字符映象都关联多种度量,被用来在渲染文本时,描述如何放置和管理它们。在后面会有详述,它们和字形位置、光标步进和文本布局有关。它们在渲染一个文本串时计算文本流时非常重要。

每个可缩放的字体格式也包含一些全局的度量,用概念单位表示,描述同一种外观的所有字形的一些特性,例如最大字形外框,字体的上行字符、下行字符和文本高度等。

虽然这些度量也会存在于一些不可缩放格式,但它们只应用于一组指定字符维度和分辨率,并且通常用象素表示。

1.2字形轮廓

1.2.1象素、点和设备解析度

当处理计算机图形程序时,指定象素的物理尺寸不是正方的。通常,输出设备是屏幕或打印机,在水平和垂直方向都有多种分辨率,当渲染文本是要注意这些情况。

定义设备的分辨率通常使用用dpi(每英寸点(dot)数)表示的两个数,例如,一个打印机的分辨率为300x600dpi表示在水平方向,每英寸有300 个象素,在垂直方向有600个象素。一个典型的计算机显示器根据它的大小,分辨率不同(15’’和17’’显示器对640x480象素大小不同),当然图形模式分辨率也不一样。

所以,文本的大小通常用点(point)表示,而不是用设备特定的象素。点是一种简单的物理单位,在数字印刷中,一点等于1/72英寸。例如,大多罗马书籍使用10到14点大小印刷文字内容。

可以用点数大小来计算象素数,公式如下:象素数 = 点数*分辨率/72

分辨率用dpi表示,因为水平和垂直分辨率可以不同,单个点数通常定义不同象素文本宽度和高度。

1.2.2向量表示

字体轮廓的源格式是一组封闭的路径,叫做轮廓线。每个轮廓线划定字形的外部或内部区域,它们可以是线段或是Bezier曲线。

曲线通过控制点定义,根据字体格式,可以是二次(conic Beziers)或三次(cubic Beziers)多项式。在文献中,conic Bezier通常称为quadratic Beziers。因此,轮廓中每个点都有一个标志表示它的类型是一般还是控制点,缩放这些点将缩放整个轮廓。

每个字形最初的轮廓点放置在一个不可分割单元的网格中,点通常在字体文件中以16位整型网格坐标存储,网格的原点在(0,0),它的范围是-16384到-16383(虽然有的格式如Type1使用浮点型,但为简便起见,我们约定用整型分析)。

网格的方向和传统数学二维平面一致,x轴从左到右,y轴从下到上。

在创建字形轮廓时,一个字体设计者使用一个假想的正方形,叫做EM正方形。他可以想象成一个画字符的平面。正方形的大小,即它边长的网格单元是很重要的,原因是:

z它是用来将轮廓缩放到指定文本尺寸的参考,例如在300x300dpi中的12pt大小对应12*300/72=50象素。

从网格单元缩放到象素可以使用下面的公式

象素数=点数×分辨率/72

象素坐标=网格坐标*象素数/EM大小

z EM尺寸越大,可以达到更大的分辨率,例如一个极端的例子,一个4单元的EM,只有25个点位置,显然不够,通常TrueType字体之用2048单元的EM;Type1 PostScript字体有一个固定1000网格单元的EM,但是点坐标可以用浮点值表示。

注意,字形可以自由超出EM正方形。网格单元通常交错字体单元或EM单元。上边的象素数并不是指实际字符的大小,而是EM正方形显示的大小,所以不同字体,虽然同样大小,但是它们的高度可能不同。

1.2.3Hinting和位图渲染

存储在一个字体文件中的轮廓叫“主”轮廓,它的点坐标用字体单元表示,在它被转换成一个位图时,

它必须缩放至指定大小。这通过一个简单的转换完成,但是总会产生一些不想要的副作用,例如像字母E和H,它们主干的宽度和高度会不相同。

所以,优秀的字形渲染过程在缩放“点”是,需要通过一个网格对齐(grid-fitting)的操作(通常叫hinting),将它们对齐到目标设备的象素网格。这主要目的之一是为了确保整个字体中,重要的宽度和高度能够一致。例如对于字符I和T来说,它们那个垂直笔划要保持同样象素宽度。另外,它的目的还有管理如stem和overshoot的特性,这在小象素字体会引起一些问题。

有若干种方式来处理网格对齐,多数可缩放格式中,每种字形轮廓都有一些控制数据和程序。

z显式网格对齐

TrueType格式定义了一个基于栈的虚拟机(VM),可以借助多于200中操作码(大多是几何操作)来编写程序,每个字形都由一个轮廓和一个控制程序组成,后者可以处理实际的网格对齐,他由字体设计者定义。采用显式的方式,质量上--对小字体有很好的结果,这对屏幕显示非常重要;速度上--如果程序很复杂,解释字节码很慢;一致性上--所有渲染器产生同样的字形位图;大小上--字形程序会很长;技术难度上--编写优秀的hinting程序非常难,没有好的工具支持。

z隐式网格对齐(也叫hinting)

Type1格式有一个更简单的方式,每个字形由一个轮廓以及若干叫hints的片断组成,后者用来描述字形的某些重要特性,例如主干的存在、某些宽度匀称性等诸如此类。没有多少种hint,要看渲染器如何解释hint 来产生一个对齐的轮廓。大小:Hint通常比显式字形程序小的多;质量:小字体不好,最后结合反走样;速度:网格对齐会非常快不一致:不同渲染器结果不同,甚至同一引擎不同版本也不同。

z自动网格对齐

有些格式很简单,没有包括控制信息,将字体度量如步进、宽度和高度分开。要靠渲染器来猜测轮廓的一些特性来实现得体的网格对齐。大小:不需要控制信息,导致更小的字体文件;质量:小字体不好,最后结合反走样;速度:依赖对齐算法,通常比显式对齐快。速度:依赖算法;不一致:不同渲染器结果不同,甚至同一引擎不同版本也不同。

1.3字形度量

1.3.1基线(baseline)、笔(pen)和布局(layout)

基线是一个假想的线,用来在渲染文本时知道字形,它可以是水平(如Roman)和是垂直的(如中文)。而且,为了渲染文本,在基线上有一个虚拟的点,叫做笔位置(pen position)或原点(origin),他用来定位字形。每种布局使用不同的规约来放置字形:

z对水平布局,字形简单地搁在基线上,通过增加笔位置来渲染文本,既可以向右也可以向左增加。两个相邻笔位置之间的距离是根据字形不同的,叫做步进宽度(advance width)。注意这个值总是正数,即使是从右往左的方向排列字符,如Arabic。这和文本渲染的方式有些不同。笔位置总是放置在基线上。

z对垂直布局,字形在基线上居中放置:

1.3.2印刷度量和边界框

在指定字体中,定义了多种外观度量。

z上行高度(ascent)。从基线到放置轮廓点最高/上的网格坐标,因为Y轴方向是向上的,所以它是一个正值。

z下行高度(descent)。从基线到放置轮廓点最低/下的网格坐标,因为Y轴方向是向上的,所以它是一个负值。

z行距(linegap)。两行文本间必须的距离,基线到基线的距离应该计算成:

上行高度-下行高度+行距

z边界框(bounding box,bbox)。这是一个假想的框子,他尽可能紧密的装入字形。通过四个值来表示,

叫做xMin、yMin、xMax、yMax,对任何轮廓都可以计算,它们可以是字体单元(测量原始轮廓)或者整型象素单元(测量已缩放的轮廓)。注意,如果不是为了网格对齐,你无需知道这个框子的这个值,只需知道它的大小即可。但为了正确渲染一个对齐的字形,需要保存每个字形在基线上转换、放置的重要对齐。

z内部leading。这个概念从传统印刷业而来,他表示字形出了EM正方形空间数量,通常计算如下:internal leading = ascent – descent – EM_size

z外部leading。行距的别名。

1.3.3跨距(bearing)和步进

每个字形都有叫跨距和步进的距离,它们的定义是常量,但是它们的值依赖布局,同样的字形可以用来渲染横向或纵向文字。

z左跨距或bearingX。从当前笔位置到字形左bbox边界的水平距离,对水平布局是正数,对垂直布局大多是负值。

z上跨距或bearingY。从基线到bbox上边界的垂直距离,对水平布局是正值,对垂直布局是负值。

z步进宽度或advanceX。当处理文本渲染一个字形后,笔位置必须增加(从左向右)或减少(从右向左)的水平距离。对水平布局总是正值,垂直布局为null。

z步进高度或advanceY。当每个字形渲染后,笔位置必须减少的垂直距离。对水平布局为null,对垂直布局总是正值。

z字形宽度。字形的水平长度。对未缩放的字体坐标,它是bbox.xMax-bbox.xMin,对已缩放字形,它的计算要看特定情况,视乎不同的网格对齐而定。

z字形高度。字形的垂直长度。对未缩放的字体坐标,它是bbox.yMax-bbox.yMin,对已缩放字形,它的计算要看特定情况,视乎不同的网格对齐而定。

z右跨距。只用于水平布局,描述从bbox右边到步进宽度的距离,通常是一个非负值。

advance_width – left_side_bearing – (xMax-xMin)

下图是水平布局所有的度量

下图是垂直布局的度量:

1.3.4网格对齐的效果

因为hinting将字形的控制点对齐到象素网格,这个过程将稍稍修改字符映象的尺寸,和简单的缩放有所区别。例如,小写字母m的映象在主网格中有时是一个正方形,但是为了使它在小象素大小情况下可以辨别,hinting试图扩大它已缩放轮廓,以让它三条腿区分开来,这将导致一个更大的字符位图。

字形度量也会受网格对齐过程的影响:

z映象的宽度和高度改变了,即使只是一个象素,对于小象素大小字形区别都很大;

z映象的边界框改变了,也改变了跨距;

z步进必须更改,例如如果被hint的位图比缩放的位图大时,必须增加步进宽度,来反映扩大的字形宽度。这有一些含义如下,

z因为hinting,简单缩放字体上行或下行高度可能不会有正确的结果,一个可能的方法时保持被缩放上行高度的顶和被缩放下行高度的底。

z没有容易的方法去hint一个范围内字形并步进它们宽度,因为hinting对每个轮廓工作都不一样。唯一的方法时单独hint每个字形,并记录返回值。有些格式,如TrueType,包含一些表对一些通用字符预先计算出它们的象素大小。

z hinting依赖最终字符宽度和高度的象素值,意味着它非常依赖分辨率,这个特性使得正确的所见即所得布局非常难以实现。

在FT 中,对字形轮廓处理2D变换很简单,但是对一个已hint的轮廓,需要注意专有地使用整型象素距离(意味着FT_Outline_Translate() 函数的参数应该都乘以64,因为点坐标都是26.6固定浮点格式),否则,变换将破坏hinter的工作,导致非常难看的位图。

1.3.5文本宽度和边界框

如上所示,指定字形的原点对应基线上笔的位置,没有必要定位字形边界框的某个角,这不像多数典型的位图字体格式。有些情况,原点可以在边界框的外边,有时,也可以在里边,这要看给定的字形外形了。

同样,字形的步进宽度是在布局时应用于笔位置的增量,而不是字形的宽度,那是字形边界的宽度。对文本串,具有相同的规约,这意味着:

z指定文本串的边界框没有必要包含文本光标,也不需要后边的字形放置在它的角上。

z字符串的步进宽度和它的边界框大小无关,特别时它在开始和最后包含空格或tab。

z最后,附加的处理如间距调整能够创建文本串,它的大小不直接依赖单独字形度量并列排列。例如,V A 的步进宽度不是V和A各自的步进之和。

1.4字距调整

字距调整这个术语指用来在一个文本串中调整重合字形的相对位置的特定信息。

1.4.1字距调整对

字距调整包括根据相邻字形的轮廓修改它们之间的距离。例如T和y可以贴得更近一点,因为y的上缘正好在T的右上角一横的下边。

当仅仅根据字形的标准宽度来布局文本,一些连续的字符看上去有点太挤和太松,有的字体外观包含一个表,它包含文本布局所需的指定字形对的字距距离。

z这个对是顺序的,A V对的距离和V A对不一定一致;

z依据布局或书写,字距可以表示水平或垂直方向。

z字距表示成网格单元,它们通常是X轴方向的,意味着负值表示两个字形需要在水平方向放的更近一点。

1.4.2应用字距调整

在渲染文本时应用字据调整是一个比较简单的过程,只需要在写下一个字形时,将缩放的字距加到笔位置即可。然而,正确的渲染器要考虑的更细一点。

“滑动点”问题是一个很好的例子:很多字体外观包括一个大写字符(如T、F)和一个点.之间的字距调整,以将点正好放置在前者的主腿的右侧。

根据字符的外形,有时候需要在点和随后的字符间作附加的调整。一个方案是,只在需要时滑动点,当然这需要对文本的意思有了解。如果当我们在渲染特定段落的最后一个点时,上面的调整就不适合了。这只是一个例子,还有很多其他例子显示一个真正的印刷工人需要恰当地布局文本。

有一个很简单地算法,可以避免滑动点问题。

1. 在基线上放置第一个字形;

2. 将笔位置保存到pen1;

3. 根据第一个和第二个字形的字距距离调整笔位置;

4. 放置第二个字形,并计算下个笔位置,放到pen2;

5. 如果pen1大于pen2,使用pen1作为下个笔位置,否则使用pen2。

1.5文本处理

1.5.1书写简单文本串

在第一个例子中,我们将生成一个简单的Roman文字串,即采用水平的自左向右布局,使用专有的象素度量,这个过程如下:

1. 将字符串转换成一系列字形索引;

2. 将笔放置在光标位置;

3. 获得或装入字形映象;

4. 平移字形以使它的原点匹配笔位置;

5. 将字形渲染到目标设备;

6. 根据字形的步进象素增加笔位置;

7. 对剩余的字形进行第三步;

8. 当所有字形都处理了,在新的笔位置设置文本光标。

注意字距调整不在这个算法中。

1.5.2子象素定位

在渲染文本时使用子象素定位有时很有用。这非常重要,例如为了提供半所见即所得的文本布局,文本渲染的算法和上一节很相似,但是有些区别:

z笔位置表示成小数形式的象素;

z因为将一个已经hint过的轮廓平移一个非整型距离将破坏网格对齐,字形原点的位置在渲染字符映象前必须取整;

z步进宽度表示成小数形式的象素,没有必要是整型。

这里是算法的改进版本:

1. 将字符串转换成一系列字形索引;

2. 将笔放置在光标位置,这可以是一个非整型点;

3. 获得或装入字形映象;

4. 平移字形以使它的原点匹配取整后的笔位置;

5. 将字形渲染到目标设备;

6. 根据字形的步进象素宽度增加笔位置,这个宽度可以是小数形式;

7. 对剩余的字形进行第三步;

8. 当所有字形都处理了,在新的笔位置设置文本光标。

注意使用小数象素定位后,两个指定字符间的空间将不是固定的,它右先前的取整操作堆积的数决定。1.5.3简单字距调整

在基本文本渲染算法上增加字距调整非常简单,当一个字距调整对发现了,简单地在第4步前,将缩放后的调整距离增加到笔位置即可。淡然,这个距离在算法1需要被取整,算法2不必要。

1.5.4自右向左布局

布局Arabic或Heberw文字的过程非常相似,区别只是在字形渲染前,笔位置需要减少(记住步进宽度总是正值)

1.5.5垂直布局

布局垂直文字也是同样的过程,重要的区别如下:

z基线是垂直的,使用垂直的度量而不是水平度量;

z左跨距通常是负的,但字形原点必须在基线上;

z步进高度总是正值,所以笔位置必须减少以从上至下书写;

1.6 FT轮廓

1.6.1 FT轮廓描述和结构

a. 轮廓曲线分解

一个轮廓是2D平面上一系列封闭的轮廓线。每个轮廓线由一系列线段和Bezier弧组成,根据文件格式不同,曲线可以是二次和三次多项式,前者叫quadratic或conic弧,它们在TrueType格式中用到,后者叫cubic弧,多数用于Type1格式。

每条弧由一系列起点、终点和控制点描述,轮廓的每个点有一个特定的标记,表示它用来描述一个线段还是一条弧。这个标记可以有以下值:

FT_Curve_Tag_On 当点在曲线上,这对应线段和弧的起点和终点。其他标记叫做“Off”点,即它不在轮廓线上,但是作为Bezier弧的控制点。

FT_Curve_Tag_Conic 一个Off点,控制一个conic Bezier弧

FT_Curve_Tag_Cubic 一个Off点,控制一个cubic Bezier弧

下面的规则应用于将轮廓点分解成线段和弧

z两个相邻的“on”点表示一条线段;

z一个conic Off点在两个on点之间表示一个conic Bezier弧,off点是控制点,on点是起点和终点;

z两个相邻的cubic off点在两个on点之间表示一个cubic Bezier弧,它必须有两个cubic控制点和两个on 点。

z最后,两个相邻的conic off点强制??在它们正中间创建一个虚拟的on点。这大大方便定义连续的conic 弧。TrueType规范就是这么定义的。

注意,在单个轮廓线中可以混合使用conic和cubic弧,不过现在没有那种字体驱动产生这样的轮廓。

b. 轮廓描述符

FT轮廓通过一个简单的结构描述

FT_Outline

n_points 轮廓中的点数

n_contours 轮廓中轮廓线数

points 点坐标数组

contours 轮廓线端点索引数组

tags 点标记数组

这里,points是一个FT_Vector记录数组的指针,用来存储每个轮廓点的向量坐标。它表示为一个象素1/64,也叫做26.6固定浮点格式。

contours是一组点索引,用来划定轮廓的轮廓线。例如,第一个轮廓线总是从0点开始,以contours[0]点结束。第二个轮廓线从contours[0]+1点开始,以contours[1]结束,等等。

注意,每条轮廓线都是封闭的,n_points应该和contours[n_controus-1]+1相同。最后,tags是一组字节,用来存放每个轮廓的点标记。

1.6.2边界和控制框计算

边界框(bbox)是一个完全包含指定轮廓的矩形,所要的是最小的边界框。因为弧的定义,bezier的控制点无需包含在轮廓的边界框中。例如轮廓的上缘是一个Bezier弧,一个off点就位于bbox的上面。不过这在字符轮廓中很少出现,因为大多字体设计者和创建工具都会在每个曲线拐点处放一个on点,这会使hinting 更加容易。于是我们定义了控制框(cbox),它是一个包含轮廓所有点的最小矩形,很明显,它包含bbox,通常它们是一样的。不想 bbox,cbox计算起来非常快。

控制框和边界框可以通过函数FT_Outline_Get_CBox()和 FT_Outline_Get_BBox()自动计算,前者总是非常快,后者在有外界控制点的情况下会慢一点,因为需要找到conic和cubic弧的末端,如果不是这种情况,它和计算控制框一样快。

注意,虽然大多字形轮廓为易于hint具有相同的cbox和bbox,这在它们进行变换以后,如旋转,就不再是这种情况了。

1.6.3坐标、缩放和网格对齐

轮廓点的向量坐标表示为26.6格式,即一个象素的1/64。因此,坐标(1.0,-2.5)存放整型对(x:64,y:-192)。

在主字形轮廓从EM网格缩放到当前字符大小后,hinter负责对齐重要的轮廓点到象素网格。虽然这个过程很难几句话说清楚,但是它的目的也就是取整点的位置,以保持字形重要的特性,如宽度、主干等。下面的操作可以用来将26.6格式的向量距离取整到网格:

round(x) == (x + 32) & -64

floor(x) == x & -64

ceiling(x) == (x + 63) & -64

一旦一个字形轮廓经过对齐或变换,在渲染之前通常要计算字形的映象象素大小。做到这一点,必须考虑如下:扫描线转换器画出所有中心在字形形状中的象素,这导致如下计算:

z计算bbox;

z对齐bbox如下:

xmin = floor(bbox.xMin)

xmax = ceiling(bbox.xMax)

ymin = floor(bbox.yMin)

ymax = ceiling(bbox.yMax)

z返回象素尺寸,即

width = (xmax-xmin) / 64 和height = (ymax-ymin) / 64

通过对齐bbox,可以保证所有的象素中心将画到,包括那些从drop-out控制来的,将在调整后的框子之中。接着,框子的象素尺寸可以计算出来。

同时注意,当平移一个对齐的轮廓,应该总是使用整型距离来移动。否则,字形的边缘将不再对齐象素网格,hinter的工作将无效,产生非常难看的位图。

1.7 FT位图

1.7.1向量坐标和象素坐标对比

这里阐述了向量坐标的象素坐标的区别,为了更清楚的说明,使用方括号来表示象素坐标,使用圆括号表示向量坐标。

在象素坐标中,我们使用Y轴向上的规约,坐标[0,0]总是指位图左下角象素,坐标[width-1, rows-1]是右上角象素。在向量坐标中,点坐标用浮点单位表示,如(1.25, -2.3),这个位置并不是指一个特定象素,而是在2D平面上一个非实质性的点。

象素其实在2D平面上是一个方块,它的中心是象素坐标值的一半,例如位图的左下角象素通过方块(0,0)-(1,1)界定,它的中心位于 (0.5,0.5)。注意这儿用的是向量坐标表示。这对计算距离就会发生一些区别。例如,[0,0]-[10.0]一条线的象素长度是11,然而, (0,0)-(10,0)的向量程度覆盖了10个象素,因此它的长度是10。

1.7.2 FT位图和象素图描述符

一个位图和象素图通过一个叫FT_Bitmap的单一结构描述,他定义在中,属性如下

FT_Bitmap

rows 行数,即位图中的水平线数

width 位图的水平象素数

pitch 它的绝对值是位图每行占的字节数,根据位图向量方向,可以是正值或是负值

buffer 一个指向位图象素缓冲的无类型指针

pixel_mode 一个枚举值,用来表示位图的象素格式;例如ft_pixel_mode_mono表示1位单色位图,ft_pixel_mode_grays表示8位反走样灰度值

num_grays 这只用于灰度象素模式,它给出描述反走样灰度级别的级数,FT缺省值为255。

pitch 属性值的正负符号确定象素缓冲中的行是升序还是降序存放。上面说道FT在2D平面上使用Y轴向上的规约,这意味着(0,0)总是指向位图的左下角。如果 picth是正值,按照向量减少的方向存储行,即象素缓冲的第一个字节表示位图最上一行的部分。如果是负值,第一个字节将表示位图最下一行的部分。对所有的情况,pitch可以看作是在指定位图缓冲中,跳到下一个扫描行的字节增量。

通常都使用正pitch,当然有的系统会使用负值。

1.7.3轮廓转换到位图和象素图

使用FT从一个向量映象转换到位图和象素图非常简单,但是,在转换前,必须理解有关在2D平面上放置轮廓的一些问题:

z字形转载器和hinter在2D平面上放置轮廓时,总将(0,0)匹配到字符原点,这意味着字形轮廓,及对应的边界框,可以在平面中放置于任何地方。

z目标位图映射到2D平面上,左下角在(0,0)上,这就是说一个[w,h]大小的位图和象素图将被映射到(0,0)-(w,h)界定的2D矩形窗口。

z当扫描转换轮廓,所有在这个位图窗口的部分将被渲染,其他的被忽略。

很多使用FT的开发者都会有个误解,认为一个装入的轮廓可以直接渲染成一个适当大小的位图,下面的图像表明这个问题。

z第一个图表明一个2D平面上一个装入的轮廓;

z第二个表示一个任意大小[w,h]维护的目标窗口;

z第三个表示在2D平面上轮廓和窗口的合并;

z最后一个表示位图实际被渲染的部分。

实际上,几乎所有的情况,装入或变换过的轮廓必须在渲染成目标位图之前作平移操作,以调整到相对目标窗口的位置。

例如,创建一个单独的字形位图正确的方法如下:

z计算字形位图的大小,可以直接从字形度量计算出来,或者计算它的边界框(这在经过变换后非常有用,此时字形度量不再有效)。

z根据计算的大小创建位图,别忘了用背景色填充象素缓冲;

z平移轮廓,使左下角匹配到(0,0)。别忘了为了hinting,应该使用整型。通常,这就是说平移一个向量(-ROUND(xMin), -ROUND(yMin))。

z调用渲染功能,例如FT_Outline_Render()函数。

在将字形映象直接写入一个大位图的情况,轮廓必须经过平移,以将它们的向量位置对应到当前文本光标/字符原点上。

2. FreeType 2的设计

2.1介绍

编写freetype库的目标:

z它让客户应用程序方便的访问字体文件,无论字体文件存储在哪里,并且与字体格式无关。

z方便的提取全局字体数据,这些数据在平常的字体格式中普遍存在。(例如:全局度量标准,字符编码/字符映射表,等等)

z方便的提取某个字符的字形数据(度量标准,图像,名字,其他任何东西)

z访问字体格式特定的功能(例如,SFNT表,多重控制,OpenType轮廓表)

Freetype 2的设计也受如下要求很大的影响:

z高可移植性。这个库必须可以运行在任何环境中。这个要求引入了一些非常激烈的选择,这些是FreeType2的低级系统界面的一部分。

z可扩展性。新特性应该可以在极少改动库基础代码的前提下添加。这个要求引入了非常简单的设计:几乎所有操作都是以模块的形式提供的。

z可定制。它应该能够很容易建立一个只包含某个特定项目所需的特性的版本。当你需要集成它到一个嵌入式图形库的字体服务器中时,这是非常重要的。

z简洁高效。这个库的主要目标是只有很少cpu和内存资源的嵌入式系统。

2.2组件和API

FT可以看作是一组组件,每个组件负责一部分任务,它们包括

z客户应用程序一般会调用FT高层API,它的功能都在一个组件中,叫做基础层。

z根据上下文和环境,基础层会调用一个或多个模块进行工作,大多数情况下,客户应用程序不知道使用那个模块。

z基础层还包含一组例程来进行一些共通处理,例如内存分配,列表处理、io流解析、固定点计算等等,这些函数可以被模块随意调用,它们形成了一个底层基础API。

如下图,表明它们的关系

另外,

z为了一些特殊的构建,基础层的有些部分可以替换掉,也可以看作组件。例如ftsystem组件,负责实现内存管理和输入流访问,还有ftinit,负责库初始化。

z FT还有一些可选的组件,可以根据客户端应用灵活使用,例如ftglyph组件提供一个简单的API来管理字形映象,而不依赖它们内部表示法。或者是访问特定格式的特性,例如ftmm组件用来访问和管理Type1字体中Multiple Masters数据。

z最后,一个模块可以调用其他模块提供的函数,这对在多个字体驱动模块中共享代码和表非常有用,例如truetype和cff模块都使用sfnt模块提供的函数。

请注意一些要点:

z一个可选的组件可以用在高层API,也可以用在底层API,例如上面的ftglyph;

z有些可选组件使用模块特定的接口,而不是基础层的接口,上例中,ftmm直接访问Type1模块来访问数据;

z一个可替代的组件能够提供一个高层API的函数,例如,ftinit提供FT_Init_FreeType()

2.3公共对象和类

2.3.1FT中的面向对象

虽然FT是使用ANSI C编写,但是采用面向对象的思想,是这个库非常容易扩展,因此,下面有一些代码规约。

1.每个对象类型/类都有一个对应的结构类型和一个对应的结构指针类型,后者称为类型/类的句柄类型

设想我们需要管理FT中一个foo类的对象,可以定义如下

typedef struct FT_FooRec_* FT_Foo;

typedef struct FT_FooRec_

{

// fields for the foo class

}FT_FooRec;

依照规约,句柄类型使用简单而有含义的标识符,并以FT_开始,如FT_Foo,而结构体使用相同的名称但是加上Rec后缀。Rec是记录的缩写。每个类类型都有对应的句柄类型;

2.类继承通过将基类包装到一个新类中实现,例如,我们定义一个foobar类,从foo类继承,可以实现为

typedef struct FT_FooBarRec_ * FT_FooBar;

typedef struct FT_FooBarRec_

{

FT_FooRec root; //基类

}FT_FooBarRec;

可以看到,将一个FT_FooRec放在FT_FooBarRec定义的开始,并约定名为root,可以确保一个foobar对象也是一个foo对象。

在实际使用中,可以进行类型转换。

2.3.2 FT_Library类

这个类型对应一个库的单一实例句柄,没有定义相应的FT_LibraryRec,使客户应用无法访问它的内部属性。库对象是所有FT其他对象的父亲,你需要在做任何事情前创建一个新的库实例,销毁它时会自动销毁他所有的孩子,如face和module等。通常客户程序应该调用FT_Init_FreeType()来创建新的库对象,准备作其他操作时使用。另一个方式是通过调用函数FT_New_Library()来创建一个新的库对象,它在中定义,这个函数返回一个空的库,没有任何模块注册,你可以通过调用FT_Add_Module()来安装模块。

调用FT_Init_FreeType()更方便一些,因为他会缺省地注册一些模块。这个方式中,模块列表在构建时动态计算,并依赖ftinit部件的内容。(见ftinit.c[l73]行,include FT_CONFIG_MODULES_H,其实就是包含ftmodule.h,在ftmodule.h中定义缺省的模块,所以模块数组 ft_default_modules的大小是在编译时动态确定的。)

2.3.3 FT_Face类

一个外观对象对应单个字体外观,即一个特定风格的特定外观类型,例如Arial和Arial Italic是两个不同的外观。

一个外观对象通常使用FT_New_Face()来创建,这个函数接受如下参数:一个FT_Library句柄,一个表示字体文件的C文件路径名,一个决定从文件中装载外观的索引(一个文件中可能有不同的外观),和FT_Face 句柄的地址,它返回一个错误码。

FT_Error FT_New_Face( FT_Library library,

const char* filepathname,

FT_Long face_index,

FT_Face* face);

函数调用成功,返回0,face参数将被设置成一个非NULL值。

外观对象包含一些用来描述全局字体数据的属性,可以被客户程序直接访问。例如外观中字形的数量、外观家族的名称、风格名称、EM大小等,详见FT_FaceRec定义。

2.3.4 FT_Size类

每个FT_Face对象都有一个或多个FT_Size对象,一个尺寸对象用来存放指定字符宽度和高度的特定数据,每个新创建的外观对象有一个尺寸,可以通过face->size直接访问。

尺寸对象的内容可以通过调用FT_Set_Pixel_Sizes()或FT_Set_Char_Size()来改变。

一个新的尺寸对象可以通过FT_New_Size()创建,通过FT_Done_Size()销毁,一般客户程序无需做这一步,它们通常可以使用每个FT_Face缺省提供的尺寸对象。

FT_Size 公共属性定义在FT_SizeRec中,但是需要注意的是有些字体驱动定义它们自己的FT_Size的子类,以存储重要的内部数据,在每次字符大小改变时计算。大多数情况下,它们是尺寸特定的字体hint。例如,TrueType驱动存储CVT表,通过cvt程序执行将结果放入TT_Size结构体中,而 Type1驱动将scaled global metrics放在T1_Size对象中。

2.3.5 FT_GlyphSlot类

字形槽的目的是提供一个地方,可以很容易地一个个地装入字形映象,而不管它的格式(位图、向量轮廓或其他)。理想的,一旦一个字形槽创建了,任何字形映象可以装入,无需其他的内存分配。在实际中,只对于特定格式才如此,像TrueType,它显式地提供数据来计算一个槽地最大尺寸。

另一个字形槽地原因是他用来为指定字形保存格式特定的hint,以及其他为正确装入字形的必要数据。基本的FT_GlyphSlotRec结构体只向客户程序展现了字形metics和映象,而真正的实现回包含更多的数据。例如,TrueType特定的TT_GlyphSlotRec结构包含附加的属性,存放字形特定的字节码、在hint过程中暂时的轮廓和其他一些东西。

最后,每个外观对象有一个单一字形槽,可以用face->glyph直接访问。

2.3.6 FT_CharMap类

FT_CharMap类型用来作为一个字符地图对象的句柄,一个字符图是一种表或字典,用来将字符码从某种编码转换成字体的字形索引。

单个外观可能包含若干字符图,每个对应一个指定的字符指令系统,例如Unicode、Apple Roman、Windows codepages等等。

每个FT_CharMap对象包含一个platform和encoding属性,用来标识它对应的字符指令系统。每个字体格式都提供它们自己的FT_CharMapRec的继承类型并实现它们。

2.4 内部对象和类

2.4.1 内存管理

所有内存管理操作通过基础层中3个特定例程完成,叫做FT_Alloc、FT_Realloc、 FT_Free,每个函数需要一个 FT_Memory句柄作为它的第一个参数。它是一个用来描述当前内存池/管理器对象的指针。在库初始化时,在FT_Init_FreeType中调用函数FT_New_Memory创建一个内存管理器,这个函数位于ftsystem部件当中。

缺省情况下,这个管理器使用ANSI malloc、realloc和free函数,不过ftsystem是基础层中一个可替换的部分,库的特定构建可以提供不同的内存管理器。即使使用缺省的版本,客户程序仍然可以提供自己的内存管理器,通过如下的步骤,调用FT_Init_FreeType实现:

1.手工创建一个FT_Memory对象,FT_MemoryRec位于公共文件中。

2.使用你自己的内存管理器,调用FT_New_Library()创建一个新的库实例。新的库没有包含任何已注册的

模块。

3.通过调用函数FT_Add_Default_Modules()(在ftinit部件中)注册缺省的模块,或者通过反复调用

FT_Add_Module手工注册你的驱动。

2.4.2输入流

字体文件总是通过FT_Stream对象读取,FT_StreamRec的定义位于公共文件中,可以允许客户开发者提供自己的流实现。FT_New_Face()函数会自动根据他第二个参数,一个C路径名创建一个新的流对象。它通过调用由 ftsystem部件提供的FT_New_Stream()完成,后者时可替换的,在不同平台上,流的实现可能大不一样。

举例来说,流的缺省实现位于文件src/base/ftsystem.c并使用ANSI fopen/fseek和fread函数。不过在FT2的Unix版本中,提供了另一个使用内存映射文件的实现,对于主机系统来说,可以大大提高速度。

FT区分基于内存和基于磁盘的流,对于前者,所有数据在内存直接访问(例如ROM、只写静态数据和内存映射文件),而后者,使用帧(frame)的概念从字体文件中读出一部分,使用典型的seek/read操作并暂时缓冲。

FT_New_Memory_Face 函数可以用来直接从内存中可读取的数据创建/打开一个FT_Face对象。最后,如果需要客户输入流,客户程序能够使用FT_Open_Face()函数接受客户输入流。这在压缩或远程字体文件的情况下,以及从特定文档抽取嵌入式字体文件非常有用。

注意每个外观拥有一个流,并且通过FT_Done_Face被销毁。总的来说,保持多个FT_Face在打开状态不是一个很好的主意。

2.4.3模块

FT2 模块本身是一段代码,库调用FT_Add_Moudle()函数注册模块,并为每个模块创建了一个FT_Module对象。FT_ModuleRec的定义对客户程序不是公开的,但是每个模块类型通过一个简单的公共结构FT_Module_Class描述,它定义在< freetype/ftmodule.h>中,后面将详述。

当调用FT_Add_Module是,需要指定一个FT_Module_Class结构的指针,它的声明如下:

FT_Error FT_Add_Module( FT_Library library,

const FT_Module_Class* clazz);

调用这个函数将作如下操作:

z检查库中是否已经有对应FT_Module_Class指名的模块对象;

z如果是,比较模块的版本号看是否可以升级,如果模块类的版本号小于已装入的模块,函数立即返回。

当然,还要检查正在运行的FT版本是否满足待装模块所需FT的版本。

z创建一个新的FT_Module对象,使用模块类的数据的标志决定它的大小和如何初始化;

z如果在模块类中有一个模块初始器,它将被调用完成模块对象的初始化;

z新的模块加入到库的“已注册”模块列表中,对升级的情况,先前的模块对象只要简单的销毁。

z注意这个函数并不返回FT_Module句柄,它完全是库内部的事情,客户程序不应该摆弄他。最后,要知道FT2识别和管理若干种模块,这在后面将有详述,这里列举如下:

渲染器模块用来将原始字形映象转换成位图或象素图。FT2自带两个渲染器,一个是生成单色位图,另一个生成高质量反走样的象素图。

字体驱动模块用来支持多种字体格式,典型的字体驱动需要提供特定的FT_Face、FT_Size、FT_GlyphSlot和FT_CharMap的实现;

助手模块被多个字体驱动共享,例如sfnt模块分析和管理基于SFNT字体格式的表,用于TrueType 和OpenType字体驱动;

最后,auto-hinter模块在库设计中有特殊位置,它不管原始字体格式,处理向量字形轮廓,使之产生优质效果。

注意每个FT_Face对象依据原始字体文件格式,都属于相应的字体驱动。这就是说,当一个模块从一个库实例移除/取消注册后,所有的外观对象都被销毁(通常是调用FT_Remove_Module()函数)。

因此,你要注意当你升级或移除一个模块时,没有打开FT_Face对象,因为这会导致不预期的对象删除。

2.4.4库

现在来说说FT_Library对象,如上所述,一个库实例至少包含如下:

z一个内存管理对象(FT_Memory),用来在实例中分配、释放内存;

z一个FT_Module对象列表,对应“已安装”或“已注册”的模块,它可以随时通过FT_Add_Module()和FT_Remove_Module()管理;

z记住外观对象属于字体驱动,字体驱动模块属于库。

还有一个对象属于库实例,但仍未提到:raster pool

光栅池是一个固定大小的一块内存,为一些内存需要大的操作作为内部的“草稿区域”,避免内存分配。例如,它用在每个渲染器转换一个向量字形轮廓到一个位图时(这其实就是它为何叫光栅池的原因)。光栅池的大小在初始化的时候定下来的(缺省为16k字节),运行期不能修改。当一个瞬时操作需要的内存超出这个池的大小,可以另外分配一块作为例外条件,或者是递归细分任务,以确保不会超出池的极限。这种极度的内存保守行为是为了FT的性能考虑,特别在某些地方,如字形渲染、扫描线转换等。

2.5模块类

在FT中有若干种模块

z渲染模块,用来管理可缩放的字形映象。这意味这转换它们、计算边框、并将它们转换成单色和反走样位图。FT可以处理任何类型的字形映像,只要为它提供了一个渲染模块,FT缺省带了两个渲染器

raster 支持从向量轮廓(由FT_Outline对象描述)到单色位图的转换

smooth 支持同样的轮廓转换到高质量反走样的象素图,使用256级灰度。这个渲染器也支持直接生成span。

z字体驱动模块,用来支持一种或多种特定字体格式,缺省情况下,FT由下列字体驱动 truetype 支持TrueType字体文件

type1 支持PostScript Type1字体,可以是二进制(.pfb)和ASCII(.pfa)格式,包括Multiple Master

字体

cid 支持Postscript CID-keyed字体

cff 支持OpenType、CFF和CEF字体(CEF是CFF的一个变种,在Adobe的SVG Viewer中使用 winfonts 支持Windows位图字体,.fon和.fnt

字体驱动可以支持位图和可缩放的字形映象,一个特定支持Bezier轮廓的字体驱动通过FT_Outline可以提供他自己的hinter,或依赖FT的autohinter模块。

z助手模块,用来处理一些共享代码,通常被多个字体驱动,甚至是其他模块使用,缺省的助手如下 sfnt 用来支持基于SFNT存储纲要的字体格式,TrueType和OpenType字体和其他变种

psnames 用来提供有关字形名称排序和Postscript编码/字符集的函数。例如他可以从一个Type1字形名称字典中自动合成一个Unicode字符图。

psaux 用来提供有关Type1字符解码的函数,type1、cid和cff都需要这个特性

z最后,autohinter模块在FT中是特殊角色,当一个字体驱动没有提供自己的hint引擎时,他可以在字形装载时处理各自的字形轮廓。

3.字形装载

3.1基本步骤介绍

z初始化库

z通过创建一个新的 face 对象来打开一个字体文件

z以点或者象素的形式选择一个字符大小

z装载一个字形(glyph)图像,并把它转换为位图

z渲染一个简单的字符串

z容易地渲染一个旋转的字符串

3.2头文件

下面的内容是编译一个使用了FreeType2库的应用程序所需要的指令。

1.FreeType2 include 目录

你必须把FreeType2头文件的目录添加到编译包含(include)目录中。

注意,现在在Unix系统,你可以运行freetype-config脚本加上--cflags选项来获得正确的编译标记。这个脚本也可以用来检查安装在你系统中的库的版本,以及需要的库和连接标记。

2.包含名为ft2build.h的文件

Ft2build.h包含了接下来要#include的公共FreeType2头文件的宏声明。

3.包含主要的FreeType2 API头文件

你要使用FT_FREETYPE_H宏来完成这个工作,就像下面这样:

#include

#include FT_FREETYPE_H

FT_FREETYPE_H是在ftheader.h中定义的一个特别的宏。Ftheader.h包含了一些安装所特定的宏,这些宏指名了FreeType2 API的其他公共头文件。

你可以阅读“FreeType 2 API参考”的这个部分来获得头文件的完整列表。

#include语句中宏的用法是服从ANSI的。这有几个原因:

z这可以避免一些令人痛苦的与FreeType 1.x公共头文件的冲突。

z宏名字不受限于DOS的8.3文件命名限制。象FT_MULTIPLE_MASTERS_H或FT_SFNT_NAMES_H这样的名字比真实的文件名ftmm.h和fsnames.h更具可读性并且更容易理解。

z它允许特别的安装技巧,我们不在这里讨论它。

注意:从FreeType 2.1.6开始,旧式的头文件包含模式将不会再被支持。这意味着现在如果你做了象下面那样的事情,你将得到一个错误:

#include

#include

. . .

3.3初始化库

简单地创建一个FT_Library类型的变量,例如library,然后象下面那样调用函数FT_Init_FreeType:

#include

#include FT_FREETYPE_H

FT_LIBRARY library;

. . .

Error = FT_Init_FreeType ( &library );

If ( error )

{

. . . 当初始化库时发生了一个错误. . .

}

这个函数负责下面的事情:

z它创建一个FreeType 2库的新实例,并且设置句柄library为它。

z它装载库中FreeType所知道的每一个模块。除了别的以外,你新建的library对象可以优雅地处理TrueType, Type 1, CID-keyed 和OpenType/CFF字体。

就像所看到的,这个函数返回一个错误代码,如同FreeType API的大部分其他函数一样。值为0的错误代码始终意味着操作成功了,否则,返回值指示错误,library设为NULL。

3.4装载一个字体face

3.4.1 从一个字体文件装载

应用程序通过调用FT_New_Face创建一个新的face对象。一个face对象描述了一个特定的字样和风格。例如,’Times New Roman Regular’和’Times New Roman Italic’对应两个不同的face。

FT_Library library; /* 库的句柄 */

FT_Face face; /* face对象的句柄 */

error = FT_Init_FreeType( &library );

if ( error ) { ... }

error = FT_New_Face( library,

"/usr/share/fonts/truetype/arial.ttf",

0,

&face );

if ( error == FT_Err_Unknown_File_Format )

{

... 可以打开和读这个文件,但不支持它的字体格式

}

else if ( error )

{

... 其它的错误码意味着这个字体文件不能打开和读,或者简单的说它损坏了...

}

就如你所想到的,FT_NEW_Face打开一个字体文件,然后设法从中提取一个face。它的参数为:

Library

一个FreeType库实例的句柄,face对象从中建立

Filepathname

字体文件路径名(一个标准的C字符串)

Face_index

某些字体格式允许把几个字体face嵌入到同一个文件中。

这个索引指示你想装载的face。如果这个值太大,函数将会返回一个错误。Index 0总是正确的。

Face

一个指向新建的face对象的指针。当失败时其值被置为NULL。

要知道一个字体文件包含多少个face,只要简单地装载它的第一个face(把face_index设置为0),face->num_faces的值就指示出了有多少个face嵌入在该字体文件中。

3.4.2 从内存装载

如果你已经把字体文件装载到内存,你可以简单地使用FT_New_Memory_Face为它新建一个face对象,如下所示:

FT_Library library; /* 库的句柄 */

FT_Face face; /* face对象的句柄 */

error = FT_Init_FreeType( &library );

if ( error ) { ... }

error = FT_New_Memory_Face( library,

buffer, /* 缓存的第一个字节 */

size, /* 缓存的大小(以字节表示) */

0, /* face索引 */

&face );

if ( error ) { ... }

如你所看到的,FT_New_Memory_Face简单地用字体文件缓存的指针和它的大小(以字节计算)代替文件路径。除此之外,它与FT_New_Face的语义一致。

3.4.3从其他来源装载(压缩文件,网络,等)

使用文件路径或者预装载文件到内存是简单的,但还不足够。FreeType 2可以支持通过你自己实现的I/O 程序来装载文件。

这是通过FT_Open_Face函数来完成的。FT_Open_Face可以实现使用一个自定义的输入流,选择一个特定的驱动器来打开,乃至当创建该对象时传递外部参数给字体驱动器。我们建议你查阅“FreeType 2参考手册”,学习如何使用它。

3.5 访问face内容

一个face对象包含该face的全部全局描述信息。通常的,这些数据可以通过分别查询句柄来直接访问,例如face->num_glyphs。

FT_FaceRec结构描述包含了可用字段的完整列表。我们在这里详细描述其中的某些:

Num_glyphs

这个值给出了该字体face中可用的字形(glyphs)数目。简单来说,一个字形就是一个字符图像。但它不一定符合一个字符代码。

Flags

一个32位整数,包含一些用来描述face特性的位标记。例如,标记FT_FACE_FLAG_SCALABLE用来指示该face的字体格式是可伸缩并且该字形图像可以渲染到任何字符象素尺寸。要了解face标记的更多信息,请阅读“FreeType 2 API 参考”。

Units_per_EM

这个字段只对可伸缩格式有效,在其他格式它将会置为0。它指示了EM所覆盖的字体单位的个数。

Num_fixed_size

这个字段给出了当前face中嵌入的位图的个数。简单来说,一个strike就是某一特定字符象素尺寸下的一系列字形图像。例如,一个字体face可以包含象素尺寸为10、12和14的strike。要注意的是即使是可伸缩的字体格式野可以包含嵌入的位图!

Fixed_sizes

一个指向FT_Bitmap_Size成员组成的数组的指针。每一个FT_Bitmap_Size指示face中的每一个strike 的水平和垂直字符象素尺寸。

注意,通常来说,这不是位图strike的单元尺寸。

3.6设置当前象素尺寸

对于特定face中与字符大小相关的信息,FreeType 2使用size对象来构造。例如,当字符大小为12点时,使用一个size对象以1/64象素为单位保存某些规格(如ascender或者文字高度)的值。

当FT_New_Face或它的亲戚被调用,它会自动在face中新建一个size对象,并返回。该size对象可以通过face->size直接访问。

注意:一个face对象可以同时处理一个或多个size对象,但只有很少程序员需要用到这个功能,因而,我们决定简化该API,(例如,每个face对象只拥有一个size对象)但是这个特性我们仍然通过附加的函数提供。

当一个新的face对象建立时,对于可伸缩字体格式,size对象默认值为字符大小水平和垂直均为10象素。对于定长字体格式,这个大小是未定义的,这就是你必须在装载一个字形前设置该值的原因。

使用FT_Set_Char_Size完成该功能。这里有一个例子,它在一个300x300dpi设备上把字符大小设置为16pt。

error = FT_Set_Char_Size(

face, /* face对象的句柄 */

0, /* 以1/64点为单位的字符宽度 */

16*64, /* 以1/64点为单位的字符高度 */

300, /* 设备水平分辨率 */

300 ); /* 设备垂直分辨率 */

注意:

z字符宽度和高度以1/64点为单位表示。一个点是一个1/72英寸的物理距离。通常,这不等于一个象素。z设备的水平和垂直分辨率以每英寸点数(dpi)为单位表示。显示设备(如显示器)的常规值为72dpi或96dpi。

这个分辨率是用来从字符点数计算字符象素大小的。

z字符宽度为0意味着“与字符高度相同”,字符高度为0意味着“与字符宽度相同”。对于其他情况则意味着指定不一样的字符宽度和高度。

z水平或垂直分辨率为0时表示使用默认值72dpi。

z第一个参数是face对象的句柄,不是size对象的。

这个函数计算对应字符宽度、高度和设备分辨率的字符象素大小。然而,如果你想自己指定象素大小,你可以简单地调用FT_Set_Pixel_Sizes,就像这样:

error = FT_Set_Pixel_Sizes(

face, /* face对象句柄 */

0, /* 象素宽度 */

16 ); /* 象素高度 */

这个例子把字符象素设置为16x16象素。如前所说的,尺寸中的任一个为0意味着“与另一个尺寸值相等”。注意这两个函数都返回错误码。通常,错误会发生在尝试对定长字体格式(如FNT或PCF)设置不在face->fixed_size数组中的象素尺寸值。

比特币0.9.2版编译中文手册

比特币0.9.2中文版编译手册 日期:2014-07-01 构建比特币源码,是一件十分费时费力的工作,尤其在windows系统中编译比特币源码更加的麻烦,经过一两天努力,终于在windows7 64位系统中成功编译出了比特币源文件。现在总结如下,首先准备一套干净的windows7 64位操作系统,最好是使用vbox或者vmware 虚拟机建立一个专用系统,这样的可以防止其它干扰导至编译失败,接下来说说,我的编译过程: 1.安装msys系统 msys作用是在windows系统中重建linux系统编译环境,在msys系统下操作,就像linux 中的操作一样,具有相同的语法命令。从下面的网址中下载msys最新版: https://www.wendangku.net/doc/db6833805.html,/projects/mingw/files/Installer/mingw-get-setup.exe/download 然后运行mingw-get-setup.exe文件后,选择安装目录为H:\MinGW,之后软件会首先更新下载库,更新成功会弹出一个窗口MinGW installation manager,在这个窗口中,只下载msys相关的包文件,不要下载mingw相关文件,因为不使用它带的这个mingw。 主要如下面所示: msys-base-bin msys-autoconf-bin msys-automake-bin msys-libtool-bin 选择好之后,点击Installation->Apply changes即可。一定要确保mingw包没有被下载,这里我们只需要msys相关系统,也要确保msys-gcc和msys-w32api等包没有被下载,否则当我们执行编译时,可能会调用这些不该出现的包文件,而导至编译失败。 2.安装perl系统 由于在编译比特币时,需要调用一些perl脚本,所以从下面的网址中下载一个perl安装程序,然后安装即可。 https://www.wendangku.net/doc/db6833805.html,/ActivePerl/releases/5.18.1.1800/ActivePerl-5.18.1.1800-M SWin32-x64-297570.msi

交叉编译几种常见的报错

交叉编译几种常见的报错 由于是第一次交叉编译,不知道会出现什么问题,思路就是先把gcc和ld都改成arm的,然后遇到什么问题在解决什么问题,以下过程都是在这个思路下进行。 1.指定arm的编译器和连接器: 只是把gcc改为arm-none-linux-gnueabi-gcc,ld改为arm-none-linux-gnueabi-ld,其他的都没有 修改。出现以下错误: arm-none-linux-gnueabi-ld: warning: library search path "/usr/local/lib" is unsafe for cross-compilation arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.so when searching for -lfreetype arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.a when searching for -lfreetype arm-none-linux-gnueabi-ld: cannot find -lfreetype 分析原因是:链接的这些库文件都是在PC编译器下编译出来的,现在把它们和用arm-none-linux-gnueabi-gcc编译出来的文件做链接,当然会出错。 解决方法:这些库重新用arm-gcc重新编译生成相应的库。 下面使用是重新编译库文件的过程: 重新编译freetype 根据交叉编译的文档,我创建了一个文件夹/usr/local/arm-linux来存放编译后的库文件。执行: ./configure –host=arm-none-linux-gnueabi –prefix=/usr/local/arm-linux 注意:host的参数应该是交叉编译环境的前缀。 另外,freetype自动生成的include文件夹有点小问题,编译完成后的include目录结构是 /include/ft2build.h和

Word中MathType公式调整的一些技巧

Word中MathType公式调整的一些技巧 一、批量修改公式的字号和大小 数学试卷编辑中,由于排版等要求往往需要修改公式的大小,一个一个的修改不仅费时费力,还容易产生各种错误。如果采用下面介绍的方法,就可以达到批量修改公式大小的效果。 (1)双击一个公式,打开MathType,进入编辑状态; (2)点击size(尺寸)菜单→define(自定义)→字号对应的pt(磅)值,一般五号对应10pt(磅),小四对应12pt(磅); (3)根据具体要求调节pt(磅)值,然后点击OK(确定)按钮; (4)然后点击preference(选项)→equation preference (公式选项)→save to file(保存到文档),保存一个与默认配置文件不同的名字,然后关闭MathType 回到Word文档; (5)点击Word界面上的菜单MathType→format equations(公式格式)→load equation preferrence(加载公式选项),点击选项下面的browse(浏览)按钮,选中刚才保存的配置文件,并点选whole document(整个文档)选项,最后单击OK(确定)按钮。 到此,就安心等着公式一个个自动改过来吧…… 但这样处理后,下次使用Word文档进行MathType公式编辑时,将以上述选定的格式作为默认设置。如果需要恢复初始状态,可以按以下步骤操作:(1)双击一个公式,打开MathType,进入编辑状态; (2)然后点击preference(选项)→equation preference (公式选项)→Load factory settings(加载出厂设置),然后关闭MathType回到Word文档。 二、调整被公式撑大的Word行距 点击“文件”菜单下的“页面设置”项。在“文档网格”标签页中的“网格”一栏,勾选“无网格”项。 但此时也存在一个问题,就是此时的行间距一般比预期的行间距要小。这时

FreeType的缓存

FreeType的缓存.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。别把虾米不当海鲜。 FreeType的缓存子系统提供了一个高性能的管理face、size、glyph image和charmap的途径。 I. Requirements and Design Goals: When dealing with fonts, caching rapidly becomes a necessity for at least the following reasons: 当处理字体时,高速缓存是必要的,原因如下: l 打开字体文件是相当慢的,因为它需要加载数据到内存中。所以,尽可能地保持FT_Face对象处于打开状态是一个好主意。 l 每一个FT_Face 或 FT_Size对象会占用几百KB,假设它总是很大,应该限制打开的face的个数到最小。 l 每个face包含成百上千的字形,由于通常只是使用一个face中的一小部分字形,一次性加载所有的字形是完全没有必要的。应该缓存我们经常使用的字形。 l 当属于给定face的所有字形已经载入内存时,对应的FT_Face对象可以被关闭已减少内存的占用。 FreeType缓存子系统提供了自动完成上述任务的很好的途径。 II. The Cache Manager: FTC_Manager用于处理缓存中的各种数据。应首先调用FTC_Manager_New 来创建它。 1. 通过FTC_FaceID鉴别face: FTC_Manager并不直接知晓哪些字体被安装了或者在运行期是否有效。应用程序有责任定位和鉴别face,并打开相应的字体文件。这意味着应用程序必须使用一个指针(FTC_FaceID)来唯一鉴别一个给定的有效的或已安装的face。虽然这个指针对于FTC_Manager来说并不重要,但是它们的值在程序运行期必须始终保持不变,用于关联缓存的数据和它们相应的face。 应用程序也必须提供(在FTC_Manager_New期间)一个专门的回调函数FTC_Face_Requester。这个外观请求器管理从一个给定的FTC_FaceID转换到一个新FT_Face对象,这通常暗示着调用FT_New_Face 或FT_Open_Face。

(完整版)Word中使用MathType使公式自动编号

Word中使用MathType使公式自动编号,并可左对齐,右对齐 2011-05-31 13:09:12| 分类:杂七杂八| 标签:|字号大中小订阅 MathType是一款功能强大的数学公式编辑器,与常见的文字处理软件和演示程序配合使用,能够在各种 文档中加入复杂的数学公式和符号。它的另一优势就是可以插入带编号公式,建立编号与公式的关联,并 能自动更新编号,避免了人工改编号的麻烦和错误。 一、安装及界面(以 6.5中文版为例) 安装完MathType之后,在word软件中,会生成一个工具栏(如下),在word菜单栏也会有个MathType的菜单项,列出了MathType的一般功能。 Mathtype编辑器的界面如下: 只要通过工具栏就可以很方便的进行公式编辑,如希腊字母、上标下标、积分号、求和、分数、矩阵等。相信大家浏览一下工具栏的选项就能明白它们的用法,这里不做赘述。这里要讲的是一些细节性 的东西。在此要记住一句话,凡是你在书上见过的公式格式,mathtype都能做出来。 二、在word软件中使用MathType。

在word中,MathType工具栏各按钮的功能如下图: 1.插入公式说明 前四项都是在word中插入公式,点任何一项都会打开MathType编辑器。 用于在正文段落中插入小公式或变量符号等; 1)“Insert Inline Equation” 2)“Insert Display Equation” 用于插入无编号公式,第三、四项顾名思义就是插入带左、右编号的公式,这三项都是用于插入单独占一行的公式,如下图:

2.首次参数配置 在写论文时,用到较多的是第一、四项。首次使用带右编号的公式“Insert Display Equation, Number on Right”时,会弹出一个提示框,如下图: 的是输入公式的章、节号,一般学位论文中公式用“章号(chapter)+公式序号”格式,如(1.1),不写节号(section),如(1.1.1)。Mathtype默认公式编号为“节号+公式序号”,通过菜单栏“MathType---Format Equation Numbers…”打开下图窗口,可以更改公式编号的数字格式、括号形式、分隔符等。(下图选项是章号+公式序号,小括号,圆点隔开)。

操作系统

第7章移动互联网技术 7.1 移动操作系统 智能手机操作系统是一种运算能力及功能比传统功能手机更强的操作系统。使用最多的操作系统有:Android、iOS、Symbian、Windows Phone和BlackBerry OS。他们之间的应用软件互不兼容。因为可以像个人电脑一样安装第三方软件,所以智能手机有丰富的功能。智能手机能够显示与个人电脑一致的正常网页,它具有独立的操作系统以及良好的用户界面,拥有很强的应用扩展性、能方便随意地安装和删除应用程序。 7.1.1 Android概述 Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟进行开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android 在全球的市场份额首次超过塞班系统,跃居全球第一。 7.1.1.1Android系统架构 图android 系统架构图

1)Linux 内核层: Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。 2)Android 运行时环境: a)Android 核心库:提供了JA V A库的大多数功能 b)Dalvik 虚拟机: 依赖于linux 内核的一些功能,比如线程机制和底层内存管理机制。同时虚拟机是基于寄存器的。Dalvik 采用简练、高效的byte code 格式运行,它能够在低资耗和没有应用相互干扰的情况下并行执行多个应用,每一个Android 应用程序都在它自己的进程中运行,并且都拥有一个独立的Dalvik 虚拟机实例。Dalvik 虚拟机中可执行文件为.dex文件,该格式文件针对小内存使用做了优化。所有的类都经由JA V A 编译器编译,然后通过SDK中的"dx" 工具转化成.dex 格式由虚拟机执行。 3)类库: a)系统C 库(libc):专门为基于embedded linux的设备定制的。 b)媒体库:支持多种常用的音频、视频格式回放和录制,同时支持静态图像文 件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG。 c)SurfaceManager :对显示子系统的管理,并且为多个应用程序提供了2D和 3D 图层的无缝融合

MathType使用技巧

目录 1 详解MathType中如何批量修改公式字体和大小 (2) 2 如何在等号上插入容 (3) 3 详解MathType快捷键使用技巧 (3) 4 数学上的恒不等于符号怎么打 (3) 5 MathType表示分类的大括号怎么打 (3) 6 编辑公式时如何让括号的容居中 (3) 7 MathType怎么编辑叉符号 (3) 8 怎样用MathType编辑竖式加减法 (3) 9 如何用MathType编辑除法竖式 (3) 10 如何用MathType编辑短除法 (3) 如何调整MathType矩阵行列间距 (3) 12在MathType中怎样表示将公式叉掉 (3) 13 MathType怎么输入字母上方的黑点 (3) 14 MathType如何编辑大于或约等于符号 (3)

1 详解MathType中如何批量修改公式字体和大小 MathType应用在论文中时,有时会因为排版问题批量修改公式字体和大小,一个一个的修改不仅费时费力,还容易出现错误,本教程将详解如何在MathType公式编辑器中批量修改公式字体和大小。批量修改公式字体和大小的操作步骤: 步骤一双击论文中的任意一个公式,打开MathType公式编辑器软件。 步骤二单击菜单栏中的大小——定义命令,打开“定义尺寸”对话框。如果使用的是英文版MathType,点击size——define即可。 步骤三在“定义尺寸”对话框中,通过更改pt值的大小可以达到修改MathType字体的效果。英文版下为“Full”。

一般情况下,五号字对应的pt值为10,小四号字对应的pt值为12。因为“磅”是大家比较熟悉的单位,用户也可以将pt值换成“磅”来衡量。 步骤四菜单栏中的选项——公式选项——保存到文件,选择保存路径。英文版的MathType点击preference——equation preference —— save to file 步骤六关闭MathType软件后,点击word文档中的MathType——Insert Number——format equation,打开format equation对话框。

《The design of FreeType 2》中译版

《The design of FreeType 2》中译版 介绍 这份文档提供了FreeType 2函数库设计与实现的细节。本文档的目标是让开发人员更好的理解FreeType 2是如何组织的,并让他们扩充、定制和调试它。 首先,我们先了解这个库的目的,也就是说,为什么会写这个库: * 它让客户应用程序方便的访问字体文件,无论字体文件存储在哪里,并且与字体格式无关。* 方便的提取全局字体数据,这些数据在平常的字体格式中普遍存在。(例如:全局度量标准,字符编码/字符映射表,等等) * 方便的提取某个字符的字形数据(度量标准,图像,名字,其他任何东西) * 访问字体格式特定的功能(例如,SFNT表,多重控制,OpenType轮廓表) Freetype 2的设计也受如下要求很大的影响: * 高可移植性。这个库必须可以运行在任何环境中。这个要求引入了一些非常激烈的选择,这些是FreeType2的低级系统界面的一部分。 * 可扩展性。新特性应该可以在极少改动库基础代码的前提下添加。这个要求引入了非常简单的设计:几乎所有操作都是以模块的形式提供的。 * 可定制。它应该能够很容易建立一个只包含某个特定项目所需的特性的版本。当你需要集成它到一个嵌入式图形库的字体服务器中时,这是非常重要的。 * 简洁高效。这个库的主要目标是只有很少cpu和内存资源的嵌入式系统。 这份文档的其他部分分为几个部分。首先,一些章节介绍了库的基本设计以及Freetype 2内部对象/数据的管理。 接下来的章节专注于库的定制和与这个话题相关的系统特定的界面,如何写你自己的模块和如何按需裁减库初始化和编译。 一、组件和API FT可以看作是一组组件,每个组件负责一部分任务,它们包括 * 客户应用程序一般会调用FT高层API,它的功能都在一个组件中,叫做基础层。 * 根据上下文和环境,基础层会调用一个或多个模块进行工作,大多数情况下,客户应用程序不知道使用那个模块。 * 基础层还包含一组例程来进行一些共通处理,例如内存分配,列表处理、io流解析、固定点计算等等,这些函数可以被模块随意调用,它们形成了一个底层基础API。 如下图,表明它们的关系:

应用freetype开发描边字体

应用freetype开发描边字体 在天龙八部,聊个斋这些国产的游戏中,都用到了freetype,并使用到freetype提供的描边生成方法。 关于freetype怎么应用描边,有个sample,链接如下 https://www.wendangku.net/doc/db6833805.html,/freetype2/docs/tutorial/example2.cpp 但是这个sample中的生成描边的方式是低效率的,因为是间接生成的,在描绘函数里面得到span的信息,然后又遍历了span再生成bitmap,最后再输出。 经过我一个通宵研究,我想出了一个更为直接的描绘方式。 只要把这个sample中间的一部分替换成如下代码就可以了: FT_Outline *outline = &reinterpret_cast(glyph)->outline; FT_Glyph_Get_CBox(glyph, FT_GL YPH_BBOX_GRIDFIT, &bbox); int width = (bbox.xMax - bbox.xMin)>>6; int rows = (bbox.yMax - bbox.yMin)>>6; bmp.buffer = new unsigned char[width * rows]; memset(bmp.buffer, 0, width * rows); bmp.width = width; bmp.rows = rows; bmp.pitch = width; bmp.pixel_mode = FT_PIXEL_MODE_GRAY; bmp.num_grays = 256; memset(¶ms, 0, sizeof (params)); params.source = outline; params.target = &bmp; params.flags = FT_RASTER_FLAG_AA; FT_Outline_Translate(outline,-bbox.xMin,-bbox.yMin); FT_Outline_Render(library, outline, ¶ms); save_edge_buffer = bmp.buffer; FT_BBox bbox_in; FT_Glyph glyph_fg; FT_Get_Glyph(size->face->glyph, &glyph_fg); FT_Glyph_Get_CBox(glyph_fg, FT_GL YPH_BBOX_GRIDFIT, &bbox_in); bmp.buffer = new unsigned char[width * rows]; memset(bmp.buffer, 0, width * rows); bmp.width = width; bmp.rows = rows;

MathType使用技巧大全

MathType是“公式编辑器”的功能强大而全面的版本。如果要经常在文档中编排各种复杂的数学、化学公式,则MathType是非常合适的选择。MathType用法与“公式编辑器”一样简单易学,而且其额外的功能使你的工作更快捷,文档更美观。 MathType包括: (1)Euclid字体设置了几百个数学符号。 (2)具有应用于几何、化学及其他方面的新样板和符号。 (3)专业的颜色支持。 (4)为全球广域网创建公式。 (5)将输出公式译成其他语言(例如:TeX、AMS-TeX、LaTeX、MathML及自定义语言)的翻译器。 (6)用于公式编号、格式设置及转换Microsoft Word文档的专用命令。 (7)可自定义的工具栏,可容纳最近使用过的几百个符号、表达式和公式。 (8)可自定义的键盘快捷键。 在编辑word文档时,如果需要录入公式将是一件非常痛苦的事情。利用M athtype作为辅助工具,会为文档的公式编辑和修改提供很多方便。下面介绍几种mathtype中比较重要的技巧 一、批量修改公式的字号和大小 论文中,由于排版要求往往需要修改公式的大小,一个一个修改不仅费时

费力还容易使word产生非法操作。 解决办法,批量修改:双击一个公式,打开mathtype,进入编辑状态, 点击size菜单->define->字号对应的pt值,一般五号对应10pt,小四对应12pt 其他可以自己按照具体要求自行调节。其他默认大小设置不推荐改动。 然后点击preference->equation preference -> save to file ->存一个与默认配置文件不同的名字,然后关闭mathtype回到word文档。 点击word界面上的mathtype ->format equation -> load equation pr eferrence选项下面的browse按钮,选中刚才存的配置文件,点选whole doc ument选项,确定,就安心等着公式一个个改过来。 word中被行距被撑大的解决方法 -------------------------- 在Word文档中插入公式后,行距便会变得很大,简单的调整段落的行距是行不通的。逐个点选公式,然后拖动下角的箭头倒可以将它任意放大缩小以调整行距,但是如果在一篇文档中使用了大量的公式,这种操作显然太麻烦,手工操作也容易使得公式大小不一,一些小的公式还会影响到显示的效果。下面介绍两种调整公式行距的方法: ·全部一次调整 依次单击菜单命令“文件→页面设置”。单击“文档网格”选项卡,如图1所示。选中“无网格”,单击“确定”按钮就可以了。

几种GUI比较

几种嵌入式GUI介绍 一、MicroWindows Century软件公司维护的,较早出现的开放源代码的嵌入式嵌入式GUI 特点: 1主要特色:提供较为完善的图形功能,支持多种外部设备输入,包括LCD、鼠标和键盘等。 2核心是基于显示设备接口的,绝大部分使用C语言开发的,移植性很强。 3主要在linux、wince等操作系统上运行。 4对硬件资源的需求: 文件存储空间:100k-600k 输入输出接口:支持frambuffer ,支持每像素1、2、4、8、16、24、32.支持彩色和灰度显示。支持鼠标、键盘、触摸屏。 CPU:支持intel 16位32位,MIPS R4000、ARM。 二、Qt/Embedded(简称QtE) QtE是一个专门为嵌入式系统设计图形用户界面的工具包,挪威Trolltech 公司产品。1995年正式发行第一个版本Qt0.9。Linux桌面系统的KDE 就是基于Qt库开发的,Qt与linux操作系统的兼容性最好。

特点: 1主要特色:支持多种平台,移植时只需重新编译代码而不需要对代码进行修改。 2模块化,可剪裁,极其适合嵌入式系统的“小而快”的要求。 3用C++编写,为开发者提供清晰的框架。 4 For free 版本代码完全开放。https://www.wendangku.net/doc/db6833805.html, 三、uc/GUI uC/GUI是一个通用的嵌入式应用的图形模块,它是美国Micrium公司开发的一种高效的、与处理器和LCD控制器独立的通用GUI,可以适用各种CPU和LCD,uC/GUI完全以ANSI-C编写,因此它与处理器无关,在单任务和多任务操作系统都可以很好的应用、可以很方便地移植到不同的操作系统和嵌入式微处理器上,并可支持不同尺寸的图形液晶显示器。它采用层次化的设计,功能强大,移植方便,被广泛地应用于嵌入式领域,如PDA、机顶盒以及DVD NCD播放机等 (1)支持任何8位、16位和32位的CPU,只要求CPU具有相应的ANSI-C编译器即可; (2)所有硬件接口定义都使用可配置的宏; (3)字符、位图可显示与LCD的任意点,并不限制与字节长度的整数倍数地址; (4)所有程序在长度和速度方面都进行了优化,结构清晰;

word公式编辑器MathType使用技巧

word公式编辑器MathType使用技巧 当你在用mathtype编辑公式的时候,是否因频繁的鼠标点击而对这个软件颇有抱怨,其实mathtype 的研发人员早就替你想到了这一点并给出了解决的方案。 1. 常见的数学符号的快捷键(Ctrl是王道) (1) 分式 Ctrl+F(分式) Ctrl+/(斜杠分式) (2) 根式 Ctrl+R(根式) 先按“Ctrl+T”,放开后,再按N(n次根式)。 例如,先按“Ctrl+T”,放开后,再按N,然后在空格中分别填入2,3就得到2的3次方根。 (3) 上、下标 Ctrl+H(上标)例如,按y Ctrl+H+2 就得到 Ctrl+L(下标)例如,按y Ctrl+L+2就得到 Ctrl+J(上下标)例如,按y Ctrl+J 然后在空格中分别填入2,3就得到 (4) 不等式 先按“Ctrl+K”,放开后,再按逗号,就得到小于等于符号≤ 先按“Ctrl+K”,放开后,再按句号,就得到大于等于符号≥ (5) 导数、积分 Ctrl+Alt+'(单撇(导数符号)) Ctrl+Shift+”(双撇(二阶导数符号)) Ctrl+I(定积分记号) Ctrl+Shift+I, ! (不定积分记号) (6)上横线、矢量箭头 Ctrl+Shift+连字符(上横线) Ctrl+Alt+连字符(矢量箭头) (7)括号快捷键(效率提高50% o(∩_∩)o ) Ctrl+9或Ctrl+0(小括号) Ctrl+[或Ctrl+](中括号) Ctrl+{ 或Ctrl+}(大括号) (8)放大或缩小尺寸,只是显示,并不改变字号 Ctrl+1(100%) Ctrl+2(200%)

字体美化

Ubuntu 8.10Ubuntu 8.10字体美化原理初步探索字体美化原理初步探索 前言 本人(Gary)对操作系统的美观要求颇高,因为没有一个看上去舒服的系统就很难激发学习使用的热情。而Linux跟Windows相比在字体显示的美观度方面(特指汉字)差距颇大。一来微软投入了大量的资源和财力开发出了一些特定的商业字库供Windows使用,而来Windows本身也是以易用性强著称,所以微软在背后也做了大量的工作让使用者安装好系统就能近乎完美的浏览各种文档和页面。即使默认没有安装某种字体或者字库,想要增加也仅仅靠点击几下鼠标就能达到目的,不可谓不是已经做到极致。老实说至少在这个方面不管哪个Linux的发行版都是比不上。 虽然如此,但是由于Linux自身功能的强大性和自由性,我坚信可以定制修改出一个让人满意的字体显示效果,但是要达到这个目的可不是点点鼠标就可以的,背后隐藏着很多的知识。对于像我这样未入门的人来说门槛有些高。虽然网上有很多美化的方法和步骤,可是在我尝试过后都不是那么令人满意。主要有这样几个方面的问题:1. 每个人的系统安装情况不同,你有安装过的包我不一定装了。你方便找到或者安装上的包对于我来说却可能非常困难;2. 命令繁杂且都没有任何说明,让人难以理解,特别是对于初学者;3.美化以后绝大部分总会留有美中不足,比如大部分都好看了,可是某某某应用程序还是不行之类的事情经常发生;4.即使幸运的美化好了让你重新帮别人再弄一次估计都很难重现,因为根本不懂原理或者理解很浅薄容易遗忘。我就是因为上面4点原因因此决心好好研究一下Linux系统下的字体系统,以我目前新装上的Ubuntu 8.10为蓝本在网上搜索了大量的相关文章撰写本文,只是来源琐碎,有一些来源链接丢失了,实在是不好意思。不过本文也融入了大量的个人理解,并且修正了很多的错误。大家可以随意转载,没有任何限制,也不用通知本人,只需要连同前言部分也一起转载就可以了。如有错误欢迎批评指正,以便及时修正,免得误人子弟。 如有问题需要探讨请发送邮件到 预备知识 1.1.有衬线字体有衬线字体有衬线字体((Serif Serif)、)、)、无衬线字体无衬线字体无衬线字体((Sans Serif)Sans Serif)和等宽字体和等宽字体和等宽字体((Monospace Monospace)) 初看到“衫线”这个词时候以为是衬衫,心想字体还分什么有衬衫无衬衫?仔细一看才发现看错了,在字典里面查了一下发现原来“衫线”是一个术语起源于荷兰语,指字母的拐角或端点位置的修饰线。(如下图所示) 我们平时所用的Times New Roman、Georgia等就属于有衫线字体(Serif),而Arial、Tahoma、Verdana 等则属于无衫线字体(Sans Serif)。对中文而言,同样存在这两大种类,很明显,宋体、细明体(繁体中常用)等就属于Serif,而黑体、幼圆等则属于Sans Serif。总结一下个人觉得有衫线字体(Serif)就是有棱角而且粗细不一的,无衫线字体(sans serif)就是相对比较圆滑而且粗细均匀的字体。正是由于这个特性使得无衬衫字体(Sans Serif)比较醒目,而且字体较小的时候依然容易辨认,而有衫线字体(Serif)由于强调笔画始末,因此前后字母看上去连续性更强,适合阅读,可是字号小了以后有些细的地方就变得更细显得模糊或者发虚,但是大的时候却更有型。因此各有利弊,不同场合应该选择不同的字体来显示,这样才更加美观,也使得本文更有意义。 上面这两种字体类别又叫比例字体(Proportional Font),另外还有一种字体叫做等宽字体 (Monospace Font)。顾名思义就是字符宽度相等。在等宽字体中,字母 i,j 显得两侧餘白较多,

MathType_使用技巧教程

1、Aurora 方程的类型 在Aurora中有三种类型方程,分别为:inline, display和numbered display。inline 是指该方程与其它的文字混在一起,构成文档的一行,可以理解为行内方程。display类型是指该方程单独构成一个段落,并且居中显示,可以理解为行间显示的方程。numbered display类型就是带数字标号的行间显示。 2、快捷键 Microsoft Word 为了避免跟其他应用程序冲突, 在word里使用Aurora快捷键大多数都是以开头。例如,你想插入一个行间方程,一直按住 ,再按 然后放开两键,再按。 我装word的版本比较老所以我的word里面的快捷键是开头 Insert inline equation Insert display equation Insert numbered equation Edit equation on the left Edit equation on the right Insert equation number Insert equation reference Insert section break Show/hide (toggle) section markers Format equation numbers Manage equation numbering

中文 LyX 使用简介

中文LyX 使用简介 小虫 LyX 这个程式在Linux 上面出现已经有一段时间了,也很早就可以支援中文的使用,其实已经可以作为在Linux 上面进行文书排版工作的很好用的解决方案,可惜的是,这支程式在国内似乎并没有受到足够的重视,没有被大家广泛接受并使用;作为一个从一年多以前就完全利用LyX 来处理日常文件排版工作的Linux 使用者,小虫想要利用这篇短短的文章来跟大家简单介绍一下LyX 的使用,并且稍稍分说LyX 这套排版系统跟Word 等程式的不同,希望能够让大家来认识一下LyX 配合LA TEX-CJK 的这套排版系统,进而让Linux 也可以帮大家处理日常的文件排版工作。 1 什么是LyX? 在谈论LyX 之前,要先请读者认识一下TEX 跟LA TEX 是甚么东东;1984 年的时候,Donald Knuth 教授为了他自己即将出版的新书排版美观的要求,开发了TEX 这套排版程式,提供一套语言来供使用者作文书排版的工作,并且还可以输出非常精美的文件,特别是在处理数学式子的时候TEX 特别的好用,所以这个系统马上受到广泛的爱用,现在还有不少人在撰写科学论文的时候还是习惯用TEX 来排版呢,美国物理学会跟数学学会都直接接受TEX 格式的文件投稿,可见得TEX 在科学论文方面的普遍性,不过,TEX 的指令太繁复了,使用起来并不是很方便,所以后来Leslie Lamport 在TEX 之上用巨集加入了许多扩充功能,发展出了更方便的LA TEX 系统,TEX/LA TEX 是幕后排版系统,他们利用指令来指定文件的种类跟文章内容的编排方式,所以说用LA TEX 来写文章就好像在写程式一样,虽然功能强大,可是入门的门槛可不低,使用上也不太方便;目前市面上有好几本讲述LA TEX 的中文书籍,想多了解LA TEX 的朋友可以自行去找来看看。 鉴于LA TEX 的学习不易,有心人士便替LA TEX 创造一个图形化的操作介面,那就是LyX 这一支程式啦,LyX 让使用者可以用"近乎" 所见即所得(What Y ou See Is What Y ou Get, WYSIWYG) 的方式来编排文件,不必再去记一堆LA TEX 的指令就可以编排文件了。既然称之为一个"前端介面",可想而知,LyX 其实只负责提供一个图形介面来方便使用者的操作,它本身其实并不负责文件的排版跟列印输出等等工作的,LyX 会将使用者编排的文件转成LA TEX 格式的档案,然后再呼叫系统里面的LA TEX 套件来进行排版的工作,产生排版的结果,所以要使用LyX 的话,系统上还要有LA TEX 才行。

mathtype使用方法

当你在用mathtype编辑公式的时候,是否因频繁的鼠标点击而对这个软件颇有抱怨,其实mathtype的研发人员早就替你想到了这一点并给出了解决的方案,只是我们往往“满足”于“鼠标流”而没有去进一步的探究,但是,现在还不晚.... 1. 常见的数学符号的快捷键(Ctrl是王道) (1) 分式 Ctrl+F(分式) Ctrl+/(斜杠分式) (2) 根式 Ctrl+R(根式) 先按“Ctrl+T”,放开后,再按N(n次根式)。 例如,先按“Ctrl+T”,放开后,再按N,然后在空格中分别填入2,3就得到2的3次方根。 (3) 上、下标 Ctrl+H(上标)例如,按y Ctrl+H+2 就得到 Ctrl+L(下标)例如,按y Ctrl+L+2就得到 Ctrl+J(上下标)例如,按y Ctrl+J 然后在空格中分别填入2,3就得到 (4) 不等式 先按“Ctrl+K”,放开后,再按逗号,就得到小于等于符号≤ 先按“Ctrl+K”,放开后,再按句号,就得到大于等于符号≥ (5) 导数、积分 Ctrl+Alt+'(单撇(导数符号)) Ctrl+Shift+”(双撇(二阶导数符号)) Ctrl+I(定积分记号) Ctrl+Shift+I, ! (不定积分记号) (6)上横线、矢量箭头 Ctrl+Shift+连字符(上横线) Ctrl+Alt+连字符(矢量箭头) (7)括号快捷键(效率提高50% o(∩_∩)o ) Ctrl+9或Ctrl+0(小括号) Ctrl+[或Ctrl+](中括号) Ctrl+{ 或Ctrl+}(大括号)

(8)放大或缩小尺寸,只是显示,并不改变字号 Ctrl+1(100%) Ctrl+2(200%) Ctrl+4(400%) Ctrl+8(800%) (9)空格和加粗 Ctrl+Shift+Space 空格 Ctrl+Shift+B 加粗 (如果你要问如何记下这些快捷键,其实只要注意把那些字母和英文对应就很好记忆了。比如,R代表Root,F代表Fraction,I代表Integate,H代表Higher等等) 2.希腊字母 先按“Ctrl+G”,放开后,再按英语字母字母得到相应的小写希腊字母;如果再按“Shift+字母”,得到相应的大写希腊字母。 例如,先按“Ctrl+G”,放开后,再按字母A得到小写希腊字母α。 又如,先按“Ctrl+G”,放开后,再按“Shift+S”,得到大写希腊字母Σ。 3.添加常用公式 MathType的一大特色就是可以自己添加或删除一些常用公式,添加的办法是:先输入我们要添加的公式,然后选中该公式,用鼠标左键拖到工具栏中适当位置即可。删除的方式是右击工具图标,选择“删除”命令即可。 4.元素间跳转 每一步完成后转向下一步(如输入分子后转向分母的输入等)可用Tab键,换行用Enter 键

嵌入式Linux系统下的汉字处理和显示

嵌入式Linux系统下的汉字处理和显示本文阐述在嵌入式Linux环境下通过汉字编码的转换,汉字字体的提取,实现对汉字的处理和显示。所提出的解决方案,在嵌入式Linux环境下,可以不依赖于MicroWindows、MiniGUI等嵌入式图形界面接口软件实现汉字的处理与显示。 1 汉字编码的处理 由于传统的计算机字符内码ASCII码最多只能包含256个字符,只能包含英文字符和其他常用字符,而不能包含其它语言的字符,尤其是汉字。因此不同的组织机构又制定了包含汉字的字符编码标准。GB编码是由我国政府颁布的国家标准,经过不断扩充,形成了GB2312、GB13000(GBK)、GB18030标准;BIG-5码是主要由使用繁体字的地区采用的标准;Unicode编码是由Unicode协会为包含汉字在内的各种语种字符制定的统一字符集标准,同时兼容于国际标准ISO 10646,但是不兼容GB编码。Unicode编码又有UTF8等实现形式,一般Unicode指UCS-2规范。 在嵌入式Linux系统下使用的汉字,其来源大致可以分为: 1.程序字符串常量中的汉字; 2.文本文件或其它资源文件。 因为各种源文件编辑器、文本文件编辑器或资源文件来源的不同、网络环境的不同。因此嵌入式Linux系统下使用的汉字也体现为各种不同的编码格式,需要进行编码格式的转换,才能够对汉字进行正确的处理。 嵌入式Linux系统应用开发所使用的程序源文件和文本文件,一般是来自于Windows操作系统下的编辑工具,或Linux桌面操作系统下的编辑工具。Windows操作系统下的常用文本编辑器,如Notepad、UltraEdit等,缺省的文件编码保存格式是ASCII码,其中的汉字以GB编码保存。Linux XWindow下的图形界面文件编辑器gEdit,也以ASCII码作为缺省的文本保存编码,其中的汉字以UTF-8编码保存。 嵌入式Linux系统所使用的程序编译工具,如gcc、g++系列工具,按照ASCII码格式对源文件进行分析和编译,对于字符串常量中的字符,则不加区别,按原有编码格式编译进入目标文件。

MathType使用技巧

MathType使用技巧 MathType是“公式编辑器”的功能强大而全面的版本。如果要经常在文档中编排各种复杂的数学、化学公式,则MathType是非常合适的选择。MathType用法与“公式编辑器”一样简单易学,而且其额外的功能使你的工作更快捷,文档更美观。 MathType包括: (1)Euclid字体设置了几百个数学符号。 (2)具有应用于几何、化学及其他方面的新样板和符号。 (3)专业的颜色支持。 (4)为全球广域网创建公式。 (5)将输出公式译成其他语言(例如:TeX、AMS-TeX、LaTeX、MathML及自定义语言)的翻译器。 (6)用于公式编号、格式设置及转换Microsoft Word文档的专用命令。 (7)可自定义的工具栏,可容纳最近使用过的几百个符号、表达式和公式。 (8)可自定义的键盘快捷键。 图1 MathType公式编辑器 在编辑word文档时,如果需要录入公式将是一件非常痛苦的事情。利用Mathtype作为辅助工具,会为文档的公式编辑和修改提供很多方便。下面介绍几种mathtype中比较重要的技巧 1. 放大或缩小尺寸 Ctrl+1(100%);Ctrl+2(200%); 2.在数学公式中插入一些符号 Ctrl+9或Ctrl+0(小括号);Ctrl+[ 或Ctrl+](中括号);Ctrl+{ 或Ctrl+}(大括号); Ctrl+F(分式);Ctrl+/(斜杠分式);Ctrl+H(上标);Ctrl+L(下标);Ctrl+I(积分号); Ctrl+R(根式);Ctrl+Shift+连字符(上横线);Ctrl+Alt+连字符(矢量箭头);Ctrl+Alt+'(单撇);Ctrl+Alt+"(双撇);先按“Ctrl+T”放开后,再按N(n次根式)、S(求和符号)、P(乘积符号)等。 3.微移间隔

基于Unicode编码方式的TrueType字体的实现

龙源期刊网 https://www.wendangku.net/doc/db6833805.html, 基于Unicode编码方式的TrueType字体的实现 作者:赵黎,蔡雪梅 来源:《电脑知识与技术》2010年第03期 摘要:MiniGUI是典型的图形用户界面系统,它采用面向对象的技术实现多字体和多字符集的支持。MiniGUI针对字体和字符集定义了一系列抽象接口,如果要增加对某种字体或某种字 符集的支持,只需实现该字体类型和该字符集的接口即可。该文重点讲述了对Unicode字符集和TrueType字体的支持和实现,并提供了Unicode编码方式的文本处理和显示的API。 关键词:MiniGUI;TrueType字体;Unicode;字符集 中图分类号:TP391文献标识码:A文章编号:1009-3044(2010)03-738-04 Implement of TrueType Font Based on Unicode encoding ZHAO Li, CAI Xue-mei (College of Electroning Engineering, Chongqing University of Posts and Telecommunications, Chongqing 400065, China) Abstract: MiniGUI is a typical Graphic User Interface System.It achieves multi-font and multi-character set support by adopting the techniques of object-oriented. It defines a series of abstract interface for fonts and character sets,the support of a certain font or a character set is increased by achieving the interfaces of the font type and the character set.The paper describes the support and implement for Unicode character set and TrueType font, and it provides the application program interface of the text process and display in Unicode encoding ways. Key words: MiniGUI; truetype; unicode; character set MiniGUI 是一个跨操作系统的、面向嵌入式系统的轻量级图形用户界面支持系统。它主要在Linux控制台上运行,是基于SVGALib和LinuxThread库的多窗口图形用户界面支持系统。它采用了类Win32的API接口,实现了简化的类Windows 98风格的图形用户界面。自1999年初遵循GPL条款发布第一个版本以来,MiniGUI已广泛应用于手持信息终端、机顶盒、工业控制系统及工业仪表、便携式多媒体播放机、查询终端等产品和领域。而且MiniGUI2.0为基于嵌入式Linux的高端嵌入式设备提供了完整的多进程支持,从而将MiniGUI从中端市场带到了 高端市场[3]。

相关文档
相关文档 最新文档