摘自:http://www.cnblogs.com/muxue/archive/2010/06/03/1751094.html
AGG 中也加入了一些基础描画对象(primitives)和标记(marker)的渲染器。这个机制可以让你很快地描画一些常见的、带锯齿的对象,比如直线,矩形,椭圆等。标记(marker)可以画出一些在散点图(scatter plots)中常见的形状。如果你不打算用它们,那么你可以跳过这一节的内容。
Primitives Renderer
头文件: agg_renderer_primitives.h
Declaration
template<class BaseRenderer> classrenderer_primitives
{
public:
typedef BaseRenderer base_ren_type;
typedef typename base_ren_type::color_type color_type;
//.. .
};
这里的 BaseRenderer 可以用renderer_base 或是 renderer_mclip.
Creation
renderer_primitives(base_ren_type& ren):
m_ren(&ren),
m_fill_color(),
m_line_color(),
m_curr_x(0),
m_curr_y(0)
{}
创建的开销非常小,只是初始化指向 base renderer 对象的指针、两个颜色信息、以及初始化坐标值,这些坐标值会在 move_to 和 line_to 函数中用到。
Member functions
static int coord(double c);
将一个 double 型的坐标值转换成亚像素精度的 int 型。它做的事就是将 double 值乘以256 ,然后返回它的整型部分。
void fill_color(const color_type& c);
void line_color(const color_type& c);
const color_type& fill_color() const;
const color_type& line_color() const;
获取或是设置 fill 或是直线的颜色。颜色可以带有 alpha 值并且这个值会生效,这样的话,基础画面对象(primitives)就可以进行 alpha 混合渲染。
void rectangle(int x1, int y1, int x2, inty2);
描画一个矩形,但不填充线的颜色。使用的是正规的像素坐标,边界的宽度始终是 1 像素,不能修改。
void solid_rectangle(int x1, int y1, intx2, int y2);
描画一个不带边界的实心矩形,填充线的颜色。使用的是像素坐标。
void outlined_rectangle(int x1, int y1, intx2, int y2);
描画一个带边界的实心矩形。使用了颜色线(colors line)和填充(fill?)。
void ellipse(int x, int y, int rx, int ry);
void solid_ellipse(int x, int y, int rx,int ry);
void outlined_ellipse(int x, int y, int rx,int ry);
描画椭圆,空心的、实心的或是实心带边界的。坐标是整数值,以像素数来衡量。rx 和 ry 是像素数衡量的椭圆半径。
void line(int x1, int y1, int x2, int y2,bool last=false);
使用亚像素精度描画一条 bresenham 光栅线。坐标的格式是 24.8,即,1/256的像素精度。 last决定是否描画最后一个像素,这对于使用 alpha混合渲染来描画 consecutive 线段会非常重要。不应该有像素被多次描画。
void move_to(int x, int y);
void line_to(int x, int y, boollast=false);
line()版本。
const base_ren_type& ren() const {return *m_ren; }
base_ren_type& ren() { return *m_ren; }
返回 base renderer 对象的引用。
const rendering_buffer& rbuf() const {return m_ren->rbuf(); }
rendering_buffer& rbuf() { returnm_ren->rbuf(); }
返回附着于 base renderer 的 rendering buffer 的引用。
提供例子:
agg::rendering_buffer &rbuf = rbuf_window();
agg::pixfmt_bgr24 pixf(rbuf);
typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
renderer_base_type renb(pixf);
agg::renderer_primitives<renderer_base_type> primitive(renb);
primitive.line_color(agg::rgba8(255,0,0));//设置线的颜色
primitive.fill_color(agg::rgba8(0,255,0));//设置填充的颜色
primitive.solid_ellipse(230,230,220,220);//绘制实心圆
primitive.solid_rectangle(300,300,400,400);//绘制实心矩形
总结:rendering_buffer(RGB分量)-》pixfmt_bgr24(像素) -》 renderer_base(携带裁剪区域的像素操作) -》renderer_primitives(绘制一些带锯齿的简单图形)
在上述的过程中,是需要反复去思考的,现在实现的功能都没有采用任何的复杂算法,都是中规中矩的对像素点进行了一系列的RGB赋值,实际上操作的还是渲染缓存的指针,没有进行任何的偏移。