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 <functional> | 8 #include <functional> |
9 #include <initializer_list> | 9 #include <initializer_list> |
10 #include <vector> | 10 #include <vector> |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 SkPaint paint; | 66 SkPaint paint; |
67 paint.setColor(SK_ColorBLACK); | 67 paint.setColor(SK_ColorBLACK); |
68 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint); | 68 canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint); |
69 } | 69 } |
70 static sk_sp<SkImage> create_image() { | 70 static sk_sp<SkImage> create_image() { |
71 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); | 71 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); |
72 auto surface(SkSurface::MakeRaster(info)); | 72 auto surface(SkSurface::MakeRaster(info)); |
73 draw_image_test_pattern(surface->getCanvas()); | 73 draw_image_test_pattern(surface->getCanvas()); |
74 return surface->makeImageSnapshot(); | 74 return surface->makeImageSnapshot(); |
75 } | 75 } |
76 static SkData* create_image_data(SkImageInfo* info) { | 76 static sk_sp<SkData> create_image_data(SkImageInfo* info) { |
77 *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); | 77 *info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); |
78 const size_t rowBytes = info->minRowBytes(); | 78 const size_t rowBytes = info->minRowBytes(); |
79 SkAutoTUnref<SkData> data(SkData::NewUninitialized(rowBytes * info->height()
)); | 79 sk_sp<SkData> data(SkData::MakeUninitialized(rowBytes * info->height())); |
80 { | 80 { |
81 SkBitmap bm; | 81 SkBitmap bm; |
82 bm.installPixels(*info, data->writable_data(), rowBytes); | 82 bm.installPixels(*info, data->writable_data(), rowBytes); |
83 SkCanvas canvas(bm); | 83 SkCanvas canvas(bm); |
84 draw_image_test_pattern(&canvas); | 84 draw_image_test_pattern(&canvas); |
85 } | 85 } |
86 return data.release(); | 86 return data; |
87 } | 87 } |
88 static sk_sp<SkImage> create_data_image() { | 88 static sk_sp<SkImage> create_data_image() { |
89 SkImageInfo info; | 89 SkImageInfo info; |
90 sk_sp<SkData> data(create_image_data(&info)); | 90 sk_sp<SkData> data(create_image_data(&info)); |
91 return SkImage::MakeRasterData(info, data, info.minRowBytes()); | 91 return SkImage::MakeRasterData(info, std::move(data), info.minRowBytes()); |
92 } | 92 } |
93 #if SK_SUPPORT_GPU // not gpu-specific but currently only used in GPU tests | 93 #if SK_SUPPORT_GPU // not gpu-specific but currently only used in GPU tests |
94 static sk_sp<SkImage> create_image_565() { | 94 static sk_sp<SkImage> create_image_565() { |
95 const SkImageInfo info = SkImageInfo::Make(20, 20, kRGB_565_SkColorType, kOp
aque_SkAlphaType); | 95 const SkImageInfo info = SkImageInfo::Make(20, 20, kRGB_565_SkColorType, kOp
aque_SkAlphaType); |
96 auto surface(SkSurface::MakeRaster(info)); | 96 auto surface(SkSurface::MakeRaster(info)); |
97 draw_image_test_pattern(surface->getCanvas()); | 97 draw_image_test_pattern(surface->getCanvas()); |
98 return surface->makeImageSnapshot(); | 98 return surface->makeImageSnapshot(); |
99 } | 99 } |
100 static sk_sp<SkImage> create_image_large() { | 100 static sk_sp<SkImage> create_image_large() { |
101 const SkImageInfo info = SkImageInfo::MakeN32(32000, 32, kOpaque_SkAlphaType
); | 101 const SkImageInfo info = SkImageInfo::MakeN32(32000, 32, kOpaque_SkAlphaType
); |
(...skipping 25 matching lines...) Expand all Loading... |
127 SkPictureRecorder recorder; | 127 SkPictureRecorder recorder; |
128 SkCanvas* canvas = recorder.beginRecording(10, 10); | 128 SkCanvas* canvas = recorder.beginRecording(10, 10); |
129 canvas->clear(SK_ColorCYAN); | 129 canvas->clear(SK_ColorCYAN); |
130 return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), SkISize
::Make(10, 10), | 130 return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), SkISize
::Make(10, 10), |
131 nullptr, nullptr); | 131 nullptr, nullptr); |
132 }; | 132 }; |
133 #endif | 133 #endif |
134 // Want to ensure that our Release is called when the owning image is destroyed | 134 // Want to ensure that our Release is called when the owning image is destroyed |
135 struct RasterDataHolder { | 135 struct RasterDataHolder { |
136 RasterDataHolder() : fReleaseCount(0) {} | 136 RasterDataHolder() : fReleaseCount(0) {} |
137 SkAutoTUnref<SkData> fData; | 137 sk_sp<SkData> fData; |
138 int fReleaseCount; | 138 int fReleaseCount; |
139 static void Release(const void* pixels, void* context) { | 139 static void Release(const void* pixels, void* context) { |
140 RasterDataHolder* self = static_cast<RasterDataHolder*>(context); | 140 RasterDataHolder* self = static_cast<RasterDataHolder*>(context); |
141 self->fReleaseCount++; | 141 self->fReleaseCount++; |
142 self->fData.reset(); | 142 self->fData.reset(); |
143 } | 143 } |
144 }; | 144 }; |
145 static sk_sp<SkImage> create_rasterproc_image(RasterDataHolder* dataHolder) { | 145 static sk_sp<SkImage> create_rasterproc_image(RasterDataHolder* dataHolder) { |
146 SkASSERT(dataHolder); | 146 SkASSERT(dataHolder); |
147 SkImageInfo info; | 147 SkImageInfo info; |
148 SkAutoTUnref<SkData> data(create_image_data(&info)); | 148 dataHolder->fData = create_image_data(&info); |
149 dataHolder->fData.reset(SkRef(data.get())); | 149 return SkImage::MakeFromRaster(SkPixmap(info, dataHolder->fData->data(), inf
o.minRowBytes()), |
150 return SkImage::MakeFromRaster(SkPixmap(info, data->data(), info.minRowBytes
()), | |
151 RasterDataHolder::Release, dataHolder); | 150 RasterDataHolder::Release, dataHolder); |
152 } | 151 } |
153 static sk_sp<SkImage> create_codec_image() { | 152 static sk_sp<SkImage> create_codec_image() { |
154 SkImageInfo info; | 153 SkImageInfo info; |
155 SkAutoTUnref<SkData> data(create_image_data(&info)); | 154 sk_sp<SkData> data(create_image_data(&info)); |
156 SkBitmap bitmap; | 155 SkBitmap bitmap; |
157 bitmap.installPixels(info, data->writable_data(), info.minRowBytes()); | 156 bitmap.installPixels(info, data->writable_data(), info.minRowBytes()); |
158 sk_sp<SkData> src( | 157 sk_sp<SkData> src(SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Ty
pe, 100)); |
159 SkImageEncoder::EncodeData(bitmap, SkImageEncoder::kPNG_Type, 100)); | 158 return SkImage::MakeFromEncoded(std::move(src)); |
160 return SkImage::MakeFromEncoded(src); | |
161 } | 159 } |
162 #if SK_SUPPORT_GPU | 160 #if SK_SUPPORT_GPU |
163 static sk_sp<SkImage> create_gpu_image(GrContext* context) { | 161 static sk_sp<SkImage> create_gpu_image(GrContext* context) { |
164 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); | 162 const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType); |
165 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info)); | 163 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info)); |
166 draw_image_test_pattern(surface->getCanvas()); | 164 draw_image_test_pattern(surface->getCanvas()); |
167 return surface->makeImageSnapshot(); | 165 return surface->makeImageSnapshot(); |
168 } | 166 } |
169 #endif | 167 #endif |
170 | 168 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 REPORTER_ASSERT(reporter, rec.fExpectSameAsImmutable == sameImmutable); | 222 REPORTER_ASSERT(reporter, rec.fExpectSameAsImmutable == sameImmutable); |
225 } | 223 } |
226 } | 224 } |
227 | 225 |
228 namespace { | 226 namespace { |
229 | 227 |
230 const char* kSerializedData = "serialized"; | 228 const char* kSerializedData = "serialized"; |
231 | 229 |
232 class MockSerializer : public SkPixelSerializer { | 230 class MockSerializer : public SkPixelSerializer { |
233 public: | 231 public: |
234 MockSerializer(SkData* (*func)()) : fFunc(func), fDidEncode(false) { } | 232 MockSerializer(sk_sp<SkData> (*func)()) : fFunc(func), fDidEncode(false) { } |
235 | 233 |
236 bool didEncode() const { return fDidEncode; } | 234 bool didEncode() const { return fDidEncode; } |
237 | 235 |
238 protected: | 236 protected: |
239 bool onUseEncodedData(const void*, size_t) override { | 237 bool onUseEncodedData(const void*, size_t) override { |
240 return false; | 238 return false; |
241 } | 239 } |
242 | 240 |
243 SkData* onEncode(const SkPixmap&) override { | 241 SkData* onEncode(const SkPixmap&) override { |
244 fDidEncode = true; | 242 fDidEncode = true; |
245 return fFunc(); | 243 return fFunc().release(); |
246 } | 244 } |
247 | 245 |
248 private: | 246 private: |
249 SkData* (*fFunc)(); | 247 sk_sp<SkData> (*fFunc)(); |
250 bool fDidEncode; | 248 bool fDidEncode; |
251 | 249 |
252 typedef SkPixelSerializer INHERITED; | 250 typedef SkPixelSerializer INHERITED; |
253 }; | 251 }; |
254 | 252 |
255 } // anonymous namespace | 253 } // anonymous namespace |
256 | 254 |
257 // Test that SkImage encoding observes custom pixel serializers. | 255 // Test that SkImage encoding observes custom pixel serializers. |
258 DEF_TEST(Image_Encode_Serializer, reporter) { | 256 DEF_TEST(Image_Encode_Serializer, reporter) { |
259 MockSerializer serializer([]() -> SkData* { return SkData::NewWithCString(kS
erializedData); }); | 257 MockSerializer serializer([]() -> sk_sp<SkData> { |
| 258 return SkData::MakeWithCString(kSerializedData); |
| 259 }); |
260 sk_sp<SkImage> image(create_image()); | 260 sk_sp<SkImage> image(create_image()); |
261 SkAutoTUnref<SkData> encoded(image->encode(&serializer)); | 261 sk_sp<SkData> encoded(image->encode(&serializer)); |
262 SkAutoTUnref<SkData> reference(SkData::NewWithCString(kSerializedData)); | 262 sk_sp<SkData> reference(SkData::MakeWithCString(kSerializedData)); |
263 | 263 |
264 REPORTER_ASSERT(reporter, serializer.didEncode()); | 264 REPORTER_ASSERT(reporter, serializer.didEncode()); |
265 REPORTER_ASSERT(reporter, encoded); | 265 REPORTER_ASSERT(reporter, encoded); |
266 REPORTER_ASSERT(reporter, encoded->size() > 0); | 266 REPORTER_ASSERT(reporter, encoded->size() > 0); |
267 REPORTER_ASSERT(reporter, encoded->equals(reference)); | 267 REPORTER_ASSERT(reporter, encoded->equals(reference.get())); |
268 } | 268 } |
269 | 269 |
270 // Test that image encoding failures do not break picture serialization/deserial
ization. | 270 // Test that image encoding failures do not break picture serialization/deserial
ization. |
271 DEF_TEST(Image_Serialize_Encoding_Failure, reporter) { | 271 DEF_TEST(Image_Serialize_Encoding_Failure, reporter) { |
272 auto surface(SkSurface::MakeRasterN32Premul(100, 100)); | 272 auto surface(SkSurface::MakeRasterN32Premul(100, 100)); |
273 surface->getCanvas()->clear(SK_ColorGREEN); | 273 surface->getCanvas()->clear(SK_ColorGREEN); |
274 sk_sp<SkImage> image(surface->makeImageSnapshot()); | 274 sk_sp<SkImage> image(surface->makeImageSnapshot()); |
275 REPORTER_ASSERT(reporter, image); | 275 REPORTER_ASSERT(reporter, image); |
276 | 276 |
277 SkPictureRecorder recorder; | 277 SkPictureRecorder recorder; |
278 SkCanvas* canvas = recorder.beginRecording(100, 100); | 278 SkCanvas* canvas = recorder.beginRecording(100, 100); |
279 canvas->drawImage(image, 0, 0); | 279 canvas->drawImage(image, 0, 0); |
280 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); | 280 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); |
281 REPORTER_ASSERT(reporter, picture); | 281 REPORTER_ASSERT(reporter, picture); |
282 REPORTER_ASSERT(reporter, picture->approximateOpCount() > 0); | 282 REPORTER_ASSERT(reporter, picture->approximateOpCount() > 0); |
283 | 283 |
284 MockSerializer emptySerializer([]() -> SkData* { return SkData::NewEmpty();
}); | 284 MockSerializer emptySerializer([]() -> sk_sp<SkData> { return SkData::MakeEm
pty(); }); |
285 MockSerializer nullSerializer([]() -> SkData* { return nullptr; }); | 285 MockSerializer nullSerializer([]() -> sk_sp<SkData> { return nullptr; }); |
286 MockSerializer* serializers[] = { &emptySerializer, &nullSerializer }; | 286 MockSerializer* serializers[] = { &emptySerializer, &nullSerializer }; |
287 | 287 |
288 for (size_t i = 0; i < SK_ARRAY_COUNT(serializers); ++i) { | 288 for (size_t i = 0; i < SK_ARRAY_COUNT(serializers); ++i) { |
289 SkDynamicMemoryWStream wstream; | 289 SkDynamicMemoryWStream wstream; |
290 REPORTER_ASSERT(reporter, !serializers[i]->didEncode()); | 290 REPORTER_ASSERT(reporter, !serializers[i]->didEncode()); |
291 picture->serialize(&wstream, serializers[i]); | 291 picture->serialize(&wstream, serializers[i]); |
292 REPORTER_ASSERT(reporter, serializers[i]->didEncode()); | 292 REPORTER_ASSERT(reporter, serializers[i]->didEncode()); |
293 | 293 |
294 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); | 294 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); |
295 sk_sp<SkPicture> deserialized(SkPicture::MakeFromStream(rstream)); | 295 sk_sp<SkPicture> deserialized(SkPicture::MakeFromStream(rstream)); |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 SkBitmap bm1; | 1016 SkBitmap bm1; |
1017 bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kUnpremul_SkAlphaType)); | 1017 bm1.allocPixels(SkImageInfo::MakeN32(256, 256, kUnpremul_SkAlphaType)); |
1018 bm0.readPixels(bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0); | 1018 bm0.readPixels(bm1.info(), bm1.getPixels(), bm1.rowBytes(), 0, 0); |
1019 | 1019 |
1020 SkBitmap bm2; | 1020 SkBitmap bm2; |
1021 bm2.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType)); | 1021 bm2.allocPixels(SkImageInfo::MakeN32(256, 256, kPremul_SkAlphaType)); |
1022 bm1.readPixels(bm2.info(), bm2.getPixels(), bm2.rowBytes(), 0, 0); | 1022 bm1.readPixels(bm2.info(), bm2.getPixels(), bm2.rowBytes(), 0, 0); |
1023 | 1023 |
1024 REPORTER_ASSERT(reporter, equal(bm0, bm2)); | 1024 REPORTER_ASSERT(reporter, equal(bm0, bm2)); |
1025 } | 1025 } |
OLD | NEW |