Android Skia和2D图形系统

时间:2023-02-06 23:33:55

p { margin-bottom: 0.21cm; }h1 { margin-bottom: 0.21cm; }h1.western { font-family: "AR PL UMing CN",serif; }h1.cjk { font-family: "Bitstream Vera Sans"; font-size: 24pt; font-style: normal; font-weight: bold; }h1.ctl { font-family: "Bitstream Vera Sans"; font-size: 24pt; font-weight: bold; }a:link { }

AndroidSkia2D图形系统

1Skia概述

SkiaGoogle一个底层的图形、图像、动画、SVG、文本等多方面的图形库,是Android中图形系统的引擎。

Skia作为第三方软件放在external目录下:external/skia/

Skia的结构如下图所示:

 

 

 

 

Android Skia和2D图形系统

 

主要包含三个库:

libcorecg.so: 包含/skia/src/core的部分内容,比如其中的 RegionRect是在SurfaceFlinger里面用来计算可视区域的;

libsgl.so: 包含/skia/src/core|effects|images|ports|utils的部分和全部内容,这个实现了skia大部分的图形效果,以及图形格式的编解码;
libskiagl.so:
包含/skia/src/gl里面的内容,主要用来调用opengl实现部分效果。

 

2Skia对上层的接口(API

skia的源文件及部分头文件都在external/skia/src目录下,导出的头文件在external/skia/include目录下。最主要的是SKCanvas类,几乎整个AndroidGUI系统的底层绘制都是由这个类来完成的。其头文件和源代码文件的路径分别为:

external/skia/include/core/SKCanvas.h

external/skia/include/core/SKCanvas.cpp

SKCanvas类主要有三种绘制功能:

a基本图形绘制(drawARGB,drawLine函数)

b图像文件绘制(drawBitmap函数)

c文本绘制(drawText函数)

 

3Skia的图像编解码部分

这部分的接口主要是:

external/include/image/SKImageDecoder.h //把图像文件或者流解码到skia的内部内存SKBitmap;

external/include/image/SKImageEncoder.h //skia内部内存SKBitmap编码成文件或流的形式;

这些接口需要具体的类实现,主要代码在src/image文件中。

 

4Android图形系统的JNI接口

主要提供了从Skia底层库到Java上层的支持,代码路径为:

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

主要为Canvas.cpp文件。

 

5Android的图形包(graphics

Android图形类的包是android.graphics,它通过调用图形系统的JNI提供了对Java框架中图形系统的支持,在AndroidJava框架中和Java应用程序中,2D绘制的功能(基本图形、图片文件,文字)也是通过调用它来实现的。代码路径为:

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

其中Canvas.cpp文件实现了Android图形系统中最重要的一个类android.graphic.canvas

 

6Android 2D图形硬件加速

目前Android2D图形硬件加速主要是通过copybit模块来实现,Copybit是封装在Android系统opengl软件实现库(libagl)的一部分,仅对openGLES 2D API进行封装,实现openGLES 2D API到硬件的加速功能。

copybit模块以HAL的形式实现,代码hardware/msm7k/libcopybit/copybit.c

 

另外,在http://code.google.com/p/skia/wiki/FAQ看到关于Skia硬件加速和字体支持的相关信息:

DoesSkia support HW acceleration?

Thereare two ways Skia can take advantage of HW.

1.Subclass SkCanvas

Sinceall drawing calls go through SkCanvas,those calls can be redirected to a different graphics API. SkGLCanvashas been written 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 bereplace on a platform in order to take advantage of specific CPUfeatures. One such example is the NEON SIMD instructions on ARM v7devices. See src/opts/

Does Skiasupport Font hinting?

Skiahas a built-in font cache, but it does not know how to actual renderfont files like TrueType into its cache. For that it relies on theplatform to supply an instance of SkScalerContext. This is Skia'sabstract interface for communicating with a font scaler engine. Insrc/ports you can see support files for FreeType, Mac OS X, andWindows GDI font engines. Other font engines can easily be supportedin a like manner