Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Side by Side Diff: dm/DMSrcSink.cpp

Issue 1641273003: Support decoding opaque to *premul (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Update SkMaskSwizzler to support opaque to premul Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "DMSrcSink.h" 8 #include "DMSrcSink.h"
9 #include "SkAndroidCodec.h" 9 #include "SkAndroidCodec.h"
10 #include "SkCodec.h" 10 #include "SkCodec.h"
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 // We will replicate the names used by CodecSrc so that images can 226 // We will replicate the names used by CodecSrc so that images can
227 // be compared in Gold. 227 // be compared in Gold.
228 if (1 == fSampleSize) { 228 if (1 == fSampleSize) {
229 return SkOSPath::Basename(fPath.c_str()); 229 return SkOSPath::Basename(fPath.c_str());
230 } 230 }
231 return get_scaled_name(fPath, 1.0f / (float) fSampleSize); 231 return get_scaled_name(fPath, 1.0f / (float) fSampleSize);
232 } 232 }
233 233
234 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 234 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
235 235
236 CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType, float scale) 236 CodecSrc::CodecSrc(Path path, Mode mode, DstColorType dstColorType, SkAlphaType dstAlphaType,
237 float scale)
237 : fPath(path) 238 : fPath(path)
238 , fMode(mode) 239 , fMode(mode)
239 , fDstColorType(dstColorType) 240 , fDstColorType(dstColorType)
241 , fDstAlphaType(dstAlphaType)
240 , fScale(scale) 242 , fScale(scale)
241 {} 243 {}
242 244
243 bool CodecSrc::veto(SinkFlags flags) const { 245 bool CodecSrc::veto(SinkFlags flags) const {
244 // Test CodecImageGenerator on 8888, 565, and gpu 246 // Test CodecImageGenerator on 8888, 565, and gpu
245 if (kGen_Mode == fMode) { 247 if (kGen_Mode == fMode) {
246 return (flags.type != SinkFlags::kRaster || flags.approach != SinkFlags: :kDirect) && 248 return (flags.type != SinkFlags::kRaster || flags.approach != SinkFlags: :kDirect) &&
247 flags.type != SinkFlags::kGPU; 249 flags.type != SinkFlags::kGPU;
248 } 250 }
249 251
250 // Test all other modes to direct raster backends (8888 and 565). 252 // Test all other modes to direct raster backends (8888 and 565).
251 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir ect; 253 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir ect;
252 } 254 }
253 255
254 bool get_decode_info(SkImageInfo* decodeInfo, const SkImageInfo& defaultInfo, 256 bool get_decode_info(SkImageInfo* decodeInfo, SkColorType canvasColorType,
255 SkColorType canvasColorType, CodecSrc::DstColorType dstColorType) { 257 CodecSrc::DstColorType dstColorType) {
256 switch (dstColorType) { 258 switch (dstColorType) {
257 case CodecSrc::kIndex8_Always_DstColorType: 259 case CodecSrc::kIndex8_Always_DstColorType:
258 if (kRGB_565_SkColorType == canvasColorType) { 260 if (kRGB_565_SkColorType == canvasColorType) {
259 return false; 261 return false;
260 } 262 }
261 *decodeInfo = defaultInfo.makeColorType(kIndex_8_SkColorType); 263 *decodeInfo = decodeInfo->makeColorType(kIndex_8_SkColorType);
262 break; 264 break;
263 case CodecSrc::kGrayscale_Always_DstColorType: 265 case CodecSrc::kGrayscale_Always_DstColorType:
264 if (kRGB_565_SkColorType == canvasColorType) { 266 if (kRGB_565_SkColorType == canvasColorType) {
265 return false; 267 return false;
266 } 268 }
267 *decodeInfo = defaultInfo.makeColorType(kGray_8_SkColorType); 269 *decodeInfo = decodeInfo->makeColorType(kGray_8_SkColorType);
268 break; 270 break;
269 default: 271 default:
270 *decodeInfo = defaultInfo.makeColorType(canvasColorType); 272 *decodeInfo = decodeInfo->makeColorType(canvasColorType);
271 break; 273 break;
272 } 274 }
273 275
274 // FIXME: Currently we cannot draw unpremultiplied sources.
275 if (decodeInfo->alphaType() == kUnpremul_SkAlphaType) {
276 *decodeInfo = decodeInfo->makeAlphaType(kPremul_SkAlphaType);
277 }
278 return true; 276 return true;
279 } 277 }
280 278
281 Error test_gen(SkCanvas* canvas, SkData* data) { 279 Error test_gen(SkCanvas* canvas, SkData* data) {
282 SkAutoTDelete<SkImageGenerator> gen = SkCodecImageGenerator::NewFromEncodedC odec(data); 280 SkAutoTDelete<SkImageGenerator> gen = SkCodecImageGenerator::NewFromEncodedC odec(data);
283 if (!gen) { 281 if (!gen) {
284 return "Could not create image generator."; 282 return "Could not create image generator.";
285 } 283 }
286 284
287 // FIXME: The gpu backend does not draw kGray sources correctly. (skbug.com/ 4822) 285 // FIXME: The gpu backend does not draw kGray sources correctly. (skbug.com/ 4822)
(...skipping 24 matching lines...) Expand all
312 // so we will handle it in its own function. 310 // so we will handle it in its own function.
313 if (kGen_Mode == fMode) { 311 if (kGen_Mode == fMode) {
314 return test_gen(canvas, encoded); 312 return test_gen(canvas, encoded);
315 } 313 }
316 314
317 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); 315 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
318 if (nullptr == codec.get()) { 316 if (nullptr == codec.get()) {
319 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); 317 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
320 } 318 }
321 319
322 SkImageInfo decodeInfo; 320 SkImageInfo decodeInfo = codec->getInfo().makeAlphaType(fDstAlphaType);
323 if (!get_decode_info(&decodeInfo, codec->getInfo(), canvas->imageInfo().colo rType(), 321 if (!get_decode_info(&decodeInfo, canvas->imageInfo().colorType(), fDstColor Type)) {
324 fDstColorType)) {
325 return Error::Nonfatal("Testing non-565 to 565 is uninteresting."); 322 return Error::Nonfatal("Testing non-565 to 565 is uninteresting.");
326 } 323 }
327 324
328 // Try to scale the image if it is desired 325 // Try to scale the image if it is desired
329 SkISize size = codec->getScaledDimensions(fScale); 326 SkISize size = codec->getScaledDimensions(fScale);
330 if (size == decodeInfo.dimensions() && 1.0f != fScale) { 327 if (size == decodeInfo.dimensions() && 1.0f != fScale) {
331 return Error::Nonfatal("Test without scaling is uninteresting."); 328 return Error::Nonfatal("Test without scaling is uninteresting.");
332 } 329 }
333 330
334 // Visually inspecting very small output images is not necessary. We will 331 // Visually inspecting very small output images is not necessary. We will
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 Name CodecSrc::name() const { 560 Name CodecSrc::name() const {
564 if (1.0f == fScale) { 561 if (1.0f == fScale) {
565 return SkOSPath::Basename(fPath.c_str()); 562 return SkOSPath::Basename(fPath.c_str());
566 } 563 }
567 return get_scaled_name(fPath, fScale); 564 return get_scaled_name(fPath, fScale);
568 } 565 }
569 566
570 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 567 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
571 568
572 AndroidCodecSrc::AndroidCodecSrc(Path path, Mode mode, CodecSrc::DstColorType ds tColorType, 569 AndroidCodecSrc::AndroidCodecSrc(Path path, Mode mode, CodecSrc::DstColorType ds tColorType,
573 int sampleSize) 570 SkAlphaType dstAlphaType, int sampleSize)
574 : fPath(path) 571 : fPath(path)
575 , fMode(mode) 572 , fMode(mode)
576 , fDstColorType(dstColorType) 573 , fDstColorType(dstColorType)
574 , fDstAlphaType(dstAlphaType)
577 , fSampleSize(sampleSize) 575 , fSampleSize(sampleSize)
578 {} 576 {}
579 577
580 bool AndroidCodecSrc::veto(SinkFlags flags) const { 578 bool AndroidCodecSrc::veto(SinkFlags flags) const {
581 // No need to test decoding to non-raster or indirect backend. 579 // No need to test decoding to non-raster or indirect backend.
582 return flags.type != SinkFlags::kRaster 580 return flags.type != SinkFlags::kRaster
583 || flags.approach != SinkFlags::kDirect; 581 || flags.approach != SinkFlags::kDirect;
584 } 582 }
585 583
586 Error AndroidCodecSrc::draw(SkCanvas* canvas) const { 584 Error AndroidCodecSrc::draw(SkCanvas* canvas) const {
587 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); 585 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
588 if (!encoded) { 586 if (!encoded) {
589 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 587 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
590 } 588 }
591 SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded)); 589 SkAutoTDelete<SkAndroidCodec> codec(SkAndroidCodec::NewFromData(encoded));
592 if (nullptr == codec.get()) { 590 if (nullptr == codec.get()) {
593 return SkStringPrintf("Couldn't create android codec for %s.", fPath.c_s tr()); 591 return SkStringPrintf("Couldn't create android codec for %s.", fPath.c_s tr());
594 } 592 }
595 593
596 SkImageInfo decodeInfo; 594 SkImageInfo decodeInfo = codec->getInfo().makeAlphaType(fDstAlphaType);
597 if (!get_decode_info(&decodeInfo, codec->getInfo(), canvas->imageInfo().colo rType(), 595 if (!get_decode_info(&decodeInfo, canvas->imageInfo().colorType(), fDstColor Type)) {
598 fDstColorType)) {
599 return Error::Nonfatal("Testing non-565 to 565 is uninteresting."); 596 return Error::Nonfatal("Testing non-565 to 565 is uninteresting.");
600 } 597 }
601 598
602 // Scale the image if it is desired. 599 // Scale the image if it is desired.
603 SkISize size = codec->getSampledDimensions(fSampleSize); 600 SkISize size = codec->getSampledDimensions(fSampleSize);
604 601
605 // Visually inspecting very small output images is not necessary. We will 602 // Visually inspecting very small output images is not necessary. We will
606 // cover these cases in unit testing. 603 // cover these cases in unit testing.
607 if ((size.width() <= 10 || size.height() <= 10) && 1 != fSampleSize) { 604 if ((size.width() <= 10 || size.height() <= 10) && 1 != fSampleSize) {
608 return Error::Nonfatal("Scaling very small images is uninteresting."); 605 return Error::Nonfatal("Scaling very small images is uninteresting.");
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
1295 skr.visit<void>(i, drawsAsSingletonPictures); 1292 skr.visit<void>(i, drawsAsSingletonPictures);
1296 } 1293 }
1297 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); 1294 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture());
1298 1295
1299 canvas->drawPicture(macroPic); 1296 canvas->drawPicture(macroPic);
1300 return check_against_reference(bitmap, src, fSink); 1297 return check_against_reference(bitmap, src, fSink);
1301 }); 1298 });
1302 } 1299 }
1303 1300
1304 } // namespace DM 1301 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | include/codec/SkCodec.h » ('j') | src/codec/SkMaskSwizzler.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698