####################
本文由极度寒冰原创,转载请注明出处。
####################
1. Skia:skia是个2D向量图形处理函数库,包含字型、座标转换,以及点阵图都有高效能且简洁的表现。
2. 在chrome里,skia的具体实现:
a. 在chrome刚启动的时候,会去调用字型的处理函数去读取所有的字体配置,然后去配置默认的字型。具体实现在:SkFontHost_android.cpp init_system_fonts()
b. SkBitmap是skia中很重要的一个类,很多画图动作涉及到SkBitmap,它封装了与位图相关的一系列操作。
Allocator是SkBitmap的内嵌类,其实只有一个成员函数:allocPixelRef(),所以把它理解为一个接口更合适,SkBitmap使用Allocator的派生类–HeapAllocator作为它的默认分配器。
allocPixelRef 的实现是在 src/core/SkBitmap.cpp
SkBitmap和Allocator的定义是在 include/core/SkBitmap.h
c. 可以看到,在进行绘制的过程中,Bitmap起了很大的作用. 所以在进行fish ie tank进行测试的时候,首先会进行的是:判断bitmap是不是会返回成功。
这部分的具体实现是在chrome/content/public/common/common_param_traits.cc中的Read函数中进行,Read()会去调用InitSkBitmapFromData去进行具体的判断。
d. 绘制时几个重要的类:
SkDevice:设备类包含一个SkBitmap作为后端,用于软件绘制方案. (SkDevice类的初始化和内部实现是在SkDevice.cpp)
SkGpuDevice:设备类,包含一个绘制的目标对象,通过GrContext来绘制,其利用硬件加速的GL库来绘制2D图形.SkGpuDevice类的初始化和实现是在SkGpuDevice.cpp
SkDraw应该就是绘制细节的实现
SkCanvas更像是接口的提供者,SkCanvas会调用SkDevice里面的绘制方法,而这些方法是由SkDraw具体承担的。
3. 代码的实现"
skcanvas.cpp SkCanvas::internalDrawBitmap(const SkBitmap& bitmap, const SkIRect* srcRect,const SkMatrix& matrix, const SkPaint* paint)
|
\|/
skcanvas.cpp SkCanvas::commonDrawBitmap(const SkBitmap& bitmap, const SkIRect* srcRect,const SkMatrix& matrix, const SkPaint& paint)
(在SkCanvas::commonDrawBitmap函数中,有个while (iter.next())循环. 在这个循中,有个函数为iter.fDevice->drawBitmap(iter, bitmap, matrix, paint),这里的iter为:skdrawiter; fDevice即为skDevice)
然后就会由此进入到到skdevice的实现部分.
SkDevice.cpp, SkDevice::drawBitmap (const SkDraw& draw, const SkBitmap& bitmap, const SkIRect* srcRect, const SkMatrix& matrix, const SkPaint& paint)
在这个函数中,会调用draw.drawBitmap(*bitmapPtr, matrix, paint);
SkDraw.cpp, SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix,const SkPaint& origPaint)
在整个函数中,会进行ChooseSprite,drawRect,drawBitmapAsMask等函数着色,颜色设置,绘画等等的具体判断和操作.