AGG第二课 代码框架以及命名规则

简介:

1源码目录

 

1examples

最大的参考价值,作者在AGG库下的example目录中,创建了很多win32的测试用例,创建使用的是VC6.0的工程,目前采用VS2005,可以轻松的进行工程的导入。初学者可以简单的使用。进入agg\examples\win32_api目录,点击example.dsw,允许进行工程的导入,就OK了。接下来会对每一个例子进行详细的应用剖析。

2font_freetype

??

3font_win32_tt

??

4gps

多边形集合算法,后面剖析一二!!

5include

这是一个非常重要的文件夹,里面包含有三个文件夹和一堆的头文件:ctrlplatform(作者在这里封装了系统的函数,提供了一种简单测试AGG的方式),util.大部分的头文件都是完整的包含类的声明和实现,受到模块类定义的限制,

6src

该目录下的源码文件有vcgentrans等,不明所以,还有platform

util等文件夹,对应于每一个平台的实现文件。

框架代码分析

rendering buffer (frame buffer 我们可以理解为显存)存储一块连续的内存区域,不知道自身具体存储内容的结构,只按照行的长度,向外提供行指针,有宽、高、步长属性。

spanrender 水平区段绘制器,用于绘制scanline中的段,与renderingbuffer直接交互,将scanline的内容映射到显存中。

outline 轮廓线,将矢量数据转化为点阵格式 rasterizer内部类。

scanline将点阵格式的点集合,转化成为renderer使用的水平区段。

renderer将点阵数据填上颜色放入显存中

rasterizer栅格器,用于转化上层的矢量数据到栅格集合中。

Vectortransitions 矢量变化,一个复杂的集合对应着nconvs 对点集合的操作。

 

一个比方来介绍AGG里面的一组关系,rasterizer,scanline,renderer之间的关系.它们就如同你在黑板面前拿着一本一册,用粉笔画黑板报.那本画册就是rasterizer,他存储图形,黑板套装(包括粉笔)就是我们的renderer,而你就是中间的scanline. AGG中就是通过scanlinerasterizer中存放的栅格信息用粉笔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类型,会导致问题更加复杂。


vvertex的缩写,ggenerator的缩写。

1 agg_vcgen_xxxx

历史从agg_gen_xxxxagg_cgen_xxxxagg_vcgen_xxxx

“vcgen””VertexaccCumulating Generators”的缩写

2 agg_vpgen_xxxxx

"vpgen" "Vertex Pass-through Generator"的缩写

 

其他的命名

affine_matrix à trans_affine

viewport  àtrans_viewport

邮件记录

I also would like to rename some classesand files, particulary agg_gen_xxxx to

agg_cgen_xxxx (where 'c' refers to"Cumulating" generators), there're also will

be agg_pgen_xxxxx refering to"Pass-through" generators. First ones acculumate

vertices of the whole contour (not path)before generating the path, the last

ones are fed with vertices and then askedto produce some other vertices on

demand. A typical example of thePass-through generator is Liang-Barski polygon

clipper.

 

Also, for the sake of consistency I'd liketo rename affine_matrix to

trans_affine, because there are trans_perspective,trans_bilinear, and

trans_warp_magnifier.



> > Or just:
> >
> > agg::rasterizer_fill
> > agg::rasterizer_fill_aa
> > agg::rasterizer_line
> > agg::rasterizer_line_aa
> >
> > It's shorter but maybe a bit less clear.

> If you want to fit the PostScript naming, maybe you could use:

> agg::rasterizer_fill...
> agg::rasterizer_stroke...

I like these also.


> > So, what is your vote: solid/outline, scanline/outline
> > of fill/line?


My preference in order would be:

1) rasterizer_fill/stroke
2) rasterizer_fill/line


rendering buffer (frame buffer 我们可以理解为显存)存储一块连续的内存区域,不知道自身具体存储


内容的结构,只按照行的长度,向外提供行指针,有宽、高、步长属性。

spanrender 水平区段绘制器,用于绘制scanline中的段,与rendering buffer直接交互,将scanline的内


容映射到显存中。

outline 轮廓线,将矢量数据转化为点阵格式 rasterizer内部类。

scanline将点阵格式的点集合,转化成为renderer使用的水平区段。

renderer将点阵数据填上颜色放入显存中

rasterizer栅格器,用于转化上层的矢量数据到栅格集合中。

Vectortransitions 矢量变化,一个复杂的集合对应着n多convs 对点集合的操作。

cw(clockwise):顺时针

ccw( counter-clockwise):逆时针

flip_y翻转y轴,来自于某些操作系统对于渲染缓存的y轴坐标的方向问题(windows,BeOS系统)


6)

premultiplied pre是预先的意思,而multiply是乘法的意思,按照字面上的理解就是预先乘以,简称预乘,对于一些图片虽然提供了alpha通道的值,但是所有的RGB分量都是已经乘以alpha通道得到的值,这样子,就可以在进行图片的叠加显示(专业术语是混合),减少了一道工序。

以前 color = alpha*A+(1-alpha)*B

现在 color = A * (1-alpha)*B



     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1961149,如需转载请自行联系原作者




相关文章
|
3月前
|
Java
Albert 源码解析:分组复用
Albert 源码解析:分组复用
21 0
|
11天前
|
设计模式 虚拟化 开发者
利用SwiftUI构建动态列表的高级技巧
【4月更文挑战第14天】 在本文中,我们将深入探讨如何运用SwiftUI框架实现一个具有高度交互性和动态性的列表视图。我们将透过具体实例,展示如何结合SwiftUI的声明式语法与先进的设计模式,来优化列表的性能和用户体验。文中将涵盖数据绑定、动画过渡、以及状态管理的实用技巧,并讨论如何通过这些技术提升应用的响应性和可扩展性。
|
前端开发 数据格式
#yyds干货盘点 【React工作记录二十二】ant design实现嵌套table
#yyds干货盘点 【React工作记录二十二】ant design实现嵌套table
165 0
#yyds干货盘点 【React工作记录二十二】ant design实现嵌套table
|
SQL 自然语言处理 分布式计算
HiveSQL源码之语法词法编译文件解析一文详解
HiveSQL源码之语法词法编译文件解析一文详解
264 0
HiveSQL源码之语法词法编译文件解析一文详解
|
分布式计算 Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(1)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(1)
161 0
|
分布式计算 Java Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(3)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(3)
172 0
|
SQL 分布式计算 Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(4)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(4)
366 0
|
SQL 分布式计算 Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(5)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(5)
141 0
|
SQL 分布式计算 Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(8)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(8)
172 0
|
SQL 分布式计算 Spark
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(10)
SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(10)
145 0