Primitives and Markers Renderers

摘自: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赋值,实际上操作的还是渲染缓存的指针,没有进行任何的偏移。




你可能感兴趣的:(agg)