圖形渲染是Skia引擎的重要功能之一,在Skia圖形渲染的基類為SkDisplayable,其擴(kuò)展類包括SkText、SkLine、SkDrawPath、SkBaseBitmap、SkDrawRect等基本圖形操作。Skia引擎的圖形架構(gòu)下圖所示。

Skia引擎的圖形架構(gòu)
SkDevice是渲染設(shè)備的邏輯抽象,支持獲取SkBitmap的寬、高、配置、是否透明等信息。支持通過SkDraw進(jìn)行的基本繪圖操作,如Paint、Points、Rect、Path、Bitmap、Sprite、Text、PosText、TextOnPath、Vertices、Device等操作。在通常情況下,不建議直接調(diào)用SkDevice的方法,為了進(jìn)行圖形操作,可以通過SkCanvas的方法來進(jìn)行。
SkDraw是Skia進(jìn)行渲染時的實(shí)際執(zhí)行類,SkDevice在進(jìn)行渲染操作時需要調(diào)用該類的方法。
SkBitmap是渲染設(shè)備的物理抽象,是SkDevice的渲染對象。SkBitmap的配置信息包括色深(1位還是8位)、配色板(Color Table)、元數(shù)據(jù)模式(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()); //深度復(fù)制
…
}
…
}
SkCanvas是Skia的畫布類,封裝了渲染設(shè)備上的所有狀態(tài),通過和畫筆類SkPaint協(xié)同工作,來完成所有的渲染操作。SkCanvas渲染的一般過程如代碼8-5所示:
SkRegion是Skia的渲染區(qū)域類,是Surface Flinger里面計算可視區(qū)域的操作基本單位。
代碼: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); //設(shè)置風(fēng)格
paint.setStrokeWidth(CURSOR_RING_OUTER_DIAMETER); //設(shè)置寬度
paint.setColor(cursorOuterColors[flavor]); //設(shè)置顏色
canvas->drawPath(path, paint); //執(zhí)行渲染
paint.setStrokeWidth(CURSOR_RING_INNER_DIAMETER);
paint.setColor(cursorInnerColors[flavor]);
canvas->drawPath(path, paint);
}
SkString為進(jìn)行字符串的渲染提供了一個輕量級的接口,通過引入?yún)⒖加洈?shù)機(jī)制減小了內(nèi)存的消耗,支持字符串的插入、合并、追加、互換、字體大小、編碼設(shè)置等操作。其默認(rèn)的編碼為UTF8,支持UTF16編碼。
SkIPoint在渲染一個點(diǎn)時需要(x,y)坐標(biāo)。支持點(diǎn)的旋轉(zhuǎn)、縮放、點(diǎn)間距離等操作。