Android的Graphic系统分析之skia.docxVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android的Graphic系统分析之skia

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函数来实现的。SurfaceSurface类继承自EGLNativeBase模板类,因此它实际上一个ANativeWindow,只不过该模板给它添加了引用计数功能,并可安全地进行类型转换。class Surface: public EGLNativeBaseANativeWindow, Surface, RefBase上层应用程序各有自己的surface,因此多个surface会同时存在,这些surface在本侧就是SurfaceComposerClient所代

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档