Add more canvas ops 5
Added:
--DrawImage
--DrawImageRect
--DrawImageNine
--DrawPicture
--DrawImageLattice
Test: Added tests to CanvasOpTests
Change-Id: I9997d9fadd8738aa5fef4288dbcf92864da9fe74
diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h
index 6a76539..8c7113d 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -21,12 +21,16 @@
#include <SkPath.h>
#include <SkRegion.h>
#include <SkVertices.h>
+#include <SkImage.h>
+#include <SkPicture.h>
+#include <hwui/Bitmap.h>
#include <log/log.h>
#include "CanvasProperty.h"
#include "CanvasOpTypes.h"
#include <experimental/type_traits>
+#include <utility>
namespace android::uirenderer {
@@ -269,6 +273,97 @@
ASSERT_DRAWABLE()
};
+template<>
+struct CanvasOp<CanvasOpType::DrawImage> {
+
+ CanvasOp<CanvasOpType::DrawImageRect>(
+ const sk_sp<Bitmap>& bitmap,
+ float left,
+ float top,
+ SkPaint paint
+ ) : left(left),
+ top(top),
+ paint(std::move(paint)),
+ bitmap(bitmap),
+ image(bitmap->makeImage()) { }
+
+ float left;
+ float top;
+ SkPaint paint;
+ sk_sp<Bitmap> bitmap;
+ sk_sp<SkImage> image;
+
+ void draw(SkCanvas* canvas) const {
+ canvas->drawImage(image, left, top, &paint);
+ }
+ ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawImageRect> {
+
+ CanvasOp<CanvasOpType::DrawImageRect>(
+ const sk_sp<Bitmap>& bitmap,
+ SkRect src,
+ SkRect dst,
+ SkPaint paint
+ ) : src(src),
+ dst(dst),
+ paint(std::move(paint)),
+ bitmap(bitmap),
+ image(bitmap->makeImage()) { }
+
+ SkRect src;
+ SkRect dst;
+ SkPaint paint;
+ sk_sp<Bitmap> bitmap;
+ sk_sp<SkImage> image;
+
+ void draw(SkCanvas* canvas) const {
+ canvas->drawImageRect(image,
+ src,
+ dst,
+ &paint,
+ SkCanvas::kFast_SrcRectConstraint
+ );
+ }
+ ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawImageLattice> {
+
+ CanvasOp<CanvasOpType::DrawImageLattice>(
+ const sk_sp<Bitmap>& bitmap,
+ SkRect dst,
+ SkCanvas::Lattice lattice,
+ SkPaint paint
+ ): dst(dst),
+ lattice(lattice),
+ bitmap(bitmap),
+ image(bitmap->makeImage()),
+ paint(std::move(paint)) {}
+
+ SkRect dst;
+ SkCanvas::Lattice lattice;
+ const sk_sp<Bitmap> bitmap;
+ const sk_sp<SkImage> image;
+
+ SkPaint paint;
+ void draw(SkCanvas* canvas) const {
+ canvas->drawImageLattice(image.get(), lattice, dst, &paint);
+ }
+ ASSERT_DRAWABLE()
+};
+
+template<>
+struct CanvasOp<CanvasOpType::DrawPicture> {
+ sk_sp<SkPicture> picture;
+ void draw(SkCanvas* canvas) const {
+ picture->playback(canvas);
+ }
+};
+
// cleanup our macros
#undef ASSERT_DRAWABLE