cairo總結

Cairo將成爲Linux 2D 繪圖的未來 注意:目前"有理論沒有實踐"^_^ ======================= 1,什麼是Cairo。 ======================= cairo是一個支持多種輸出的向量圖形庫。也就是說,cairo是種畫圖的工具庫,他可以向多種設備上畫圖 ,比如: cairo可以輸出到png,可以輸出到pdf,可以輸出到ps,可以輸出到xlib,可以輸出到XCB,可以 輸出到win32,以後還要輸出到svg ======================= 2.理解cairo: ======================= 如果單純的從代碼上理解cairo,可能容易讓人迷惑,所以,我們需要這麼去理解cairo: cairo是一個畫筆,你可以爲這個畫筆設置顏色、設置字體、設置alpha,也可以用這個畫筆去畫出任何圖 形。 就像畫家作畫一樣,你可以用畫布,也可以用宣紙,也可以用其他的材料。cairo這支畫筆,可以在 png,ps,pdf或者Xlib上畫東西。 例子如下: /*利用cairo繪製一個png圖形*/ #include #include #include #include int main() { FILE *file; file=fopen("a.png","w");//打開一個文件,寫入,文件名爲a.png cairo_t *cr; //聲明一支畫筆 cr=cairo_create();//創建畫筆 cairo_set_target_png(cr,file,CAIRO_FORMAT_ARGB32,400,400);//設置畫布,就是文件,a.png cairo_set_rgb_color(cr,0,1,0);//設置畫筆顏色,也就是紅,綠,藍,這裏設置成綠色。 cairo_rectangle(cr,10,10,200,200);//畫一個方塊,位置從座標(10,10)開始,寬200,高200 cairo_fill(cr);//填充,使用的顏色當然是上面設置的顏色。 cairo_move_to(cr,250,200);//將畫筆移動到(250,200) cairo_select_font (cr, "DongWen--Song", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);//爲cairo設置一個字體,字體名DongWen--Song,非斜體,非粗體。 cairo_scale_font(cr,60);//縮放字體到60倍 cairo_show_text(cr,"hello world");//畫出一個串 cairo_destroy(cr);//銷燬畫筆 fclose(file);//關閉文件 } 存成t1.c,然後使用下面的命令編譯 gcc -o t1 t1.c -lcairo -I/usr/include/cairo 運行./t1,就生成了一個png圖片文件,自己用工具打開看就可以了。 ======================= 3.常用函數: ======================= 操作畫筆: 創建畫筆。 cairo_create(); 增加引用計數1。 cairo_reference(); 減少引用計數1,如果返回0,所有的資源均被釋放。 cairo_destroy(); 保存當前cairo畫筆。 cairo_save(); 恢復上一次保存的cairo畫筆,也就是說必須跟cairo_save()配對。 cairo_restore(); ------------ 描繪函數: 將一個path用線把輪廓描出來(這個函數繪製的是“空心”的圖)。 cairo_stoke(cr); 將你前面畫的東西(一個path)用指定顏色填充起來(這個函數繪製的是“實心”的圖)。 cairo_fill(cr); -------------- 繪製圖形: 方塊: cairo_rectangle(cr,10,10,100,100); 通過三點定義一道弧線: cairo_curve_to(cr,x1,y1,x2,y2,x3,y3) 順時針畫一個圓弧,圓心x,y,半徑radius,起始弧度from,終止弧度to. 比如從0,M_PI(在math.h裏),就可以是一個半圓(開口的不會補上直線)。從0到2*M_PI就是一個整圓。 cairo_arc(cr,x,y,radius,from,to); 逆時針畫一個圓弧. cairo_arc_negative(cr,x,y,radius,from,to); ---------------- 字體相關: /*暫時不用,所以具體略過*/ 創建字體,返回cairo_font_t * 。 cairo_ft_font_create(); 設置字體,接受參數cairo_t *和cairo_font_t * 。 cairo_set_font(); 選擇正體Nimbus Sans L,請根據你係統的fc-list自己選擇一個字體. cairo_select_font(cr,"Nimbus Sans L", 0,0); 縮放字體,設置爲60,雖然是scale,但是cairo內部實際上用的是字號 cairo_scale_font(cr,60); 顯示hehe,藍色,60號,Nimbus Sans L字體 cairo_show_text(cr,"hehe"); ---------------- 繪製路徑相關: 好像是用了path就不用使用restore防止畫筆移動的時候繪製額外直線了,見例子。 cairo_new_path(cr); cairo_close_path(cr); 顯示字體,類似cairo_show_text但可把字體當成path處理,所以,可以作出任何特效和變換。 cairo_text_path(char * utf8); --------------- 特殊圖形繪製: 旋轉函數,接受弧度做參數(用M_PI去除) 注意,使用時,它是影響全局的,也就是旋轉了之後,後面畫的一切都是旋轉的. 所以旋轉之前,做一下cairo_save,完成需要的旋轉之後做一下cairo_restore能方便一點。 cairo_rotate(cr,angle); 縮放圖形,謹慎使用,注意使用cairo_save和cairo_restore,這個函數可以在不同的surface上使用。 x指寬度縮放倍數,y指高度縮放的倍數。 cairo_scale(cr,x,y); 相對座標,就是以你當前的點爲座標的原點,然後在移動或者畫到制定的位置。 cairo_rel_move_to(); cairo_rel_line_to(); cairo_rel_curve_to(); ======================= 4.常用代碼片斷舉例: ======================= 繪製: 畫一個方塊(stroke): cairo_rectangle(cr,10,10,100,100); cairo_set_line_width(cr,10) cairo_set_rgb_color(cr,0,0,1); cairo_stroke(cr); 畫一條斜線(從0,0到100,100)(stroke): cairo_move_to(cr,0,0); cairo_line_to(cr,100,100); cairo_set_rgb_color(cr,1,0,0); cairo_stroke(cr); 畫一個空心圓圈(stroke): cairo_arc(cr,100,100,40,0,2*M_PI); cairo_set_line_width(cr,3); cairo_set_rgb_color(cr,1,0,0); cairo_stroke(cr); 一個紅色的實心圓(fill): cairo_arc(cr,100,100,40,0,2*M_PI);//以100,100座標爲圓心畫一個半徑爲40的圓(整圓)。 cairo_set_rgb_color(cr,1,0,0);//紅色 cairo_fill(cr);//這時候得到的就是一個紅色的實心圓。 ---------------- 寫字: /*將畫筆移動到 60x60座標。 注意:畫文字的時候,這個座標是文字左下角座標, 如果你這時候移動到0,0座標,其實你的文字將被畫到400x400的畫布之外。*/ cairo_move_to(cr,60,60); //選擇正體Nimbus Sans L,請根據你係統的fc-list自己選擇一個字體 cairo_select_font(cr,"Nimbus Sans L", 0,0); //設置爲60,雖然是scale,但是cairo內部實際上用的是字號 cairo_scale_font(cr,60); //顯示hehe,藍色,60號,Nimbus Sans L字體 cairo_show_text(cr,"hehe"); 作一個空心字: //使用了textpath這是通過cairo_show_text()做不到的。 cairo_text_path("Hello"); cairo_set_line_width(cr,1); cairo_stroke(cr); ---------------- 相對座標: cairo_move_to(cr,10,10); //這時候點就在20,20上 cairo_rel_move_to(cr,10,10); ---------------- 保存畫筆: /*大體過程: 1)保存畫筆cairo_save(cr); 2)使用畫筆...導致畫筆發生變化... 3)恢復畫筆cairo_restore(cr); 爲保持完整性,代碼有點多但不影響實質 */ cairo_t * cr; cr = cairo_create(); //聲明畫筆並創建 FILE *file; file=fopen("c.png","w"); //設置目標爲一個png文件,大小爲400x400,色彩32位。 cairo_set_target_png(cr,file,CAIRO_FORMAT_ARGB32,400,400); //$$$SAVE_1 保存畫筆,這時候,畫筆是乾乾淨淨的,沒有任何操作。 cairo_save(cr); //畫一個矩形框,藍色 cairo_rectangle(cr,10,10,200,200); cairo_set_rgb_color(cr,0,0,1); cairo_set_line_width(cr,4); cairo_stroke(cr); //寫字 cairo_move_to(cr,60,60); cairo_select_font(cr,"Nimbus Sans L", 0,0); cairo_scale_font(cr,60); cairo_show_text(cr,"hehe"); //$$$恢復到 SAVE_1,這時候的畫筆又是乾乾淨淨的了。 cairo_restore(cr); //SAVE_2 再保存一下,沒準以後還會用到這個乾淨的畫筆 cairo_save(cr);。 //寫字 cairo_move_to(cr,70,70); cairo_set_rgb_color(cr,1,0,0); cairo_scale_font(cr,60); //如果上面不作restore,而又進行了scale_font,這時候,字體就是60x60倍了 cairo_show_text(cr,"hehe"); //恢復到SAVE_2,這時候畫筆仍然是初始狀態。 cairo_restore(cr); /*畫了一個大半圓曲線。 如果,上面你沒有恢復到畫筆的初始狀態,那麼,這時候cairo畫筆位於70,70,將畫一條直線,捎帶一個 大半圓曲線,畫線的方向是這樣的,從當前座標(70,70)到大半圓的開頭,然後到大半圓結尾, 也就是順 時針方向。 */ cairo_set_rgb_color(cr,0,1,0); cairo_arc(cr,100,100,60,0, 1.5*M_PI); cairo_set_line_width(cr,3); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); cairo_stroke(cr); cairo_destroy(cr); cairo_destroy(cr); fclose(file); -------------------- 使用路徑: /*當前點在(70,70)那麼在(100,100)處畫圓會首先移動到該圓點,導致一條直線 *所以path可以解決這個問題見下面: */ cairo_move_to(70,70); cairo_new_path(cr); cairo_set_rgb_color(cr,0,1,0); cairo_arc(cr,100,100,60,0, 1.5*M_PI); cairo_set_line_width(cr,3); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); cairo_stroke(cr); cairo_close_path(cr); ---------------- 旋轉: cairo_t *cr; cr = cairo_create(); cairo_set_target_.....; //順時針旋轉30度。如果是-M_PI/6,也就是逆時針旋轉30度了。 cairo_rotate(cr,M_PI/6); cairo_rectangle(cr,10,10,100,100);//正方形 cairo_set_rgb_color(cr,1,0,0); cairo_set_line_width(cr,10); cairo_stroke(cr); 縮放:繪製一個平行四邊形 cairo_t *cr; cr = cairo_create(); cairo_set_target_.....; //水平方向不變,垂直方向縮小爲一半。 cairo_scale(cr,1,0.5); //順時針旋轉30度。如果是-M_PI/6,也就是逆時針旋轉30度了。 cairo_rotate(cr,M_PI/6); cairo_rectangle(cr,10,10,100,100);//正方形,經過了scale之後,變成了長方形。 cairo_set_rgb_color(cr,1,0,0); cairo_set_line_width(cr,10); /*首先,上下兩條邊的粗細變成了原來的一半,同時這個圖形不是一個直角矩形,而是一個平行四邊形。 因爲: 進行了scale之後,影響垂直方向的所有變換,都變成了原來的一半。所以,本來應該是每條邊都旋轉30 度,現在 上下兩條邊都變成了旋轉一半的度數,也就是15度。 當然,如果你要旋轉一個長方形,只要直接用cairo_rectangle畫一個長方形就OK了 注意,cairo_rotate隻影響其後的內容,所以,不能在畫完了在rotate。 */ cairo_stroke(cr); =======================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章