AGG第二课 代码框架以及命名规则
1源碼目錄
?
1)examples
最大的參考價(jià)值,作者在AGG庫下的example目錄中,創(chuàng)建了很多win32的測試用例,創(chuàng)建使用的是VC6.0的工程,目前采用VS2005,可以輕松的進(jìn)行工程的導(dǎo)入。初學(xué)者可以簡單的使用。進(jìn)入agg\examples\win32_api目錄,點(diǎn)擊example.dsw,允許進(jìn)行工程的導(dǎo)入,就OK了。接下來會對每一個(gè)例子進(jìn)行詳細(xì)的應(yīng)用剖析。
2)font_freetype
??
3)font_win32_tt
??
4)gps
多邊形集合算法,后面剖析一二!!
5)include
這是一個(gè)非常重要的文件夾,里面包含有三個(gè)文件夾和一堆的頭文件:ctrl,platform(作者在這里封裝了系統(tǒng)的函數(shù),提供了一種簡單測試AGG的方式),util.大部分的頭文件都是完整的包含類的聲明和實(shí)現(xiàn),受到模塊類定義的限制,
6)src
該目錄下的源碼文件有vcgen,trans等,不明所以,還有platform
util等文件夾,對應(yīng)于每一個(gè)平臺的實(shí)現(xiàn)文件。
2?框架代碼分析
rendering buffer (frame buffer 我們可以理解為顯存)存儲一塊連續(xù)的內(nèi)存區(qū)域,不知道自身具體存儲內(nèi)容的結(jié)構(gòu),只按照行的長度,向外提供行指針,有寬、高、步長屬性。
spanrender?水平區(qū)段繪制器,用于繪制scanline中的段,與renderingbuffer直接交互,將scanline的內(nèi)容映射到顯存中。
outline 輪廓線,將矢量數(shù)據(jù)轉(zhuǎn)化為點(diǎn)陣格式 rasterizer內(nèi)部類。
scanline將點(diǎn)陣格式的點(diǎn)集合,轉(zhuǎn)化成為renderer使用的水平區(qū)段。
renderer將點(diǎn)陣數(shù)據(jù)填上顏色放入顯存中
rasterizer柵格器,用于轉(zhuǎn)化上層的矢量數(shù)據(jù)到柵格集合中。
Vectortransitions?矢量變化,一個(gè)復(fù)雜的集合對應(yīng)著n多convs?對點(diǎn)集合的操作。
?
一個(gè)比方來介紹AGG里面的一組關(guān)系,rasterizer,scanline,和renderer之間的關(guān)系.它們就如同你在黑板面前拿著一本一冊,用粉筆畫黑板報(bào).那本畫冊就是rasterizer,他存儲圖形,黑板套裝(包括粉筆)就是我們的renderer,而你就是中間的scanline. AGG中就是通過scanline把rasterizer中存放的柵格信息用粉筆pixfmt_renderer轉(zhuǎn)化到黑板rendering_buffer中,完成最終的繪制.
變量定義:float 還是double類型
????實(shí)際上,這來源于C/C++對float和double類型的處理方法。如果你定義一個(gè)類似如下的函數(shù):
void foo(float x, float y) ,傳遞的參數(shù)值永遠(yuǎn)都是double類型。除此之外,在矩陣變換中,使用double類型是最合理的,因?yàn)椴捎胒loat類型,只能夠顯示7到10位小數(shù)點(diǎn),遇到精度的計(jì)算錯(cuò)誤是難以避免的。因此C/C++采用double類型,那是再自然不過的選擇。
????凡是有例外,我還是非常贊同在頂點(diǎn)源中使用float類型,例如: agg::path_storage,還有其他的轉(zhuǎn)換器保存了大量的頂點(diǎn)數(shù)組(agg::conv_stroke)。交叉使用double和float類型,會導(dǎo)致問題更加復(fù)雜。
v是vertex的縮寫,g是generator的縮寫。
1 agg_vcgen_xxxx
歷史從agg_gen_xxxx到agg_cgen_xxxx到agg_vcgen_xxxx
“vcgen”是”VertexaccCumulating Generators”的縮寫
2 agg_vpgen_xxxxx
"vpgen"?是"Vertex Pass-through Generator"的縮寫
?
3?其他的命名
affine_matrix?à?trans_affine
viewport??àtrans_viewport
4?郵件記錄
I also would like to rename some classesand files, particulary agg_gen_xxxx to
agg_cgen_xxxx (where 'c' refers to"Cumulating" generators), there're also will
be agg_pgen_xxxxx refering to"Pass-through" generators. First ones acculumate
vertices of the whole contour (not path)before generating the path, the last
ones are fed with vertices and then askedto produce some other vertices on
demand. A typical example of thePass-through generator is Liang-Barski polygon
clipper.
?
Also, for the sake of consistency I'd liketo rename affine_matrix to
trans_affine, because there are trans_perspective,trans_bilinear, and
trans_warp_magnifier.
>?
> > Or just:
> >
> > agg::rasterizer_fill
> > agg::rasterizer_fill_aa
> > agg::rasterizer_line
> > agg::rasterizer_line_aa
> >
> > It's shorter but maybe a bit less clear.
>?
> If you want to fit the PostScript naming, maybe you could use:
>?
> agg::rasterizer_fill...
> agg::rasterizer_stroke...
I like these also.
>?
> > So, what is your vote: solid/outline, scanline/outline
> > of fill/line?
>?
My preference in order would be:
1) rasterizer_fill/stroke
2) rasterizer_fill/line
rendering buffer (frame buffer 我們可以理解為顯存)存儲一塊連續(xù)的內(nèi)存區(qū)域,不知道自身具體存儲
內(nèi)容的結(jié)構(gòu),只按照行的長度,向外提供行指針,有寬、高、步長屬性。
spanrender 水平區(qū)段繪制器,用于繪制scanline中的段,與rendering buffer直接交互,將scanline的內(nèi)
容映射到顯存中。
outline 輪廓線,將矢量數(shù)據(jù)轉(zhuǎn)化為點(diǎn)陣格式 rasterizer內(nèi)部類。
scanline將點(diǎn)陣格式的點(diǎn)集合,轉(zhuǎn)化成為renderer使用的水平區(qū)段。
renderer將點(diǎn)陣數(shù)據(jù)填上顏色放入顯存中
rasterizer柵格器,用于轉(zhuǎn)化上層的矢量數(shù)據(jù)到柵格集合中。
Vectortransitions 矢量變化,一個(gè)復(fù)雜的集合對應(yīng)著n多convs 對點(diǎn)集合的操作。
cw(clockwise):順時(shí)針
ccw( counter-clockwise):逆時(shí)針
flip_y翻轉(zhuǎn)y軸,來自于某些操作系統(tǒng)對于渲染緩存的y軸坐標(biāo)的方向問題(windows,BeOS系統(tǒng))
6)
premultiplied pre是預(yù)先的意思,而multiply是乘法的意思,按照字面上的理解就是預(yù)先乘以,簡稱預(yù)乘,對于一些圖片雖然提供了alpha通道的值,但是所有的RGB分量都是已經(jīng)乘以alpha通道得到的值,這樣子,就可以在進(jìn)行圖片的疊加顯示(專業(yè)術(shù)語是混合),減少了一道工序。
以前 color = alpha*A+(1-alpha)*B
現(xiàn)在 color = A * (1-alpha)*B
轉(zhuǎn)載于:https://blog.51cto.com/fengyuzaitu/1961149
總結(jié)
以上是生活随笔為你收集整理的AGG第二课 代码框架以及命名规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUBA在查询语句如何添加参数
- 下一篇: Citrix Port(常用端口)