| 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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkData.h" | 10 #include "SkData.h" |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 SkData* fData; | 408 SkData* fData; |
| 409 | 409 |
| 410 static void Release(const void* pixels, void* context) { | 410 static void Release(const void* pixels, void* context) { |
| 411 ReleaseDataContext* state = (ReleaseDataContext*)context; | 411 ReleaseDataContext* state = (ReleaseDataContext*)context; |
| 412 REPORTER_ASSERT(state->fReporter, state->fData); | 412 REPORTER_ASSERT(state->fReporter, state->fData); |
| 413 state->fData->unref(); | 413 state->fData->unref(); |
| 414 state->fData = nullptr; | 414 state->fData = nullptr; |
| 415 } | 415 } |
| 416 }; | 416 }; |
| 417 | 417 |
| 418 // May we (soon) eliminate the need to keep testing this, by hiding the bloody d
evice! | |
| 419 #include "SkDevice.h" | |
| 420 static uint32_t get_legacy_gen_id(SkSurface* surf) { | |
| 421 SkBaseDevice* device = surf->getCanvas()->getDevice_just_for_deprecated_comp
atibility_testing(); | |
| 422 return device->accessBitmap(false).getGenerationID(); | |
| 423 } | |
| 424 | |
| 425 /* | |
| 426 * Test legacy behavor of bumping the surface's device's bitmap's genID when we
access its | |
| 427 * texture handle for writing. | |
| 428 * | |
| 429 * Note: this needs to be tested separately from checking newImageSnapshot, as
calling that | |
| 430 * can also incidentally bump the genID (when a new backing surface is created)
. | |
| 431 */ | |
| 432 template <class F> | |
| 433 static void test_texture_handle_genID(skiatest::Reporter* reporter, SkSurface* s
urf, F f) { | |
| 434 const uint32_t gen0 = get_legacy_gen_id(surf); | |
| 435 f(surf, SkSurface::kFlushRead_BackendHandleAccess); | |
| 436 const uint32_t gen1 = get_legacy_gen_id(surf); | |
| 437 REPORTER_ASSERT(reporter, gen0 == gen1); | |
| 438 | |
| 439 f(surf, SkSurface::kFlushWrite_BackendHandleAccess); | |
| 440 const uint32_t gen2 = get_legacy_gen_id(surf); | |
| 441 REPORTER_ASSERT(reporter, gen0 != gen2); | |
| 442 | |
| 443 f(surf, SkSurface::kDiscardWrite_BackendHandleAccess); | |
| 444 const uint32_t gen3 = get_legacy_gen_id(surf); | |
| 445 REPORTER_ASSERT(reporter, gen0 != gen3); | |
| 446 REPORTER_ASSERT(reporter, gen2 != gen3); | |
| 447 } | |
| 448 | |
| 449 template <class F> | |
| 450 static void test_backend_handle(skiatest::Reporter* reporter, SkSurface* surf, F
f) { | |
| 451 SkAutoTUnref<SkImage> image0(surf->newImageSnapshot()); | |
| 452 GrBackendObject obj = f(surf, SkSurface::kFlushRead_BackendHandleAccess); | |
| 453 REPORTER_ASSERT(reporter, obj != 0); | |
| 454 SkAutoTUnref<SkImage> image1(surf->newImageSnapshot()); | |
| 455 // just read access should not affect the snapshot | |
| 456 REPORTER_ASSERT(reporter, image0->uniqueID() == image1->uniqueID()); | |
| 457 | |
| 458 obj = f(surf, SkSurface::kFlushWrite_BackendHandleAccess); | |
| 459 REPORTER_ASSERT(reporter, obj != 0); | |
| 460 SkAutoTUnref<SkImage> image2(surf->newImageSnapshot()); | |
| 461 // expect a new image, since we claimed we would write | |
| 462 REPORTER_ASSERT(reporter, image0->uniqueID() != image2->uniqueID()); | |
| 463 | |
| 464 obj = f(surf, SkSurface::kDiscardWrite_BackendHandleAccess); | |
| 465 REPORTER_ASSERT(reporter, obj != 0); | |
| 466 SkAutoTUnref<SkImage> image3(surf->newImageSnapshot()); | |
| 467 // expect a new(er) image, since we claimed we would write | |
| 468 REPORTER_ASSERT(reporter, image0->uniqueID() != image3->uniqueID()); | |
| 469 REPORTER_ASSERT(reporter, image2->uniqueID() != image3->uniqueID()); | |
| 470 } | |
| 471 | |
| 472 static SkImage* create_image(skiatest::Reporter* reporter, | 418 static SkImage* create_image(skiatest::Reporter* reporter, |
| 473 ImageType imageType, GrContext* context, SkColor co
lor, | 419 ImageType imageType, GrContext* context, SkColor co
lor, |
| 474 ReleaseDataContext* releaseContext) { | 420 ReleaseDataContext* releaseContext) { |
| 475 const SkPMColor pmcolor = SkPreMultiplyColor(color); | 421 const SkPMColor pmcolor = SkPreMultiplyColor(color); |
| 476 const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); | 422 const SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10); |
| 477 const size_t rowBytes = info.minRowBytes(); | 423 const size_t rowBytes = info.minRowBytes(); |
| 478 const size_t size = rowBytes * info.height(); | 424 const size_t size = rowBytes * info.height(); |
| 479 | 425 |
| 480 SkAutoTUnref<SkData> data(SkData::NewUninitialized(size)); | 426 SkAutoTUnref<SkData> data(SkData::NewUninitialized(size)); |
| 481 void* addr = data->writable_data(); | 427 void* addr = data->writable_data(); |
| 482 sk_memset32((SkPMColor*)addr, pmcolor, SkToInt(size >> 2)); | 428 sk_memset32((SkPMColor*)addr, pmcolor, SkToInt(size >> 2)); |
| 483 | 429 |
| 484 switch (imageType) { | 430 switch (imageType) { |
| 485 case kRasterCopy_ImageType: | 431 case kRasterCopy_ImageType: |
| 486 return SkImage::NewRasterCopy(info, addr, rowBytes); | 432 return SkImage::NewRasterCopy(info, addr, rowBytes); |
| 487 case kRasterData_ImageType: | 433 case kRasterData_ImageType: |
| 488 return SkImage::NewRasterData(info, data, rowBytes); | 434 return SkImage::NewRasterData(info, data, rowBytes); |
| 489 case kRasterProc_ImageType: | 435 case kRasterProc_ImageType: |
| 490 SkASSERT(releaseContext); | 436 SkASSERT(releaseContext); |
| 491 releaseContext->fData = SkRef(data.get()); | 437 releaseContext->fData = SkRef(data.get()); |
| 492 return SkImage::NewFromRaster(info, addr, rowBytes, | 438 return SkImage::NewFromRaster(info, addr, rowBytes, |
| 493 ReleaseDataContext::Release, releaseCo
ntext); | 439 ReleaseDataContext::Release, releaseCo
ntext); |
| 494 case kGpu_ImageType: { | 440 case kGpu_ImageType: { |
| 495 SkAutoTUnref<SkSurface> surf( | 441 SkAutoTUnref<SkSurface> surf( |
| 496 SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, inf
o, 0)); | 442 SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, inf
o, 0)); |
| 497 surf->getCanvas()->clear(color); | 443 surf->getCanvas()->clear(color); |
| 498 // test our backing texture / rendertarget while were here... | |
| 499 auto textureAccessorFunc = | |
| 500 [](SkSurface* surf, SkSurface::BackendHandleAccess access) -
> GrBackendObject { | |
| 501 return surf->getTextureHandle(access); }; | |
| 502 auto renderTargetAccessorFunc = | |
| 503 [](SkSurface* surf, SkSurface::BackendHandleAccess access) -
> GrBackendObject { | |
| 504 GrBackendObject obj; | |
| 505 SkAssertResult(surf->getRenderTargetHandle(&obj, access)
); | |
| 506 return obj; }; | |
| 507 test_backend_handle(reporter, surf, textureAccessorFunc); | |
| 508 test_backend_handle(reporter, surf, renderTargetAccessorFunc); | |
| 509 test_texture_handle_genID(reporter, surf, textureAccessorFunc); | |
| 510 test_texture_handle_genID(reporter, surf, renderTargetAccessorFunc); | |
| 511 | |
| 512 // redraw so our returned image looks as expected. | |
| 513 surf->getCanvas()->clear(color); | |
| 514 return surf->newImageSnapshot(); | 444 return surf->newImageSnapshot(); |
| 515 } | 445 } |
| 516 case kCodec_ImageType: { | 446 case kCodec_ImageType: { |
| 517 SkBitmap bitmap; | 447 SkBitmap bitmap; |
| 518 bitmap.installPixels(info, addr, rowBytes); | 448 bitmap.installPixels(info, addr, rowBytes); |
| 519 SkAutoTUnref<SkData> src( | 449 SkAutoTUnref<SkData> src( |
| 520 SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 1
00)); | 450 SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 1
00)); |
| 521 return SkImage::NewFromEncoded(src); | 451 return SkImage::NewFromEncoded(src); |
| 522 } | 452 } |
| 523 } | 453 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); | 714 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); |
| 785 refImg.reset(nullptr); // force a release of the image | 715 refImg.reset(nullptr); // force a release of the image |
| 786 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); | 716 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); |
| 787 } | 717 } |
| 788 #endif | 718 #endif |
| 789 DEF_GPUTEST(ImageTestsFromSurfaceTestsTODO, reporter, factory) { | 719 DEF_GPUTEST(ImageTestsFromSurfaceTestsTODO, reporter, factory) { |
| 790 test_image(reporter); | 720 test_image(reporter); |
| 791 test_empty_image(reporter); | 721 test_empty_image(reporter); |
| 792 test_imagepeek(reporter, factory); | 722 test_imagepeek(reporter, factory); |
| 793 } | 723 } |
| OLD | NEW |