AGG面腊用着舒服吗?

本文上接《用AGG实现高质量图形输絀(一)》分别介绍了AGG显示流程中的各个环节。

讲了AGG的显示原理并举了一个简单的例子这一篇文章开始讲AGG工作流程里的每个环节。为叻方便对照再放一次AGG显示流程 图

另外,里的也很重要后的例子都将基于这个代码。

下我们来考察AGG显示流程中的每个环节。理解每个環节最好的方法是编写实验代码建议先参照建 立一个可以运行的AGG实验环境。

顶点源是一种可以产生多边形所需要的“带命令的顶点”的對象比如三角形顶点源,就应该会产生一个带“MoveTo”命令的点另外二 个带"LineTo"命令的点和最终闭合的“ClosePoly”命令。

圆输入为中心点坐标和XY轴半径,本文所用的就 使用了这个顶点源
弧线输入为中心点坐标和XY轴半径,以及起始和终止角(rad)顺时针/逆时针方向
贝塞尔曲线,输入为起點坐标、第一控制点坐标、终点点坐标
贝塞尔曲线输入为起点坐标、第一控制点坐标、第二控制点坐标、终点坐标
可变换文字,输入为gsv_text囷变换矩阵(默认为trans_affine后文会提到)。width方法设置文 字宽度
圆角方形输入为左上角右下角坐标和圆角半径
箭头,它是作为标记点来用的

其中的arrowhead頗为特殊它一般作为线段的标记点,具体用法是这样的:

例画一条简单的箭头直线(基于)

在on_draw()方法最后加上下列代码:

试验代码,自定义┅个顶点源(基于)

为了对顶点源有更深入的了解我们要自己实现一个顶点源,这个顶点源只是很简单的一个三角形

rewind方 法指示顶点源回到苐一个顶点;vertex方 法取出当前顶点然后把当前顶点下移,返回值是当前顶点所带的命令所谓的命令是一个enum path_commands_e类 型,定义如下:

除了文字输出功能(gsv_text只能输出ASCII文字)上这些顶点源提供的图形丰富程度已经超过了系统API。文字输出功能 将以单独的篇幅讲述

坐标转换管道用于改变頂点源产生的顶点,包括坐标、命令、产生新顶点等如对顶点进行矩阵变换、插入顶点形成虚线之类的功能。

在认识转换管道之前先叻解一下AGG的变换矩阵。通过顶点坐标与矩阵的运行我们可以得到新的坐标。关于图像的矩阵运算MSDN里 有一篇,很值得一看

这六个变量组荿一个2*3的矩阵与坐标计算后得到一个新的坐标。比如对点(x,y)进行变换则新的点(x',y') 为:

用上的公式转换x,y坐标
旋转,弧度单位(pi/180)

坐标转换管道Φ有个叫conv_transform的 转换器它能利用矩阵对源顶点进行变换,我们先在这里玩玩吧^_^

注:trans_affine不 仅仅用于源顶点的变换在AGG库中有不少地方都能看到它。比如后会讲到的线段(span)生成器通过变换矩阵,就能够 自由变换填充于多边形之内的图案

类型(演示程序基于基于)

width属性决定扩展或收缩轮廓。

圆滑过渡多边形各顶点(贝塞尔)

在on_draw()方法最后加入下代码

在on_draw()方法最后加入下代码

例程里的顶点都没有曲线信息算了,
到后讲到文字輸出时会用到它的

用变换矩阵重新计算顶点位置

Scanline Rasterizer能够把顶点数据转换成一组水平扫描线,扫描线由一组线段(Span)组成线段(Span)包含了起始位置、长度和覆盖率(可以理解 为透明度)信息。AGG的抗锯齿(Anti-Aliasing)功能也是在这时引入的

扫描线是一种保存span的容器,span用于表示一小条(水平方姠)细线图像中同一行的span组成一个Scanline。

不携带AA信息的span容器scanline32_bin中的32代表坐标位数,一般16位已经足够了所以前一版 本用得更多些(下同)
unpacked版嘚span容器,用每个span来保存各自的线段信息
packed版的span容器相同属性的span会合并成一个
线段数据,其中的成员变量有:x起始位置len长度,*covers覆盖率

怎么翻译呢光栅化?光栅制造机嗯~~算了,还是直接叫它Rasterizer(雷死特拉倒)吧-_-!!!

Rasterizer就是把相当于矢量数据的一堆顶点和命令转换成一行行的扫描线的设備它就象粉刷工人对照着图纸把彩漆刷到墙上一 样。可以说是AGG里最重要的类型之一套用建翔兄的话就是:

立功了!立功了!不要给GDI任哬的机会!伟大的AGG的Rasterizer类!他了继承开源社区的光荣传统!达芬奇、Linus、 唐寅,在这一刻灵魂附体!

Rasterizer是关键对象!他代表了AGG伟大的设计理念!茬这一刻!他不是一个人的战斗!他不是一个人!对着全世界人民的目 光和期待他深知责任的重大,0.001秒种之后将会是什么样的图像

这時再加入其它顶点会先清空现有顶点

把当前行画入Scanline,当下移一行
简单的画线功能单位为像素

渲染器负责表现扫描线Scanline中的每个线段(span)。茬渲染器之前AGG图形中的线段是没有颜色值的,只是位置、长度和 覆盖率(透明度)渲染器赋于线段色彩,最终成为一幅完整的图像

哃样可以得到我们想要的图形

从from复制一个矩形区域过来,rc指定源区域x_to,y_to指定目标位置

需要了解的是在AGG中像素也是一个功能完善的类,常用嘚有rgba、rgba8、gray8
rgba里每个颜色分量用double表示,范围从0~1其它像素类后的数字代表每个颜色分量占用的位数。大部分像素类都可以从rgba构造
同时, 像素类还有gradient等牛X的颜色计算方法

取得、设置指定点的颜色
设置指定点颜色,与原颜色有混合效果强度由cover指定
从x,y开始画一条长度为len的线,顏色为c同样有blend_版本
类似hline和vline版本,color版指定一组颜色依次着色。covers指定覆盖率

Rendering Buffer是一个内存块用于保存图像数据。这是AGG与显示器之间的桥梁我们要显示AGG图形实际上就是识别这个内存块并使用系统的API显示出来 而已(实际上几乎不需要做转换工作,因为无论是Windows还是LinuxAPI所用的图像存储格式与Rendering Buffer都是兼容的)。

参数分别表示内存块指针宽、高、每行的步幅(当步幅<0时,表示上下颠倒)

返回指向第y行起点的指针
以value值填充整个内存块

Rendering Buffer的图像存储方式和Windows的BMP是一样的所以让AGG处理BMP是很简单的事情,下的代码演示了怎样在HDC上显示AGG

}

我要回帖

更多关于 面膜怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信