| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 <functional> |
| 9 #include "DMGpuSupport.h" |
| 10 |
| 8 #include "SkBitmap.h" | 11 #include "SkBitmap.h" |
| 9 #include "SkCanvas.h" | 12 #include "SkCanvas.h" |
| 10 #include "SkData.h" | 13 #include "SkData.h" |
| 11 #include "SkDevice.h" | 14 #include "SkDevice.h" |
| 12 #include "SkImageEncoder.h" | 15 #include "SkImageEncoder.h" |
| 13 #include "SkImageGenerator.h" | 16 #include "SkImageGenerator.h" |
| 14 #include "SkImage_Base.h" | 17 #include "SkImage_Base.h" |
| 15 #include "SkPicture.h" | 18 #include "SkPicture.h" |
| 16 #include "SkPictureRecorder.h" | 19 #include "SkPictureRecorder.h" |
| 17 #include "SkPixelSerializer.h" | 20 #include "SkPixelSerializer.h" |
| 18 #include "SkRRect.h" | 21 #include "SkRRect.h" |
| 19 #include "SkStream.h" | 22 #include "SkStream.h" |
| 20 #include "SkSurface.h" | 23 #include "SkSurface.h" |
| 21 #include "SkUtils.h" | 24 #include "SkUtils.h" |
| 22 #include "Test.h" | 25 #include "Test.h" |
| 23 | 26 |
| 24 #if SK_SUPPORT_GPU | |
| 25 #include "GrContext.h" | |
| 26 #include "gl/GrGLInterface.h" | |
| 27 #include "gl/GrGLUtil.h" | |
| 28 #endif | |
| 29 | |
| 30 static void assert_equal(skiatest::Reporter* reporter, SkImage* a, const SkIRect
* subsetA, | 27 static void assert_equal(skiatest::Reporter* reporter, SkImage* a, const SkIRect
* subsetA, |
| 31 SkImage* b) { | 28 SkImage* b) { |
| 32 const int widthA = subsetA ? subsetA->width() : a->width(); | 29 const int widthA = subsetA ? subsetA->width() : a->width(); |
| 33 const int heightA = subsetA ? subsetA->height() : a->height(); | 30 const int heightA = subsetA ? subsetA->height() : a->height(); |
| 34 | 31 |
| 35 REPORTER_ASSERT(reporter, widthA == b->width()); | 32 REPORTER_ASSERT(reporter, widthA == b->width()); |
| 36 REPORTER_ASSERT(reporter, heightA == b->height()); | 33 REPORTER_ASSERT(reporter, heightA == b->height()); |
| 37 #if 0 | 34 #if 0 |
| 38 // see https://bug.skia.org/3965 | 35 // see https://bug.skia.org/3965 |
| 39 bool AO = a->isOpaque(); | 36 bool AO = a->isOpaque(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 SkCanvas canvas(bm); | 77 SkCanvas canvas(bm); |
| 81 draw_image_test_pattern(&canvas); | 78 draw_image_test_pattern(&canvas); |
| 82 } | 79 } |
| 83 return data.release(); | 80 return data.release(); |
| 84 } | 81 } |
| 85 static SkImage* create_data_image() { | 82 static SkImage* create_data_image() { |
| 86 SkImageInfo info; | 83 SkImageInfo info; |
| 87 SkAutoTUnref<SkData> data(create_image_data(&info)); | 84 SkAutoTUnref<SkData> data(create_image_data(&info)); |
| 88 return SkImage::NewRasterData(info, data, info.minRowBytes()); | 85 return SkImage::NewRasterData(info, data, info.minRowBytes()); |
| 89 } | 86 } |
| 87 #if SK_SUPPORT_GPU // not gpu-specific but currently only used in GPU tests |
| 88 static SkImage* create_picture_image() { |
| 89 SkPictureRecorder recorder; |
| 90 SkCanvas* canvas = recorder.beginRecording(10, 10); |
| 91 canvas->clear(SK_ColorCYAN); |
| 92 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
| 93 return SkImage::NewFromPicture(picture, SkISize::Make(10, 10), nullptr, null
ptr); |
| 94 }; |
| 95 #endif |
| 90 // Want to ensure that our Release is called when the owning image is destroyed | 96 // Want to ensure that our Release is called when the owning image is destroyed |
| 91 struct RasterDataHolder { | 97 struct RasterDataHolder { |
| 92 RasterDataHolder() : fReleaseCount(0) {} | 98 RasterDataHolder() : fReleaseCount(0) {} |
| 93 SkAutoTUnref<SkData> fData; | 99 SkAutoTUnref<SkData> fData; |
| 94 int fReleaseCount; | 100 int fReleaseCount; |
| 95 static void Release(const void* pixels, void* context) { | 101 static void Release(const void* pixels, void* context) { |
| 96 RasterDataHolder* self = static_cast<RasterDataHolder*>(context); | 102 RasterDataHolder* self = static_cast<RasterDataHolder*>(context); |
| 97 self->fReleaseCount++; | 103 self->fReleaseCount++; |
| 98 self->fData.reset(); | 104 self->fData.reset(); |
| 99 } | 105 } |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 SkDebugf("SkImage_Gpu2Cpu : cachedBitmap was already purged\n"); | 375 SkDebugf("SkImage_Gpu2Cpu : cachedBitmap was already purged\n"); |
| 370 } | 376 } |
| 371 } | 377 } |
| 372 | 378 |
| 373 image.reset(nullptr); | 379 image.reset(nullptr); |
| 374 { | 380 { |
| 375 SkBitmap cachedBitmap; | 381 SkBitmap cachedBitmap; |
| 376 REPORTER_ASSERT(reporter, !SkBitmapCache::Find(uniqueID, &cachedBitmap))
; | 382 REPORTER_ASSERT(reporter, !SkBitmapCache::Find(uniqueID, &cachedBitmap))
; |
| 377 } | 383 } |
| 378 } | 384 } |
| 385 |
| 386 DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_newTextureImage, reporter, context, glCon
text) { |
| 387 GrContextFactory otherFactory; |
| 388 GrContextFactory::ContextInfo otherContextInfo = |
| 389 otherFactory.getContextInfo(GrContextFactory::kNative_GLContextType); |
| 390 glContext->makeCurrent(); |
| 391 |
| 392 std::function<SkImage*()> imageFactories[] = { |
| 393 create_image, |
| 394 create_codec_image, |
| 395 create_data_image, |
| 396 // Create an image from a picture. |
| 397 create_picture_image, |
| 398 // Create a texture image. |
| 399 [context] { return create_gpu_image(context); }, |
| 400 // Create a texture image in a another GrContext. |
| 401 [glContext, otherContextInfo] { |
| 402 otherContextInfo.fGLContext->makeCurrent(); |
| 403 SkImage* otherContextImage = create_gpu_image(otherContextInfo.fGrCo
ntext); |
| 404 glContext->makeCurrent(); |
| 405 return otherContextImage; |
| 406 } |
| 407 }; |
| 408 |
| 409 for (auto factory : imageFactories) { |
| 410 SkAutoTUnref<SkImage> image(factory()); |
| 411 if (!image) { |
| 412 ERRORF(reporter, "Error creating image."); |
| 413 continue; |
| 414 } |
| 415 GrTexture* origTexture = as_IB(image)->peekTexture(); |
| 416 |
| 417 SkAutoTUnref<SkImage> texImage(image->newTextureImage(context)); |
| 418 if (!texImage) { |
| 419 // We execpt to fail if image comes from a different GrContext. |
| 420 if (!origTexture || origTexture->getContext() == context) { |
| 421 ERRORF(reporter, "newTextureImage failed."); |
| 422 } |
| 423 continue; |
| 424 } |
| 425 GrTexture* copyTexture = as_IB(texImage)->peekTexture(); |
| 426 if (!copyTexture) { |
| 427 ERRORF(reporter, "newTextureImage returned non-texture image."); |
| 428 continue; |
| 429 } |
| 430 if (origTexture) { |
| 431 if (origTexture != copyTexture) { |
| 432 ERRORF(reporter, "newTextureImage made unnecessary texture copy.
"); |
| 433 } |
| 434 } |
| 435 if (image->width() != texImage->width() || image->height() != texImage->
height()) { |
| 436 ERRORF(reporter, "newTextureImage changed the image size."); |
| 437 } |
| 438 if (image->isOpaque() != texImage->isOpaque()) { |
| 439 ERRORF(reporter, "newTextureImage changed image opaqueness."); |
| 440 } |
| 441 } |
| 442 } |
| 379 #endif | 443 #endif |
| 380 | 444 |
| 381 // https://bug.skia.org/4390 | 445 // https://bug.skia.org/4390 |
| 382 DEF_TEST(ImageFromIndex8Bitmap, r) { | 446 DEF_TEST(ImageFromIndex8Bitmap, r) { |
| 383 SkPMColor pmColors[1] = {SkPreMultiplyColor(SK_ColorWHITE)}; | 447 SkPMColor pmColors[1] = {SkPreMultiplyColor(SK_ColorWHITE)}; |
| 384 SkBitmap bm; | 448 SkBitmap bm; |
| 385 SkAutoTUnref<SkColorTable> ctable( | 449 SkAutoTUnref<SkColorTable> ctable( |
| 386 new SkColorTable(pmColors, SK_ARRAY_COUNT(pmColors))); | 450 new SkColorTable(pmColors, SK_ARRAY_COUNT(pmColors))); |
| 387 SkImageInfo info = | 451 SkImageInfo info = |
| 388 SkImageInfo::Make(1, 1, kIndex_8_SkColorType, kPremul_SkAlphaType); | 452 SkImageInfo::Make(1, 1, kIndex_8_SkColorType, kPremul_SkAlphaType); |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 check_image_color(reporter, refImg, expected1); | 731 check_image_color(reporter, refImg, expected1); |
| 668 #endif | 732 #endif |
| 669 check_image_color(reporter, cpyImg, expected0); | 733 check_image_color(reporter, cpyImg, expected0); |
| 670 | 734 |
| 671 // Now exercise the release proc | 735 // Now exercise the release proc |
| 672 REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount); | 736 REPORTER_ASSERT(reporter, 0 == releaseChecker.fReleaseCount); |
| 673 refImg.reset(nullptr); // force a release of the image | 737 refImg.reset(nullptr); // force a release of the image |
| 674 REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount); | 738 REPORTER_ASSERT(reporter, 1 == releaseChecker.fReleaseCount); |
| 675 } | 739 } |
| 676 #endif | 740 #endif |
| OLD | NEW |