c语言安卓图形库cairo,cairo 图形库
簡介
提到cairo,估計很少知道這還是一個圖形庫的名字(http://cairographics.org),Linux的兩大流行桌面環境KDE和Gnome,其對應的基礎組件是QT和GTK+,相對于框架性質的QT,GTK+則依然保持著自由與開放的傳統,從底層繪圖到上層程序庫都由其他開源庫組成,cairo就是GTK+采用的底層圖形庫,負責構建圖形界面。cairo是一款開源的2d矢量圖形庫,支持多種后端輸出,用c語言編寫而且模塊化設計得很出色。這篇博客介紹一份cairo的windows移植和定制(Visual Studio 編譯),及跟windows的全新圖形子系統DXGI對接,通過DXGI來顯示cairo產生的圖像幀,即基于cairo的不依賴操作系統GUI、不依賴于應用程序框架的圖形庫。博客的主要內容是介紹、分析、演示
cairo 圖形庫
cairo能夠做各種復雜的點線圖案繪制、填充、文字渲染、圖像變換、剪切、層混合等等操作。但是他沒有涉及到用戶交互,如鼠標、touch、事件處理,交互窗口,這些統統沒有,他只有專一的繪圖。他有surface可以理解為畫布,這個surface可以是基于內存(image surface,必選的surface)也可以基于某種backend(和操作系統或驅動接口對接),使用過程是創建一個surface,然后在surface里做各種繪圖,最后使用Painting類的functions時圖像就顯示在了surface上。當然surface也是一塊image,可以把image通過png(源碼有對接libpng庫)圖像壓縮輸出png文件,本文的最后的繪圖像演示就是使用cairo輸出png文件,不是屏幕截圖(上傳圖片后圖像質量可能會降低)
下面是cairo移到Visual Studio的一些技術要點
在cairo/src創建cairo-features.h,描述cairo的功能模塊。這里cairo的圖像將通過DXGI顯示,只有IMAGE、FT(FreeType)是必須,其余可選,如下圖
創建cairo的VS Win32 DLL空項目,參考srcMakefile.sources里的代碼文件列表和組織結構導入cairo源碼。另外還有依賴庫pixman、zlib、libpng、freetype,這些可以創建靜態庫,如下圖
編譯生成DLL,VS編譯cairo會有一千多條警告,如下圖,基本上是level 3、level 4級別的warning。對于一款成熟穩健的開源庫來講,修改大量的level3 warning就沒必要了,即使移除這些warning,后續的版本跟進,新版本代碼同步將是個問題。
Windows 圖形接口
下面兩張圖摘自微軟官方文檔,1是windows xp圖形系統接口,2是vista及其之后windows的。從vista開始,微軟設計了全新的顯示驅動模型,調整了圖形系統架構,可以提供更好的圖像質量,可以為界面提供硬件加速。參考文檔:https://msdn.microsoft.com/en-us/library/ee417756(v=vs.85).aspx?。
下圖是DXGI(DirectX Graphics Infrastructure),是從vista開始的一個新的子系統。DXGI用于處理一些底層任務如枚舉硬件設備,創建緩存交互鏈(swap-chain),呈現渲染好的圖像幀到輸出設備等,程序可以直接訪問DXGI。參考文檔:https://msdn.microsoft.com/en-us/library/bb205075(v=vs.85).aspx
cairo創建image surface其像素格式一般用CAIRO_FORMAT_RGB24是32位,對應的DXGI像素格式DXGI_FORMAT_B8G8R8A8_UNORM。desc.OutputWindow即是關聯的輸出窗口。cairo繪圖完畢后調用cairo_image_surface_get_data 得到圖像數據寫入DXGI
* @CAIRO_FORMAT_RGB24: each pixel is a 32-bit quantity, with
* the upper 8 bits unused. Red, Green, and Blue are stored
* in the remaining 24 bits in that order. (Since 1.0)
surface = cairo_image_surface_create(cairo_format_t::CAIRO_FORMAT_RGB24, width, height);
//一些繪圖操作...
cairo_image_surface_get_data(surface);
//DXGI 對接
DXGI_SWAP_CHAIN_DESC desc;
desc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.OutputWindow = hWnd;
desc.Windowed = TRUE;
此部分代碼編程可以參閱讀Microsoft官方的Programming Guide還有Reference,文檔位于MSDN章節Desktop app technologies-----> Graphics and Gaming-----> Direct 2D / Direct 3D / DirectX Graphics Articles。
圖像演示
線及其端點(支持反走樣抗鋸齒)
程序精準控制下產生的一組貝塞爾曲線
填充
文本
圖像層,蒙板和剪切
混合,2個層之間使用不同的混合算法的效果
變換
knight.mobile@outlook.com
https://my.oschina.net/u/3548910/blog/1036313
總結
以上是生活随笔為你收集整理的c语言安卓图形库cairo,cairo 图形库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 速度不输高铁,“球类速度王者”羽毛球究竟
- 下一篇: AAE对抗自编码器