VS2005编译Cairo1.8

来源:互联网 发布:淘宝小齐店铺真假 编辑:程序博客网 时间:2024/05/21 17:31

第一篇将流行的开源矢量库串起来乱侃了一番,希望还不了解矢量库的网友已经知道了这些大名鼎鼎的开源Project。了解了之后就要使用他们,但是使用的第一步,应该是先编译过去,然后才能谈使用。编译都没有做到的话,使用起来就更加困难重重了。按我之前的计划,将先用VisualStudio2005将Cairo、Skia这两个库编译过去,然后再说怎么来用他们。

 

本篇,就是Cairo1.8版移植到VC下的编译过程。之所以说移植,是因为这两个工程自身都不带VC Project,而直接建立一个工程将代码直接加进来又编译不过去,这意味着需要修改代码。也说明这些工程在开发的过程中,也没有太多的考虑要用VC来编译。但VC的使用者不在少数,这是一个造福“人类”的过程。另外Cairo其实已经出了1.9.x版了,但是本篇只编译1.8的原因是1.9版的修改量相当的巨大,几乎每一个代码文件都有着不小的改动,而且经过1.9的一番改动之后,要移植到VC就更为困难了。至少我进行了一次简单尝试之后发现没有成功,其复杂度远比1.8高,加上又没有更多的时间去研究他了,于是就放弃1.9版了。但是1.8的移植仍然是很有价值的,至少目前还在使用1.8甚至1.8以下版本的软件工程还是很多的,而且1.8版的效率也还是相当不错的!

 

好了,废话不多说,我们按步就班的开始移植工作。

第一步就是要先下载Cairo以及与之关联的工程包,关联的工程列表如下:

Cairo:http://www.cairographics.org/releases/ 这里有Cairo的历史版本,我们下1.8.10就可以了,这也是放出来的1.8的最高版本了

Pixman:和上面同一个链接,下载其0.18.4,这是可以配合1.8的版本,0.19的Pixman我没有测试过,有兴趣各位可以自行测试

Zlib、Libpng:这两个我就不多说了,自己Google吧…………

下完以上4个工程之后,Zlib和Libpng两个的编译是不需要讲的,因为他们自带VC的工程文件,解包,双击,Build,搞定。

 

Pixman是pixelmanipulation的意思,即像素操作,这是一套工程无关的以位图/像素运算为基础的SDK,其包含的功能其实也挺丰富的,Blend/AlphaBlend、Edge Raster、Gradient Fill、Region、Fill等一大堆,而且还有SSE优化,这是给Cairo用的底层库。马上我们就来编译这个库。

 

第二步,编译Pixman,然后才能编译Cairo。编译Pixman的过程,其实是比较轻松的,建立VC工程(最后使用.lib工程),将解开后的Pixman包文件里的所有.c文件除pixman-vmx.c、pixman-arm-neon.c和pixman-arm-simd.c这三个文件不加,pixman-conical-gradient.c加不加无所谓(我就没有加),其它的都加进来。而.h文件就无所谓了,加不加入工程都可以正常编译。然后给工程的Debug和Release版都加入USE_MMX、USE_SSE2和PACKAGE这3个宏,Build吧!这一步应该是比较轻松的就可以通过的。如果出现有个体差异,请注意观察和解决。如果解决不了,可以通过QQ找我帮助。

 

第三步,编译Cairo。这一步就相对复杂点了,因为需要少量的修改代码。而且在编译之前,需要进行一点点小的Cairo知识普及:

 

Cairo有一个最大的特点就是支持类型众多的Backends,也就是我在第一篇里提到过的各种Render Target,如PDF/SVG/GDI等等。每一种Backends,其对应有一个.c文件来实现。本篇没有打算将每一个Backends都编译过去,那样的话篇章就太长了,所以本篇只选择了几个最常用的,基本上也是大家都用得到其它的可能基本都用不到的Backends,将其编译过去。剩下的那些如果需要的话,可以按照我说的方法,依葫芦画瓢的加入工程并编译过去。另外Cairo支持使用FreeType字体,但既然我们是用VC来做编译,那当然就要使用Win32的GDI字体了,况且GDI字体有一个好处就是无需做任何配置,就可以生成出质量很好的字体,不比FreeType差,FreeType的那个尤其是AntiAliasing效果我是看着不太舒服的。。。。。。

 

 现在建立Cairo的工程DLL(用Lib也可以,只有一点点的小区别,下面将会说明),将下面的.c文件添加到工程里:

cairo-analysis-surface.c

cairo-arc.c

cairo-array.c

cairo-atomic.c

cairo-base85-stream.c

cairo-bentley-ottmann.c

cairo-cache.c

cairo-cff-subset.c

cairo-clip.c

cairo-color.c

cairo-debug.c

cairo-deflate-stream.c

cairo-fixed.c

cairo-font-face-twin-data.c

cairo-font-face-twin.c

cairo-font-face.c

cairo-font-options.c

cairo-freelist.c

cairo-gstate.c

cairo-hash.c

cairo-hull.c

cairo-image-surface.c

cairo-lzw.c

cairo-matrix.c

cairo-meta-surface.c

cairo-misc.c

cairo-mutex.c

cairo-output-stream.c

cairo-paginated-surface.c

cairo-path-bounds.c

cairo-path-fill.c

cairo-path-fixed.c

cairo-path-stroke.c

cairo-path.c

cairo-pattern.c

cairo-pdf-operators.c

cairo-pdf-surface.c

cairo-pen.c

cairo-png.c

cairo-polygon.c

cairo-ps-surface.c

cairo-rectangle.c

cairo-region.c

cairo-scaled-font-subsets.c

cairo-scaled-font.c

cairo-skiplist.c

cairo-slope.c

cairo-spline.c

cairo-stroke-style.c

cairo-surface-fallback.c

cairo-surface.c

cairo-system.c

cairo-traps.c

cairo-truetype-subset.c

cairo-type1-fallback.c

cairo-type3-glyph-surface.c

cairo-unicode.c

cairo-user-font.c

cairo-version.c

cairo-wideint.c

cairo-win32-font.c

cairo-win32-printing-surface.c

cairo-win32-surface.c

cairo.c

check-link.c

 

好像列表有点长,将就吧……

添加完之后,开始修改代码文件:

A、如果是编译为lib工程(编译DLL的跳过),打开cairo.h在第53行左右位置,加入下面代码:

#ifdef _LIB

#define CAIRO_WIN32_STATIC_BUILD 1

#endif

因为建立为了LIB工程的话,VC会自动的加入预定义的宏_LIB,所以判断如果有这个宏,就定义CAIRO_WIN32_STATIC_BUILD为1

 

B、打开cairo-features.h文件,将#define CAIRO_HAS_FT_FONT 1改为0,#define CAIRO_HAS_SVG_SURFACE 1改为0,CAIRO_HAS_XLIB_SURFACE 1和CAIRO_HAS_XLIB_XRENDER_SURFACE 1都改为0。

 

C、(编译为DLL的可以忽略)打开cairoint.h将下面的定义:

#ifdef _MSC_VER

#define cairo_public __declspec(dllexport)

#endif

 

 改成:

 

#ifdef _MSC_VER

#ifndef _LIB

#define cairo_public __declspec(dllexport)

#endif

#endif

 

代码修改过程到此为止,怎么样,简单吧?呵呵,因为我们只选择了PDF/GDI/PS/Image/PNG这几种Backends,所以修改过程是非常简单的。

 

现在打开工程的Preprocessor属性页,也就是预定义管理,添加下面的预定义宏:

CAIRO_HAS_WIN32_FONT

CAIRO_HAS_WIN32_SURFACE

CAIRO_HAS_PNG_FUNCTIONS

CAIRO_HAS_PS_SURFACE

CAIRO_HAS_PDF_SURFACE

 

 如果是DLL工程,再打开附加Lib属性页,把zlib、libpng和pixman这三个工程编译好的lib文件加进去,或者使用VC特有的工程依赖自动来管理也可以。编译为lib的话就不需要了,因为这些库将会在使用cairo.lib的时候才会需要用到。

 

所以的准备工作都已经就绪,下一步就是泡杯茶,并按下Build按钮,等待还算是比较快的Cairo1.8编译过程吧!

 

 

PS:编译过程中的一个注意事项:在建立工程或者打开zlib/libpng这些工程的时候,一定要注意看CRT库的设定,必须要全部编译为相同的CRT库,比如要么都是MultiThread DLL要么都是MultiThread,或者就两个都编译出来也可以。