﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Error-随笔分类-agg</title><link>http://www.cppblog.com/Error/category/19900.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 24 Feb 2013 00:35:19 GMT</lastBuildDate><pubDate>Sun, 24 Feb 2013 00:35:19 GMT</pubDate><ttl>60</ttl><item><title>AGG 关键概念散记</title><link>http://www.cppblog.com/Error/archive/2013/02/20/197953.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 20 Feb 2013 06:56:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2013/02/20/197953.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/197953.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2013/02/20/197953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/197953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/197953.html</trackback:ping><description><![CDATA[<div>渲染 渲染缓存 混合 像素格式混合 基础渲染器 顶点源 路径存储器</div><div></div><div>渲染器：渲染器负责表现&#8220;扫描线&#8221;中的每个线段。在渲染器之前AGG图形中的线段</div><div>是没有颜色值的，只是位置、长度、和透明度。渲染器赋予线段色彩，最终成为一副</div><div>完整的图像。</div><div>最常用的如下：像素格式渲染器-PixelFormatRenderer、基础渲染器-BaseRender、扫描线（抗锯齿）ScanlineRenderer渲染器&nbsp;</div><div>像素格式渲染器可以直接工作</div><div>基础渲染器需要像素格式作为模版支持</div><div>扫描渲染器需要基础渲染器作为模版支持</div><div></div><div>渲染缓存：渲染缓存保存着一个个像素，作为AGG的画布。它仅仅是一个内存块，用来存储像素，</div><div>不提供任何绘图功能，只允许你读取和修改里边的数据。它也不告诉你里边的像素类型---它只管理内存</div><div>混合器：混合器是用来处理不同像素格式的如：agg::rgba &nbsp;agg::argb（PS：也许叫像素点混合器比较合适）</div><div>像素格式混合器：如agg::pixfmt_rgb24。（像素块混合器？）像素格式混合器的作用是直接操作像素，也就是</div><div>在缓存里边保持的数据。像素格式有两个属性决定：混合器类型（RGBA32）和顺序（ORDER_ARGB）</div><div></div><div>基础渲染器：基础渲染器是扫描线渲染器的基础。基础渲染器需要手动以模版的形式系统像素格式信息，</div><div>他会通过像素格式混合器来渲染。（实际通过模版传入的好像是像素格式混合器）他的功能比像素格式混合器来的</div><div>要更全面一点，有更多的渲染接口。</div><div></div><div>顶点源：顶点源是一个concept，有rewind()和vertex()函数。<br /><br />********************<br />参考教程<br /><div>http://www.360doc.com/content/12/0722/09/992979_225748412.shtml</div><br /></div><img src ="http://www.cppblog.com/Error/aggbug/197953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2013-02-20 14:56 <a href="http://www.cppblog.com/Error/archive/2013/02/20/197953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>enic的agg学习笔记1：官方文档</title><link>http://www.cppblog.com/Error/archive/2012/09/10/190123.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 10 Sep 2012 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2012/09/10/190123.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/190123.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2012/09/10/190123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/190123.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/190123.html</trackback:ping><description><![CDATA[<div><p>传说这就是AGG：</p> <p><a href="file:///C:/Documents%20and%20Settings/cail/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1B53F082/agg6.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="agg" border="0" alt="agg" src="file:///C:/Documents%20and%20Settings/cail/Local%20Settings/Temp/WindowsLiveWriter-429641856/supfiles1B53F082/agg_thumb4.jpg" width="284" height="388" /></a> </p> <p>要理解这张图上的几个概念：</p> <p>*vertex source: 顶点源。一切的图像的世界是由点构成的。</p> <p>*cordinate conversion pipeline: 坐标转换管道。不用自己去担心各种坐标系？</p> <p>*scanline rasterizer: 光栅化，把顶点数据处理合成一组组线段，这里可能会有一些fix或者effect。</p> <p>*renderers: 渲染器</p> <p>*rendering buffer: 用于存放像素点的内存</p> <p align="justify">我的理解是这样：图像是以点集的方式存在的，要画图先是冲一组点集开始，先把这一组点的坐标转换成目标坐标，然后通过光栅化形成一组线段，然后通过渲染器把这一组线段渲染到buffer上面形成面。点-&gt;线段-&gt;面</p> <p>*****************************************************************************************************</p> <p><strong>一、vertex source</strong></p> <p>&nbsp;</p> <p>我理解它是一个concept，官方解释是这个：</p> <p>&nbsp;&nbsp;&nbsp; 所有实现了void rewind(unsigned path_id);和unsigned vertex(double* x, double*  y);的类。</p> <p>agg提供的vertex source concept如下（可以自己扩展）：</p> <p>ellipse 圆</p> <p>arc 弧线</p> <p>curve3 curve4 贝塞尔曲线</p> <p>gsv_text AGG自带字模的文字输出（只支持ASCII码）</p> <p>gsv_text_outline&lt;&gt;&nbsp; 可变换文字，输入为gsv_text和变换矩阵</p> <p>rounded_rect&nbsp; 圆角方形</p> <p>path_storage 路径存储器，可以用join_path方法加入多个顶点源。</p> <p>arrowhead&nbsp; 箭头</p> <p>&nbsp;</p> <p><strong>二、coordinate conversion pipeline</strong></p> <p>&nbsp;&nbsp;&nbsp; 坐标转换管道用于改变顶点源产生的顶点，包括坐标、命令、产生新顶点等。如对顶点进行矩阵变换、插入顶点形成虚线之类的功能。</p> <p>1.变化矩阵 trans_affine</p> <p>头文件：#include &lt;agg_trans_affine.h&gt;</p> <p>接口：scale 缩放、rotate旋转、translate平移、矩阵*乘法、invert取反矩阵</p> <p>2.坐标转换管道</p> <p>template&lt;class VertexSource, class Markers = null_markers&gt; struct  conv_stroke;</p> <p>变成连续线 构造参数为VertexSource width属性决定线宽。</p> <p>template&lt;class VertexSource, class Markers = null_markers&gt; struct  conv_dash;</p> <p>虚线</p> <p>template&lt;class MarkerLocator, class MarkerShapes&gt; class  conv_marker;</p> <p>建立标记</p> <p>template&lt;class VertexSource&gt; struct conv_contour;</p> <p>轮廓变换</p> <p>template&lt;class VertexSource&gt; struct conv_smooth_poly1_curve;</p> <p>圆滑过渡多边形各顶点</p> <p>template&lt;class VertexSource&gt; struct conv_bspline;</p> <p>圆滑过渡多义线各顶点</p> <p>template&lt;class VertexSource, class Curve3 = curve3, class Curve4 =  curve4&gt; class conv_curve;</p> <p>可识别VertexSource中的曲线信息</p> <p>template&lt;class VertexSource, class Transformer = trans_affine&gt; class  conv_transform;</p> <p>矩阵变换 用变换矩阵重新计算顶点位置</p> <p>&nbsp;</p> <p><strong>三、scanline rasterizer</strong></p> <p>1.scanline</p> <p>扫描线是一种保存span的容器，span用于表示一小条（水平方向）细线。图像中同一行的span组成一个Scanline</p> <p>2.rasterizer</p> <p>Rasterizer就是把相当于矢量数据的一堆顶点和命令转换成一行行的扫描线的设备，它就象粉刷工人对照着图纸把彩漆刷到墙上一样</p> <p>&nbsp;</p> <p><strong>四、renderers</strong></p> <p>&nbsp;&nbsp;&nbsp;  渲染器负责表现扫描线Scanline中的每个线段（span）。在渲染器之前，AGG图形中的线段是没有颜色值的，只是位置、长度和覆盖率（透明度）。渲染器赋于线段色彩，最终成为一幅完整的图像。  </p> <p>&nbsp;&nbsp;&nbsp; 渲染器被分成底中高三层。其中底层负责像素包装，由PixelFormat Renderer实现；中层是基础层，在PixelFormat  Renderer的基础上提供更多方法，是所有高层渲染器依赖的基础，由Base Renderer实现；高层负责渲染Scanline中的线段，由Scanline  Renderer等实现。</p> <p>&nbsp;</p> <p><strong>五、rendering buffer</strong></p> <p>Rendering  Buffer是一个内存块，用于保存图像数据。这是AGG与显示器之间的桥梁，我们要显示AGG图形实际上就是识别这个内存块并使用系统的API显示出来  而已（实际上几乎不需要做转换工作，因为无论是Windows还是Linux，API所用的图像存储格式与Rendering Buffer都是兼容的）。</p> <p>&nbsp;</p> <p>差不多了，其他的东东现在看多了白搭，俺们要在战斗中学会战斗，，，</p></div><img src ="http://www.cppblog.com/Error/aggbug/190123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2012-09-10 16:36 <a href="http://www.cppblog.com/Error/archive/2012/09/10/190123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>