Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: tests/CachedDecodingPixelRefTest.cpp

Issue 1426753006: SkResourceCache::GetAllocator() index8 and other color types handling (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkResourceCache.cpp ('k') | tests/SkResourceCacheTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBitmap.h" 8 #include "SkBitmap.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkData.h" 10 #include "SkData.h"
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 156
157 class TestImageGenerator : public SkImageGenerator { 157 class TestImageGenerator : public SkImageGenerator {
158 public: 158 public:
159 enum TestType { 159 enum TestType {
160 kFailGetPixels_TestType, 160 kFailGetPixels_TestType,
161 kSucceedGetPixels_TestType, 161 kSucceedGetPixels_TestType,
162 kLast_TestType = kSucceedGetPixels_TestType 162 kLast_TestType = kSucceedGetPixels_TestType
163 }; 163 };
164 static int Width() { return 10; } 164 static int Width() { return 10; }
165 static int Height() { return 10; } 165 static int Height() { return 10; }
166 static uint32_t Color() { return 0xff123456; } 166 // value choosen so that there is no loss when converting to to RGB565 and b ack
167 TestImageGenerator(TestType type, skiatest::Reporter* reporter) 167 static SkColor Color() { return 0xff10345a; }
168 : INHERITED(GetMyInfo()), fType(type), fReporter(reporter) { 168 static SkPMColor PMColor() { return SkPreMultiplyColor(Color()); }
169
170 TestImageGenerator(TestType type, skiatest::Reporter* reporter,
171 SkColorType colorType = kN32_SkColorType)
172 : INHERITED(GetMyInfo(colorType)), fType(type), fReporter(reporter) {
169 SkASSERT((fType <= kLast_TestType) && (fType >= 0)); 173 SkASSERT((fType <= kLast_TestType) && (fType >= 0));
170 } 174 }
171 virtual ~TestImageGenerator() { } 175 virtual ~TestImageGenerator() { }
172 176
173 protected: 177 protected:
174 static SkImageInfo GetMyInfo() { 178 static SkImageInfo GetMyInfo(SkColorType colorType) {
175 return SkImageInfo::MakeN32(TestImageGenerator::Width(), TestImageGenera tor::Height(), 179 return SkImageInfo::Make(TestImageGenerator::Width(), TestImageGenerator ::Height(),
176 kOpaque_SkAlphaType); 180 colorType, kOpaque_SkAlphaType);
177 } 181 }
178 182
179 bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 183 bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
180 SkPMColor ctable[], int* ctableCount) override { 184 SkPMColor ctable[], int* ctableCount) override {
181 REPORTER_ASSERT(fReporter, pixels != nullptr); 185 REPORTER_ASSERT(fReporter, pixels != nullptr);
182 REPORTER_ASSERT(fReporter, rowBytes >= info.minRowBytes()); 186 REPORTER_ASSERT(fReporter, rowBytes >= info.minRowBytes());
183 if (fType != kSucceedGetPixels_TestType) { 187 if (fType != kSucceedGetPixels_TestType) {
184 return false; 188 return false;
185 } 189 }
186 if (info.colorType() != kN32_SkColorType) { 190 if (info.colorType() != kN32_SkColorType && info.colorType() != getInfo( ).colorType()) {
187 return false; 191 return false;
188 } 192 }
189 char* bytePtr = static_cast<char*>(pixels); 193 char* bytePtr = static_cast<char*>(pixels);
190 for (int y = 0; y < info.height(); ++y) { 194 switch (info.colorType()) {
191 sk_memset32(reinterpret_cast<SkColor*>(bytePtr), 195 case kN32_SkColorType:
192 TestImageGenerator::Color(), info.width()); 196 for (int y = 0; y < info.height(); ++y) {
193 bytePtr += rowBytes; 197 sk_memset32((uint32_t*)bytePtr,
198 TestImageGenerator::PMColor(), info.width());
199 bytePtr += rowBytes;
200 }
201 break;
202 case kIndex_8_SkColorType:
203 *ctableCount = 1;
204 ctable[0] = TestImageGenerator::PMColor();
205 for (int y = 0; y < info.height(); ++y) {
206 memset(bytePtr, 0, info.width());
207 bytePtr += rowBytes;
208 }
209 break;
210 case kRGB_565_SkColorType:
211 for (int y = 0; y < info.height(); ++y) {
212 sk_memset16((uint16_t*)bytePtr,
213 SkPixel32ToPixel16(TestImageGenerator::PMColor()), info. width());
214 bytePtr += rowBytes;
215 }
216 break;
217 default:
218 return false;
194 } 219 }
195 return true; 220 return true;
196 } 221 }
197 222
198 private: 223 private:
199 const TestType fType; 224 const TestType fType;
200 skiatest::Reporter* const fReporter; 225 skiatest::Reporter* const fReporter;
201 226
202 typedef SkImageGenerator INHERITED; 227 typedef SkImageGenerator INHERITED;
203 }; 228 };
204 229
205 static void check_test_image_generator_bitmap(skiatest::Reporter* reporter, 230 static void check_test_image_generator_bitmap(skiatest::Reporter* reporter,
206 const SkBitmap& bm) { 231 const SkBitmap& bm) {
207 REPORTER_ASSERT(reporter, TestImageGenerator::Width() == bm.width()); 232 REPORTER_ASSERT(reporter, TestImageGenerator::Width() == bm.width());
208 REPORTER_ASSERT(reporter, TestImageGenerator::Height() == bm.height()); 233 REPORTER_ASSERT(reporter, TestImageGenerator::Height() == bm.height());
209 SkAutoLockPixels autoLockPixels(bm); 234 SkAutoLockPixels autoLockPixels(bm);
210 REPORTER_ASSERT(reporter, bm.getPixels()); 235 REPORTER_ASSERT(reporter, bm.getPixels());
211 if (nullptr == bm.getPixels()) { 236 if (nullptr == bm.getPixels()) {
212 return; 237 return;
213 } 238 }
214 int errors = 0; 239 int errors = 0;
215 for (int y = 0; y < bm.height(); ++y) { 240 for (int y = 0; y < bm.height(); ++y) {
216 for (int x = 0; x < bm.width(); ++x) { 241 for (int x = 0; x < bm.width(); ++x) {
217 if (TestImageGenerator::Color() != *bm.getAddr32(x, y)) { 242 if (TestImageGenerator::Color() != bm.getColor(x, y)) {
218 ++errors; 243 ++errors;
219 } 244 }
220 } 245 }
221 } 246 }
222 REPORTER_ASSERT(reporter, 0 == errors); 247 REPORTER_ASSERT(reporter, 0 == errors);
223 } 248 }
224 249
225 static void check_pixelref(TestImageGenerator::TestType type, 250 static void check_pixelref(TestImageGenerator::TestType type,
226 skiatest::Reporter* reporter, 251 skiatest::Reporter* reporter,
227 SkDiscardableMemory::Factory* factory) { 252 SkDiscardableMemory::Factory* factory,
228 SkAutoTDelete<SkImageGenerator> gen(new TestImageGenerator(type, reporter)); 253 SkColorType colorType) {
254 SkAutoTDelete<SkImageGenerator> gen(new TestImageGenerator(type, reporter, c olorType));
229 REPORTER_ASSERT(reporter, gen.get() != nullptr); 255 REPORTER_ASSERT(reporter, gen.get() != nullptr);
230 SkBitmap lazy; 256 SkBitmap lazy;
231 bool success = SkDEPRECATED_InstallDiscardablePixelRef(gen.detach(), nullptr , &lazy, factory); 257 bool success = SkDEPRECATED_InstallDiscardablePixelRef(gen.detach(), nullptr , &lazy, factory);
232 258
233 REPORTER_ASSERT(reporter, success); 259 REPORTER_ASSERT(reporter, success);
234 if (TestImageGenerator::kSucceedGetPixels_TestType == type) { 260 if (TestImageGenerator::kSucceedGetPixels_TestType == type) {
235 check_test_image_generator_bitmap(reporter, lazy); 261 check_test_image_generator_bitmap(reporter, lazy);
236 } else if (TestImageGenerator::kFailGetPixels_TestType == type) { 262 } else if (TestImageGenerator::kFailGetPixels_TestType == type) {
237 SkAutoLockPixels autoLockPixels(lazy); 263 SkAutoLockPixels autoLockPixels(lazy);
238 REPORTER_ASSERT(reporter, nullptr == lazy.getPixels()); 264 REPORTER_ASSERT(reporter, nullptr == lazy.getPixels());
239 } 265 }
240 } 266 }
241 267
242 /** 268 /**
243 * This tests the basic functionality of SkDiscardablePixelRef with a 269 * This tests the basic functionality of SkDiscardablePixelRef with a
244 * basic SkImageGenerator implementation and several 270 * basic SkImageGenerator implementation and several
245 * SkDiscardableMemory::Factory choices. 271 * SkDiscardableMemory::Factory choices.
246 */ 272 */
247 DEF_TEST(DiscardableAndCachingPixelRef, reporter) { 273 DEF_TEST(DiscardableAndCachingPixelRef, reporter) {
248 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, nullpt r); 274 const SkColorType testColorTypes[] = {
249 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, nul lptr); 275 kN32_SkColorType,
276 kIndex_8_SkColorType,
277 kRGB_565_SkColorType
278 };
279 for (const SkColorType testColorType : testColorTypes) {
280 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, nu llptr,
281 testColorType);
282 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, nullptr,
283 testColorType);
250 284
251 SkAutoTUnref<SkDiscardableMemoryPool> pool( 285 SkAutoTUnref<SkDiscardableMemoryPool> pool(
252 SkDiscardableMemoryPool::Create(1, nullptr)); 286 SkDiscardableMemoryPool::Create(1, nullptr));
253 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed()); 287 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed());
254 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, pool); 288 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, po ol,
255 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed()); 289 testColorType);
256 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, poo l); 290 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed());
257 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed()); 291 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, pool,
292 testColorType);
293 REPORTER_ASSERT(reporter, 0 == pool->getRAMUsed());
258 294
259 SkDiscardableMemoryPool* globalPool = SkGetGlobalDiscardableMemoryPool(); 295 SkDiscardableMemoryPool* globalPool = SkGetGlobalDiscardableMemoryPool() ;
260 // Only acts differently from nullptr on a platform that has a 296 // Only acts differently from nullptr on a platform that has a
261 // default discardable memory implementation that differs from the 297 // default discardable memory implementation that differs from the
262 // global DM pool. 298 // global DM pool.
263 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, global Pool); 299 check_pixelref(TestImageGenerator::kFailGetPixels_TestType, reporter, gl obalPool,
264 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, glo balPool); 300 testColorType);
301 check_pixelref(TestImageGenerator::kSucceedGetPixels_TestType, reporter, globalPool,
302 testColorType);
303 }
265 } 304 }
266 305
267 //////////////////////////////////////////////////////////////////////////////// 306 ////////////////////////////////////////////////////////////////////////////////
268 307
269 DEF_TEST(Image_NewFromGenerator, r) { 308 DEF_TEST(Image_NewFromGenerator, r) {
270 TestImageGenerator::TestType testTypes[] = { 309 const TestImageGenerator::TestType testTypes[] = {
271 TestImageGenerator::kFailGetPixels_TestType, 310 TestImageGenerator::kFailGetPixels_TestType,
272 TestImageGenerator::kSucceedGetPixels_TestType, 311 TestImageGenerator::kSucceedGetPixels_TestType,
273 }; 312 };
313 const SkColorType testColorTypes[] = {
314 kN32_SkColorType,
315 kIndex_8_SkColorType,
316 kRGB_565_SkColorType
317 };
274 for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) { 318 for (size_t i = 0; i < SK_ARRAY_COUNT(testTypes); ++i) {
275 TestImageGenerator::TestType test = testTypes[i]; 319 TestImageGenerator::TestType test = testTypes[i];
276 SkImageGenerator* gen = new TestImageGenerator(test, r); 320 for (const SkColorType testColorType : testColorTypes) {
277 SkAutoTUnref<SkImage> image(SkImage::NewFromGenerator(gen)); 321 SkImageGenerator* gen = new TestImageGenerator(test, r, testColorTyp e);
278 if (nullptr == image.get()) { 322 SkAutoTUnref<SkImage> image(SkImage::NewFromGenerator(gen));
279 ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed [" 323 if (nullptr == image.get()) {
280 SK_SIZE_T_SPECIFIER "]", i); 324 ERRORF(r, "SkImage::NewFromGenerator unexpecedly failed ["
281 continue; 325 SK_SIZE_T_SPECIFIER "]", i);
282 } 326 continue;
283 REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width()); 327 }
284 REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height()); 328 REPORTER_ASSERT(r, TestImageGenerator::Width() == image->width());
285 REPORTER_ASSERT(r, image->isLazyGenerated()); 329 REPORTER_ASSERT(r, TestImageGenerator::Height() == image->height());
330 REPORTER_ASSERT(r, image->isLazyGenerated());
286 331
287 SkBitmap bitmap; 332 SkBitmap bitmap;
288 bitmap.allocN32Pixels(TestImageGenerator::Width(), TestImageGenerator::H eight()); 333 bitmap.allocN32Pixels(TestImageGenerator::Width(), TestImageGenerato r::Height());
289 SkCanvas canvas(bitmap); 334 SkCanvas canvas(bitmap);
290 const SkColor kDefaultColor = 0xffabcdef; 335 const SkColor kDefaultColor = 0xffabcdef;
291 canvas.clear(kDefaultColor); 336 canvas.clear(kDefaultColor);
292 canvas.drawImage(image, 0, 0, nullptr); 337 canvas.drawImage(image, 0, 0, nullptr);
293 if (TestImageGenerator::kSucceedGetPixels_TestType == test) { 338 if (TestImageGenerator::kSucceedGetPixels_TestType == test) {
294 REPORTER_ASSERT( 339 REPORTER_ASSERT(
295 r, TestImageGenerator::Color() == *bitmap.getAddr32(0, 0)); 340 r, TestImageGenerator::Color() == bitmap.getColor(0, 0));
296 } else { 341 }
297 REPORTER_ASSERT(r, kDefaultColor == bitmap.getColor(0,0)); 342 else {
343 REPORTER_ASSERT(r, kDefaultColor == bitmap.getColor(0, 0));
344 }
298 } 345 }
299 } 346 }
300 } 347 }
OLDNEW
« no previous file with comments | « src/core/SkResourceCache.cpp ('k') | tests/SkResourceCacheTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698