AndroidSkia 和 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 Android2D 图形硬件加速
目前 Android 2D 图形硬件加速主要是通过 copybit 模块来实现, Copybit 是封装在 Android系统 opengl 软件实现库( libagl )的一部分,仅对 openGL ES2D API 进行封装,实现openGL ES 2D API 到硬件的加速功能。
copybit 模块以 HAL 的形式实现,代码 hardware/msm7k/libcopybit/copybit.c
另外,在 http://code.google.com/p/skia/wiki/FAQ看到关于 Skia 硬件加速和字体支持的相关信息:
Does Skia support HWacceleration?
Thereare two ways Skia can take advantage of HW.
1.Subclass SkCanvas
Sinceall drawing calls go through SkCanvas, thosecalls can be redirected to a different graphics API. SkGLCanvas has beenwritten to direct its drawing calls to OpenGL. See src/gl/
2.Custom bottleneck routines
Thereare sets of bottleneck routines inside the blits of Skia that can be replace ona platform in order to take advantage of specific CPU features. One suchexample is the NEON SIMD instructions on ARM v7 devices. See src/opts/
Does Skia support Fonthinting?
Skiahas a built-in font cache, but it does not know how to actual render font fileslike TrueType into its cache. For that it relies on the platform to supply aninstance of SkScalerContext. This is Skia's abstract interface forcommunicating with a font scaler engine. In src/ports you can see support filesfor FreeType, Mac OS X, and Windows GDI font engines. Other font engines caneasily be supported in a like manner