图形渲染是Skia引擎的重要功能之一,在Skia图形渲染的基类为SkDisplayable,其扩展类包括SkText、SkLine、SkDrawPath、SkBaseBitmap、SkDrawRect等基本图形操作。Skia引擎的图形架构下图所示。

Skia引擎的图形架构
SkDevice是渲染设备的逻辑抽象,支持获取SkBitmap的宽、高、配置、是否透明等信息。支持通过SkDraw进行的基本绘图操作,如Paint、Points、Rect、Path、Bitmap、Sprite、Text、PosText、TextOnPath、Vertices、Device等操作。在通常情况下,不建议直接调用SkDevice的方法,为了进行图形操作,可以通过SkCanvas的方法来进行。
SkDraw是Skia进行渲染时的实际执行类,SkDevice在进行渲染操作时需要调用该类的方法。
SkBitmap是渲染设备的物理抽象,是SkDevice的渲染对象。SkBitmap的配置信息包括色深(1位还是8位)、配色板(Color Table)、元数据模式(RGB565、ARGB4444、ARGB8888)等。
Image* ImageBuffer::image() const
{
if (!m_image) {
ASSERT(context());
SkCanvas* canvas=context()->platformContext()->mCanvas; //获取SkCanvas
SkDevice* device=canvas->getDevice(); //获取SkDevice
const SkBitmap& orig=device->accessBitmap(false); //获取SkBitmap
SkBitmap copy;
orig.copyTo(©, orig.config()); //深度复制
…
}
…
}
SkCanvas是Skia的画布类,封装了渲染设备上的所有状态,通过和画笔类SkPaint协同工作,来完成所有的渲染操作。SkCanvas渲染的一般过程如代码8-5所示:
SkRegion是Skia的渲染区域类,是Surface Flinger里面计算可视区域的操作基本单位。
代码:SkCanvas渲染的一般过程
void CursorRing::DrawRing(SkCanvas* canvas,const Vector< WebCore::IntRect>& rects, Flavor flavor)
{
unsigned rectCount=rects.size();
SkRegion rgn;
SkPath path;
for (unsigned i=0; i < rectCount; i++)
{
SkRect r(rects[i]);
SkIRect ir;
r.round(&ir);
ir.inset(-CURSOR_RING_OUTER_OUTSET, -CURSOR_RING_OUTER_OUTSET);
rgn.op(ir, SkRegion::kUnion_Op);
}
rgn.getBoundaryPath(&path);
SkPaint paint;
paint.setAntiAlias(true);
paint.setPathEffect(new SkCornerPathEffect(CURSOR_RING_ROUNDEDNESS))->unref();
if (flavor >=NORMAL_ANIMATING) { // pressed
paint.setColor(cursorPressedColors[flavor - NORMAL_ANIMATING]);
canvas->drawPath(path, paint);
}
paint.setStyle(SkPaint::kStroke_Style); //设置风格
paint.setStrokeWidth(CURSOR_RING_OUTER_DIAMETER); //设置宽度
paint.setColor(cursorOuterColors[flavor]); //设置颜色
canvas->drawPath(path, paint); //执行渲染
paint.setStrokeWidth(CURSOR_RING_INNER_DIAMETER);
paint.setColor(cursorInnerColors[flavor]);
canvas->drawPath(path, paint);
}
SkString为进行字符串的渲染提供了一个轻量级的接口,通过引入参考记数机制减小了内存的消耗,支持字符串的插入、合并、追加、互换、字体大小、编码设置等操作。其默认的编码为UTF8,支持UTF16编码。
SkIPoint在渲染一个点时需要(x,y)坐标。支持点的旋转、缩放、点间距离等操作。