From a40d9c89b7661b8f9997d582ceb44553b95e9671 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Fri, 19 May 2017 15:21:05 -0400 Subject: Improve test coverage of image decode modes Summary of the new world... --image CodecSrc and ImageGenSrc tests run on: (1) 8888 with kIgnore transfer fn behavior (2) srgb with kRespect transfer fn behavior (3) f16 AndroidCodecSrc and BRDCodecSrc tests run on: (1) 8888, since SkAndroidCodec always uses kIgnore (2) f16, since android uses f16 --colorImage ColorCodecSrc tests run on: (1) 8888 in kBaseline mode, so we can see what the raw pixels look like (2) srgb in color correct modes (3) f16 in color correct modes Bug: skia: Change-Id: I65d1a04051da6f94bf5e48f7bc610f482870dc75 Reviewed-on: https://skia-review.googlesource.com/17396 Reviewed-by: Leon Scroggins Commit-Queue: Matt Sarett --- dm/DMSrcSink.cpp | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'dm/DMSrcSink.cpp') diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 4e3884e3c9..752ab2e4ae 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -123,6 +123,14 @@ static inline void alpha8_to_gray8(SkBitmap* bitmap) { } Error BRDSrc::draw(SkCanvas* canvas) const { + if (canvas->imageInfo().colorSpace() && + kRGBA_F16_SkColorType != canvas->imageInfo().colorType()) { + // SkAndroidCodec uses legacy premultiplication and blending. Therefore, we only + // run these tests on legacy canvases. + // We allow an exception for F16, since Android uses F16. + return Error::Nonfatal("Skip testing to color correct canvas."); + } + SkColorType colorType = canvas->imageInfo().colorType(); if (kRGB_565_SkColorType == colorType && CodecSrc::kGetFromCanvas_DstColorType != fDstColorType) { @@ -439,6 +447,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { int colorCount = 256; SkCodec::Options options; + options.fPremulBehavior = canvas->imageInfo().colorSpace() ? + SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore; if (kCodecZeroInit_Mode == fMode) { memset(pixels.get(), 0, size.height() * rowBytes); options.fZeroInitialized = SkCodec::kYes_ZeroInitialized; @@ -558,7 +568,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { bool useOldScanlineMethod = !useIncremental && !ico; if (useIncremental || ico) { if (SkCodec::kSuccess == codec->startIncrementalDecode(decodeInfo, dst, - rowBytes, nullptr, colorPtr, &colorCount)) { + rowBytes, &options, colorPtr, &colorCount)) { int rowsDecoded; if (SkCodec::kIncompleteInput == codec->incrementalDecode(&rowsDecoded)) { codec->fillIncompleteImage(decodeInfo, dst, rowBytes, @@ -604,7 +614,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { void* dst = pixels.get(); // Decode odd stripes - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, nullptr, colorPtr, + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options, colorPtr, &colorCount)) { return "Could not start scanline decoder"; } @@ -659,13 +669,11 @@ Error CodecSrc::draw(SkCanvas* canvas) const { // align with the jpeg block sizes and it will sometimes not. This allows us // to test interestingly different code paths in the implementation. const int tileSize = 36; - - SkCodec::Options opts; SkIRect subset; for (int x = 0; x < width; x += tileSize) { subset = SkIRect::MakeXYWH(x, 0, SkTMin(tileSize, width - x), height); - opts.fSubset = ⊂ - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &opts, + options.fSubset = ⊂ + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options, colorPtr, &colorCount)) { return "Could not start scanline decoder."; } @@ -693,8 +701,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { const int w = SkAlign2(W / divisor); const int h = SkAlign2(H / divisor); SkIRect subset; - SkCodec::Options opts; - opts.fSubset = ⊂ + options.fSubset = ⊂ SkBitmap subsetBm; // We will reuse pixel memory from bitmap. void* dst = pixels.get(); @@ -718,7 +725,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { SkImageInfo subsetBitmapInfo = bitmapInfo.makeWH(scaledW, scaledH); size_t subsetRowBytes = subsetBitmapInfo.minRowBytes(); const SkCodec::Result result = codec->getPixels(decodeInfo, dst, subsetRowBytes, - &opts, colorPtr, &colorCount); + &options, colorPtr, &colorCount); switch (result) { case SkCodec::kSuccess: case SkCodec::kIncompleteInput: @@ -799,6 +806,14 @@ bool AndroidCodecSrc::veto(SinkFlags flags) const { } Error AndroidCodecSrc::draw(SkCanvas* canvas) const { + if (canvas->imageInfo().colorSpace() && + kRGBA_F16_SkColorType != canvas->imageInfo().colorType()) { + // SkAndroidCodec uses legacy premultiplication and blending. Therefore, we only + // run these tests on legacy canvases. + // We allow an exception for F16, since Android uses F16. + return Error::Nonfatal("Skip testing to color correct canvas."); + } + sk_sp encoded(SkData::MakeFromFileName(fPath.c_str())); if (!encoded) { return SkStringPrintf("Couldn't read %s.", fPath.c_str()); @@ -948,10 +963,14 @@ Error ImageGenSrc::draw(SkCanvas* canvas) const { // Test various color and alpha types on CPU SkImageInfo decodeInfo = gen->getInfo().makeAlphaType(fDstAlphaType); + SkImageGenerator::Options options; + options.fBehavior = canvas->imageInfo().colorSpace() ? + SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore; + int bpp = SkColorTypeBytesPerPixel(decodeInfo.colorType()); size_t rowBytes = decodeInfo.width() * bpp; SkAutoMalloc pixels(decodeInfo.height() * rowBytes); - if (!gen->getPixels(decodeInfo, pixels.get(), rowBytes)) { + if (!gen->getPixels(decodeInfo, pixels.get(), rowBytes, &options)) { SkString err = SkStringPrintf("Image generator could not getPixels() for %s\n", fPath.c_str()); -- cgit v1.2.3