Index: gm/image_pict.cpp |
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp |
index ce2d2ecb0c680648ddc3a64872b9c69fe88fb11c..dd1fab549a830e54d9f1d4b9fd3ec1b3b70826d2 100644 |
--- a/gm/image_pict.cpp |
+++ b/gm/image_pict.cpp |
@@ -8,10 +8,14 @@ |
#include "gm.h" |
#include "SkCanvas.h" |
#include "SkImage.h" |
+#include "SkImageCacherator.h" |
#include "SkPictureRecorder.h" |
+#include "SkSurface.h" |
#if SK_SUPPORT_GPU |
#include "GrContext.h" |
+#include "GrTexture.h" |
+#include "../src/image/SkImage_Gpu.h" |
#endif |
static void draw_something(SkCanvas* canvas, const SkRect& bounds) { |
@@ -94,3 +98,89 @@ private: |
}; |
DEF_GM( return new ImagePictGM; ) |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+ |
+class ImageCacheratorGM : public skiagm::GM { |
+ SkAutoTUnref<SkPicture> fPicture; |
+ SkAutoTDelete<SkImageCacherator> fCache; |
+ |
+public: |
+ ImageCacheratorGM() {} |
+ |
+protected: |
+ SkString onShortName() override { |
+ return SkString("image-cacherator"); |
+ } |
+ |
+ SkISize onISize() override { |
+ return SkISize::Make(850, 450); |
+ } |
+ |
+ void onOnceBeforeDraw() override { |
+ const SkRect bounds = SkRect::MakeXYWH(100, 100, 100, 100); |
+ SkPictureRecorder recorder; |
+ draw_something(recorder.beginRecording(bounds), bounds); |
+ fPicture.reset(recorder.endRecording()); |
+ |
+ // extract enough just for the oval. |
+ const SkISize size = SkISize::Make(100, 100); |
+ |
+ SkMatrix matrix; |
+ matrix.setTranslate(-100, -100); |
+ fCache.reset(new SkImageCacherator(SkImageGenerator::NewFromPicture(size, |
+ fPicture, |
+ &matrix, |
+ nullptr))); |
+ } |
+ |
+ void drawSet(SkCanvas* canvas) const { |
+ SkMatrix matrix = SkMatrix::MakeTrans(-100, -100); |
+ canvas->drawPicture(fPicture, &matrix, nullptr); |
+ |
+ { |
+ SkBitmap bitmap; |
+ fCache->lockAsBitmap(&bitmap); |
+ canvas->drawBitmap(bitmap, 150, 0); |
+ } |
+#if SK_SUPPORT_GPU |
+ { |
+ SkAutoTUnref<GrTexture> texture(fCache->lockAsTexture(canvas->getGrContext(), |
+ kUntiled_SkImageUsageType)); |
+ if (!texture) { |
+ return; |
+ } |
+ // No API to draw a GrTexture directly, so we cheat and create a private image subclass |
+ SkAutoTUnref<SkImage> image(new SkImage_Gpu(100, 100, fCache->generator()->uniqueID(), |
+ kPremul_SkAlphaType, texture, 0, |
+ SkSurface::kNo_Budgeted)); |
+ canvas->drawImage(image, 300, 0); |
+ } |
+#endif |
+ } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ canvas->translate(20, 20); |
+ |
+ this->drawSet(canvas); |
+ |
+ canvas->save(); |
+ canvas->translate(0, 130); |
+ canvas->scale(0.25f, 0.25f); |
+ this->drawSet(canvas); |
+ canvas->restore(); |
+ |
+ canvas->save(); |
+ canvas->translate(0, 200); |
+ canvas->scale(2, 2); |
+ this->drawSet(canvas); |
+ canvas->restore(); |
+ } |
+ |
+private: |
+ typedef skiagm::GM INHERITED; |
+}; |
+DEF_GM( return new ImageCacheratorGM; ) |
+ |
+ |
+ |