AGG参考手册1.前言1.1.简介1.1.1.……Anti-GrainGeometry(AGG)是一个用标准的平台无关的C++开发的通用图形工具包。在把高质量二维图形作为关键的计算机程序中,它可以应用被应用于许多方面。例如,AGG可以用于渲染二维地图。AGG仅仅使用C++和标准C的函数,如memcpy,sin,cos,sqrt等。基本的算法甚至没有使用C++的标准模板库。因此,AGG能够在大量的应用程序中使用,包括嵌入式系统。另一方面,AGG允许使用者替换图形库的任何部分,比如当它不能满足性能的要求时进行库的替换。使用者也可以根据需要添加其它的颜色空间。这一切的实现都是因为AGG广泛采用了C++的模板机制。AGG不是一个结构紧密的图形库,且不容易使用。我认为AGG是一个“创建其它工具的工具”。这意味着AGG中没有“Graphics”对象或其它类似的结构,它包含了许多组织松散、能组合或是单独使用的算法。这些算法都有定义良好的接口,并且算法之间隐式或显式的依赖关系尽可能最小。1.1.2.……大部分图形库都有一个包含成百上千方法的单独类,如GDI+中的“Graphics”。这个对象也可以隐式存在,如OpenGL。总之,所有常用的图形工具包,包括Java2D,DispalyPDF,SVG以及其它优秀的图形工具包都显式或隐式的含有这个类。这种做法简单而且非常适用于一些场合,但是去一直受到限制。它在简单的场合中性能很好,但至少我仍未遇到可以完全满足所有需求的图形库。此外,所有此种类型的库或标准都过于庞大。大部分功能从未被使用,而一些简单的操作却不能实现。图形引擎(或库)是一兆字节来计算的。如果使用最先进的SVG浏览器,它只在显示最简单的基元时表现良好。只要试图使用一些高级操作,如用不同的图形过滤器与SVG交互,将会发生内存泄露,甚至崩溃。这并不是因为它有不良设计,而是因为采取了极端复杂的设计。这种设计本身成为了不可能完成的任务,不能被人感知,,就像不能感知无穷大一样。1.1.3.建议AGG主要的目标是要打破上述的传统,展现其稳定、轻巧、灵活、自由的优点。它的基本概念开始似乎并不遵循惯例,非常接近于STL,但还是存在着很大的区别。STL是一个通用的C++工具,而AGG是C++图形库。STL作为一个方便的工具包直接在应用程序中使用,但我并不建议以同样的方式使用AGG。比较好的方法是针对需要处理的问题,对AGG进行轻量级的、面向问题的封装后再使用。这与GDI+又有什么不同呢?首先,可以完全控制封装后的AGG。AGG只是提供了一系列基本的算法和灵活的设计,使得算法间显式或隐式的联系都最小。使用者可以只定义接口、转换管道和输出格式,甚至可以模拟任何已经存在的图形接口的一部分。例如,使用AGG光栅化器来在屏幕上显示图形并直接调用WindowsGDI来打印,并合并为一个单独的API。不信吗?下图是GDI+和AGG的渲染质量的比较。但是最重要的是,如果设计足够灵活,程序将是完全可移植的。AGG还是一个可以将不同的输出合并为一个统一的API的工具。另外,在基于Web的应用程序中,可以使用AGG在服务器端生成栅格图像。而且AGG是完全跨平台的。1.1.4.反走样和子像素精度反走样是在低分辨率设备上显示图像时用于改善视觉质量的一种广为人知的技术。它基于人的视觉特性。看看下图,尝试猜测一下它表达的意思。这是用反走样发生绘制的单词。根据Kotelnikov-Shannon定理,图像的最大频率远高于Shannon极限。现在来看看正常大小的同一幅图,能够很容易地认出“stereo”这个词。然而,这两幅图是完全相同的。第一幅仅仅是第二副的放大版本。这个特性允许在累积经验的基础上重新构建缺失的信息。反走样并没有让你看得更清楚,只是让你的大脑更好得运转并重构丢失的信息。反走样的成果显而易见。如它使得我们可以绘制出更加详尽的地图。但是关键并不是反走样本身,而是可以利用子像素精度的技术绘制基元。这对于线的视觉厚度尤其重要。首先,如果利用了子像素精度,即使只使用简单的Bresenham线插值法也可以获得比较好的效果。下图显示了使用简单的Bresenham插值后放大的结果。如图中的(2)和(3),细的黑线就是需要插值的线。如果利用子像素精度,虽然线的起点和终点落在同一个像元中,但是会显示两种不同的像素集合。...