图形渲染是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)坐标。支持点的旋转、缩放、点间距离等操作。