本篇,就是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是pixel manipulation的意思,即像素操作,这是一套工程无关的以位图/像素运算为基础的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,或者就两个都编译出来也可以。