1源码目录
1)examples
最大的参考价值,作者在AGG库下的example目录中,创建了很多win32的测试用例,创建使用的是VC6.0的工程,目前采用VS2005,可以轻松的进行工程的导入。初学者可以简单的使用。进入agg\examples\win32_api目录,点击example.dsw,允许进行工程的导入,就OK了。接下来会对每一个例子进行详细的应用剖析。
2)font_freetype
??
3)font_win32_tt
??
4)gps
多边形集合算法,后面剖析一二!!
5)include
这是一个非常重要的文件夹,里面包含有三个文件夹和一堆的头文件:ctrl,platform(作者在这里封装了系统的函数,提供了一种简单测试AGG的方式),util.大部分的头文件都是完整的包含类的声明和实现,受到模块类定义的限制,
6)src
该目录下的源码文件有vcgen,trans等,不明所以,还有platform
util等文件夹,对应于每一个平台的实现文件。
2 框架代码分析
rendering buffer (frame buffer 我们可以理解为显存)存储一块连续的内存区域,不知道自身具体存储内容的结构,只按照行的长度,向外提供行指针,有宽、高、步长属性。
spanrender 水平区段绘制器,用于绘制scanline中的段,与renderingbuffer直接交互,将scanline的内容映射到显存中。
outline 轮廓线,将矢量数据转化为点阵格式 rasterizer内部类。
scanline将点阵格式的点集合,转化成为renderer使用的水平区段。
renderer将点阵数据填上颜色放入显存中
rasterizer栅格器,用于转化上层的矢量数据到栅格集合中。
Vectortransitions 矢量变化,一个复杂的集合对应着n多convs 对点集合的操作。
一个比方来介绍AGG里面的一组关系,rasterizer,scanline,和renderer之间的关系.它们就如同你在黑板面前拿着一本一册,用粉笔画黑板报.那本画册就是rasterizer,他存储图形,黑板套装(包括粉笔)就是我们的renderer,而你就是中间的scanline. AGG中就是通过scanline把rasterizer中存放的栅格信息用粉笔pixfmt_renderer转化到黑板rendering_buffer中,完成最终的绘制.
变量定义:float 还是double类型
实际上,这来源于C/C++对float和double类型的处理方法。如果你定义一个类似如下的函数:
void foo(float x, float y) ,传递的参数值永远都是double类型。除此之外,在矩阵变换中,使用double类型是最合理的,因为采用float类型,只能够显示7到10位小数点,遇到精度的计算错误是难以避免的。因此C/C++采用double类型,那是再自然不过的选择。
凡是有例外,我还是非常赞同在顶点源中使用float类型,例如: agg::path_storage,还有其他的转换器保存了大量的顶点数组(agg::conv_stroke)。交叉使用double和float类型,会导致问题更加复杂。