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 |