2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
12 #include "Resources.h"
15 #include "GrContext.h"
17 // Helper function that uploads the given SkImage using MakeFromDeferredTextureImageData and then
18 // draws the uploaded version at the specified coordinates.
19 static void DrawDeferredTextureImageData(SkCanvas* canvas,
20 SkImage::DeferredTextureImageUsageParams* params) {
21 GrContext* context = canvas->getGrContext();
23 skiagm::GM::DrawGpuOnlyMessage(canvas);
26 sk_sp<GrContextThreadSafeProxy> proxy(context->threadSafeProxy());
30 sk_sp<SkImage> encodedImage = GetResourceAsImage("mandrill_512.png");
32 SkDebugf("\nCould not load resource.\n");
36 size_t requiredMemoryInBytes = encodedImage->getDeferredTextureImageData(
37 *proxy, params, 1, nullptr, canvas->imageInfo().colorSpace());
38 if (requiredMemoryInBytes == 0) {
39 SkDebugf("\nCould not create DeferredTextureImageData.\n");
43 std::vector<uint8_t> memory;
44 memory.resize(requiredMemoryInBytes);
45 encodedImage->getDeferredTextureImageData(
46 *proxy, params, 1, memory.data(), canvas->imageInfo().colorSpace());
47 sk_sp<SkImage> uploadedEncodedImage = SkImage::MakeFromDeferredTextureImageData(
48 context, memory.data(), SkBudgeted::kNo);
50 canvas->drawImage(uploadedEncodedImage, 10, 10);
55 if (!GetResourceAsBitmap("mandrill_512.png", &bitmap)) {
56 SkDebugf("\nCould not decode resource.\n");
59 sk_sp<SkImage> decodedImage = SkImage::MakeFromBitmap(bitmap);
61 requiredMemoryInBytes = decodedImage->getDeferredTextureImageData(
62 *proxy, params, 1, nullptr, canvas->imageInfo().colorSpace());
63 if (requiredMemoryInBytes == 0) {
64 SkDebugf("\nCould not create DeferredTextureImageData.\n");
68 memory.resize(requiredMemoryInBytes);
69 decodedImage->getDeferredTextureImageData(
70 *proxy, params, 1, memory.data(), canvas->imageInfo().colorSpace());
71 sk_sp<SkImage> uploadedDecodedImage = SkImage::MakeFromDeferredTextureImageData(
72 context, memory.data(), SkBudgeted::kNo);
74 canvas->drawImage(uploadedDecodedImage, 512 + 20, 10);
77 static void DrawDeferredTextureImageMipMapTree(SkCanvas* canvas, SkImage* image,
78 SkImage::DeferredTextureImageUsageParams* params) {
79 GrContext* context = canvas->getGrContext();
81 skiagm::GM::DrawGpuOnlyMessage(canvas);
84 sk_sp<GrContextThreadSafeProxy> proxy(context->threadSafeProxy());
87 paint.setFilterQuality(params->fQuality);
89 int mipLevelCount = SkMipMap::ComputeLevelCount(image->width(), image->height());
90 size_t requiredMemoryInBytes = image->getDeferredTextureImageData(
91 *proxy, params, 1, nullptr, canvas->imageInfo().colorSpace());
92 if (requiredMemoryInBytes == 0) {
93 SkDebugf("\nCould not create DeferredTextureImageData.\n");
97 std::vector<uint8_t> memory;
98 memory.resize(requiredMemoryInBytes);
99 image->getDeferredTextureImageData(
100 *proxy, params, 1, memory.data(), canvas->imageInfo().colorSpace());
101 sk_sp<SkImage> uploadedImage = SkImage::MakeFromDeferredTextureImageData(
102 context, memory.data(), SkBudgeted::kNo);
104 // draw a column using deferred texture images
105 SkScalar offsetHeight = 10.f;
106 // handle base mipmap level
108 canvas->translate(10.f, offsetHeight);
109 canvas->drawImage(uploadedImage, 0, 0, &paint);
111 offsetHeight += image->height() + 10;
112 // handle generated mipmap levels
113 for (int i = 0; i < mipLevelCount; i++) {
114 SkISize mipSize = SkMipMap::ComputeLevelSize(image->width(), image->height(), i);
116 canvas->translate(10.f, offsetHeight);
117 canvas->scale(mipSize.width() / static_cast<float>(image->width()),
118 mipSize.height() / static_cast<float>(image->height()));
119 canvas->drawImage(uploadedImage, 0, 0, &paint);
121 offsetHeight += mipSize.height() + 10;
124 // draw a column using SkImage
126 // handle base mipmap level
128 canvas->translate(image->width() + 20.f, offsetHeight);
129 canvas->drawImage(image, 0, 0, &paint);
131 offsetHeight += image->height() + 10;
132 // handle generated mipmap levels
133 for (int i = 0; i < mipLevelCount; i++) {
134 SkISize mipSize = SkMipMap::ComputeLevelSize(image->width(), image->height(), i);
136 canvas->translate(image->width() + 20.f, offsetHeight);
137 canvas->scale(mipSize.width() / static_cast<float>(image->width()),
138 mipSize.height() / static_cast<float>(image->height()));
139 canvas->drawImage(image, 0, 0, &paint);
141 offsetHeight += mipSize.height() + 10;
145 DEF_SIMPLE_GM(deferred_texture_image_none, canvas, 512 + 512 + 30, 512 + 20) {
146 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(1.f, 1.f),
147 kNone_SkFilterQuality, 0);
148 DrawDeferredTextureImageData(canvas, ¶ms);
151 DEF_SIMPLE_GM(deferred_texture_image_low, canvas, 512 + 512 + 30, 512 + 20) {
152 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(1.f, 1.f),
153 kLow_SkFilterQuality, 0);
154 DrawDeferredTextureImageData(canvas, ¶ms);
157 DEF_SIMPLE_GM(deferred_texture_image_medium_encoded, canvas, 512 + 512 + 30, 1110) {
158 sk_sp<SkImage> encodedImage = GetResourceAsImage("mandrill_512.png");
160 SkDebugf("\nCould not load resource.\n");
164 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(0.25f, 0.25f),
165 kMedium_SkFilterQuality, 0);
166 DrawDeferredTextureImageMipMapTree(canvas, encodedImage.get(), ¶ms);
169 DEF_SIMPLE_GM(deferred_texture_image_medium_decoded, canvas, 512 + 512 + 30, 1110) {
171 if (!GetResourceAsBitmap("mandrill_512.png", &bitmap)) {
172 SkDebugf("\nCould not decode resource.\n");
175 sk_sp<SkImage> decodedImage = SkImage::MakeFromBitmap(bitmap);
177 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(0.25f, 0.25f),
178 kMedium_SkFilterQuality, 0);
179 DrawDeferredTextureImageMipMapTree(canvas, decodedImage.get(), ¶ms);
182 DEF_SIMPLE_GM(deferred_texture_image_high, canvas, 512 + 512 + 30, 512 + 20) {
183 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(1.f, 1.f),
184 kHigh_SkFilterQuality, 0);
185 DrawDeferredTextureImageData(canvas, ¶ms);
188 DEF_SIMPLE_GM(deferred_texture_image_medium_encoded_indexed, canvas, 128 + 128 + 30, 340) {
189 sk_sp<SkImage> encodedImage = GetResourceAsImage("color_wheel.gif");
191 SkDebugf("\nCould not load resource.\n");
195 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(0.25f, 0.25f),
196 kMedium_SkFilterQuality, 0);
197 DrawDeferredTextureImageMipMapTree(canvas, encodedImage.get(), ¶ms);
200 DEF_SIMPLE_GM(deferred_texture_image_medium_decoded_indexed, canvas, 128 + 128 + 30, 340) {
202 if (!GetResourceAsBitmap("color_wheel.gif", &bitmap)) {
203 SkDebugf("\nCould not decode resource.\n");
206 sk_sp<SkImage> decodedImage = SkImage::MakeFromBitmap(bitmap);
208 auto params = SkImage::DeferredTextureImageUsageParams(SkMatrix::MakeScale(0.25f, 0.25f),
209 kMedium_SkFilterQuality, 0);
210 DrawDeferredTextureImageMipMapTree(canvas, decodedImage.get(), ¶ms);