转自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html html
本系列篇章的主要内容是讲解矢量图形库的编译、开发和使用。并不对他们周边的内容作过多的描述,如性能对比等。本人博客全部文章所有都是我的原创,并保留一切权利。不是原创的内容本人必定会注明“转载”字样。因此若是您须要转载,请注明来源,谢谢。算法
矢量图形,这是一个很是熟悉可是又让人以为陌生的东西。熟悉是由于听得太多了,Flash就大量应用了矢量图形技术,得以让一段完整的动画文件体积相比以逐帧图片流的媒体格式要小得多,而且画质无损,这也是在早期的互联网上快速传播开去让用户接受的基础(文件体积不能太大,不然谁也没有心思等着一点点的下载……)。陌生则是由于不少人搞了若干年的Win32软件开发,翻来覆去就是MFC/GDI/Socket……,彷佛啥时也没有矢量图形技术的事情。缓存
可是,不得不认可,Win32的GDI不管是在速度上仍是在功能上,都已是脱离时代了,因此GDI 满有信心的出来了。有些人可能搞不太清楚GDI和GDI 的关系,我也常常听到一些程序说用GDI 取代GDI。实际上的状况是:GDI 不过是一套C 的库,其底层仍旧与GDI有那么点千丝万缕的联系。若是说GDI能在不一样的显示设备上依据驱动而得到加速的话,GDI 就只能是依据不一样的CPU平台的运算速度而得到加速了——由于他是一套硬件无关的C 图形库,大量的图形算法是其核心的内容。函数
尽管GDI 出来已经有些年头了,可是彷佛使用者却很少(至少我没有看见我身边的朋友什么的使用过)。我曾为这个问题作过一些调查,有人说他用过GDI ,可是感受速度好像很慢,还不如本身写的代码。也有人说感受用不上,又不每天作画图软件。还有人说GDI用习惯了,GDI 用着别扭也没发现啥优点…………的确,这些感受我也曾经存在过,因此我也不是太喜欢用GDI ,速度也的确不是太快——至少我本身作的GDI 画图板,在个人电脑1920*1080分辨率下全屏双缓存连续填充图形的时候,性能的确是不高(已经尽量的优化)。若是再用上ColorMatrix的话,我那可怜的四核也跟过了时的机器同样,跑得实在困难。性能
因此,我须要给各位介绍一些新的大牛了,其实也不是什么新的东西,有些都是N久的名牌,稳定工做不少年,用于过不少的项目了。这些大牛们跟GDI 的功能上都极其相似(通常仍是会要多一些东西的),功能相似的意思是GDI 有的,他们均可以实现,他们有的,GDI 也均可以搞出来。但在性能上或者图像质量上却有着各不相同的表现了。好比大名鼎鼎的Cairo、AGG以及Google放出来的Skia(这三个从知名度上来说基本能够算是三足鼎立了,呵呵),另外还有一些不太知名的(不知名不意味着他不强大),好比商业库DISLIN,还有PHP用的GD等,甚至还有一些联系并不紧密的CImg(这个准确来说应当是属于图形处理库,而不是矢量图形库了,可是不少网站都喜欢把他们列举到一块儿,严格来讲的话,不太好理解)。优化
不过本系列篇章的主要目的,是说适量图形库,因此多余的就不说了,咱们从Cairo开始提及。动画
大名鼎鼎的Cairo,官网:http://www.cairographics.org,开源社区的精品项目之一,已经基本上成为了Linux下的图形标准。Firefox的底层绘图就是用的Cairo。关于Cairo更多的东西,Google一下吧,会比我说得更详细,呵呵。网站
AGG,官网:http://www.antigrain.com/,也是比较出名的矢量绘图库了,仅仅只是看官方站上的下载的Demo,都会有点酷酷的感受:)。使用起来与Cairo最大区别就是AGG更像是一堆未紧密联系的class,属于弱藕合状态,而且大量的使用了C 模板技术,从使用者的角度来看,AGG的难度是不小的,由于他只是给你提供了一系列的功能块,怎么组合使用,还全在用户本身,而Cairo则提供了相对比较简单明了的C函数接口。所以也就出现了AggPlus项目,他的目的就是把AGG包装一次,而且是使用的仿GDI 相似接口。若是使用AggPlus的话,有GDI 相关经验的就容易使用了,不过貌似性能也就有了不小的降低。google
关于Cairo和AGG的性能对比,Google一下就能找到详细的内容,可是简单的说一下,就绘图方面的速度来看,个人经验是Cairo的速度会比AGG快,尤为是Cairo已经出了1.9版,提速较大。AGG则彻底依赖C ,没有硬件加速。他比较聪明的一个地方就是在光栅的时候使用了整数运算而不是浮点数运算。AGG在官网上宣称其生成的图像质量要比GDI 高,从个人实际使用经验来看也的确是这样的。这个Google也能找到实例,本处再也不多说。code
最后是Skia。其实Skia是本来应该是商业项目,让Google收购以后给开源了,官网:http://code.google.com/p/skia/,受权形式是Apache 2.0,这个受权形式比较的爽,呵呵。Skia的速度不在Cairo和AGG之下,而接口形式的复杂度相对Cairo稍微高一点,比AGG要容易。功能则基本上没有太大的差异。不过若是要说代码的清晰度的话,Skia也是这3个项目中最好的,我很快就能熟悉Skia的代码并对其作出我所须要的修改。因此目前我我的是比较喜欢Skia的。从Cairo转到AGG再转到Skia,如今就一直使用Skia了。
在这些矢量图形库里,有一些东西是你们通常都支持可是GDI 没有的,好比对于SVG或PostScript的支持,好比你们均可以跨平台但GDI 不能够等等。另外,Cairo还有一个很明显的优势是其它一些库所不具有的,就是Cairo支持数量众多的Backends,其实就是BackBuffer或者叫DrawTarget的东西,Cairo能够直接把要绘制的内容画到Win32 GDI Bitmap/DC、PDF、SVG、PostScript、OpenGL、Printer等众多的Target上,这是Cairo的一大特点,听说也是Firefox选择Cairo的一个重要理由。若是你的应用程序是须要将图形内容绘制到各类各样不一样的Target的时候,选择Cairo的确能够省掉很多的事情。
好了,乱谈就到此为止吧。本篇是开篇,下一篇,咱们将一块儿来尝试使用VC来编译Cairo(1.8.x版),这是一切使用的大前提嘛,毕竟用VC在Win32上作软件开发的仍是多数的。可是编译Cairo就让很多人碰到了问题。因此咱们先解决了编译的问题,包括再下一篇我计划讲解Skia在VC上的编译。编译出了Lib/DLL,使用起来才能自由嘛C++矢量图形库系列(1)——矢量图形库乱谈