内容发布更新时间 : 2024/12/23 11:34:13星期一 下面是文章的全部内容请认真阅读。
iterator,const_iterator; typename cover_type; 成员方法 iterator begin(); unsigned num_spans();
void reset(int min_x, int max_x);
void add_span(int x, unsigned len, unsigned cover)
void add_cell(int x, unsigned cover) void add_cells(int x, unsigned len, const cover_type* covers) void finalize(int y) int y();
Rasterizer
span中covers类型(覆盖率)
用于遍历span,begin()取得指向第一个span的迭代器
num_spans()取得容器中span的数目 设置容器大小 加入一条线段 加入一个点 加入一组点
Scanline容器对应的Y坐标
怎么翻译呢?光栅化?光栅制造机?嗯~~算了,还是直接叫它Rasterizer(雷死特拉倒)吧-_-!!!
Rasterizer就是把相当于矢量数据的一堆顶点和命令转换成一行行的扫描线的设备,它就象粉刷工人对照着图纸把彩漆刷到墙上一 样。可以说是AGG里最重要的类型之一,套用建翔兄的话就是:
立功了!立功了!不要给GDI任何的机会!伟大的AGG的Rasterizer类!他了继承开源社区的光荣传统!达芬奇、Linus、 唐寅,在这一刻灵魂附体!
Rasterizer是关键对象!他代表了AGG伟大的设计理念!在这一刻!他不是一个人的战斗!他不是一个人!面对着全世界人民的目 光和期待,他深知责任的重大,0.001秒种之后将会是什么样的图像? 头文件
#include
template
成员方法
template
设置gamma值。
GammaF为一种仿函数
AGG自带有gamma_power、gamma_none、
gamma_threshold、 gamma_linear、gamma_multiply
bool rewind_scanlines(); bool navigate_scanline(int y); bool sweep_scanline(Scanline&); void reset();
void move_to(int x, int y);
void line_to(int x, int y);
void move_to_d(double x, double y); void line_to_d(double x, double y); void add_path(VertexSource& vs, unsigned path_id=0)
跳到第一个scanline位置,同时设置sorted为true。 这时再加入其它顶点会先清空现有顶点 跳到y行
把当前行画入Scanline,当下移一行
清空
简单的画线功能,单位为1/poly_subpixel_scale (poly_subpixel_scale一般为256) 简单的画线功能,单位为像素 加入顶点
Renderers 渲染器
渲染器负责表现扫描线Scanline中的每个线段(span)。在渲染器之前,AGG图形中的线段是没有颜色值的,只是位置、长度和 覆盖率(透明度)。渲染器赋于线段色彩,最终成为一幅完整的图像。
渲 染器被分成底中高三层。其中底层负责像素包装,由PixelFormat Renderer实现;中层是基础层,在PixelFormat Renderer的基础上提供更多方法,是所有高层渲染器依赖的基础,由Base Renderer实现;高层负责渲染Scanline中的线段,由Scanline Renderer等实现。
Scanline Renderer
头文件
#include
template
template
以及自己写的实现了void prepare() 和 template
另外,头文件agg_renderer_scanline.h中 的render_scanlines函 数很重要,它是AGG显示流程的实现。
void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren);
从Rasterizer生成逐行的Scanline,然后交给Scanline Renderer渲染。
这 里还要提一下render_scanlines_aa_solid、render_scanlines_aa、 render_scanlines_bin_solid、render_scanlines_bin这 几个函数。它们的作用和 render_scanlines一 样,只是跳过了Scanline Renderer环节,直接向Base Renderer渲染。 void render_scanlines_aa_solid(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, const ColorT& color)
template
void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen);
实验代码(基于此 处代码)
把on_draw()方法里原
typedef agg::renderer_scanline_aa_solid
改成
typedef agg::renderer_scanline_bin_solid
得到的图形是:
去掉renderer_scanline_type以及所有的rensl相关语句,把 agg::render_scanlines(ras,sl,rensl);
改成
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,i*50));
同样可以得到我们想要的图形
Basic Renderers
头文件
#include
template
构造函数
renderer_base(pixfmt_type& ren);
参数ren指定底层的PixelFormat Renderer
成员方法
pixfmt_type& ren();
unsigned width() const; unsigned height() const;
void reset_clipping(bool visibility); bool clip_box(int x1, int y1, int x2, int y2); void add_clip_box(int x1, int y1, int x2, int y2);
bool inbox(int x, int y) const; void first_clip_box(); bool next_clip_box(); const rect& clip_box() const; int xmin() const; int ymin() const; int xmax() const; int ymax() const; const rect& bounding_clip_box() const; int bounding_xmin() const;
int bounding_ymin() const;
int bounding_xmax() const;
int bounding_ymax() const;
void clear(const color_type& c); void copy_pixel(int x, int y, const color_type& c);
void blend_pixel(int x, int y, const color_type& c, cover_type cover); color_type pixel(int x, int y) const; void copy_h(v)line(int x1, int y, int x2, const color_type& c);
void blend_h(v)line(int x1, int y, int x2, const color_type& c, cover_type cover);
void blend_solid_h(v)span(int x, int y, int len,
const color_type& c, const cover_type* covers); void blend_color_h(v)span(_no_slip)(int
返回底层的PixelFormat Renderer 宽高
设置是否可见
clipping
box=visibility?(0,0,width-1,height-1):(1,1,0,0) 设置clipping box,renderer_base专有 添加clipping box,renderer_mclip专有
x,y点是否在clipping box内,renderer_base专有切换clipping box,renderer_mclip专用
返回clipping box大小
以颜色c填充所有区域
见后文的PixelFormat Renderer