文档库 最新最全的文档下载
当前位置:文档库 › freetype教程

freetype教程

freetype教程
freetype教程

freetype教程

第一步--简易的字形装载

介绍

这是“FreeType2教程”的第一部分。它将教会你如何:

*初始化库

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

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

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

*渲染一个简单的字符串

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

1.头文件

下面的内容是编译一个使用了FreeType2库的应用程序所需要的指令。请谨慎阅读,自最近一次版本更新后我们已经更改了少许东西。

1.FreeType2include目录

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

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

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

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

3.包含主要的FreeType2API头文件

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

#include

#include FT_FREETYPE_H

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

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

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

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

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

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

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

#include

#include

...

2.初始化库

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

#include

#include FT_FREETYPE_H

FT_LIBRARY library;

...

Error=FT_Init_FreeType(&library);

If(error)

{

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

}

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

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

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

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

3.装载一个字体face

a.从一个字体文件装载

应用程序通过调用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。

如果这个值太大,函数将会返回一个错误。Index0总是正确的。

Face

一个指向新建的face对象的指针。

当失败时其值被置为NULL。

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

b.从内存装载

如果你已经把字体文件装载到内存,你可以简单地使用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的语义一致。

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

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

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

4.访问face内容

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

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

Num_glyphs

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

Flags

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

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的单元尺寸。

5.设置当前象素尺寸

对于特定face中与字符大小相关的信息,FreeType2使用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);/*设备垂直分辨率*/

注意:

*字符宽度和高度以1/64点为单位表示。一个点是一个1/72英寸的物理距离。通常,这不等于一个象素。

*设备的水平和垂直分辨率以每英寸点数(dpi)为单位表示。显示设备(如显示器)的常规值为72dpi或96dpi。这个分辨率是用来从字符点数计算字符象素大小的。

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

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

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

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

error=FT_Set_Pixel_Sizes(

face,/*face对象句柄*/

0,/*象素宽度*/

16);/*象素高度*/

这个例子把字符象素设置为16x16象素。如前所说的,尺寸中的任一个为0意味着“与另一个尺寸值相等”。

注意这两个函数都返回错误码。通常,错误会发生在尝试对定长字体格式(如FNT或PCF)设置不在face->fixed_size数组中的象素尺寸值。

6.装载一个字形图像

a.把一个字符码转换为一个字形索引

通常,一个应用程序想通过字符码来装载它的字形图像。字符码是一个特定编码中代表该字符的数值。例如,字符码64代表了ASCII编码中的’A’。

一个face对象包含一个或多个字符表(charmap),字符表是用来转换字符码到字形索引的。例如,很多TrueType字体包含两个字符表,一个用来转换Unicode字符码到字形索引,另一个用来转换Apple Roman编码到字形索引。这样的字体既可以用在Windows(使用

Unicode)和Macintosh(使用Apple Roman)。同时要注意,一个特定的字符表可能没有覆盖完字体里面的全部字形。

当新建一个face对象时,它默认选择Unicode字符表。如果字体没包含Unicode字符表,FreeType会尝试在字形名的基础上模拟一个。注意,如果字形名是不标准的那么模拟的字符表有可能遗漏某些字形。对于某些字体,包括符号字体和旧的亚洲手写字体,Unicode模拟是不可能的。

我们将在稍后叙述如何寻找face中特定的字符表。现在我们假设face包含至少一个Unicode 字符表,并且在调用FT_New_Face时已经被选中。我们使用FT_Get_Char_Index把一个Unicode字符码转换为字形索引,如下所示:

glyph_index=FT_Get_Char_Index(face,charcode);

这个函数会在face里被选中的字符表中查找与给出的字符码对应的字形索引。如果没有字符表被选中,这个函数简单的返回字符码。

注意,这个函数是FreeType中罕有的不返回错误码的函数中的一个。然而,当一个特定的字符码在face中没有字形图像,函数返回0。按照约定,它对应一个特殊的字形图像――缺失字形,通常会显示一个框或一个空格。

b.从face中装载一个字形

一旦你获得了字形索引,你便可以装载对应的字形图像。在不同的字体中字形图像存储为不同的格式。对于固定尺寸字体格式,如FNT或者PCF,每一个图像都是一个位图。对于可伸缩字体格式,如TrueType或者Type1,使用名为轮廓(outlines)的矢量形状来描述每一个字形。一些字体格式可能有更特殊的途径来表示字形(如MetaFont――但这个格式不被支持)。幸运的,FreeType2有足够的灵活性,可以通过一个简单的API支持任何类型的字形格式。

字形图像存储在一个特别的对象――字形槽(glyph slot)中。就如其名所暗示的,一个字形槽只是一个简单的容器,它一次只能容纳一个字形图像,可以是位图,可以是轮廓,或者其他。每一个face对象都有一个字形槽对象,可以通过face->glyph来访问。它的字段在FT_GlyphSlotRec结构的文档中解释了。

通过调用FT_Load_Glyph来装载一个字形图像到字形槽中,如下:

error=FT_Load_Glyph(

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

glyph_index,/*字形索引*/

load_flags);/*装载标志,参考下面*/

load_flags的值是位标志集合,是用来指示某些特殊操作的。其默认值是FT_LOAD_DEFAULT 即0。

这个函数会设法从face中装载对应的字形图像:

*如果找到一个对应该字形和象素尺寸的位图,那么它将会被装载到字形槽中。嵌入的位图总是比原生的图像格式优先装载。因为我们假定对一个字形,它有更高质量的版本。这可以用FT_LOAD_NO_BITMAP标志来改变。

*否则,将装载一个该字形的原生图像,把它伸缩到当前的象素尺寸,并且对应如TrueType 和Type1这些格式,也会完成hinted操作。

字段face->glyph->format描述了字形槽中存储的字形图像的格式。如果它的值不是FT_GLYPH_FORMAT_BITMAP,你可以通过FT_Render_Glyph把它直接转换为一个位图。如下:

error=FT_Render_Glyph(face->glyph,/*字形槽*/

render_mode);/*渲染模式*/

render_mode参数是一个位标志集合,用来指示如何渲染字形图像。把它设为FT_RENDER_MODE_NORMAL渲染出一个高质量的抗锯齿(256级灰度)位图。这是默认情况,如果你想生成黑白位图,可以使用FT_RENDER_MODE_MONO标志。

一旦你生成了一个字形图像的位图,你可以通过glyph->bitmap(一个简单的位图描述符)直接访问,同时用glyph->bitmap_left和glyph->bitmap_top来指定起始位置。

要注意,bitmap_left是从字形位图当前笔位置到最左边界的水平距离,而bitmap_top是从笔位置(位于基线)到最高边界得垂直距离。他么是正数,指示一个向上的距离。

下一部分将给出字形槽内容的更多细节,以及如何访问特定的字形信息(包括度量)。

c.使用其他字符表

如前面所说的,当一个新face对象创建时,它会寻找一个Unicode字符表并且选择它。当前被选中的字符表可以通过face->charmap访问。当没有字符表被选中时,该字段为NULL。这种情况在你从一个不含Unicode字符表的字体文件(这种文件现在非常罕见)创建一个新的FT_Face对象时发生。

有两种途径可以在FreeType2中选择不同的字符表。最轻松的途径是你所需的编码已经有对应的枚举定义在FT_FREETYPE_H中,例如FT_ENCODING_BIG5。在这种情况下,你可以简单地调用FT_Select_CharMap,如下:

error=FT_Select_CharMap(

face,/*目标face对象*/

FT_ENCODING_BIG5);/*编码*/

另一种途径是手动为face解析字符表。这通过face对象的字段num_charmaps和charmaps(注意这是复数)来访问。如你想到的,前者是face中的字符表的数目,后者是一个嵌入在face

中的指向字符表的指针表(a table of pointers to the charmaps)。

每一个字符表有一些可见的字段,用来更精确地描述它,主要用到的字段是charmap->platform_id和charmap->encoding_id。这两者定义了一个值组合,以更普

通的形式用来描述该字符表。

每一个值组合对应一个特定的编码。例如组合(3,1)对应Unicode。组合列表定义在TrueType 规范中,但你也可以使用文件FT_TRUETYPE_IDS_H来处理它们,该文件定义了几个有用的常数。

要选择一个具体的编码,你需要在规范中找到一个对应的值组合,然后在字符表列表中寻找它。别忘记,由于历史的原因,某些编码会对应几个值组合。这里是一些代码:

FT_CharMap found=0;

FT_CharMap charmap;

int n;

for(n=0;nnum_charmaps;n++)

{

charmap=face->charmaps[n];

if(charmap->platform_id==my_platform_id&&

charmap->encoding_id==my_encoding_id)

{

found=charmap;

break;

}

}

if(!found){...}

/*现在,选择face对象的字符表*/

error=FT_Set_CharMap(face,found);

if(error){...}

一旦某个字符表被选中,无论通过FT_Select_CharMap还是通过FT_Set_CharMap,它都会在后面的FT_Get_Char_Index调用使用。

d.字形变换

当字形图像被装载时,可以对该字形图像进行仿射变换。当然,这只适用于可伸缩(矢量)字体格式。

简单地调用FT_Set_Transform来完成这个工作,如下:

error=FT_Set_Transform(

face,/*目标face对象*/

&matrix,/*指向2x2矩阵的指针*/

&delta);/*指向2维矢量的指针*/

这个函数将对指定的face对象设置变换。它的第二个参数是一个指向FT_Matrix结

构的指针。该结构描述了一个2x2仿射矩阵。第三个参数是一个指向FT_Vector结构的指针。该结构描述了一个简单的二维矢量。该矢量用来在2x2变换后对字形图像平移。

注意,矩阵指针可以设置为NULL,在这种情况下将进行恒等变换。矩阵的系数是16.16形式的固定浮点单位。

矢量指针也可以设置为NULL,在这种情况下将使用(0,0)的delta。矢量坐标以一个象素的1/64为单位表示(即通常所说的26.6固定浮点格式)。

注意:变换将适用于使用FT_Load_Glyph装载的全部字形,并且完全独立于任何hinting处理。这意味着你对一个12象素的字形进行2倍放大变换不会得到与24象素字形相同的结果(除非你禁止hints)。

如果你需要使用非正交变换和最佳hints,你首先必须把你的变换分解为一个伸缩部分和一个旋转/剪切部分。使用伸缩部分来计算一个新的字符象素大小,然后使用旋转/剪切部分来调用FT_Set_Transform。这在本教程的后面部分有详细解释。

同时要注意,对一个字形位图进行非同一性变换将产生错误。

7.简单的文字渲染

现在我们将给出一个非常简单的例子程序,该例子程序渲染一个8位Latin-1文本字符串,并且假定face包含一个Unicode字符表。

该程序的思想是建立一个循环,在该循环的每一次迭代中装载一个字形图像,把它转换为一个抗锯齿位图,把它绘制到目标表面(surface)上,然后增加当前笔的位置。

a.基本代码

下面的代码完成我们上面提到的简单文本渲染和其他功能。

FT_GlyphSlot slot=face->glyph;/*一个小捷径*/

int pen_x,pen_y,n;

...initialize library...

...create face object...

...set character size...

pen_x=300;

pen_y=200;

for(n=0;n

{

FT_UInt glyph_index;

/*从字符码检索字形索引*/

glyph_index=FT_Get_Char_Index(face,text[n]);

/*装载字形图像到字形槽(将会抹掉先前的字形图像)*/

error=FT_Load_Glyph(face,glyph_index,FT_LOAD_DEFAULT);

if(error)

continue;/*忽略错误*/

/*转换为一个抗锯齿位图*/

error=FT_Render_Glyph(face->glyph,ft_render_mode_normal);

if(error)

continue;

/*现在,绘制到我们的目标表面(surface)*/

my_draw_bitmap(&slot->bitmap,

pen_x+slot->bitmap_left,

pen_y-slot->bitmap_top);

/*增加笔位置*/

pen_x+=slot->advance.x>>6;

pen_y+=slot->advance.y>>6;/*现在还是没用的*/

}

这个代码需要一些解释:

*我们定义了一个名为slot的句柄,它指向face对象的字形槽。(FT_GlyphSlot类型是一个指针)。这是为了便于避免每次都使用face->glyph->XXX。

*我们以slot->advance增加笔位置,slot->advance符合字形的步进宽度(也就是通常所说的走格(escapement))。步进矢量以象素的1/64为单位表示,并且在每一次迭代中删减为整数象素。

*函数my_draw_bitmap不是FreeType的一部分,但必须由应用程序提供以用来绘制位图到目标表面。在这个例子中,该函数以一个FT_Bitmap描述符的指针和它的左上角位置为参数。

*Slot->bitmap_top的值是正数,指字形图像顶点与pen_y的垂直距离。我们假定my_draw_bitmap采用的坐标使用一样的约定(增加Y值对应向下的扫描线)。我们用pen_y 减它,而不是加它。

b.精练的代码

下面的代码是上面例子程序的精练版本。它使用了FreeType2中我们还没有介绍的特性和函数,我们将在下面解释:

FT_GlyphSlot slot=face->glyph;/*一个小捷径*/

FT_UInt glyph_index;

int pen_x,pen_y,n;

...initialize library...

...create face object...

...set character size...

pen_x=300;

pen_y=200;

for(n=0;n

{

/*装载字形图像到字形槽(将会抹掉先前的字形图像)*/

error=FT_Load_Char(face,text[n],FT_LOAD_RENDER);

if(error)

continue;/*忽略错误*/

/*现在,绘制到我们的目标表面(surface)*/

my_draw_bitmap(&slot->bitmap,

pen_x+slot->bitmap_left,

pen_y-slot->bitmap_top);

/*增加笔位置*/

pen_x+=slot->advance.x>>6;

}

我们简化了代码的长度,但它完成相同的工作:

*我们使用函数FT_Loac_Char代替FT_Load_Glyph。如你大概想到的,它相当于先调用GT_Get_Char_Index然后调用FT_Get_Load_Glyph。

*我们不使用FT_LOAD_DEFAULT作为装载模式,使用FT_LOAD_RENDER。它指示了字形图像必须立即转换为一个抗锯齿位图。这是一个捷径,可以取消明显的调用FT_Render_Glyph,

但功能是相同的。

注意,你也可以指定通过附加FT_LOAD_MONOCHROME装载标志来获得一个单色位图。

c.更高级的渲染

现在,让我们来尝试渲染变换文字(例如通过一个环)。我们可以用FT_Set_Transform来完成。这里是示例代码:

FT_GlyphSlot slot;

FT_Matrix matrix;/*变换矩阵*/

FT_UInt glyph_index;

FT_Vector pen;/*非变换原点*/

int n;

...initialize library...

...create face object...

...set character size...

slot=face->glyph;/*一个小捷径*/

/*准备矩阵*/

matrix.xx=(FT_Fixed)(cos(angle)*0x10000L);

matrix.xy=(FT_Fixed)(-sin(angle)*0x10000L);

matrix.yx=(FT_Fixed)(sin(angle)*0x10000L);

matrix.yy=(FT_Fixed)(cos(angle)*0x10000L);

/*26.6笛卡儿空间坐标中笔的位置,以(300,200)为起始*/

pen.x=300*64;

pen.y=(my_target_height-200)*64;

for(n=0;n

{

/*设置变换*/

FT_Set_Transform(face,&matrix,&pen);

/*装载字形图像到字形槽(将会抹掉先前的字形图像)*/

error=FT_Load_Char(face,text[n],FT_LOAD_RENDER);

if(error)

continue;/*忽略错误*/

/*现在,绘制到我们的目标表面(变换位置)*/

my_draw_bitmap(&slot->bitmap,

slot->bitmap_left,

my_target_height-slot->bitmap_top);

/*增加笔位置*/

pen.x+=slot->advance.x;

pen.y+=slot->advance.y;

}

一些说明:

*现在我们使用一个FT_Vector类型的矢量来存储笔位置,其坐标以象素的1/64为单位表示,并且倍增。该位置表示在笛卡儿空间。

*不同于系统典型的对位图使用的坐标系(其最高的扫描线是坐标0),FreeType中,字形图像的装载、变换和描述总是采用笛卡儿坐标系(这意味着增加Y对应向上的扫描线)。因此当我们定义笔位置和计算位图左上角时必须在两个系统之间转换。

*我们对每一个字形设置变换来指示旋转矩阵以及使用一个delta来移动转换后的图像到当前笔位置(在笛卡儿空间,不是位图空间)。结果,bitmap_left和bitmap_top的值对应目标空间象素中的位图原点。因此,我们在调用my_draw_bitmap时不在它们的值上加pen.x或pen.y。

*步进宽度总会在变换后返回,这就是它可以直接加到当前笔位置的原因。注意,这次它不会四舍五入。

一个例子完整的源代码可以在这里找到。

要很注意,虽然这个例子比前面的更复杂,但是变换效果是完全一致的。因此它可以作为一个替换(但更强大)。

然而该例子有少许缺点,我们将在本教程的下一部分中解释和解决。

结论

在这个部分,你已经学习了FreeType2的基础以及渲染旋转文字的充分知识。

下一部分将深入了解FreeType2API更详细的资料,它可以让你直接访问字形度量标准和字形图像,还能让你学习到如何处理缩放、hinting、自居调整,等等。

第三部分将讨论模块、缓存和其他高级主题,如如何在一个face中使用多个尺寸对象。

比特币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/1c8881279.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/1c8881279.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和

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。

网店美工视觉设计实战教程(全彩微课版)-48481-教学大纲

《网店美工视觉设计实战教程(全彩微课版)》 教学大纲 一、课程信息 课程名称:网店美工:店铺装修+图片美化+页面设计+运营推广(全彩微课版) 课程类别:素质选修课/专业基础课 课程性质:选修/必修 计划学时:21 计划学分:2 先修课程:无 选用教材:《网店美工视觉设计实战教程(全彩微课版)》,何晓琴编著,2018年;人民邮电出版社出版教材; 适用专业:本书可作为有志于或者正在从事淘宝美工相关职业的人员学习和参考,也可作为高等院校电子商务相关课程的教材。 课程负责人: 二、课程简介 随着网店的迅速普及和全民化,衍生了“淘宝美工”这个针对网店页面视觉设计的新兴行业。本书从淘宝美工的角度出发,为淘宝卖家提供全面、实用、快速的店铺视觉设计与装修指导。主要包括网店美工基础、图片调色、图片修饰、店铺首页核心模块设计、详情页视觉设计、页面装修、视觉营销推广图制作等,最后针对无线端进行首页、详情页视觉的设计与装修。本书内容层层深入,并通过丰富的实例为读者全方面介绍淘宝美工在日常工作中所需的知识和技能,有效地引导读者进行淘宝店铺装修的学习。 本课程主要对淘宝美工的设计基础和方法进行详细介绍,通过学习该课程,使学生了解网店美工的基本要求,以及掌握网店的设计与制作。 三、课程教学要求

体描述。“关联程度”栏中字母表示二者关联程度。关联程度按高关联、中关联、低关联三档分别表示为“H”“M”或“L”。“课程教学要求”及“关联程度”中的空白栏表示该课程与所对应的专业毕业要求条目不相关。 四、课程教学内容

五、考核要求及成绩评定 注:此表中内容为该课程的全部考核方式及其相关信息。 六、学生学习建议 (一)学习方法建议 1. 理论配合实战训练进行学习,提高学生的实战动手能力; 2. 在条件允许的情况下,可以申请一个网店,进行深入学习; 3. 提高学生的是设计感和审美能力; (二)学生课外阅读参考资料 《网店美工:店铺装修+图片美化+页面设计+运营推广(全彩微课版)》,何晓琴编著,2018年,人民邮电出版社合作出版教材

操作系统

第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 图层的无缝融合

《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/1c8881279.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;

几种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/1c8881279.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)所有程序在长度和速度方面都进行了优化,结构清晰;

字体美化

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 显得两侧餘白较多,

中文 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 才行。

嵌入式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码格式对源文件进行分析和编译,对于字符串常量中的字符,则不加区别,按原有编码格式编译进入目标文件。

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

龙源期刊网 https://www.wendangku.net/doc/1c8881279.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]。

淘宝网店二维码使用教程全攻略

一、什么是二维码——还记得超市的条形码吗? 谈起“二维码”,可能很多人会犯糊涂。但是与它类似的“一维条形码”广泛地运用于超市商品识别,却是我们每个人都十分熟悉的。二维码正是“一维条形码”发展的“高级阶段”,在一个小小的方块里面包含一条链接地址,引导使用者通过扫描设备(如手机)快速进入相应 的网址。 图1:一维条形码图2:淘宝二维码 现在,淘宝为卖家们提供二维码在线生成的工具,您可以将您的店铺和宝贝的“手机浏览链接”转化成二维码印制出来,夹在包裹中、印在优惠券上甚至是你的商品上。举例来说,接收包裹时,买家拿到印有二位码的优惠券,此时,他们只需用手机的摄像头“照”一下这个黑白相间的小方块,就可以快速地通过手机进入您的店铺中。二维码还有更多的妙用和更多的好处。 图3:生活中使用淘宝二维码的场景

二、淘宝二维码妙在何处——轻轻一扫客源不断! 1. 好处在哪里? 淘宝买家通过手机上的二维码识别软件,扫描卖家发布的淘宝二维码,可以直接找到卖家的促销活动,店铺首页,宝贝单品。免去输入网址、关键词搜索的麻烦。 淘宝卖家可以将二维码印刷到包裹中的宣传物上(如优惠券、宣传册),随包裹发给买家,吸引买家通过二维码进入店铺进行二次购买,为您带来源源不断的客流。 您可以在PC店铺和商品详情页中贴出二维码,使顾客可以在手机中快速收藏,随时随地光顾您的店铺! 卖家还可以考虑在平面媒体(如《淘宝天下》)上发布带有二维码的促销活动。对于有能力大卖家,还可以在自己的商品上贴上相应的二维码。 图4:二维码的引流作用 2. 买家的操作方法 有软件和摄像头的买家:淘宝合作的免费二维码软件有淘宝Android版、快拍、QuickMark、码上淘、魔印等,手机访问https://www.wendangku.net/doc/1c8881279.html,可快速下载。这些手机软件提供二维码扫描功能,只要买家打开这些软件,将摄像头对准二维码1秒中左右,识别成功后手机将自动进入对应的网页。 没有软件或者摄像头的买家可以在手机上进入https://www.wendangku.net/doc/1c8881279.html,页面,输入活动码,同样能够进入到您所设置的链接中。 图5:买家的使用方法

dw网页淘宝设计模板

竭诚为您提供优质文档/双击可除dw网页淘宝设计模板 篇一:dreamweaver在淘宝美工课中的应用 泉州新东方叶生方老师整理 dreamweaver在淘宝美工课中的应用 一、店铺装修(网页技术) 专业型课程分两个阶段:1、店铺装修基础阶段,2、html+css行内样式部分。 (一)实用型阶段——店铺装修基础 1、认识旺铺及类型、模板、模块、布局;旺铺20xx标准版拓展版20xx新版 2、ps切片导出web代码 3、dw表格排版 4、分类导航设计——ps切片、dw表格、热区三种技术综合运用 5、旺铺宽屏效果制作(页面背景、店头自定义、自定义大图三部分组成) 6、图片背景、旺旺代码、收藏代码、滚动代码 7、识别哪些效果属于模块功能,那些效果可以自定义

实现,常用的促销工具(限时打折、满就送、团购宝、搭配减价、会员管理等) 8、淘宝首页整体风格设计、“宝贝描详情页”风格设计 9、html常用标注介绍table、tR、td、img、a等用功能 (二)专业提升阶段——html+css行内样式 10、dw使用的注意要点以及认识tabletRtdFontdiVspanh1imgapliulmarquee等常用标注。 11、表格结构分析,学会手写简单的网页代码 12、认识css盒子模型 13、了解css排版基本方法——实际表格相似导航效果 14、运用css设计宝贝详情页版式、利用p、img标注的css属性设置版式 15、css美化表格 16、了解淘宝widget库的作用与意义——悬浮旺旺、宝贝放大镜等等特效 篇二:用dw做出漂亮的模板 如何用dw做出漂亮的促销表格模板 很多的卖家在逛淘宝店时会发现很多的店铺装修很美观,如打折模块和团购模块,自己想去问店主怎么制作,但是有几个淘宝卖家会告诉你呢,不过不要着急,下面让开淘网为你详解一番吧。今天我们讲的是如何用dReamweaVeR做

linux版本centos6.6GD库添加freetype拓展的方法

钜码IT培训https://www.wendangku.net/doc/1c8881279.html, linux版本centos6.6GD库添加freetype拓展的方法 我们在工作业务中往往会需求要用到imagefttext函数,发现GD库一开始安装时没有添加FreeType,那么这时候就需要我们自己动手去安装添加,这里给大家分享一下PHPGD库添加freetype拓展的方法。 linux版本centos6.6 安装流程(由于服务器为分布式内网服务器,无法使用yum安装,以下均为下载资源包后的编译安装): 安装freetype 解压freetype-2.3.9.tar.gz 编译安装 ./configure--enable-static--enable-shared(没有指定prefix,.h文件默认安装到/usr/local/include,.a|.so文件默认安装到/usr/local/lib内其他资源包的安装如果没有指定目录也是一样到这个位置) make&&makeinstall 确认freetype安装成功后重新编译安装GD库,添加freetype支持 安装gd库,版本2.0.35 由于之前有安装记录,建议先makeclean,否则可能导致安装失败 ./configure--enable-shared--with-jpeg=/usr/local/include/--with-freetype=/usr/local/--with-png=/usr/local/include/(这里要注意的是--with-freetype=/usr/local/的路径一开始写的是/usr/local/lib,结果一直引入freetype失败,估计因为头文件不在这个目录内,改为上一级目录后引入成功) 确认SupportforFreetype2.xlibrary:yes make&&makeinstall 确认安装成功后重新编译安装PHP的gd拓展 php版本5.5.38

超详细LAMP安装

超详细LAMP安装 以下文献给那些被网上X人发的文章给误导的朋友 1、安装mysql (mysql-standard-5.0.27-linux-i686-glibc23.tar.gz) 安装文件放到了/usr/local/src目录 1)#tar -zxvf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz -C /usr/local/mysql 2)#groupadd mysql 建mysql组 3)#useradd -g mysql mysql 新增mysql用户,并添加到mysql组 4)#cd /usr/local/mysql 5)#scripts/mysql/mysql_install_db --user=mysql 创建mysql授权表,如果是mysql用户登录可省--user=mysql 6)#chown -R root . 当前目录下的文件的所有属性改为root用户 7)#chown -R mysql data 将data数据目录的所有属性改为mysql用户 8)#chgrp -R mysql . 将组属性改为mysql组 9)#bin/mysqld_safe --user=mysql & 10)#bin/mysqladmin -u root password '123456' 设置密码 11)#cp support-files/https://www.wendangku.net/doc/1c8881279.html,f /etc/https://www.wendangku.net/doc/1c8881279.html,f 数据库目录默认(/usr/local/var) LAMP 13)#vi /etc/rc.d/rc.local 添加/usr/local/mysql/bin/mysqld_safe --user=mysql & //自动启动mysql服务 附:mysql.server和mysqld_safe脚本和Mac OS X Startup Item可以用来手动启动服务器,或自动启动系统。mysql.server和Startup Item还可以用来停止服务器。 mysql.server脚本可以被用来启动或停止服务器,通过用start或stop参数调用它: shell> mysql.server start shell> mysql.server stop mysql.server stop通过向服务器发出一个信号停止它。你可手动执行mysqladmin shutdown关闭服务器。 要想在服务器上自动启动和停止MySQL,应在“/etc/rc * 文件中适当的地方增加启动、停止命令。

淘宝装修 SDK高级模板开发流程

淘宝网装修市场 高级模板设计指南1

目录 1、本地开发环境 (3) 1.1 什么是SDK (3) 1.2 下载SDK (3) 1.3 安装SDK (4) 1.4 SDK的目录结构 (7) 1.5 启动SDK (8) 2、使用SDK后台 (10) 2.1 创建模板 (10) 2.2 预览模板 (17) 2.3 配置SDK本地属性 (18) 3、模板的标准结构 (18) 4、设计模块 (18) 4.1 创建相关文件资源 (18) 4.2 编写模块代码 (19) 4.2.1 引入标识 (19) 4.2.2 使用KISSY效果 (19) 4.2.3 使用模块参数 (19) 4.2.4 调用数据接口 (20) 4.3 配置模块信息 (20) 5、设计页面 (22) 5.1 结构化页面 (22) 5.2 设计页面 (24) 5.2.1 引入单个模块 (24) 5.2.2 划分页面片区 (25) 5.2.3 配置页面信息 (26) 6、特殊页面要求 (27) 6.1 宝贝详情页面 (27) 6.2 宝贝列表,文章列表页面 (27) 6.3 不可装修的页面 (27) 7、调试模板装修效果 (28) 8、关于白名单过滤 (28) 9、PHP函数 (28) 10、发布模板到装修系统 (28) 2

1、本地开发环境 1.1什么是SDK SDK是淘宝提供给设计师在本地设计模板的软件开发包,SDK模拟了淘宝店铺环境。 SDK主要包括三个部分:Server,PHP引擎和模拟数据。 Server是指SDK会在本机上启动一个Server,这样我们可以通过浏览器浏览设计的作品。PHP引擎是指设计师只能使用PHP作为模板设计的语言。 模拟数据是指SDK包括了淘宝各个典型的店铺,这样设计师在设计模板时不用考虑实际的数据库。 目前,提供Windows操作系统和Mac操作系统的SDK工具。 1.2下载SDK 装修市场后台下载安装包,安装至本地,创建SDK web控制台。您将使用淘宝ShopSDK 来开发和上传设计模板。在开始设计之前,需在本地部署SDK环境。 设计师登录装修市场后,点击“设计师后台”导航按钮进入。(加入设计师注册流程帐号。) 进入设计师后台界面: 3

libgdx学习记录9——FreeType,ttf中文显示复习过程

l i b g d x学习记录9——F r e e T y p e,t t f中 文显示

libgdx学习记录9——FreeType,ttf中文显示 前面讲到使用Hireo创建的BitmapFont以显示中文字体。这种方式效率很高,当所要显示的字的总数较少,并且大小比较固定时,可以采用这种方式。 但是这种也有弊端: (1)字体大小不能随意设置,当放大时就会变形。 (2)当所要显示的字总数较多或者经常变化时,会很麻烦。 libgdx对中文的支持不太好,也是很多人转向其他引擎的一个原因。幸好,其扩展模块中的FreeType能够通过ttf字体来实现随意中文显示。 FreeType是libgdx的扩展模块,创建项目时需要添加对应的jar包和对应的动态运行库。 core工程lib中加入gdx-freetype.jar。 desktop工程lib中加入gdx-freetype-natives.jar。 android工程中lib加入gdx-freetype.jar,并将armeabi和armeabi-v7a中的libgx-freetype.so文件添加到对应的目录中。 三个工程中分别将对应的jar包添加到Refrenced Libraries中。 环境配置完成,具体事例如下: 1 package com.fxb.freetype; 2 3 import com.badlogic.gdx.ApplicationListener; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.g2d.BitmapFont; 8 import com.badlogic.gdx.graphics.g2d.SpriteBatch; 9 10 import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; 11 import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeBitmapFontData; 12 13 14public class FreeType implements ApplicationListener{ 15 16 BitmapFont[] font; 17//FreeTypeBitmapFontData fontData; 18 FreeTypeFontGenerator generator; 19 SpriteBatch batch; 20 21 @Override 22public void create() { 23// TODO Auto-generated method stub 24 batch = new SpriteBatch(); 25 font = new BitmapFont[3]; 26 Color[] colors = { Color.RED, Color.BLUE, Color.GREEN }; 27for( int i=0; i<3; ++i ){ 28 generator = new FreeTypeFontGenerator( Gdx.files.internal( "data/" + (i+1) + ".ttf" ) ); 29 font[i] = generator.generateFont( 25, FreeTypeFontGenerator.DEFAULT_CHARS+"今天是个好日子,大家心情都很", false ); 30 font[i].setColor( colors[i] ); 31 generator.dispose(); 32 } 33 34//fontData = generator.generateData( 25, FreeTypeFontGenerator.DEFAULT_CHARS+"今天是个好日子,大家心情都很", false ); 35 } 36 37 @Override 38public void resize(int width, int height) { 39// TODO Auto-generated method stub 40 41 } 42 43 @Override 44public void render() { 45// TODO Auto-generated method stub 46 47 Gdx.gl.glClearColor( 1, 1, 1, 1 ); 48 Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT );

相关文档