使用vs編譯所有的skia文件,然后會(huì)得到大概3500條錯(cuò)誤消息。這很可能是某些宏定義不正確,或者某些編譯開關(guān)沒有正確設(shè)置,或者某些接口沒有實(shí)現(xiàn)等。但編譯器給出的錯(cuò)誤消息往往對解決問題沒有幫助,編譯器給出的絕大部分錯(cuò)誤都是不可能出錯(cuò)的地方,標(biāo)準(zhǔn)的C++語法。于是只能先看一下SKIA的結(jié)構(gòu)。
使用svn從http://code.google.com/p/skia/下載最新的代碼,沒有任何文檔信息。skia的源文件及部分頭文件都在skia/src目錄下,導(dǎo)出的頭文件在skia/include 目錄下。打開Skia源文件夾,主要有以下部分:
animator 目錄
顧名思意,這部分是用來實(shí)現(xiàn)Skia的動(dòng)畫效果。主要包含79個(gè)CPP文件。從文件名來看,主要分為以下幾類:
以SkAnimator開頭的一些文件,SkAnimatorActive,SkAnimatorBase,SkAnimatorField,SkAnimatorSet,SkAnimatorScript等。
以SkDisplay開頭的一些文件,SkDisplayAdle, SkDisplayAdd, SkDisplayEvents, SkDisplayList, SkDisplayInput, SkDisplayMovie等等。
以SkDraw開頭的一些文件,SkDraw3D, SkDrawBitmap, SkDrawClip, SkDrawColor, SkDrawBlur, SkDrawLine, SkDrawPaint, SkDrawPath, SkDrawPoint等。
以SkScript開頭的一些文件,包括SkScript, SkScriptRuntime, SkScriptDecompile等。
這里,skia實(shí)現(xiàn)了一個(gè)腳本語言,可能是用于控制動(dòng)畫。
skia的這個(gè)腳本語言包括基本的數(shù)學(xué)運(yùn)算:加(ADD)、減(SUB)、乘(MUL)、除(DIV)、模(MOD);基本邏輯及判斷:大于(GT)、小于(LT)、等于(EQ)、與(AND)、或(OR)、非(NOT)等;還包括基本的位運(yùn)算(bit operation)。
在這個(gè)腳本中,主要有以下幾個(gè)數(shù)據(jù)類型:NoType, Int, Scalar(等同于Float), String, Array, Object。
這個(gè)目錄下還包含一些輔助性的文件,如SkBase64, SkTime等。
core 目錄
這就是skia的核心了,主要包含89個(gè)CPP文件。
基本都是一些圖形繪制函數(shù)。
主要包括SkColor,SkCanvas,SkBitmap,SkPicture,SkBlitter,SkCordic,SkPath,SkPoint,SkRect,SkRegion,SkMask等等圖形繪制類,還包括一些輔助性的類文件,sk64, skbuffer, skutils等。
skia是分層次繪制的,當(dāng)需要繪制時(shí),通知每個(gè)layer上對象的canvas來繪制。
effects 目錄
這是skia實(shí)現(xiàn)一些圖形圖像效果的部分
主要包括20個(gè)CPP文件。
主要實(shí)現(xiàn)了以下特效:遮罩、浮雕、模糊、濾鏡、漸變色、離散、透明等。
并且實(shí)現(xiàn)了PATH的各種特效。
gl 目錄
從名字看,并不知道這是做什么用的,gl=graphics library,圖形庫。
主要包括7個(gè)CPP文件。
開打SkGL.h,可以發(fā)現(xiàn)
#ifdef SK_BUILD_FOR_MAC
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#include <AGL/agl.h>
// use FBOs for devices
#define SK_GL_DEVICE_FBO
#elif defined(ANDROID)
#include <GLES/gl.h>
#include <EGL/egl.h>
#endif
所以,這部分是skia調(diào)用OpenGL或OpenGL ES來實(shí)現(xiàn)3D效果。
如果定義了MAC,則使用OpenGL,如果定義了Android,則使用嵌入式系統(tǒng)上的esgl三維圖形庫。porting的時(shí)候要加上#elif defined(SYMBIAN)之類的,防止別的地方也有android宏定義。
打開SkGL,發(fā)現(xiàn)是幾個(gè)基本的材質(zhì)貼圖函數(shù)。
images目錄
這部分是用來處理images的,共23個(gè)CPP文件和一些頭文件。
主要是SkImageDecoder和SkImageEncoder以及SkMovie。
Skia能處理的圖像類型包括以下
BMP
JPEG/PVJPEG
PNG
ICO
另外,skia還能處理PDF文檔。
使用了一個(gè)fpdfemb庫。
而SkMovie就是處理gif動(dòng)畫。
ports目錄
這部分是skia的一些接口在不同系統(tǒng)上的實(shí)現(xiàn),共24個(gè)CPP文件。
主要包括幾個(gè)部分:Font,Event,F(xiàn)ile,Thread,Time,XMLParser
這些與Skia的接口,需要針對不同的操作系統(tǒng)實(shí)現(xiàn)。
svg 目錄
這個(gè)目錄包含28個(gè)CPP文件,從文件名看,都是一些畫圖文件。
SkSVGPath, SkSVGPolyline, SkSVGRect, SkSVGText, SkSVGLine, SkSVGImage, SkSVGEllipse等等。
utils 目錄
包含9個(gè)CPP文件,是一些輔助工具類。
SkCamera, SkColorMatrix,SkOSFile,SkProxyCanvas,SkInterpolator等文件
views目錄
這個(gè)目錄包含24個(gè)CPP文件。
skia構(gòu)建了一套界面UI庫。
組件包括Window,Menu, TextBox, ListView, ProgressBar, Widget, ScrollBar,TagList,Image等。
還有組件的事件類。
window對象負(fù)責(zé)接收事件,并傳遞給當(dāng)前focus對象,若無focus對象,則focus自身。focus對象處理相應(yīng)的key events和mouse events。
在SkiView基類類中定義并實(shí)現(xiàn)了draw, acceptFocus,moveFocus,click等方法。
xml 目錄
當(dāng)然,這是處理xml數(shù)據(jù)的部分了。
skia在這里只是對xml解析器做了一層包裝,具體的xml解析器的實(shí)現(xiàn)需要根據(jù)不同的操作系統(tǒng)及宿主程序來實(shí)現(xiàn)。
third-party library
以上就是所有的skia source code了,當(dāng)然,僅僅依靠這些是不可能編譯通過了,skia還使用了一些third-party library以及包含了不少linux上的頭文件。
通過分析skia源程序,發(fā)現(xiàn)skia主要使用以下幾個(gè)第三方庫:
Zlib,處理數(shù)據(jù)的壓縮和解壓縮
Jpeglib,處理jpeg圖像的編碼解碼
Pnglib,處理png圖像的編碼解碼
giflib,處理gif圖像
fpdfemb,處理pdf文檔
skia還需要一些linux/unix下的頭文件(可能還需要更多):
stdint.h
unistd.h
features.h
cdefs.h
stubs.h
posix_opt.h
types.h
wordsize.h
typesizes.h
confname.h
getopt.h
mman.h
OS
1. Android & Linux
天然的支持Skia
2. Symbian
Symbian 3rd開始支持部分POSIX標(biāo)準(zhǔn),所以以上的頭文件函數(shù)實(shí)現(xiàn),可能有部分不為Symbian所支持,不支持的必須自行實(shí)現(xiàn)。
參見:http://innovator.samsungmobile.com/cn/cms/cnts/category.main.list.do?platformId=1&cateId=159
C標(biāo)準(zhǔn)庫和POSIX轉(zhuǎn)義符(equivalents)
Symbian OS包括ANSI C / POSIX標(biāo)準(zhǔn)庫應(yīng)用,提供了stdlib子集以支持將C和混合C / C++代碼移植到Symbian OS。
它還包括P.I.P.S. POSIX庫。如果您有一個(gè)現(xiàn)成應(yīng)用, P.I.P.S.尤其可以使核心應(yīng)用邏輯的移植容易得多。 P.I.P.S. 被專門的Wiki全面涵蓋。
3. WindowsMobile & Windows CE
支持POSIX,所以應(yīng)該也可以支持SKIA