frameworks/base/opengl/libs/ ==>
libEGL.SO
libGLESv1_CM.so
frameworks/base/opengl/libagl ==>
libagl.so
frameworks/base/libs/ui ==>
libui.so
external/skia/ ==>
libsgl.so
libskiagl.so
libcorecg.so
system/core/libpixelflinger ==>
libpixelflinger.so
Canvas.java中,所有的諸如drawPath之類的調用都是pass到底層的mNativeCanvas中去實現的, 而這個mNativeCanvas有兩種類型: SkCanvas* 和 SkGLCanvas*。 mNativeCanvas被initRaster賦值時,得到SkCanvas*的指針; 被initGL賦值時,得到SkGLCanvas*的指針。
frameworks/base/graphics/java/android/Canvas.java
SkCanvas實現了Canvas.java中給出的所有接口,如drawPaint, drawRect, drawText,clipRegion, translate, scale。。。
android大部分的控件中,使用的canvas的底層都是用的SkCanvas, 它包含在skia庫的libsgl.so, 依賴libcorecg.so(也是skia編出來的)。 而SkGLCanvas繼承了SkCanvas, SkGLCanvas的constructor中會調用GLES/gl.h中定義的opengl函數。 (GLES/gl.h的路徑是:frameworks/base/opengl/include/GLES/gl.h) SkGLCanvas中的其他函數則主要是對Texture的一些處理。
SkGLCanvas自己提供了setViewport, 和freeGlCaches。也就是說, SkCanvas中不具體實現setViewport, getViewport,直接返回false; 而SkGLCanvas中是實現這兩個函數的,但貌似好像也是Skia自己實現的,沒有direct到opengl裏面去。而像drawPaint, drawRect, drawText,clipRegion, translate, scale之類的函數接口, SkGLCanvas就是直接繼承了SkCanvas裏面的實現,沒看出哪裏會提供它自己的實現。
比較蹊蹺的是,在skia中看到了SkGLDevice,繼承於SkDevice, 實現了drawPaint等函數接口(通過SkGL pass到opengl中,或者假如opengl不支持的feature, 它自己實現),不過不知道哪裏會被調用到。
從以下這個鏈接:
http://www.mail-archive.com/[email protected]/msg02554.html
寫到The OpenGL backend for Skia is not supported and not enabled。 那麼這,是不是也解釋了爲什麼GLSurfaceView裏面,其實那些繪製都是通過handle傳給Canvas的GL類型的指針來pass call to opengl的