AGG 渲染器(Renderers)

來源:互聯網
上載者:User
文章目錄
  • Scanline Renderer
  • Basic Renderers
  • PixelFormat Renderer
Renderers 渲染器

渲染器負責表現掃描線Scanline中的每個線段(span)。在渲染器之前,AGG圖形中的線段是沒有顏色值的,只是位置、長度和 覆蓋率(透明度)。渲染器賦於線段色彩,最終成為一幅完整的映像。

渲 染器被分成底中高三層。其中底層負責像素封裝,由PixelFormat Renderer實現;中層是基礎層,在PixelFormat Renderer的基礎上提供更多方法,是所有高層渲染器依賴的基礎,由Base Renderer實現;高層負責渲染Scanline中的線段,由Scanline Renderer等實現。

Scanline Renderer標頭檔
#include <agg_renderer_scanline.h>
類型
template<class BaseRenderer> class renderer_scanline_aa_solid; //實色AA渲染template<class BaseRenderer> class renderer_scanline_bin_solid; //實色原始渲染template<class BaseRenderer, class SpanAllocator, class SpanGenerator> class renderer_scanline_aa; // 自訂AA渲染template<class BaseRenderer, class SpanAllocator, class SpanGenerator> class renderer_scanline_bin; // 自訂原始渲染

以及自己寫的實現了void prepare() 和 template<class Scanline> void render(const Scanline& sl) 方法的類

另外,標頭檔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<class Rasterizer, class Scanline, class BaseRenderer, class SpanAllocator, class SpanGenerator>void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, SpanAllocator& alloc, SpanGenerator& span_gen);
實驗代碼(基於此 處代碼)

把on_draw()方法裡原

typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderer_scanline_type;

改成

typedef agg::renderer_scanline_bin_solid<renderer_base_type> renderer_scanline_type;
得到的圖形是:

去掉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 <agg_renderer_base.h>#include <agg_renderer_mclip.h>
類型
template<class PixelFormat> class renderer_base;
template<class PixelFormat> class renderer_mclip;
建構函式
renderer_base(pixfmt_type& ren);
參數ren指定底層的PixelFormat Renderer
成員方法
pixfmt_type& ren(); 返回底層的PixelFormat Renderer
unsigned width() const;
unsigned height() const;
寬高
void reset_clipping(bool visibility); 設定是否可見
clipping box=visibility?(0,0,width-1,height-1):(1,1,0,0)
bool clip_box(int x1, int y1, int x2, int y2); 設定clipping box,renderer_base專有
void add_clip_box(int x1, int y1, int x2, int y2); 添加clipping box,renderer_mclip專有
bool inbox(int x, int y) const; x,y點是否在clipping box內,renderer_base專有
void first_clip_box();
bool next_clip_box();
切換clipping box,renderer_mclip專用
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;  
返回clipping box大小
void clear(const color_type& c); 以顏色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 x, int y, int len,
                       const color_type* colors, const cover_type* covers);
見後文的PixelFormat Renderer
void copy_from(const rendering_buffer& from,
           const rect* rc=0,
           int x_to=0,
           int y_to=0);
從from複製一個矩形地區過來,rc指定來源區域,x_to,y_to指定目標位置
實驗代碼(基於此 處代碼)

在on_draw()方法的renb.clear(agg::rgba8(255,255,255));語句後面加上:

  1. renb.clear(agg::rgba8(255,255,255));
  2. renb.clip_box(30,30,160,160); // 設定可寫地區
得到的圖形是:


PixelFormat Renderer

PixelFormat Renderer的作用是以指定的色彩空間來封裝原始的Rendering Buffer(見後文),AGG把它歸類於底層Renderer。
Rendering Buffer是以位元組為單位的,而PixelFormat Renderer則是以像素為單位的。

標頭檔
#include "agg_pixfmt_rgb.h#include "agg_pixfmt_gray.h"
類型

pixfmt_gray8
pixfmt_rgb24
pixfmt_bgr24
pixfmt_rgba32
pixfmt_bgr24_gamma
...
建構函式

pixfmt_base(rbuf_type& rb);

rb參數為Rendering Buffer類型

類型定義
typedef color_type; 像素類型
需要瞭解的是在AGG中像素也是一個功能完善的類,常用的有rgba、rgba8、gray8。
rgba裡每個顏色分量用double表示,範圍從0~1。其它像素類後面的數字代表每個顏色分量佔用的位元。大部分像素類都可以從rgba構造。
同時, 像素類還有gradient等牛X的顏色計算方法。
typedef value_type; 單個顏色分量的類型
typedef order_type; 顏色排序方式,我們可以通過裡面的枚舉值R G B A得到各顏色分量所在位置,常用的有order_rgb,order_bgr,order_rgba。
這是order_rgb的定義: struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag }; };
成員方法
unsigned width()
unsigned height()
寬高
color_type pixel(int x, int y);
void copy_pixel(int x, int y, const color_type& c);
取得、設定指定點的顏色
void blend_pixel(int x, int y, const color_type& c, int8u cover); 設定指定點顏色,與原顏色有混合效果,強度由cover指定
void copy_hline(int x, int y, unsigned len, const color_type& c);
void copy_vline(int x, int y, unsigned len, const color_type& c);
從x,y開始畫一條長度為len的線,顏色為c,同樣有blend_版本
void blend_solid_h(v)span(int x, int y, unsigned len,
                   const color_type& c, const int8u* covers);
void blend_color_h(v)span(int x, int y, unsigned len,
                   const color_type* colors, const int8u* covers);
類似hline和vline版本,color版指定一組顏色,依次著色。covers指定覆蓋率
實驗代碼(基於此 處代碼)

在on_draw()方法的最後加上:

  1. //從50,20開始,畫20條長度為100的堅線,顏色從黑漸層到紅,覆蓋率為128(半透明)
  2. for(int i=0; i<20; i++)
  3.      pixf.blend_vline(50+i,20,100,agg::rgba(i/20.0,0,0),128);
得到的圖形是:

 

作者:毛毛 來源:www.cppprog.com

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.