在PPAPI里面繪圖,可以結合第三方的圖形庫,比如Cairo、Skia。Google Chrome、Chromium和Android都使用Skia作為繪圖引擎,我也來試試Skia,先過編譯關。
> foruok原創,如需轉載請關注foruok的微信訂閱號“程序視界”聯系foruok。
# CEF編譯出的Skia不可單獨用
Chromium使用Skia,[**Windows下從源碼編譯CEF**](http://blog.csdn.net/foruok/article/details/50498740)說明了怎么編譯CEF,它會捎帶著編譯Chromium,里面有Skia,但它編譯出來的skia_library.lib無法單獨使用,加到VS工程里,報N多鏈接錯誤。
只好自己編譯了。
# 單獨編譯Skia
Windows下編譯指南:[https://skia.org/user/quick/windows](https://skia.org/user/quick/windows)。首先你系統得有Python,我們編譯過CEF,有了。
下載skia到這里:[https://skia.org/user/download](https://skia.org/user/download)。需要使用git,depot_tools很全,什么都有。
我們之前編譯CEF,已自動下載depot_tools,在E:\sources\CEF\2526\depot_tools,設置到path中:
~~~
set path=E:\sources\CEF\2526\depot_tools;%path%
~~~
然后使用git下載Skia:
~~~
git clone https://skia.googlesource.com/skia.git
~~~
然后執行下列命令:
~~~
cd %SKIA_CHECKOUT_DIR%
SET "GYP_GENERATORS=ninja,msvs" //告訴GYP,產生ninja構建文件和msvs構建文件
python bin/sync-and-gyp
SET "GYP_GENERATORS="
~~~
上面命令完成后,基于ninja的構建文件在這里:E:\sources\skia\out\Release(Debug)\build.ninja。基于VS2013的解決方案在這里:E:\sources\skia\out\skia.sln。
我選擇編譯Release版本。默認編譯“most”目標,most.ninja在這里:E:\sources\skia\out\Release\obj\gyp,它指定編譯skia_lib和dm、SampleApp、HelloWorld等模塊。
編譯命令如下:
~~~
cd out\Release
ninja
~~~
編譯到effects模塊,出錯了,說:
> ninja: build stopped: subcommand failed.
加個參數,再來:
~~~
ninja -v > skia_build.log
~~~
研究skia_build.log,發現錯誤信息如下:
> [6/1807] ninja -t msvc -e environment.x86 – “E:\software\VS2013_64_update4\VC\bin\amd64_x86\cl.exe” /nologo /showIncludes /FC @obj\tools\imgslice.imgslice.obj.rsp /c ….\tools\imgslice.cpp /Foobj\tools\imgslice.imgslice.obj /Fdimgslice.pdb
FAILED: ninja -t msvc -e environment.x86 – “E:\software\VS2013_64_update4\VC\bin\amd64_x86\cl.exe” /nologo /showIncludes /FC @obj\src\effects\effects.SkDisplacementMapEffect.obj.rsp /c ….\src\effects\SkDisplacementMapEffect.cpp /Foobj\src\effects\effects.SkDisplacementMapEffect.obj /Fdeffects.pdb
e:\sources\skia\src\effects\skdisplacementmapeffect.cpp : error C2220: 警告被視為錯誤 - 沒有生成“object”文件
e:\sources\skia\src\effects\skdisplacementmapeffect.cpp : warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數據丟失
錯誤C2220是因為把所有警告當做錯誤了,編譯時加了/WX標記。而警告C4819,MSDN說,“在具有不能表示文件中所有字符的代碼頁的系統上編譯ANSI 源文件時,出現C4819”。記得之前編譯CEF(參考[**Windows下從源碼編譯CEF**](http://blog.csdn.net/foruok/article/details/50498740))時說要設置系統locale為英文,再試試吧。
(⊙o⊙)…,真過了。
編譯完成后,lib文件和exe文件都在E:\sources\skia\out\Release目錄下。有這么些skia庫,見下圖:

試著運行一下HelloWorld.exe(在E:\sources\skia\out\Release目錄下),效果如下圖:

嗯,不錯,可以繼續前進了。下次我會把PPAPI和Skia結合起來試試。
其他參考文章:
- [**CEF Windows開發環境搭建**](http://blog.csdn.net/foruok/article/details/50468642)
- [**CEF加載PPAPI插件**](http://blog.csdn.net/foruok/article/details/50485448)
- [**VS2013編譯最簡單的PPAPI插件**](http://blog.csdn.net/foruok/article/details/50485461)
- [**理解PPAPI的設計**](http://blog.csdn.net/foruok/article/details/50486788)
- [**PPAPI插件與瀏覽器的交互過程**](http://blog.csdn.net/foruok/article/details/50494061)
- [**Windows下從源碼編譯CEF**](http://blog.csdn.net/foruok/article/details/50498740)
- [**編譯PPAPI的media_stream_video示例**](http://blog.csdn.net/foruok/article/details/50498873)
- [**PPAPI插件的繪圖與輸入事件處理**](http://blog.csdn.net/foruok/article/details/50499813)
- [**在PPAPI插件中創建本地窗口**](http://blog.csdn.net/foruok/article/details/50513228)
- [**PPAPI插件與瀏覽器的通信**](http://blog.csdn.net/foruok/article/details/50513315)
- 前言
- CEF Windows開發環境搭建
- CEF加載PPAPI插件
- VS2013編譯最簡單的PPAPI插件
- 理解PPAPI的設計
- PPAPI插件與瀏覽器的交互過程
- Windows下從源碼編譯CEF
- 編譯PPAPI的media_stream_video示例
- PPAPI插件的繪圖與輸入事件處理
- 在PPAPI插件中創建本地窗口
- PPAPI插件與瀏覽器的通信
- Windows下從源碼編譯Skia
- 在PPAPI插件中使用Skia繪圖
- 加載DLL中的圖片資源生成Skia中的SkBitmap對象
- PPAPI+Skia實現的涂鴉板
- PPAPI中使用Chromium的3D圖形接口
- PPAPI中使用OpenGL ES繪圖