blob: 32453a4cf1823b9e9278fc06ceed3ac5bbb63372 [file] [log] [blame]
robertphillips6451a0c2016-07-18 08:31:31 -07001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkBitmap.h"
9#include "include/core/SkImage.h"
10#include "include/core/SkImageInfo.h"
11#include "include/core/SkRect.h"
12#include "include/core/SkRefCnt.h"
13#include "include/core/SkTypes.h"
Robert Phillips6d344c32020-07-06 10:56:46 -040014#include "include/gpu/GrDirectContext.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "include/gpu/GrTypes.h"
16#include "src/core/SkDevice.h"
17#include "src/core/SkSpecialImage.h"
18#include "src/gpu/SkGpuDevice.h"
19#include "tests/Test.h"
20#include "tools/gpu/GrContextFactory.h"
robertphillips6451a0c2016-07-18 08:31:31 -070021
Hal Canary8a001442018-09-19 11:31:27 -040022class SkColorSpace;
Ben Wagnerd90cd3b2018-05-22 10:48:08 -040023class GrContext;
robertphillips6451a0c2016-07-18 08:31:31 -070024
robertphillips6451a0c2016-07-18 08:31:31 -070025class DeviceTestingAccess {
26public:
27 static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, const SkBitmap& bm) {
28 return dev->makeSpecial(bm);
29 }
30
31 static sk_sp<SkSpecialImage> MakeSpecial(SkBaseDevice* dev, SkImage* img) {
32 return dev->makeSpecial(img);
33 }
34
35 static sk_sp<SkSpecialImage> SnapSpecial(SkBaseDevice* dev) {
36 return dev->snapSpecial();
37 }
38};
39
40// TODO: re-enable this when Raster methods are implemented
41#if 0
42DEF_TEST(SpecialImage_BitmapDevice, reporter) {
43 static const int kWidth = 100;
44 static const int kHeight = 90;
45
46 SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
47
Hal Canary342b7ac2016-11-04 11:49:42 -040048 sk_sp<SkBaseDevice> bmDev(SkBitmapDevice::Create(ii));
robertphillips6451a0c2016-07-18 08:31:31 -070049
50 SkBitmap bm;
51 bm.tryAllocN32Pixels(kWidth, kHeight);
52
53 // Create a raster-backed special image from a raster-backed SkBitmap
54 sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(bmDev.get(), bm);
55 SkASSERT(!special->isTextureBacked());
56 SkASSERT(kWidth == special->width());
57 SkASSERT(kHeight == special->height());
58 SkASSERT(bm.getGenerationID() == special->uniqueID());
59 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
60
61 // Create a raster-backed special image from a raster-backed SkImage
62 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
63 special = DeviceTestingAccess::MakeSpecial(bmDev.get(), image.get());
64 SkASSERT(!special->isTextureBacked());
65 SkASSERT(kWidth == special->width());
66 SkASSERT(kHeight == special->height());
67 SkASSERT(bm.getGenerationID() == special->uniqueID());
68 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
69
70 // Snap the device as a raster-backed special image
71 special = DeviceTestingAccess::SnapSpecial(bmDev.get());
72 SkASSERT(!special->isTextureBacked());
73 SkASSERT(2*kWidth == special->width());
74 SkASSERT(2*kHeight == special->height());
75 SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
76}
77#endif
78
79
robertphillips6451a0c2016-07-18 08:31:31 -070080DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SpecialImage_GPUDevice, reporter, ctxInfo) {
Robert Phillips6d344c32020-07-06 10:56:46 -040081 auto context = ctxInfo.directContext();
robertphillips6451a0c2016-07-18 08:31:31 -070082
83 static const int kWidth = 100;
84 static const int kHeight = 90;
85
86 SkImageInfo ii = SkImageInfo::MakeN32Premul(2*kWidth, 2*kHeight);
87
88 sk_sp<SkBaseDevice> gpuDev(SkGpuDevice::Make(context, SkBudgeted::kNo, ii,
Brian Salomonbdecacf2018-02-02 20:32:49 -050089 1, kBottomLeft_GrSurfaceOrigin, nullptr,
Greg Daniele252f082017-10-23 16:05:23 -040090 GrMipMapped::kNo,
robertphillips7e922762016-07-26 11:38:17 -070091 SkGpuDevice::kClear_InitContents));
robertphillips6451a0c2016-07-18 08:31:31 -070092
93 SkBitmap bm;
94 SkAssertResult(bm.tryAllocN32Pixels(kWidth, kHeight));
95
96 // Create a gpu-backed special image from a raster-backed SkBitmap
97 sk_sp<SkSpecialImage> special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), bm);
98 SkASSERT(special->isTextureBacked());
99 SkASSERT(kWidth == special->width());
100 SkASSERT(kHeight == special->height());
101 SkASSERT(bm.getGenerationID() == special->uniqueID());
102 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
103
104 // Create a gpu-backed special image from a raster-backed SkImage
105 sk_sp<SkImage> image(SkImage::MakeFromBitmap(bm));
106 special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
107 SkASSERT(special->isTextureBacked());
108 SkASSERT(kWidth == special->width());
109 SkASSERT(kHeight == special->height());
110 // TODO: Hmmm, this is a bit unexpected
111 SkASSERT(image->uniqueID() != special->uniqueID());
112 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
113
114 // Create a gpu-backed special image from a gpu-backed SkImage
Brian Osmand566e2e2019-08-14 13:19:04 -0400115 image = image->makeTextureImage(context);
robertphillips6451a0c2016-07-18 08:31:31 -0700116 special = DeviceTestingAccess::MakeSpecial(gpuDev.get(), image.get());
117 SkASSERT(special->isTextureBacked());
118 SkASSERT(kWidth == special->width());
119 SkASSERT(kHeight == special->height());
120 SkASSERT(image->uniqueID() == special->uniqueID());
121 SkASSERT(SkIRect::MakeWH(kWidth, kHeight) == special->subset());
122
123 // Snap the device as a gpu-backed special image
124 special = DeviceTestingAccess::SnapSpecial(gpuDev.get());
125 SkASSERT(special->isTextureBacked());
126 SkASSERT(2*kWidth == special->width());
127 SkASSERT(2*kHeight == special->height());
128 SkASSERT(SkIRect::MakeWH(2*kWidth, 2*kHeight) == special->subset());
129}