上一篇文章我已經介紹了,移植Skia的各種條件和對環境的基本配置,這篇文章我將介紹具體的移植Skia的步驟。我的
MIPS平台上面沒有IDE的開發環境,移植工作都是在命令列下面做的,需要實現提供Makefile檔案。由於Skia的模組化做得比較好,My Code組織是把Skia分成各個小的子模組,然後為再為每個子模組提供單獨的makefile檔案,最後把這些子模組的Makefile,匯總到一個
Makefile中,就是Skia庫的makefile。
為了完成Core模組的移植工作,首先需要確認那些檔案需要要編譯,可以參考
Android代碼中Skia庫Core模組的.mk檔案和最新Skia代碼中的core模組的makefile檔案。基本src/core目錄下面的搜有的cpp文本都需要編譯。如果前面三個設定檔沒有錯誤的話,這個模組還是比較容易編譯通過的。可能不同的平台會有一些細微差距,需要把core裡面的編譯源檔案進行一些裁減,比如我們的MIPS平台沒有檔案系統,所以與檔案系統相關的代碼需要去掉,例如
SkFileStream,SkMMapStream類等。一般移植完這個模組之後,Skia的準系統就可以具備了,比如在記憶體中繪圖都可以進行了。移植到這裡你可以驗證你的移植成果了(能夠看到成果,對我們移植工作是一個鼓舞),因為繪圖是在記憶體中進行,你可以那個這塊記憶體資料,並把他輸出到任何裝置上面,比如輸出到Bitmap檔案中(前提是你對bitmap檔案結構要比較熟悉),這裡就不提供測試代碼了(我的測試代碼都在單位,代碼控制比較嚴格,拿不出來,鬱悶哦)。
移植opt模組,來對效能進行加速。發現代碼中沒有針對MIPS的加速代碼,只能選擇SkBitmapProcState_opts_none.cpp,SkBlitRow_opts_none.cpp,SkUtils_opts_none.cpp
三個檔案,也就是不進行加速,你可以根據你的平台選擇加速檔案,或者自己實現加速檔案(如果你實現加速檔案,請你和我聯絡,我向你學習)。這個模組比較簡單,編譯通過沒有什麼問題。
下面我們可以移植ports模組,這個模組提供與作業系統相關的代碼,因為每個os上面字型,線程,事件,時間等等都是有差異的。需要你選擇適合你的平台的代碼,進行編譯。如果你的平台有一些比較特殊的話,可能你還是需要自己進行一些裁減的。比如字型,我們的平台沒有提供檔案系統,Skia源碼中所有的平台實現,都需要檔案系統(字型檔),怎麼辦呢?只能自己實現了,首先把字型檔燒錄到ROM裡面,然後系統初始化的時候,把他載入到RAM記憶體中(中文字型檔的話可能需要10M左右的空間,嵌入式裝置需要衡量RAM記憶體的大小),然後自己在這裡面修改基於Linux
的字型實現SkFontHost_linux.cpp,移植所有與檔案系統相關的代碼,然後以記憶體方式實現之。如果你發現沒有合適的實現,也可以選擇以
none結尾的實現檔案,這些檔案都實現了空函數,可以讓你編譯通過。需要的時候,再想辦法實現。
utils模組實現一些工具類,這個模組比較小,參考Android中的.mk檔案和官方代碼中的makefile,這個模組比較容易移植成功。
下面移植effects模組,這個模組實現一些效果,沒有什麼特殊的把所有的源碼檔案全部加入Makefile進行編譯,兵來將擋,水來土掩就好了。
images模組主要實現一些和圖片有關的功能,比如從圖片檔案輸入資料到Skia庫,或者Skia輸出資料到圖片檔案。這個模組需要一些外部庫來支援,比如你需要支援png,那麼你需要把SkImageDecoder_libpng.cpp加入makefiel檔案,這個檔案依賴於libpng庫,你需要首先移植他到你的平台,這個庫在Android源碼中有,libpng又依賴於libz。把這些都準備好了,你應該可以編譯通過,並且你的Skia支援png檔案了。同樣道理,加入gif,jpg支援,都需要移植相應的庫。移植到這裡可以說有階段性成果了,可以用網上的測試程式來驗證了,比如Jserv先生的blog裡面的代碼。
如果你需要opengl庫進行3D(2D是Skia自己實現的)加速的話,那麼你需要移植gl模組,前提是你的平台提供opengl實現(軟實現或者硬實現)。因為我的平台上面沒有
opengl,所以沒有移植這個模組。
其他的模組都是可選的,如果你的平台需要你可以移植。這裡說一句雖然Skia提供了animator模組,Skia自己都沒有用這個子模組,可能還不完善,如果你用的話,需要自己維護哦。views模組,提供一些獨立於OS的視窗類別,由於我們的平台效能有限,目前不需要。
至此Skia庫基本移植成功了。通過上面描述可以看出,只要你對自己的平台特性足夠熟悉,掌握正確的方法,移植Skia只要一步一步來移植,還是比較容易移植成功的。
轉自 http://my.unix-center.net/~Simon_fu/?p=305