skia库
Skia库是一个外部库,代码位于external/skia/下面,生成的库名称是libskia.so。
Skia库负责2维图形的绘制,绘制的结果最终一般以位图的形式存放在内存的一块缓冲区中。我们可以从它里面几个比较重要的类来了解它到底完成什么功能。
使用SkCanvas,可以将绘制(drawing)结果保存到一个设备如位图(bitmap)中,这些绘制操作包含一系列几何图形的绘制,如绘制点、线、矩形、多边形、椭圆和圆弧等几何图形。Canvas.cpp调用了skia库的API,有的调用仅仅是对SkCanvas的简单包裹。绘制的状态(State)封装在Paint类中,如绘制的线条粗细、线条颜色、区域如何填充、线条形状等。SkBitmap是光栅位图,它包含高度和宽度两个整数以及格式(配置config规定),也可以通过getAddr()获取存储实际像素(pixel)块的地址。一副图形可以通过它的像素位图来保存,也可以通过保存它的绘制过程通过SkPicture保存起来,然后写到文件里,最后通过绘制过程恢复图形。另外,skia也包括将YUV格式转变为Jpg的编码,见YuvToJpegEncoder.cpp。
Java部分通过JNI调用Skia关系如下,包括但不限于下图中的四个类。
库libsurfaceflinger_client.so
库libsurfaceflinger_client.so链接到应用程序中,也链接到server侧(主要因为layer state管理和内存控制块等类),因此,其大多数类运行在应用程序所在进程空间中,它通过Binder与与进程sufaceflinger进行交互。它的代码位于frameworks/base/libs/surfaceflinger_client下面,
SurfaceComposerClient/SurfaceControl
如JNI层章节所述,在创建SurfaceSession(Java)时,会创建SurfaceComposerClient对象,并将SurfaceComposerClient对象指针保存到SurfaceSession(Java)的mClient中。我们来看下创建SurfaceComposerClient对象时还发生了什么?
SurfaceComposerClient继承自RefBase,所以在第一次初始化时,会执行其重载的
onFirstRef。在onFirstRef中,会获取Composer Service,也就是SurfaceFlinger在client侧的binder—-ISurfaceComposer,接着使用它建立client connection连接(实际上是分配一个用于两侧通讯的共享内存块),获取ISurfaceComposerClient,最后创建layer_state_t,保存窗口状态,用于两侧的窗口状态通讯。
SurfaceComposerClient可以加入到列表中由Composer来维护。
SurfaceControl对象指针保存在Surface(Java)中的mSurfaceControl。
SurfaceControl借助于SurfaceComposerClient,实现对UI控件的一些操作:
? ? ? ? ? ? ?
show/hide: 显示隐藏操作
setSize/setPosition: 设置大小和位置 SetLayer:设置图层
freeze/unfreeze:冻结与去冻结操作,即是否更新屏幕 SetAlpha:设置Alpha通道,即设置透明等级 SetMatrix:设置平移矩阵 setFlags:设置其它标志
这些SurfaceControl类的功能实现仅仅是对SurfaceComposerClient的简单封装。可以通过SurfaceComposerClient的函数获取Display的个数、高、宽、旋转方向以及其它信息。它是通过ComposerService中的控制块信息来实现的。
ScreenshotClient包含屏幕截屏宽(mWidth)和高(mHeight)以及像素格式(PixelFormat),截图数据保存在IMemoryHeap中(mHeap)。它是调用ISurfaceComposer的captureScreen函数来实现的。
Surface
Surface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。
class Surface
: public EGLNativeBase
上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是SurfaceComposerClient所代表,它们可以添加到Composer类维护的列表中。
SurfaceControl会使用SurfaceClient和Surface去完成相应功能,SurfaceControl的getSurface函数会创建Surface,从而也会导致SurfaceClient的创建,进而相应的ISurfaceClientComposer等会被创建。
ISurfaceComposer
ISurfaceComposer是SurfaceFlinger在client侧的一个binder,提供的接口用于对整个屏幕的全局性的管理,如方向旋转、屏幕快照、屏幕事件、屏幕更新的冻结与去冻结等。它提供的接口对应的枚举类型有:
enum {
// Note: BOOT_FINISHED must remain this value, it is called from // Java by ActivityManagerService.
BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION, CREATE_CONNECTION,
CREATE_CLIENT_CONNECTION, GET_CBLK,
OPEN_GLOBAL_TRANSACTION, CLOSE_GLOBAL_TRANSACTION, SET_ORIENTATION, FREEZE_DISPLAY, UNFREEZE_DISPLAY, SIGNAL,
CAPTURE_SCREEN,
TURN_ELECTRON_BEAM_OFF, TURN_ELECTRON_BEAM_ON };
它是通过Binder进行IPC通讯的接口,BpSurfaceComposer是client一侧, BnSurfaceComposer是service一侧。它们都继承自各自的模板类BpInterface和BnInterface,这两个模板类完成双重继承的功能,一个继承IPC通讯的API接口,一个继承Binder功能。RefBase用于索引计数,类IInterface和ISurface定义了IPC通讯的接口API,IBinder/BBinder使双方具备Binder通讯功能。
其中CREATE_CONNECTION和REATE_CLIENT_CONNECTION打开关闭一个Transaction,在打开和关闭的过程中,可以设置状态,实现窗口管理。状态变化更改是在一个事务(transaction)中进行的。
其类继承关系如下:
根据Binder继承关系规则,client侧的接口调用通过最终是由Bn侧的子类完成。我们就可以知道它的它动态的调用关系如下,左侧的调用者一般可以通过指向ISurfaceComposer的智能指针将操作将调用到SurfaceFlinger类的成员函数。
ComposerService对IsurfaceComposer进行了包裹,使用它的
getComposerService函数可以获取IsurfaceComposer。另外,ComposerService还包含了surface_flinger_cblk_t控制块信息,该内存块位于Ashem内存上,由SurfaceFlinger申请,并依据display硬件信息填充字段值。client端程序通过读取它,即可得到各display的信息。
struct display_cblk_t {//dispaly的各项信息 uint16_t w;
uint16_t h; uint8_t format; uint8_t orientation; uint8_t reserved[2]; float fps; float density; float xdpi; float ydpi; uint32_t pad[2]; };
struct surface_flinger_cblk_t // 4KB max {//控制信息块 uint8_t connected; uint8_t reserved[3]; uint32_t pad[7];
display_cblk_t displays[SharedBufferStack::NUM_DISPLAY_MAX];//最多4个display };
在SufraceFlinger的readyToRun会申请内存,并依据DisplayHardWare中得到display信息:
// create the shared control-block mServerHeap = new MemoryHeapBase(4096,
MemoryHeapBase::READ_ONLY, “SurfaceFlinger read-only heap”);//分配内存,没有指定设备名称或描述符fd,默认使用AShem上的内存
LOGE_IF(mServerHeap==0, “can’t create shared memory dealer”);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android的Graphic系统分析之skia在线全文阅读。
相关推荐: