網誌存檔

2010年11月16日 星期二

「轉貼」用 cairo 實現跨平台圖形(2)

3.為什麼要學習一種新的繪圖模型?

坦率地說,我認為目前的開放源碼解決方案在幾個方面存在欠缺。xprint 的優點是提供了統一的顯示和打印 API,但是它通常作為單獨的服務器進程運行,而且它的 API 很糟糕。libgnomeprint 提供單獨的打印和顯示模型,但是打印和繪圖 API 的分離使屏幕和打印機的呈現效果產生差異。
cairo 從以前的繪圖庫借鑑了許多經驗,而且從一開始就以實現統一 API 為設計目標。
4.cairo呈現目標
cairo 可以呈現以下輸出格式:
(1)X Window System(如果可能的話,會利用 Render 擴展)
(2)OpenGL(使用 glitz 後端)
(3)In-Memory Images(pixbuffs 等等)
(4)PostScript(適用於打印)
(5)PDF(Portable Document Format)文件
(6)SVG(Scalable Vector Graphics)格式
但是,並非所有呈現目標都產生相同的效果。儘管 cairo 力求在各種後端上產生相同的輸出,但是每種後端各有優勢。例如,PDF 後端會儘可能使用矢量計算(只在必要時生成圖像),而 PostScript 後端實際上會為每個頁面生成一個大圖像。
cairo 中的呈現模型受到許多原有技術的影響。cairo 採用了 PostScript 中的路徑、筆畫(stroke)和填充(fill)概念,還實現了 PDF 和現代 X 服務器實現的呈現擴展中的 Porter-Duff 圖像組合技術。另外,cairo 還實現了剪切、蒙板和漸變等補充特性。
5.cairo 的實際應用情況
許多有影響力的開放源碼項目已經採用了 cairo,cairo 已經成為 Linux 圖形領域的重要軟件。已經採用 cairo 的重要項目包括:
(1)Gtk+,一個廣受喜愛的跨平台圖形工具集
(2)Pango,一個用於佈置和呈現文本的免費軟件庫,它主要用於實現國際化
(3)Gnome,一個免費的桌面環境
(4)Mozilla,一個跨平台的 Web 瀏覽器基礎結構,Firefox 就是在這個基礎結構上構建的
(5)OpenOffice.org,一個可以與 Microsoft Office 匹敵的免費辦公套件
6.用cairo進行概念性繪圖
在用 cairo 進行繪圖時,最簡單的操作就像手工繪畫時一樣:選擇繪圖介質,選擇畫筆,選擇顏色,考慮線條的佈局,然後進行實際繪製。cairo 文檔通過與畫家的作畫過程進行類比來介紹 cairo 操作,下面的說明也採用這種方式。
對於畫家來說,最容易的事兒通常是選擇空白的繪圖介質。在現實世界中,藝術家可以選擇在紙上、畫布上甚至牆上作畫。在 cairo 中,也必須選擇空白的繪圖介質。在用 cairo 進行繪圖時,需要設置一個 cairo 上下文,這是主對象。在這個上下文中,可以選擇目標外表,比如 PostScript 文件、PDF 文檔或屏幕圖像。這樣就可以選擇我們要在什麼東西上進行繪圖。
現在考慮畫家的下一項任務:選擇畫筆。畫家往往花費相當長的時間來選擇形狀和大小合適的畫筆。在 cairo 中,也有畫筆形狀的概念,這由筆畫寬度來表達。不同的筆畫寬度會產生不同粗細的線條。
接下來,cairo 用戶需要以精確的坐標來表達繪圖操作,這一點與現實世界中的繪畫過程不同。藝術家只需將畫筆放在紙上的大概位置,但是計算機必須知道進行繪圖的 x 和 y 坐標。
設置了畫筆和開始繪圖的位置之後,就需要想像筆畫的形狀。簡單的圖形可能由直線組成,但是與現實的畫家一樣,也可以繪製曲線和弧線。
最後,必須定義筆畫終止的位置。同樣,這個位置也要用一對 (x,y) 坐標來指定。
另外,還可以給繪製的對象塗上顏色。按照 cairo 術語,這稱為填充(fill)。對於上面描述的每種操作,cairo 中都有對應的簡便的 API 實現。後面會介紹其中一些 API。
這些基本操作可以幫助您構建一些非常複雜的圖形。甚至可以使用 cairo 執行畫家無法輕鬆完成的工作,比如對現有的圖形進行放大等轉換,或者將圖形移動到虛擬紙張上的其他地方。
GIMP 或 Photoshop 也允許執行其中的許多操作,但是 cairo 是不同的:cairo 是一種編程式繪圖方式。GIMP 和 Photoshop 「在幕後」 使用 cairo 這樣的工具來實現繪圖。在用這些工具進行繪圖時,通過鼠標操作自動設置坐標點和工具類型(比如方框),並通過 GUI 環境選擇畫筆和筆畫寬度。如示例代碼所示(見 下載),cairo 需要顯式的交互,比如 「使用筆畫寬度 1 繪製一個弧線,半徑為 10,中心在位置 z」。

沒有留言:

張貼留言