skia簡介

【原創文章,轉載請保留或註明出處:http://blog.csdn.net/yinyhy/article/details/9963273

概述

skia是個2D向量圖形處理函數庫,包含字型、座標轉換,以及點陣圖都有高效能且簡潔的表現。不僅用於Google Chrome瀏覽器,新興的Android開放手機平臺也採用skia作爲繪圖處理,搭配OpenGL/ES與特定的硬件特徵,強化顯示的效果。

發展過程

自2005年Skia被Google收購後,一直相當神祕低調,直到2007年初,Skia GL相關的源代碼才被揭露,作爲Google Android平臺的圖形引擎,稍後的Google Chrome瀏覽器也採用Skia引擎。隨着Android與Chrome (開放版本稱爲"Chromium")兩大專案公佈源代碼後,Skia也一併公開原始源代碼,以Apache License v2發佈(注意,這意味着與GPLv2授權不相容) ,而Android與Chrome的源代碼庫中都有一份[Skia]的複製,因需求不同,做了部份的修改,比方說Chrome專案底下的 [chrome/trunk/src/skia],需要注意的是,Skia本身是不涉及底層環境,如Linux Framebuffer或Gtk+銜接的處理,這也是何以Android (透過Linux Framebuffer)與Chrome (開發中的Linux版本使用Gtk+)需要提供一份修改,以便系統接軌。

目錄結構

Skia引擎在android源代碼庫當中的位置

頭文件(也可以說是internal API, 因爲google沒有在NDK裏面提供他)位置:android/external/skia/include

源文件位於: android/external/skia/src

封裝層:android對Skia引擎進行了封裝,以便讓java代碼方便的調用,對skia封裝的代碼存在於android/framework/base/core/jni以及android/framework/base/core/jni/android/graphics目錄下面。主要是對Canvas, Bitmap, Graphics, Picture等等的封裝,以及和libui庫的結合使用。

Skia主要包含三個庫

libcorecg.so:包含/skia/src/core的部分內容,比如其中的RegionRect是在SurfaceFlinger裏面用來計算可視區域的。

libsgl.so:包含/skia/src/core|effects|images|ports|utils的部分和全部內容,這個實現了skia大部分的圖形效果,以及圖形格式的編解碼。
libskiagl.so:
包含/skia/src/gl裏面的內容,主要用來調用opengl實現部分效果。

Skia對上層的接口

Skia的源文件及部分頭文件都在external/skia/src目錄下,導出的頭文件在external/skia/include目錄下。最主要的是SKCanvas類,幾乎整個Android GUI系統的底層繪製都是由這個類來完成的。

SKCanvas類主要有三種繪製功能:

a基本圖形繪製(drawARGB,drawLine函數)

b圖像文件繪製(drawBitmap函數)

c文本繪製(drawText函數)

Skia的圖像編解碼部分

這部分的接口主要是:

external/include/image/SKImageDecoder.h // 把圖像文件或者流解碼到skia的內部內存SKBitmap中;

external/include/image/SKImageEncoder.h // skia內部內存SKBitmap編碼成文件或流的形式;

這些接口需要具體的類實現,主要代碼在src/image文件中。

Android圖形系統的JNI接口

主要提供了從Skia底層庫到Java上層的支持,代碼路徑爲:

frameworks/base/core/jni/android/graphic/

主要爲Canvas.cpp文件。

Android的圖形包 

Android圖形類的包是android.graphics,它通過調用圖形系統的JNI提供了對Java框架中圖形系統的支持,在AndroidJava框架中和Java應用程序中,2D繪製的功能(基本圖形、圖片文件,文字)也是通過調用它來實現的。代碼路徑爲:

frameworks/base/graphics/java/android/graphics/

其中Canvas.cpp文件實現了Android圖形系統中最重要的一個類android.graphic.canvas

Android2D圖形硬件加速 

目前Android 2D圖形硬件加速主要是通過copybit模塊來實現,Copybit是封裝在Android系統opengl軟件實現庫(libagl)的一部分,僅對openGL ES 2D API進行封裝,實現openGL ES 2D API到硬件的加速功能。

copybit模塊以HAL的形式實現,代碼hardware/msm7k/libcopybit/copybit.c

源碼結構說明

Skia的源代碼主要位於external\skia目錄下。與Firefox採用的Cairo相比,Skia更加小而高效,接口也更加簡潔。

external\skia\src\animator目錄下的文件用來實現Skia的動畫效果,分爲Animator、Display、Draw、SkScript等邏輯模塊。其中Animator部分包括SkAnimatorActive、SkAnimatorBase、SkAnimatorField、SkAnimatorSet、SkAnimatorScript等;Display 部分包括SkDisplayAdle、SkDisplayAdd、SkDisplayEvents、SkDisplayList、SkDisplayInput、SkDisplayMovie等;Draw部分包括SkDraw3D、 SkDrawBitmap、SkDrawClip、SkDrawColor、SkDrawBlur、SkDrawLine、SkDrawPaint、SkDrawPath、SkDrawPoint等;SkScript部分包括SkScript、SkScriptRuntime、SkScriptDecompile等。

external\skia\src\core目錄下的文件爲Skia的核心部分,執行圖形繪製功能,主要類包括SkColor、SkCanvas、SkBitmap、SkPicture、SkBlitter、SkCordic、SkPath、SkPoint、SkRect、SkRegion、SkMask 等。

external\skia\src\gl目錄下的文件實現了Skia的圖形庫。其引擎爲Open GL或者 Open GL ES,用於實現一些簡單的3D效果。

external\skia\src\images目錄下的文件實現了Skia的圖像部分。支持常見圖像的解碼、部分圖像的編碼和動畫等。

external\skia\src\ports目錄下的文件定義了Skia的移植封裝接口,包括Font、Event、File、Thread、Time、XMLParser等。

external\skia\src\svg目錄下的文件實現了Skia對矢量圖像SVG的支持。

external\skia\src\utils目錄下的文件實現了Skia的一些輔助工具,包括SkCamera、SkColorMatrix、SkOSFile、SkProxyCanvas、SkInterpolator等。

external\skia\src\views目錄下的文件實現了Skia的界面UI庫,控件包括Window、Menu、TextBox、ListView、ProgressBar、Widget、 ScrollBar、TagList、Image等。目前Skia的UI庫暫未被Android使用。

external\skia\src\xml目錄下的文件實現了Skia對XML的DOM、解析器的封裝。具體的XML解析器的實現需要根據不同的操作系統及宿主程序來實現。相關的類包括SkDOM、SkDOMNode、SkDOMAttr、SkXMLParser、SkXMLParserError、SkXMLPullParser、SkDisplayXMLParser、SkXMLWriter、SkXMLStreamWriter、SkXMLAnimatorWriter等。相關的實現位於external\skia\src\xml目錄下。

重要類簡介

(1)SkCanvas

這個類是Skia引擎的一個核心類,他封裝了所有對設備進行的畫圖操作。這個類自身包含了一個設備的引用,以及一個矩陣和裁剪棧。所有的畫圖操作,都是在經過棧內存放的矩陣變幻之後才進行的(這點和OpenGL類似)。當然,最終顯示給用戶的圖像,還必須經過裁剪堆棧的運算。
SkCanvas記錄着整個設備的繪畫狀態,而設備上面繪製的對象的狀態又是由SkPaint類來記錄的,SkPaint類作爲參數,傳遞給不同SkCanvas類的成員函數drawXXXX().(比如:drawPoints, drawLine, drawRect, drawCircle)。SkPaint類裏記錄着如顏色(color),字體(typeface),文字大小(textSize),文字粗細(strokeWidth),漸變(gradients, patterns)等。
SkCanvas類的主要成員函數:
> 構造函數,給定一個Bitmap或者Device,在給定的這個對象上進行畫圖,Device可以爲空。
            SkCanvas(const SkBitmap& bitmap);
            SkCanvas(SkDevice* device = NULL);
> setViewport, getViewport, 這2個函數只有在支持OpenGL視圖時纔有效。
> save, saveLayer, saveLayerAlpha, restore,這4個函數用於保存和恢復顯示矩陣,剪切,過濾堆棧,不同函數有不同的附加功能。
> 移位,縮放,旋轉,變形函數。
            translate(SkiaScalar dx, SkiaScalar dy);
            scale(SkScalar sx, SkScalar sy);
            rotate(SkScalar degrees);
            skew(SkScalar sx, SkScalar sy);
> 指定具體矩陣,進行相應的變換的函數,以上4個方法都可以通過定義特定的矩陣,再調用此函數實現。
            cancat(const SkMatrix& matrix);
> 圖像剪輯,把指定的區域顯示出來。
            clipRect(SkRect&...);
            clipPath(SkPath&...);
            clipRegion(SkRegion&...);
 > 在當前畫布內畫圖,有以下多種畫圖方式:
            drawARGB(u8 a, u8 r, u8 g, u8 b....) 給定透明度以及紅,綠,蘭3色,填充整個可繪製區域。
            drawColor(SkColor color...) 給定顏色color, 填充整個繪製區域。
            drawPaint(SkPaint& paint) 用指定的畫筆填充整個區域。
            drawPoint(...)/drawPoints(...) 根據各種不同參數繪製不同的點。
            drawLine(x0, y0, x1, y1, paint) 畫線,起點(x0, y0),終點(x1, y1), 使用paint作爲畫筆。
            drawRect(rect, paint) 畫矩形,矩形大小由rect指定,畫筆由paint指定。
            drawRectCoords(left, top, right, bottom, paint), 給定4個邊界畫矩陣。
            drawOval(SkRect& oval, SkPaint& paint) 畫橢圓,橢圓大小由oval矩形指定。
            drawCicle(cx,cy,radius, paint), 給定圓心座標和半徑畫圓。
            drawArcSkRect& oval...) 畫弧線,用法類似於畫橢圓。
            drawRoundRect(rect, rx, ry, paint) 畫圓角矩形,x,y方向的弧度用rx,ry指定。
            drawPath(path, paint) 路徑繪製,根據path指定的路徑繪製路徑。
            drawBitmap(SkBitmap& bitmap, left, top, paint = NULL) 繪製指定的位圖,paint可以爲空。
            drawBitmapRect(bitmap, src, dest, paint=NULL),繪製給定位圖的一部分區域,此區域由src指定,然後把截取的部分位圖繪製到dest指定的區域,可能進行縮放。
            drawBitmapMatrix(bitmap, matrix, paint=NULL),功效同上,可以通過給定矩陣來進行裁剪和縮放變換。
            drawSprite(bitmap, left, top, paint=NULL),繪製位圖,不受當前變換矩陣影響。
            drawText(void* text, byteLength, x,y,paint),以(x,y)爲起始點寫文字,文字存儲在text指針內,長度有byteLength指定。
            drawPosText(...) 功能同上,不過每個文字可以單獨指定位置。
            drawPosTextH(...) 功能同上,不過由一個變量指定了當前所有文字的統一Y座標,即在同一條水平線上以不同的間隔寫字。
            drawTextOnPathHV, drawTextOnPath, drawTextOnPath, 以不同方式在給點定的path上面繪製文字。
            drawPicture(SkPicture& picture) 在畫布上繪製圖片,比較高效的繪圖函數。
            drawShape(SkShape*) 在畫布上繪製指定形狀的圖像。
            drawVertices(...) 繪製點,可以有紋理,顏色,等附加選項。

(2)SkBitmap

(3)SkTypeface

參考資料

http://baike.baidu.com/view/9199459.htm

http://www.3g-edu.org/news/art044.htm

http://blog.csdn.net/cuiyan0214/article/details/5964689

http://news.cnblogs.com/n/89616/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章