| OLD | NEW |
| 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkData.h" | 9 #include "SkData.h" |
| 10 #include "SkDevice.h" | 10 #include "SkDevice.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 }; | 34 }; |
| 35 static const int kSurfaceTypeCnt = kLastSurfaceType + 1; | 35 static const int kSurfaceTypeCnt = kLastSurfaceType + 1; |
| 36 | 36 |
| 37 static void release_storage(void* pixels, void* context) { | 37 static void release_storage(void* pixels, void* context) { |
| 38 SkASSERT(pixels == context); | 38 SkASSERT(pixels == context); |
| 39 sk_free(pixels); | 39 sk_free(pixels); |
| 40 } | 40 } |
| 41 | 41 |
| 42 static SkSurface* create_surface(SurfaceType surfaceType, GrContext* context, | 42 static SkSurface* create_surface(SurfaceType surfaceType, GrContext* context, |
| 43 SkAlphaType at = kPremul_SkAlphaType, | 43 SkAlphaType at = kPremul_SkAlphaType, |
| 44 SkImageInfo* requestedInfo = NULL) { | 44 SkImageInfo* requestedInfo = nullptr) { |
| 45 const SkImageInfo info = SkImageInfo::MakeN32(10, 10, at); | 45 const SkImageInfo info = SkImageInfo::MakeN32(10, 10, at); |
| 46 | 46 |
| 47 if (requestedInfo) { | 47 if (requestedInfo) { |
| 48 *requestedInfo = info; | 48 *requestedInfo = info; |
| 49 } | 49 } |
| 50 | 50 |
| 51 switch (surfaceType) { | 51 switch (surfaceType) { |
| 52 case kRaster_SurfaceType: | 52 case kRaster_SurfaceType: |
| 53 return SkSurface::NewRaster(info); | 53 return SkSurface::NewRaster(info); |
| 54 case kRasterDirect_SurfaceType: { | 54 case kRasterDirect_SurfaceType: { |
| 55 const size_t rowBytes = info.minRowBytes(); | 55 const size_t rowBytes = info.minRowBytes(); |
| 56 void* storage = sk_malloc_throw(info.getSafeSize(rowBytes)); | 56 void* storage = sk_malloc_throw(info.getSafeSize(rowBytes)); |
| 57 return SkSurface::NewRasterDirectReleaseProc(info, storage, rowBytes
, | 57 return SkSurface::NewRasterDirectReleaseProc(info, storage, rowBytes
, |
| 58 release_storage, storag
e); | 58 release_storage, storag
e); |
| 59 } | 59 } |
| 60 case kGpu_SurfaceType: | 60 case kGpu_SurfaceType: |
| 61 return SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted,
info, 0, NULL); | 61 return SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted,
info, 0, nullptr); |
| 62 case kGpuScratch_SurfaceType: | 62 case kGpuScratch_SurfaceType: |
| 63 return SkSurface::NewRenderTarget(context, SkSurface::kYes_Budgeted,
info, 0, NULL); | 63 return SkSurface::NewRenderTarget(context, SkSurface::kYes_Budgeted,
info, 0, nullptr); |
| 64 } | 64 } |
| 65 return NULL; | 65 return nullptr; |
| 66 } | 66 } |
| 67 | 67 |
| 68 enum ImageType { | 68 enum ImageType { |
| 69 kRasterCopy_ImageType, | 69 kRasterCopy_ImageType, |
| 70 kRasterData_ImageType, | 70 kRasterData_ImageType, |
| 71 kRasterProc_ImageType, | 71 kRasterProc_ImageType, |
| 72 kGpu_ImageType, | 72 kGpu_ImageType, |
| 73 kCodec_ImageType, | 73 kCodec_ImageType, |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 #include "SkImageGenerator.h" | 76 #include "SkImageGenerator.h" |
| 77 | 77 |
| 78 class EmptyGenerator : public SkImageGenerator { | 78 class EmptyGenerator : public SkImageGenerator { |
| 79 public: | 79 public: |
| 80 EmptyGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {} | 80 EmptyGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(0, 0)) {} |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 static void test_empty_image(skiatest::Reporter* reporter) { | 83 static void test_empty_image(skiatest::Reporter* reporter) { |
| 84 const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_S
kAlphaType); | 84 const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_S
kAlphaType); |
| 85 | 85 |
| 86 REPORTER_ASSERT(reporter, NULL == SkImage::NewRasterCopy(info, NULL, 0)); | 86 REPORTER_ASSERT(reporter, nullptr == SkImage::NewRasterCopy(info, nullptr, 0
)); |
| 87 REPORTER_ASSERT(reporter, NULL == SkImage::NewRasterData(info, NULL, 0)); | 87 REPORTER_ASSERT(reporter, nullptr == SkImage::NewRasterData(info, nullptr, 0
)); |
| 88 REPORTER_ASSERT(reporter, NULL == SkImage::NewFromRaster(info, NULL, 0, NULL
, NULL)); | 88 REPORTER_ASSERT(reporter, nullptr == SkImage::NewFromRaster(info, nullptr, 0
, nullptr, nullptr)); |
| 89 REPORTER_ASSERT(reporter, NULL == SkImage::NewFromGenerator(new EmptyGenerat
or)); | 89 REPORTER_ASSERT(reporter, nullptr == SkImage::NewFromGenerator(new EmptyGene
rator)); |
| 90 } | 90 } |
| 91 | 91 |
| 92 static void test_empty_surface(skiatest::Reporter* reporter, GrContext* ctx) { | 92 static void test_empty_surface(skiatest::Reporter* reporter, GrContext* ctx) { |
| 93 const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_S
kAlphaType); | 93 const SkImageInfo info = SkImageInfo::Make(0, 0, kN32_SkColorType, kPremul_S
kAlphaType); |
| 94 | 94 |
| 95 REPORTER_ASSERT(reporter, NULL == SkSurface::NewRaster(info)); | 95 REPORTER_ASSERT(reporter, nullptr == SkSurface::NewRaster(info)); |
| 96 REPORTER_ASSERT(reporter, NULL == SkSurface::NewRasterDirect(info, NULL, 0))
; | 96 REPORTER_ASSERT(reporter, nullptr == SkSurface::NewRasterDirect(info, nullpt
r, 0)); |
| 97 if (ctx) { | 97 if (ctx) { |
| 98 REPORTER_ASSERT(reporter, NULL == | 98 REPORTER_ASSERT(reporter, nullptr == |
| 99 SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted,
info, 0, NULL)); | 99 SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted,
info, 0, nullptr)); |
| 100 } | 100 } |
| 101 } | 101 } |
| 102 | 102 |
| 103 #if SK_SUPPORT_GPU | 103 #if SK_SUPPORT_GPU |
| 104 static void test_wrapped_texture_surface(skiatest::Reporter* reporter, GrContext
* ctx) { | 104 static void test_wrapped_texture_surface(skiatest::Reporter* reporter, GrContext
* ctx) { |
| 105 if (NULL == ctx) { | 105 if (nullptr == ctx) { |
| 106 return; | 106 return; |
| 107 } | 107 } |
| 108 | 108 |
| 109 const GrGpu* gpu = ctx->getGpu(); | 109 const GrGpu* gpu = ctx->getGpu(); |
| 110 if (!gpu) { | 110 if (!gpu) { |
| 111 return; | 111 return; |
| 112 } | 112 } |
| 113 | 113 |
| 114 // Test the wrapped factory for SkSurface by creating a backend texture and
then wrap it in | 114 // Test the wrapped factory for SkSurface by creating a backend texture and
then wrap it in |
| 115 // a SkSurface. | 115 // a SkSurface. |
| 116 static const int kW = 100; | 116 static const int kW = 100; |
| 117 static const int kH = 100; | 117 static const int kH = 100; |
| 118 static const uint32_t kOrigColor = 0xFFAABBCC; | 118 static const uint32_t kOrigColor = 0xFFAABBCC; |
| 119 SkAutoTArray<uint32_t> pixels(kW * kH); | 119 SkAutoTArray<uint32_t> pixels(kW * kH); |
| 120 sk_memset32(pixels.get(), kOrigColor, kW * kH); | 120 sk_memset32(pixels.get(), kOrigColor, kW * kH); |
| 121 GrBackendObject texID = gpu->createTestingOnlyBackendTexture(pixels.get(), k
W, kH, | 121 GrBackendObject texID = gpu->createTestingOnlyBackendTexture(pixels.get(), k
W, kH, |
| 122 kRGBA_8888_GrPi
xelConfig); | 122 kRGBA_8888_GrPi
xelConfig); |
| 123 | 123 |
| 124 GrBackendTextureDesc wrappedDesc; | 124 GrBackendTextureDesc wrappedDesc; |
| 125 wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig; | 125 wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig; |
| 126 wrappedDesc.fWidth = kW; | 126 wrappedDesc.fWidth = kW; |
| 127 wrappedDesc.fHeight = kH; | 127 wrappedDesc.fHeight = kH; |
| 128 wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; | 128 wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
| 129 wrappedDesc.fSampleCnt = 0; | 129 wrappedDesc.fSampleCnt = 0; |
| 130 wrappedDesc.fFlags = kRenderTarget_GrBackendTextureFlag; | 130 wrappedDesc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| 131 wrappedDesc.fTextureHandle = texID; | 131 wrappedDesc.fTextureHandle = texID; |
| 132 | 132 |
| 133 SkAutoTUnref<SkSurface> surface(SkSurface::NewWrappedRenderTarget(ctx, wrapp
edDesc, NULL)); | 133 SkAutoTUnref<SkSurface> surface(SkSurface::NewWrappedRenderTarget(ctx, wrapp
edDesc, nullptr)); |
| 134 REPORTER_ASSERT(reporter, surface); | 134 REPORTER_ASSERT(reporter, surface); |
| 135 if (surface) { | 135 if (surface) { |
| 136 // Validate that we can draw to the canvas and that the original texture
color is preserved | 136 // Validate that we can draw to the canvas and that the original texture
color is preserved |
| 137 // in pixels that aren't rendered to via the surface. | 137 // in pixels that aren't rendered to via the surface. |
| 138 SkPaint paint; | 138 SkPaint paint; |
| 139 static const SkColor kRectColor = ~kOrigColor | 0xFF000000; | 139 static const SkColor kRectColor = ~kOrigColor | 0xFF000000; |
| 140 paint.setColor(kRectColor); | 140 paint.setColor(kRectColor); |
| 141 surface->getCanvas()->drawRect(SkRect::MakeWH(SkIntToScalar(kW), SkIntTo
Scalar(kH)/2), | 141 surface->getCanvas()->drawRect(SkRect::MakeWH(SkIntToScalar(kW), SkIntTo
Scalar(kH)/2), |
| 142 paint); | 142 paint); |
| 143 SkImageInfo readInfo = SkImageInfo::MakeN32Premul(kW, kH); | 143 SkImageInfo readInfo = SkImageInfo::MakeN32Premul(kW, kH); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 | 189 |
| 190 // Want to ensure that our Release is called when the owning image is destroyed | 190 // Want to ensure that our Release is called when the owning image is destroyed |
| 191 struct ReleaseDataContext { | 191 struct ReleaseDataContext { |
| 192 skiatest::Reporter* fReporter; | 192 skiatest::Reporter* fReporter; |
| 193 SkData* fData; | 193 SkData* fData; |
| 194 | 194 |
| 195 static void Release(const void* pixels, void* context) { | 195 static void Release(const void* pixels, void* context) { |
| 196 ReleaseDataContext* state = (ReleaseDataContext*)context; | 196 ReleaseDataContext* state = (ReleaseDataContext*)context; |
| 197 REPORTER_ASSERT(state->fReporter, state->fData); | 197 REPORTER_ASSERT(state->fReporter, state->fData); |
| 198 state->fData->unref(); | 198 state->fData->unref(); |
| 199 state->fData = NULL; | 199 state->fData = nullptr; |
| 200 } | 200 } |
| 201 }; | 201 }; |
| 202 | 202 |
| 203 // May we (soon) eliminate the need to keep testing this, by hiding the bloody d
evice! | 203 // May we (soon) eliminate the need to keep testing this, by hiding the bloody d
evice! |
| 204 #include "SkDevice.h" | 204 #include "SkDevice.h" |
| 205 static uint32_t get_legacy_gen_id(SkSurface* surf) { | 205 static uint32_t get_legacy_gen_id(SkSurface* surf) { |
| 206 SkBaseDevice* device = surf->getCanvas()->getDevice_just_for_deprecated_comp
atibility_testing(); | 206 SkBaseDevice* device = surf->getCanvas()->getDevice_just_for_deprecated_comp
atibility_testing(); |
| 207 return device->accessBitmap(false).getGenerationID(); | 207 return device->accessBitmap(false).getGenerationID(); |
| 208 } | 208 } |
| 209 | 209 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 } | 300 } |
| 301 case kCodec_ImageType: { | 301 case kCodec_ImageType: { |
| 302 SkBitmap bitmap; | 302 SkBitmap bitmap; |
| 303 bitmap.installPixels(info, addr, rowBytes); | 303 bitmap.installPixels(info, addr, rowBytes); |
| 304 SkAutoTUnref<SkData> src( | 304 SkAutoTUnref<SkData> src( |
| 305 SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 1
00)); | 305 SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 1
00)); |
| 306 return SkImage::NewFromEncoded(src); | 306 return SkImage::NewFromEncoded(src); |
| 307 } | 307 } |
| 308 } | 308 } |
| 309 SkASSERT(false); | 309 SkASSERT(false); |
| 310 return NULL; | 310 return nullptr; |
| 311 } | 311 } |
| 312 | 312 |
| 313 static void set_pixels(SkPMColor pixels[], int count, SkPMColor color) { | 313 static void set_pixels(SkPMColor pixels[], int count, SkPMColor color) { |
| 314 sk_memset32(pixels, color, count); | 314 sk_memset32(pixels, color, count); |
| 315 } | 315 } |
| 316 static bool has_pixels(const SkPMColor pixels[], int count, SkPMColor expected)
{ | 316 static bool has_pixels(const SkPMColor pixels[], int count, SkPMColor expected)
{ |
| 317 for (int i = 0; i < count; ++i) { | 317 for (int i = 0; i < count; ++i) { |
| 318 if (pixels[i] != expected) { | 318 if (pixels[i] != expected) { |
| 319 return false; | 319 return false; |
| 320 } | 320 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 { kRasterCopy_ImageType, true, "RasterCopy" }, | 418 { kRasterCopy_ImageType, true, "RasterCopy" }, |
| 419 { kRasterData_ImageType, true, "RasterData" }, | 419 { kRasterData_ImageType, true, "RasterData" }, |
| 420 { kRasterProc_ImageType, true, "RasterProc" }, | 420 { kRasterProc_ImageType, true, "RasterProc" }, |
| 421 { kGpu_ImageType, false, "Gpu" }, | 421 { kGpu_ImageType, false, "Gpu" }, |
| 422 { kCodec_ImageType, false, "Codec" }, | 422 { kCodec_ImageType, false, "Codec" }, |
| 423 }; | 423 }; |
| 424 | 424 |
| 425 const SkColor color = SK_ColorRED; | 425 const SkColor color = SK_ColorRED; |
| 426 const SkPMColor pmcolor = SkPreMultiplyColor(color); | 426 const SkPMColor pmcolor = SkPreMultiplyColor(color); |
| 427 | 427 |
| 428 GrContext* ctx = NULL; | 428 GrContext* ctx = nullptr; |
| 429 #if SK_SUPPORT_GPU | 429 #if SK_SUPPORT_GPU |
| 430 ctx = factory->get(GrContextFactory::kNative_GLContextType); | 430 ctx = factory->get(GrContextFactory::kNative_GLContextType); |
| 431 if (NULL == ctx) { | 431 if (nullptr == ctx) { |
| 432 return; | 432 return; |
| 433 } | 433 } |
| 434 #endif | 434 #endif |
| 435 | 435 |
| 436 ReleaseDataContext releaseCtx; | 436 ReleaseDataContext releaseCtx; |
| 437 releaseCtx.fReporter = reporter; | 437 releaseCtx.fReporter = reporter; |
| 438 | 438 |
| 439 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 439 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
| 440 SkImageInfo info; | 440 SkImageInfo info; |
| 441 size_t rowBytes; | 441 size_t rowBytes; |
| 442 | 442 |
| 443 releaseCtx.fData = NULL; | 443 releaseCtx.fData = nullptr; |
| 444 SkAutoTUnref<SkImage> image(create_image(reporter, gRec[i].fType, ctx, c
olor, &releaseCtx)); | 444 SkAutoTUnref<SkImage> image(create_image(reporter, gRec[i].fType, ctx, c
olor, &releaseCtx)); |
| 445 if (!image.get()) { | 445 if (!image.get()) { |
| 446 SkDebugf("failed to createImage[%d] %s\n", i, gRec[i].fName); | 446 SkDebugf("failed to createImage[%d] %s\n", i, gRec[i].fName); |
| 447 continue; // gpu may not be enabled | 447 continue; // gpu may not be enabled |
| 448 } | 448 } |
| 449 if (kRasterProc_ImageType == gRec[i].fType) { | 449 if (kRasterProc_ImageType == gRec[i].fType) { |
| 450 REPORTER_ASSERT(reporter, NULL != releaseCtx.fData); // we are trac
king the data | 450 REPORTER_ASSERT(reporter, nullptr != releaseCtx.fData); // we are t
racking the data |
| 451 } else { | 451 } else { |
| 452 REPORTER_ASSERT(reporter, NULL == releaseCtx.fData); // we ignored
the context | 452 REPORTER_ASSERT(reporter, nullptr == releaseCtx.fData); // we ignor
ed the context |
| 453 } | 453 } |
| 454 | 454 |
| 455 test_legacy_bitmap(reporter, image); | 455 test_legacy_bitmap(reporter, image); |
| 456 | 456 |
| 457 const void* addr = image->peekPixels(&info, &rowBytes); | 457 const void* addr = image->peekPixels(&info, &rowBytes); |
| 458 bool success = SkToBool(addr); | 458 bool success = SkToBool(addr); |
| 459 REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success); | 459 REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success); |
| 460 if (success) { | 460 if (success) { |
| 461 REPORTER_ASSERT(reporter, 10 == info.width()); | 461 REPORTER_ASSERT(reporter, 10 == info.width()); |
| 462 REPORTER_ASSERT(reporter, 10 == info.height()); | 462 REPORTER_ASSERT(reporter, 10 == info.height()); |
| 463 REPORTER_ASSERT(reporter, kN32_SkColorType == info.colorType()); | 463 REPORTER_ASSERT(reporter, kN32_SkColorType == info.colorType()); |
| 464 REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.alphaType() || | 464 REPORTER_ASSERT(reporter, kPremul_SkAlphaType == info.alphaType() || |
| 465 kOpaque_SkAlphaType == info.alphaType()); | 465 kOpaque_SkAlphaType == info.alphaType()); |
| 466 REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes); | 466 REPORTER_ASSERT(reporter, info.minRowBytes() <= rowBytes); |
| 467 REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); | 467 REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); |
| 468 } | 468 } |
| 469 | 469 |
| 470 test_image_readpixels(reporter, image, pmcolor); | 470 test_image_readpixels(reporter, image, pmcolor); |
| 471 } | 471 } |
| 472 REPORTER_ASSERT(reporter, NULL == releaseCtx.fData); // we released the dat
a | 472 REPORTER_ASSERT(reporter, nullptr == releaseCtx.fData); // we released the
data |
| 473 } | 473 } |
| 474 | 474 |
| 475 static void test_canvaspeek(skiatest::Reporter* reporter, | 475 static void test_canvaspeek(skiatest::Reporter* reporter, |
| 476 GrContextFactory* factory) { | 476 GrContextFactory* factory) { |
| 477 static const struct { | 477 static const struct { |
| 478 SurfaceType fType; | 478 SurfaceType fType; |
| 479 bool fPeekShouldSucceed; | 479 bool fPeekShouldSucceed; |
| 480 } gRec[] = { | 480 } gRec[] = { |
| 481 { kRaster_SurfaceType, true }, | 481 { kRaster_SurfaceType, true }, |
| 482 { kRasterDirect_SurfaceType, true }, | 482 { kRasterDirect_SurfaceType, true }, |
| 483 #if SK_SUPPORT_GPU | 483 #if SK_SUPPORT_GPU |
| 484 { kGpu_SurfaceType, false }, | 484 { kGpu_SurfaceType, false }, |
| 485 { kGpuScratch_SurfaceType, false }, | 485 { kGpuScratch_SurfaceType, false }, |
| 486 #endif | 486 #endif |
| 487 }; | 487 }; |
| 488 | 488 |
| 489 const SkColor color = SK_ColorRED; | 489 const SkColor color = SK_ColorRED; |
| 490 const SkPMColor pmcolor = SkPreMultiplyColor(color); | 490 const SkPMColor pmcolor = SkPreMultiplyColor(color); |
| 491 | 491 |
| 492 int cnt; | 492 int cnt; |
| 493 #if SK_SUPPORT_GPU | 493 #if SK_SUPPORT_GPU |
| 494 cnt = GrContextFactory::kGLContextTypeCnt; | 494 cnt = GrContextFactory::kGLContextTypeCnt; |
| 495 #else | 495 #else |
| 496 cnt = 1; | 496 cnt = 1; |
| 497 #endif | 497 #endif |
| 498 | 498 |
| 499 for (int i= 0; i < cnt; ++i) { | 499 for (int i= 0; i < cnt; ++i) { |
| 500 GrContext* context = NULL; | 500 GrContext* context = nullptr; |
| 501 #if SK_SUPPORT_GPU | 501 #if SK_SUPPORT_GPU |
| 502 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; | 502 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; |
| 503 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { | 503 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
| 504 continue; | 504 continue; |
| 505 } | 505 } |
| 506 context = factory->get(glCtxType); | 506 context = factory->get(glCtxType); |
| 507 | 507 |
| 508 if (NULL == context) { | 508 if (nullptr == context) { |
| 509 continue; | 509 continue; |
| 510 } | 510 } |
| 511 #endif | 511 #endif |
| 512 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 512 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
| 513 SkImageInfo info, requestInfo; | 513 SkImageInfo info, requestInfo; |
| 514 size_t rowBytes; | 514 size_t rowBytes; |
| 515 | 515 |
| 516 SkAutoTUnref<SkSurface> surface(create_surface(gRec[i].fType, contex
t, | 516 SkAutoTUnref<SkSurface> surface(create_surface(gRec[i].fType, contex
t, |
| 517 kPremul_SkAlphaType,
&requestInfo)); | 517 kPremul_SkAlphaType,
&requestInfo)); |
| 518 surface->getCanvas()->clear(color); | 518 surface->getCanvas()->clear(color); |
| 519 | 519 |
| 520 const void* addr = surface->getCanvas()->peekPixels(&info, &rowBytes
); | 520 const void* addr = surface->getCanvas()->peekPixels(&info, &rowBytes
); |
| 521 bool success = SkToBool(addr); | 521 bool success = SkToBool(addr); |
| 522 REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success); | 522 REPORTER_ASSERT(reporter, gRec[i].fPeekShouldSucceed == success); |
| 523 | 523 |
| 524 SkImageInfo info2; | 524 SkImageInfo info2; |
| 525 size_t rb2; | 525 size_t rb2; |
| 526 const void* addr2 = surface->peekPixels(&info2, &rb2); | 526 const void* addr2 = surface->peekPixels(&info2, &rb2); |
| 527 | 527 |
| 528 if (success) { | 528 if (success) { |
| 529 REPORTER_ASSERT(reporter, requestInfo == info); | 529 REPORTER_ASSERT(reporter, requestInfo == info); |
| 530 REPORTER_ASSERT(reporter, requestInfo.minRowBytes() <= rowBytes)
; | 530 REPORTER_ASSERT(reporter, requestInfo.minRowBytes() <= rowBytes)
; |
| 531 REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); | 531 REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); |
| 532 | 532 |
| 533 REPORTER_ASSERT(reporter, addr2 == addr); | 533 REPORTER_ASSERT(reporter, addr2 == addr); |
| 534 REPORTER_ASSERT(reporter, info2 == info); | 534 REPORTER_ASSERT(reporter, info2 == info); |
| 535 REPORTER_ASSERT(reporter, rb2 == rowBytes); | 535 REPORTER_ASSERT(reporter, rb2 == rowBytes); |
| 536 } else { | 536 } else { |
| 537 REPORTER_ASSERT(reporter, NULL == addr2); | 537 REPORTER_ASSERT(reporter, nullptr == addr2); |
| 538 } | 538 } |
| 539 } | 539 } |
| 540 } | 540 } |
| 541 } | 541 } |
| 542 | 542 |
| 543 // For compatibility with clients that still call accessBitmap(), we need to ens
ure that we bump | 543 // For compatibility with clients that still call accessBitmap(), we need to ens
ure that we bump |
| 544 // the bitmap's genID when we draw to it, else they won't know it has new values
. When they are | 544 // the bitmap's genID when we draw to it, else they won't know it has new values
. When they are |
| 545 // exclusively using surface/image, and we can hide accessBitmap from device, we
can remove this | 545 // exclusively using surface/image, and we can hide accessBitmap from device, we
can remove this |
| 546 // test. | 546 // test. |
| 547 static void test_accessPixels(skiatest::Reporter* reporter, GrContextFactory* fa
ctory) { | 547 static void test_accessPixels(skiatest::Reporter* reporter, GrContextFactory* fa
ctory) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 558 }; | 558 }; |
| 559 | 559 |
| 560 int cnt; | 560 int cnt; |
| 561 #if SK_SUPPORT_GPU | 561 #if SK_SUPPORT_GPU |
| 562 cnt = GrContextFactory::kGLContextTypeCnt; | 562 cnt = GrContextFactory::kGLContextTypeCnt; |
| 563 #else | 563 #else |
| 564 cnt = 1; | 564 cnt = 1; |
| 565 #endif | 565 #endif |
| 566 | 566 |
| 567 for (int i= 0; i < cnt; ++i) { | 567 for (int i= 0; i < cnt; ++i) { |
| 568 GrContext* context = NULL; | 568 GrContext* context = nullptr; |
| 569 #if SK_SUPPORT_GPU | 569 #if SK_SUPPORT_GPU |
| 570 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; | 570 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContext
Type) i; |
| 571 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { | 571 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
| 572 continue; | 572 continue; |
| 573 } | 573 } |
| 574 context = factory->get(glCtxType); | 574 context = factory->get(glCtxType); |
| 575 | 575 |
| 576 if (NULL == context) { | 576 if (nullptr == context) { |
| 577 continue; | 577 continue; |
| 578 } | 578 } |
| 579 #endif | 579 #endif |
| 580 for (size_t j = 0; j < SK_ARRAY_COUNT(gRec); ++j) { | 580 for (size_t j = 0; j < SK_ARRAY_COUNT(gRec); ++j) { |
| 581 SkImageInfo info, requestInfo; | 581 SkImageInfo info, requestInfo; |
| 582 | 582 |
| 583 SkAutoTUnref<SkSurface> surface(create_surface(gRec[j].fType, contex
t, | 583 SkAutoTUnref<SkSurface> surface(create_surface(gRec[j].fType, contex
t, |
| 584 kPremul_SkAlphaType,
&requestInfo)); | 584 kPremul_SkAlphaType,
&requestInfo)); |
| 585 SkCanvas* canvas = surface->getCanvas(); | 585 SkCanvas* canvas = surface->getCanvas(); |
| 586 canvas->clear(0); | 586 canvas->clear(0); |
| 587 | 587 |
| 588 SkBaseDevice* device = canvas->getDevice_just_for_deprecated_compati
bility_testing(); | 588 SkBaseDevice* device = canvas->getDevice_just_for_deprecated_compati
bility_testing(); |
| 589 SkBitmap bm = device->accessBitmap(false); | 589 SkBitmap bm = device->accessBitmap(false); |
| 590 uint32_t genID0 = bm.getGenerationID(); | 590 uint32_t genID0 = bm.getGenerationID(); |
| 591 // Now we draw something, which needs to "dirty" the genID (sorta li
ke copy-on-write) | 591 // Now we draw something, which needs to "dirty" the genID (sorta li
ke copy-on-write) |
| 592 canvas->drawColor(SK_ColorBLUE); | 592 canvas->drawColor(SK_ColorBLUE); |
| 593 // Now check that we get a different genID | 593 // Now check that we get a different genID |
| 594 uint32_t genID1 = bm.getGenerationID(); | 594 uint32_t genID1 = bm.getGenerationID(); |
| 595 REPORTER_ASSERT(reporter, genID0 != genID1); | 595 REPORTER_ASSERT(reporter, genID0 != genID1); |
| 596 } | 596 } |
| 597 } | 597 } |
| 598 } | 598 } |
| 599 | 599 |
| 600 static void test_snap_alphatype(skiatest::Reporter* reporter, GrContextFactory*
factory) { | 600 static void test_snap_alphatype(skiatest::Reporter* reporter, GrContextFactory*
factory) { |
| 601 GrContext* context = NULL; | 601 GrContext* context = nullptr; |
| 602 #if SK_SUPPORT_GPU | 602 #if SK_SUPPORT_GPU |
| 603 context = factory->get(GrContextFactory::kNative_GLContextType); | 603 context = factory->get(GrContextFactory::kNative_GLContextType); |
| 604 if (NULL == context) { | 604 if (nullptr == context) { |
| 605 return; | 605 return; |
| 606 } | 606 } |
| 607 #endif | 607 #endif |
| 608 for (int opaque = 0; opaque < 2; ++opaque) { | 608 for (int opaque = 0; opaque < 2; ++opaque) { |
| 609 SkAlphaType atype = SkToBool(opaque) ? kOpaque_SkAlphaType : kPremul_SkA
lphaType; | 609 SkAlphaType atype = SkToBool(opaque) ? kOpaque_SkAlphaType : kPremul_SkA
lphaType; |
| 610 for (int st = 0; st < kSurfaceTypeCnt; ++st) { | 610 for (int st = 0; st < kSurfaceTypeCnt; ++st) { |
| 611 SurfaceType stype = (SurfaceType)st; | 611 SurfaceType stype = (SurfaceType)st; |
| 612 SkAutoTUnref<SkSurface> surface(create_surface(stype, context, atype
)); | 612 SkAutoTUnref<SkSurface> surface(create_surface(stype, context, atype
)); |
| 613 REPORTER_ASSERT(reporter, surface); | 613 REPORTER_ASSERT(reporter, surface); |
| 614 if (surface) { | 614 if (surface) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 EXPECT_COPY_ON_WRITE(clear(testColor)) | 699 EXPECT_COPY_ON_WRITE(clear(testColor)) |
| 700 EXPECT_COPY_ON_WRITE(drawPaint(testPaint)) | 700 EXPECT_COPY_ON_WRITE(drawPaint(testPaint)) |
| 701 EXPECT_COPY_ON_WRITE(drawPoints(SkCanvas::kPoints_PointMode, testPointCount,
testPoints, \ | 701 EXPECT_COPY_ON_WRITE(drawPoints(SkCanvas::kPoints_PointMode, testPointCount,
testPoints, \ |
| 702 testPaint)) | 702 testPaint)) |
| 703 EXPECT_COPY_ON_WRITE(drawOval(testRect, testPaint)) | 703 EXPECT_COPY_ON_WRITE(drawOval(testRect, testPaint)) |
| 704 EXPECT_COPY_ON_WRITE(drawRect(testRect, testPaint)) | 704 EXPECT_COPY_ON_WRITE(drawRect(testRect, testPaint)) |
| 705 EXPECT_COPY_ON_WRITE(drawRRect(testRRect, testPaint)) | 705 EXPECT_COPY_ON_WRITE(drawRRect(testRRect, testPaint)) |
| 706 EXPECT_COPY_ON_WRITE(drawPath(testPath, testPaint)) | 706 EXPECT_COPY_ON_WRITE(drawPath(testPath, testPaint)) |
| 707 EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0)) | 707 EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0)) |
| 708 EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect, nullptr)) | 708 EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect, nullptr)) |
| 709 EXPECT_COPY_ON_WRITE(drawBitmapNine(testBitmap, testIRect, testRect, NULL)) | 709 EXPECT_COPY_ON_WRITE(drawBitmapNine(testBitmap, testIRect, testRect, nullptr
)) |
| 710 EXPECT_COPY_ON_WRITE(drawSprite(testBitmap, 0, 0, NULL)) | 710 EXPECT_COPY_ON_WRITE(drawSprite(testBitmap, 0, 0, nullptr)) |
| 711 EXPECT_COPY_ON_WRITE(drawText(testText.c_str(), testText.size(), 0, 1, testP
aint)) | 711 EXPECT_COPY_ON_WRITE(drawText(testText.c_str(), testText.size(), 0, 1, testP
aint)) |
| 712 EXPECT_COPY_ON_WRITE(drawPosText(testText.c_str(), testText.size(), testPoin
ts2, \ | 712 EXPECT_COPY_ON_WRITE(drawPosText(testText.c_str(), testText.size(), testPoin
ts2, \ |
| 713 testPaint)) | 713 testPaint)) |
| 714 EXPECT_COPY_ON_WRITE(drawTextOnPath(testText.c_str(), testText.size(), testP
ath, NULL, \ | 714 EXPECT_COPY_ON_WRITE(drawTextOnPath(testText.c_str(), testText.size(), testP
ath, nullptr, \ |
| 715 testPaint)) | 715 testPaint)) |
| 716 | 716 |
| 717 const SkSurface::BackendHandleAccess accessModes[] = { | 717 const SkSurface::BackendHandleAccess accessModes[] = { |
| 718 SkSurface::kFlushRead_BackendHandleAccess, | 718 SkSurface::kFlushRead_BackendHandleAccess, |
| 719 SkSurface::kFlushWrite_BackendHandleAccess, | 719 SkSurface::kFlushWrite_BackendHandleAccess, |
| 720 SkSurface::kDiscardWrite_BackendHandleAccess, | 720 SkSurface::kDiscardWrite_BackendHandleAccess, |
| 721 }; | 721 }; |
| 722 | 722 |
| 723 for (auto access : accessModes) { | 723 for (auto access : accessModes) { |
| 724 test_backend_cow(reporter, surface, access, | 724 test_backend_cow(reporter, surface, access, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 static void TestGetTexture(skiatest::Reporter* reporter, | 789 static void TestGetTexture(skiatest::Reporter* reporter, |
| 790 SurfaceType surfaceType, | 790 SurfaceType surfaceType, |
| 791 GrContext* context) { | 791 GrContext* context) { |
| 792 SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); | 792 SkAutoTUnref<SkSurface> surface(create_surface(surfaceType, context)); |
| 793 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); | 793 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
| 794 GrTexture* texture = as_IB(image)->getTexture(); | 794 GrTexture* texture = as_IB(image)->getTexture(); |
| 795 if (surfaceType == kGpu_SurfaceType || surfaceType == kGpuScratch_SurfaceTyp
e) { | 795 if (surfaceType == kGpu_SurfaceType || surfaceType == kGpuScratch_SurfaceTyp
e) { |
| 796 REPORTER_ASSERT(reporter, texture); | 796 REPORTER_ASSERT(reporter, texture); |
| 797 REPORTER_ASSERT(reporter, 0 != texture->getTextureHandle()); | 797 REPORTER_ASSERT(reporter, 0 != texture->getTextureHandle()); |
| 798 } else { | 798 } else { |
| 799 REPORTER_ASSERT(reporter, NULL == texture); | 799 REPORTER_ASSERT(reporter, nullptr == texture); |
| 800 } | 800 } |
| 801 surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode); | 801 surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode); |
| 802 REPORTER_ASSERT(reporter, as_IB(image)->getTexture() == texture); | 802 REPORTER_ASSERT(reporter, as_IB(image)->getTexture() == texture); |
| 803 } | 803 } |
| 804 | 804 |
| 805 #include "GrGpuResourcePriv.h" | 805 #include "GrGpuResourcePriv.h" |
| 806 #include "SkGpuDevice.h" | 806 #include "SkGpuDevice.h" |
| 807 #include "SkImage_Gpu.h" | 807 #include "SkImage_Gpu.h" |
| 808 #include "SkSurface_Gpu.h" | 808 #include "SkSurface_Gpu.h" |
| 809 | 809 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 SkDEBUGCODE(image2->validate();) | 876 SkDEBUGCODE(image2->validate();) |
| 877 SkDEBUGCODE(surface->validate();) | 877 SkDEBUGCODE(surface->validate();) |
| 878 REPORTER_ASSERT(reporter, image1 != image2); | 878 REPORTER_ASSERT(reporter, image1 != image2); |
| 879 } | 879 } |
| 880 | 880 |
| 881 } | 881 } |
| 882 | 882 |
| 883 DEF_GPUTEST(Surface, reporter, factory) { | 883 DEF_GPUTEST(Surface, reporter, factory) { |
| 884 test_image(reporter); | 884 test_image(reporter); |
| 885 | 885 |
| 886 TestSurfaceCopyOnWrite(reporter, kRaster_SurfaceType, NULL); | 886 TestSurfaceCopyOnWrite(reporter, kRaster_SurfaceType, nullptr); |
| 887 TestSurfaceWritableAfterSnapshotRelease(reporter, kRaster_SurfaceType, NULL)
; | 887 TestSurfaceWritableAfterSnapshotRelease(reporter, kRaster_SurfaceType, nullp
tr); |
| 888 TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, NULL, SkSurface::kDiscard
_ContentChangeMode); | 888 TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, nullptr, SkSurface::kDisc
ard_ContentChangeMode); |
| 889 TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, NULL, SkSurface::kRetain_
ContentChangeMode); | 889 TestSurfaceNoCanvas(reporter, kRaster_SurfaceType, nullptr, SkSurface::kReta
in_ContentChangeMode); |
| 890 | 890 |
| 891 test_empty_image(reporter); | 891 test_empty_image(reporter); |
| 892 test_empty_surface(reporter, NULL); | 892 test_empty_surface(reporter, nullptr); |
| 893 | 893 |
| 894 test_imagepeek(reporter, factory); | 894 test_imagepeek(reporter, factory); |
| 895 test_canvaspeek(reporter, factory); | 895 test_canvaspeek(reporter, factory); |
| 896 | 896 |
| 897 test_accessPixels(reporter, factory); | 897 test_accessPixels(reporter, factory); |
| 898 | 898 |
| 899 test_snap_alphatype(reporter, factory); | 899 test_snap_alphatype(reporter, factory); |
| 900 | 900 |
| 901 #if SK_SUPPORT_GPU | 901 #if SK_SUPPORT_GPU |
| 902 TestGetTexture(reporter, kRaster_SurfaceType, NULL); | 902 TestGetTexture(reporter, kRaster_SurfaceType, nullptr); |
| 903 if (factory) { | 903 if (factory) { |
| 904 for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { | 904 for (int i= 0; i < GrContextFactory::kGLContextTypeCnt; ++i) { |
| 905 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLCon
textType) i; | 905 GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLCon
textType) i; |
| 906 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { | 906 if (!GrContextFactory::IsRenderingGLContext(glCtxType)) { |
| 907 continue; | 907 continue; |
| 908 } | 908 } |
| 909 GrContext* context = factory->get(glCtxType); | 909 GrContext* context = factory->get(glCtxType); |
| 910 if (context) { | 910 if (context) { |
| 911 Test_crbug263329(reporter, kGpu_SurfaceType, context); | 911 Test_crbug263329(reporter, kGpu_SurfaceType, context); |
| 912 Test_crbug263329(reporter, kGpuScratch_SurfaceType, context); | 912 Test_crbug263329(reporter, kGpuScratch_SurfaceType, context); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, false, storage, w
* 4)); | 998 SkAutoTUnref<GrTexture> tex(provider->createTexture(desc, false, storage, w
* 4)); |
| 999 if (!tex) { | 999 if (!tex) { |
| 1000 REPORTER_ASSERT(reporter, false); | 1000 REPORTER_ASSERT(reporter, false); |
| 1001 return; | 1001 return; |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 GrBackendObject srcTex = tex->getTextureHandle(); | 1004 GrBackendObject srcTex = tex->getTextureHandle(); |
| 1005 ReleaseTextureContext releaseCtx(reporter); | 1005 ReleaseTextureContext releaseCtx(reporter); |
| 1006 | 1006 |
| 1007 SkAutoTUnref<SkImage> refImg(make_desc_image(ctx, w, h, srcTex, &releaseCtx)
); | 1007 SkAutoTUnref<SkImage> refImg(make_desc_image(ctx, w, h, srcTex, &releaseCtx)
); |
| 1008 SkAutoTUnref<SkImage> cpyImg(make_desc_image(ctx, w, h, srcTex, NULL)); | 1008 SkAutoTUnref<SkImage> cpyImg(make_desc_image(ctx, w, h, srcTex, nullptr)); |
| 1009 | 1009 |
| 1010 test_image_color(reporter, refImg, expected0); | 1010 test_image_color(reporter, refImg, expected0); |
| 1011 test_image_color(reporter, cpyImg, expected0); | 1011 test_image_color(reporter, cpyImg, expected0); |
| 1012 | 1012 |
| 1013 // Now lets jam new colors into our "external" texture, and see if the image
s notice | 1013 // Now lets jam new colors into our "external" texture, and see if the image
s notice |
| 1014 const SkPMColor expected1 = SkPreMultiplyColor(SK_ColorBLUE); | 1014 const SkPMColor expected1 = SkPreMultiplyColor(SK_ColorBLUE); |
| 1015 sk_memset32(storage, expected1, w * h); | 1015 sk_memset32(storage, expected1, w * h); |
| 1016 tex->writePixels(0, 0, w, h, kSkia8888_GrPixelConfig, storage, GrContext::kF
lushWrites_PixelOp); | 1016 tex->writePixels(0, 0, w, h, kSkia8888_GrPixelConfig, storage, GrContext::kF
lushWrites_PixelOp); |
| 1017 | 1017 |
| 1018 // The cpy'd one should still see the old color | 1018 // The cpy'd one should still see the old color |
| 1019 #if 0 | 1019 #if 0 |
| 1020 // There is no guarantee that refImg sees the new color. We are free to have
made a copy. Our | 1020 // There is no guarantee that refImg sees the new color. We are free to have
made a copy. Our |
| 1021 // write pixels call violated the contract with refImg and refImg is now und
efined. | 1021 // write pixels call violated the contract with refImg and refImg is now und
efined. |
| 1022 test_image_color(reporter, refImg, expected1); | 1022 test_image_color(reporter, refImg, expected1); |
| 1023 #endif | 1023 #endif |
| 1024 test_image_color(reporter, cpyImg, expected0); | 1024 test_image_color(reporter, cpyImg, expected0); |
| 1025 | 1025 |
| 1026 // Now exercise the release proc | 1026 // Now exercise the release proc |
| 1027 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); | 1027 REPORTER_ASSERT(reporter, !releaseCtx.fIsReleased); |
| 1028 refImg.reset(NULL); // force a release of the image | 1028 refImg.reset(nullptr); // force a release of the image |
| 1029 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); | 1029 REPORTER_ASSERT(reporter, releaseCtx.fIsReleased); |
| 1030 } | 1030 } |
| 1031 #endif | 1031 #endif |
| OLD | NEW |