AGG 文檔翻譯 - 基礎渲染器

基礎渲染器

Agg2個基礎渲染器,這2個渲染器有着幾乎相同的函數,它們是:renderer_base 和 renderer_mclip。第一個是最常用的,它在底層次上實現裁剪。一般說來裁剪是一項複雜的工作,agg中至少有2個層次的裁剪,低層次(像素)裁剪和高層次(向量)裁剪。這些渲染器類在像素層實施裁剪是爲了保護buffer內存訪問不越界。Renderer_mclip類可以實施多矩形區域裁剪,但是它的性能受矩形個數的影響。

Renderer_baserenderer_mclip是以像素類型渲染器作爲參數的類模板:

template<class PixelFormat> class renderer_base

{

public:

    typedef PixelFormat pixfmt_type;

    typedef typename pixfmt_type::color_type color_type;

    . . .

};

請參考renderer_baserenderer_mclip的源代碼。

 

創建

renderer_base(pixfmt_type& ren);

renderer_mclip(pixfmt_type& ren);

兩個類都接受一個像素格式渲染器的引用,rederer_mclip使用renderer_base<PixelFormat>在其內部來實現單矩形區域的裁剪,請注意你可以使用pixel_amask_adapter來作爲PixelFormatd 的模板參數。

創建基礎渲染器的代價是非常小的,它只是初始化了類成員變量。但是renderer_mclip會在增加裁剪矩形的時候分配內存,並在對象銷燬的時候釋放內存。它使用pod_deque類來分配相同大小的內存塊,並且再也不會爲它重新分配內存。當你重置(清空)了裁剪區域,已經分配的內存不會被回收,而會被重用,renderer_mclip只會在對象銷燬的時候纔會釋放內存。這個技術在agg中被廣泛使用,用來防止深度的內存碎片。

 

成員函數:

const pixfmt_type& ren() const;

pixfmt_type& ren();

返回像素類型渲染器的引用;

unsigned width()  const;

unsigned height() const;

返回渲染buffer的寬高;

void reset_clipping(bool visibility);

這個函數重置裁剪,如果visibility爲true那麼裁剪區被設置成(0,0,width()-1, height()-1),如果爲false,那麼裁剪區被設置成一個不可見的區域,如(1,1,0,0)。在renderer_mclip中此函數同樣也刪除所有之前添加的裁剪區。

重要提示:

如果你爲渲染buffer綁定了另一個內存buffer,並與這個特殊的基礎渲染器相關聯,那麼你必須要調用reset_clipping,否則裁剪區將會非法,因爲此時基礎渲染器沒有從渲染buffer中得到任何“反饋”,換句話說,renderer_baserenderer_mclip不知道渲染buffer的任何改變,在這個例子中使用事件機制或者代理又顯得多餘。

bool clip_box(int x1, int y1, int x2, int y2);

 

設置新的裁剪區,僅renderer_base有這個函數,裁剪區包含邊界信息,所以它的最大值是(0,0,width()-1, height()-1)。裁剪區在被設置前默認爲此最大值,所以設置裁剪區的值超過這個最大值是安全的。

 

void add_clip_box(int x1, int y1, int x2, int y2);

增加一個新的裁剪區,僅renderer_mclip類有此函數,你可以添加任意數量的矩形裁剪區,但是它們不能重疊,如果其中有重疊的區域,那麼某些元素可能被繪製2次或者以上,在添加裁剪區之前,考慮性能的因素,裁剪區默認爲(0, 0, width()-1, heigth()-1)。這也意味着調用renderer_mclipreset_clipping(false)函數是沒有道理的(不應該的),因爲調用這個函數後renderer_mclip所有添加的裁剪區將會被一個不可見的區域裁剪(renderer_base中的裁剪區已經被置成1100),並且不會被真正的添加。可見區域也包括了裁剪區域的邊界,也就是說add_clip_box(100, 100, 100, 100)將添加一個只有一個像素的裁剪區。

 

void clip_box_naked(int x1, int y1, int x2, int y2);

renderer_base有此函數,設置新的裁剪區但是此區域並不與之前添加的裁剪區發生裁剪運算(清除了舊的裁剪區,設置一個新的裁剪區)。這個函數是不安全的,一般在renderer_mclip中被調用,目的是爲了在渲染時在不同區域間切換和避免額外的開銷。

 

bool inbox(int x, int y) const;

檢查點(x, y)是否在裁剪區中,僅renderer_base有此函數。

 

void first_clip_box();

bool next_clip_box();

2個函數用來枚舉出渲染器中的所有裁剪區,在renderer_base中他們是空的,next_clip_box()永遠返回false

 

const rect& clip_box() const;

int         xmin()     const;

int         ymin()     const;

int         xmax()     const;

int         ymax()     const;

以一個矩形或者以單個整數的方式返回裁剪區,在renderer_mclip中這些函數恆返回(0, 0, width()-1, height()-1)(因爲返回的是renderer_base中的裁剪區,而這個裁剪區沒有被修改過)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章