From 770e0b500793bce45442b5f403913d14017df4e8 Mon Sep 17 00:00:00 2001 From: Stan Iliev Date: Thu, 5 Jan 2017 16:53:14 -0500 Subject: [PATCH] Implement image draw functions in SkiaCanvasProxy Implement onDrawImage, onDrawImageRect and onDrawImageLattice in SkiaCanvasProxy. This allows to replay SkPicture with HWUI pipeline. This CL is needed to keep up with other changes in SkiaRecordingCanvas, because Canvas::drawBitmap is translated to SkCanvas::drawImage. Test: Built and ran angler-userdebug, ran HWUI unit tests. Change-Id: Icd6cfd3bc51628a2c336faf4c95dfd5366a949a9 --- libs/hwui/SkiaCanvasProxy.cpp | 34 ++++++++++++++++++++++++++++++++++ libs/hwui/SkiaCanvasProxy.h | 7 +++++++ 2 files changed, 41 insertions(+) diff --git a/libs/hwui/SkiaCanvasProxy.cpp b/libs/hwui/SkiaCanvasProxy.cpp index 75396f7b4cf2a..2a7f5756a007a 100644 --- a/libs/hwui/SkiaCanvasProxy.cpp +++ b/libs/hwui/SkiaCanvasProxy.cpp @@ -19,6 +19,7 @@ #include "hwui/Bitmap.h" #include +#include #include #include #include @@ -140,6 +141,39 @@ void SkiaCanvasProxy::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& ce SkDEBUGFAIL("SkiaCanvasProxy::onDrawBitmapNine is not yet supported"); } +void SkiaCanvasProxy::onDrawImage(const SkImage* image, SkScalar left, SkScalar top, + const SkPaint* paint) { + SkBitmap skiaBitmap; + if (image->asLegacyBitmap(&skiaBitmap, SkImage::kRO_LegacyBitmapMode)) { + onDrawBitmap(skiaBitmap, left, top, paint); + } +} + +void SkiaCanvasProxy::onDrawImageRect(const SkImage* image, const SkRect* srcPtr, const SkRect& dst, + const SkPaint* paint, SrcRectConstraint constraint) { + SkBitmap skiaBitmap; + if (image->asLegacyBitmap(&skiaBitmap, SkImage::kRO_LegacyBitmapMode)) { + sk_sp bitmap = Bitmap::createFrom(skiaBitmap.info(), *skiaBitmap.pixelRef()); + SkRect src = (srcPtr) ? *srcPtr : SkRect::MakeWH(image->width(), image->height()); + mCanvas->drawBitmap(*bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, + dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); + } +} + +void SkiaCanvasProxy::onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, + const SkPaint*) { + SkDEBUGFAIL("SkiaCanvasProxy::onDrawImageNine is not yet supported"); +} + +void SkiaCanvasProxy::onDrawImageLattice(const SkImage* image, const Lattice& lattice, + const SkRect& dst, const SkPaint* paint) { + SkLatticeIter iter(lattice, dst); + SkRect srcR, dstR; + while (iter.next(&srcR, &dstR)) { + onDrawImageRect(image, &srcR, dstR, paint, SkCanvas::kStrict_SrcRectConstraint); + } +} + void SkiaCanvasProxy::onDrawVertices(VertexMode mode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount, const SkPaint& paint) { diff --git a/libs/hwui/SkiaCanvasProxy.h b/libs/hwui/SkiaCanvasProxy.h index badcc1dfe8cca..40ddc34c79bae 100644 --- a/libs/hwui/SkiaCanvasProxy.h +++ b/libs/hwui/SkiaCanvasProxy.h @@ -66,6 +66,13 @@ protected: const SkPaint* paint, SrcRectConstraint) override; virtual void onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint*) override; + virtual void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*); + virtual void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*, + SrcRectConstraint); + virtual void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, + const SkPaint*); + virtual void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst, + const SkPaint*); virtual void onDrawVertices(VertexMode, int vertexCount, const SkPoint vertices[], const SkPoint texs[], const SkColor colors[], SkBlendMode, const uint16_t indices[], int indexCount,