1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkBitmapDevice.h" 9 #include "SkDevice.h" 10 #include "SkSpecialImage.h" 11 12 #if SK_SUPPORT_GPU 13 #include "SkGpuDevice.h" 14 #endif 15 16 #include "Test.h" 17 18 class DeviceTestingAccess { 19 public: 20 static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, const SkBitmap& bm) { 21 return dev->makeSpecial(bm); 22 } 23 24 static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, SkImage* img) { 25 return dev->makeSpecial(img); 26 } 27 28 static sk_sp<SkSpecialImage> SnapSpecial(SkBaseDevice* dev) { 29 return dev->snapSpecial(); 30 } 31 }; 32 33 // TODO: re-enable this when Raster methods are implemented 34 #if 0 35 DEF_TEST(SpecialImage_BitmapDevice, reporter) { 36 static const int kWidth = 100; 37 static const int kHeight = 90; 38 39 SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight); 40 41 sk_sp<SkBaseDevice> bmDev(SkBitmapDevice::Create(ii)); 42 43 SkBitmap bm; 44 bm.tryAllocN32Pixels(kWidth, kHeight); 45 46 // Create a raster-backed special image from a raster-backed SkBitmap 47 sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(bmDev.get(), bm); 48 SkASSERT(!special->isTextureBacked()); 49 SkASSERT(kWidth == special->width()); 50 SkASSERT(kHeight == special->height()); 51 SkASSERT(bm.getGenerationID() == special->uniqueID()); 52 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset()); 53 54 // Create a raster-backed special image from a raster-backed SkImage 55 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm)); 56 special = DeviceTestingAccess::MakeSpecial(bmDev.get(), image.get()); 57 SkASSERT(!special->isTextureBacked()); 58 SkASSERT(kWidth == special->width()); 59 SkASSERT(kHeight == special->height()); 60 SkASSERT(bm.getGenerationID() == special->uniqueID()); 61 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset()); 62 63 // Snap the device as a raster-backed special image 64 special = DeviceTestingAccess::SnapSpecial(bmDev.get()); 65 SkASSERT(!special->isTextureBacked()); 66 SkASSERT(2*kWidth == special->width()); 67 SkASSERT(2*kHeight == special->height()); 68 SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset()); 69 } 70 #endif 71 72 73 #if SK_SUPPORT_GPU 74 75 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SpecialImage_GPUDevice, reporter, ctxInfo) { 76 GrContext* context = ctxInfo.grContext(); 77 78 static const int kWidth = 100; 79 static const int kHeight = 90; 80 81 SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight); 82 83 sk_sp<SkBaseDevice> gpuDev(SkGpuDevice::Make(context, SkBudgeted::kNo, ii, 84 0, kBottomLeft_GrSurfaceOrigin, nullptr, 85 SkGpuDevice::kClear_InitContents)); 86 87 SkBitmap bm; 88 SkAssertResult(bm.tryAllocN32Pixels(kWidth, kHeight)); 89 90 // Create a gpu-backed special image from a raster-backed SkBitmap 91 sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), bm); 92 SkASSERT(special->isTextureBacked()); 93 SkASSERT(kWidth == special->width()); 94 SkASSERT(kHeight == special->height()); 95 SkASSERT(bm.getGenerationID() == special->uniqueID()); 96 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset()); 97 98 // Create a gpu-backed special image from a raster-backed SkImage 99 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm)); 100 special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get()); 101 SkASSERT(special->isTextureBacked()); 102 SkASSERT(kWidth == special->width()); 103 SkASSERT(kHeight == special->height()); 104 // TODO: Hmmm, this is a bit unexpected 105 SkASSERT(image->uniqueID() != special->uniqueID()); 106 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset()); 107 108 // Create a gpu-backed special image from a gpu-backed SkImage 109 SkColorSpace* legacyColorSpace = nullptr; 110 image = image->makeTextureImage(context, legacyColorSpace); 111 special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get()); 112 SkASSERT(special->isTextureBacked()); 113 SkASSERT(kWidth == special->width()); 114 SkASSERT(kHeight == special->height()); 115 SkASSERT(image->uniqueID() == special->uniqueID()); 116 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset()); 117 118 // Snap the device as a gpu-backed special image 119 special = DeviceTestingAccess::SnapSpecial(gpuDev.get()); 120 SkASSERT(special->isTextureBacked()); 121 SkASSERT(2*kWidth == special->width()); 122 SkASSERT(2*kHeight == special->height()); 123 SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset()); 124 } 125 126 #endif 127