Android Skia和2D图形系统
1 Skia 概述
Skia 是 Google 一个底层的图形、图像、动画、 SVG 、文本等多方面的图形库,是 Android 中图形系统的引擎。
Skia 作为第三方软件放在 external 目录下: external/skia/ 。
Skia 的结构如下图所示:
主要包含三个库:
libcorecg.so: 包含 /skia/src/core 的部分内容,比如其中的 Region , Rect 是在 SurfaceFlinger 里面用来计算可视区域的;
libsgl.so: 包含 /skia/src/core|effects|images|ports|utils 的部分和全部内容,这个实现了 skia 大部分的图形效果,以及图形格式的编解码;
libskiagl.so: 包含 /skia/src/gl 里面的内容,主要用来调用 opengl 实现部分效果。
2 Skia 对上层的接口( API )
skia 的源文件及部分头文件都在 external/skia/src 目录下,导出的头文件在 external/skia/include 目录下。最主要的是 SKCanvas 类,几乎整个 Android GUI 系统的底层绘制都是由这个类来完成的。其头文件和源代码文件的路径分别为:
external/skia/include/core/SKCanvas.h
external/skia/include/core/SKCanvas.cpp
SKCanvas 类主要有三种绘制功能:
a 基本图形绘制 ( 如 drawARGB,drawLine 函数 )
b 图像文件绘制( drawBitmap 函数)
c 文本绘制( drawText 函数)
3 Skia 的图像编解码部分
这部分的接口主要是:
external/include/image/SKImageDecoder.h // 把图像文件或者流解码到 skia 的内部内存 SKBitmap 中 ;
external/include/image/SKImageEncoder.h // 把 skia 内部内存 SKBitmap 编码成文件或流的形式;
这些接口需要具体的类实现,主要代码在 src/image 文件中。
4 Android 图形系统的 JNI 接口
主要提供了从 Skia 底层库到 Java 上层的支持,代码路径为:
frameworks/base/core/jni/android/graphic/
主要为 Canvas.cpp 文件。
5 Android 的图形包( graphics )
Android 图形类的包是 android.graphics, 它通过调用图形系统的 JNI 提供了对 Java 框架中图形系统的支持,在 Android 的 Java 框架中和 Java 应用程序中, 2D 绘制的功能(基本图形、图片文件,文字)也是通过调用它来实现的。代码路径为:
frameworks/base/graphics/java/android/graphics/
其中 Canvas.cpp 文件实现了 Android 图形系统中最重要的一个类 android.graphic.canvas 。
6 Android 2D 图形硬件加速
目前 Android 2D 图形硬件加速主要是通过 copybit 模块来实现, Copybit 是封装在 Android 系统 opengl 软件实现库( libagl )的一部分,仅对 openGL ES 2D API 进行封装,实现 openGL ES 2D API 到硬件的加速功能。
copybit 模块以 HAL 的形式实现,代码 hardware/msm7k/libcopybit/copybit.c
另外,在 http://code.google.com/p/skia/wiki/FAQ 看到关于 Skia 硬件加速和字体支持的相关信息:
Does Skia support HW acceleration?
There are two ways Skia can take advantage of HW.
1. Subclass SkCanvas
Since all drawing calls go through SkCanvas , those calls can be redirected to a different graphics API. SkGLCanvas has been written to direct its drawing calls to OpenGL. See src/gl/
2. Custom bottleneck routines
There are sets of bottleneck routines inside the blits of Skia that can be replace on a platform in order to take advantage of specific CPU features. One such example is the NEON SIMD instructions on ARM v7 devices. See src/opts/
Does Skia support Font hinting?
Skia has a built-in font cache, but it does not know how to actual render font files like TrueType into its cache. For that it relies on the platform to supply an instance of SkScalerContext. This is Skia's abstract interface for communicating with a font scaler engine. In src/ports you can see support files for FreeType, Mac OS X, and Windows GDI font engines. Other font engines can easily be supported in a like manner