Index: gm/deferredtextureimagedata.cpp |
diff --git a/gm/deferredtextureimagedata.cpp b/gm/deferredtextureimagedata.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..951e8dbe2bcf900938ec4edcc9745c11e523356a |
--- /dev/null |
+++ b/gm/deferredtextureimagedata.cpp |
@@ -0,0 +1,81 @@ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+#include <vector> |
+ |
+#include "gm.h" |
+#include "GrContext.h" |
+#include "Resources.h" |
+#include "SkImage.h" |
+ |
+#if SK_SUPPORT_GPU |
+ |
+// Helper function that uploads the given SkImage using MakdeFromDeferredTextureImageData and then |
+// draws the uploaded version at the specified coordinates. |
+static bool DrawDeferredTextureImageData(GrContext* context, SkCanvas* canvas, SkImage* image, |
+ SkImage::DeferredTextureImageUsageParams* params, |
+ SkScalar x, SkScalar y) { |
+ size_t deferredSize = |
+ image->getDeferredTextureImageData(*context->threadSafeProxy(), params, 1, nullptr); |
+ if (deferredSize == 0) { |
+ SkDebugf("\nCould not create DeferredTextureImageData.\n"); |
+ return false; |
+ } |
+ |
+ std::vector<uint8_t> memory; |
+ memory.resize(deferredSize); |
+ image->getDeferredTextureImageData(*context->threadSafeProxy(), params, 1, memory.data()); |
+ sk_sp<SkImage> uploadedImage = |
+ SkImage::MakeFromDeferredTextureImageData(context, memory.data(), SkBudgeted::kNo); |
+ canvas->drawImage(uploadedImage, x, y); |
+ |
+ return true; |
+} |
+ |
+DEF_SIMPLE_GM(deferred_texture_image_data, canvas, 60, 10) { |
+ GrContext* context = canvas->getGrContext(); |
+ if (!context) { |
+ skiagm::GM::DrawGpuOnlyMessage(canvas); |
+ return; |
+ } |
+ |
+ sk_sp<SkImage> encodedImage = GetResourceAsImage("randPixels.png"); |
+ if (!encodedImage) { |
+ SkDebugf("\nCould not load resource.\n"); |
+ return; |
+ } |
+ |
+ SkBitmap bitmap; |
+ if (!GetResourceAsBitmap("randPixels.png", &bitmap)) { |
+ SkDebugf("\nCould not decode resource.\n"); |
+ return; |
+ } |
+ |
+ sk_sp<SkImage> decodedImage = SkImage::MakeFromBitmap(bitmap); |
+ |
+ // Draw both encoded and decoded image via deferredTextureImageData. |
+ SkImage::DeferredTextureImageUsageParams params; |
+ DrawDeferredTextureImageData(context, canvas, encodedImage.get(), ¶ms, 0, 0); |
+ DrawDeferredTextureImageData(context, canvas, decodedImage.get(), ¶ms, 10, 0); |
+ |
+ // Draw 50% scaled versions of the encoded and decoded images at medium quality. |
+ SkImage::DeferredTextureImageUsageParams mediumScaledParams; |
+ mediumScaledParams.fPreScaleMipLevel = 1; |
+ mediumScaledParams.fQuality = kMedium_SkFilterQuality; |
+ |
+ DrawDeferredTextureImageData(context, canvas, encodedImage.get(), &mediumScaledParams, 20, 0); |
+ DrawDeferredTextureImageData(context, canvas, decodedImage.get(), &mediumScaledParams, 30, 0); |
+ |
+ // Draw 50% scaled versions of the encoded and decoded images at none quality. |
+ SkImage::DeferredTextureImageUsageParams noneScaledParams; |
+ noneScaledParams.fPreScaleMipLevel = 1; |
+ noneScaledParams.fQuality = kNone_SkFilterQuality; |
+ |
+ DrawDeferredTextureImageData(context, canvas, encodedImage.get(), &noneScaledParams, 40, 0); |
+ DrawDeferredTextureImageData(context, canvas, decodedImage.get(), &noneScaledParams, 50, 0); |
+} |
+ |
+#endif |