diff options
author | Mike Klein <mtklein@chromium.org> | 2018-05-10 11:29:15 -0400 |
---|---|---|
committer | Mike Klein <mtklein@chromium.org> | 2018-05-10 18:26:22 +0000 |
commit | ce4cf72e3487f661e53f6d0c3416c9b58da4fd00 (patch) | |
tree | 5e8a5b884c787a095ea25ea93070569731e937a1 /src | |
parent | 024615e9752d93c842ad3cad597fd65382ddb678 (diff) |
non-linear blending first steps
Code:
- Add a non-linear blending bit and makeNonlinearBlending()
to SkColorSpace
- remove enough F16=linear checks to make it possible to
create surfaces and encode pngs with nonlinear F16
Testing:
- add "esrgb" software config to DM, run it
- add "srgbnl" software config, run it
- deemphasize importance of "srgb" config on bots
- update unit tests to reflect relaxed F16 constraints
- add a new unit test file with _really_ basic tests,
and a new unit test that's not working yet
Bug: skia:7942
Change-Id: I8ac042bdf9f3d791765393b68fd9256375184d83
Reviewed-on: https://skia-review.googlesource.com/127325
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkCodec.cpp | 2 | ||||
-rw-r--r-- | src/codec/SkHeifCodec.cpp | 4 | ||||
-rw-r--r-- | src/codec/SkJpegCodec.cpp | 5 | ||||
-rw-r--r-- | src/codec/SkWbmpCodec.cpp | 2 | ||||
-rw-r--r-- | src/core/SkColorSpace.cpp | 4 | ||||
-rw-r--r-- | src/core/SkColorSpace_XYZ.cpp | 10 | ||||
-rw-r--r-- | src/core/SkColorSpace_XYZ.h | 4 | ||||
-rw-r--r-- | src/core/SkPictureImageGenerator.cpp | 4 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 1 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 4 | ||||
-rw-r--r-- | src/image/SkSurface_Raster.cpp | 3 | ||||
-rw-r--r-- | src/images/SkJpegEncoder.cpp | 2 | ||||
-rw-r--r-- | src/images/SkPngEncoder.cpp | 2 | ||||
-rw-r--r-- | src/images/SkWebpEncoder.cpp | 4 |
14 files changed, 25 insertions, 26 deletions
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp index 53fa6f4643..f67e6c06d3 100644 --- a/src/codec/SkCodec.cpp +++ b/src/codec/SkCodec.cpp @@ -169,7 +169,7 @@ bool SkCodec::conversionSupported(const SkImageInfo& dst, SkColorType srcColor, case kBGRA_8888_SkColorType: return true; case kRGBA_F16_SkColorType: - return dst.colorSpace() && dst.colorSpace()->gammaIsLinear(); + return dst.colorSpace(); case kRGB_565_SkColorType: return srcIsOpaque; case kGray_8_SkColorType: diff --git a/src/codec/SkHeifCodec.cpp b/src/codec/SkHeifCodec.cpp index 6e82904115..31057a0385 100644 --- a/src/codec/SkHeifCodec.cpp +++ b/src/codec/SkHeifCodec.cpp @@ -192,10 +192,6 @@ bool SkHeifCodec::setOutputColorFormat(const SkImageInfo& dstInfo) { case kRGBA_F16_SkColorType: SkASSERT(this->colorXform()); - - if (!dstInfo.colorSpace()->gammaIsLinear()) { - return false; - } return fHeifDecoder->setOutputColor(kHeifColorFormat_RGBA_8888); default: diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp index 2cc7921277..d44258f9b0 100644 --- a/src/codec/SkJpegCodec.cpp +++ b/src/codec/SkJpegCodec.cpp @@ -433,11 +433,6 @@ bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dstInfo) { break; case kRGBA_F16_SkColorType: SkASSERT(this->colorXform()); - - if (!dstInfo.colorSpace()->gammaIsLinear()) { - return false; - } - fDecoderMgr->dinfo()->out_color_space = JCS_EXT_RGBA; break; default: diff --git a/src/codec/SkWbmpCodec.cpp b/src/codec/SkWbmpCodec.cpp index d8b10287f6..b5fd591729 100644 --- a/src/codec/SkWbmpCodec.cpp +++ b/src/codec/SkWbmpCodec.cpp @@ -29,7 +29,7 @@ static inline bool valid_color_type(const SkImageInfo& dstInfo) { case kRGB_565_SkColorType: return true; case kRGBA_F16_SkColorType: - return dstInfo.colorSpace() && dstInfo.colorSpace()->gammaIsLinear(); + return dstInfo.colorSpace(); default: return false; } diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp index be399bda6f..b75edcef94 100644 --- a/src/core/SkColorSpace.cpp +++ b/src/core/SkColorSpace.cpp @@ -500,6 +500,10 @@ bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { return false; } + if (src->nonlinearBlending() != dst->nonlinearBlending()) { + return false; + } + const SkData* srcData = src->onProfileData(); const SkData* dstData = dst->onProfileData(); if (srcData || dstData) { diff --git a/src/core/SkColorSpace_XYZ.cpp b/src/core/SkColorSpace_XYZ.cpp index 17462a117a..968f01d793 100644 --- a/src/core/SkColorSpace_XYZ.cpp +++ b/src/core/SkColorSpace_XYZ.cpp @@ -119,3 +119,13 @@ void SkColorSpace_XYZ::toDstGammaTables(const uint8_t* tables[3], sk_sp<SkData>* tables[1] = fToDstGammaTables[1]; tables[2] = fToDstGammaTables[2]; } + +sk_sp<SkColorSpace> SkColorSpace_XYZ::makeNonlinearBlending() const { + if (this->nonlinearBlending()) { + return sk_ref_sp(const_cast<SkColorSpace_XYZ*>(this)); + } + + auto cs = sk_make_sp<SkColorSpace_XYZ>(fGammaNamed, fGammas, fToXYZD50, fProfileData); + cs->fNonlinearBlending = true; + return cs; +} diff --git a/src/core/SkColorSpace_XYZ.h b/src/core/SkColorSpace_XYZ.h index 2ad2e38b1b..d0984ecd1e 100644 --- a/src/core/SkColorSpace_XYZ.h +++ b/src/core/SkColorSpace_XYZ.h @@ -23,12 +23,14 @@ public: bool onGammaCloseToSRGB() const override; bool onGammaIsLinear() const override; bool onIsNumericalTransferFn(SkColorSpaceTransferFn* coeffs) const override; + bool nonlinearBlending() const override { return fNonlinearBlending; } const SkData* onProfileData() const override { return fProfileData.get(); } sk_sp<SkColorSpace> makeLinearGamma() const override; sk_sp<SkColorSpace> makeSRGBGamma() const override; sk_sp<SkColorSpace> makeColorSpin() const override; + sk_sp<SkColorSpace> makeNonlinearBlending() const override; SkGammaNamed onGammaNamed() const override { return fGammaNamed; } @@ -56,6 +58,8 @@ private: mutable const uint8_t* fToDstGammaTables[3]; mutable SkOnce fToDstGammaOnce; + bool fNonlinearBlending = false; + friend class SkColorSpace; friend class ColorSpaceXformTest; }; diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp index 4b68ffdd93..f17ff647ae 100644 --- a/src/core/SkPictureImageGenerator.cpp +++ b/src/core/SkPictureImageGenerator.cpp @@ -23,10 +23,6 @@ SkPictureImageGenerator::Make(const SkISize& size, sk_sp<SkPicture> picture, con return nullptr; } - if (SkImage::BitDepth::kF16 == bitDepth && (!colorSpace || !colorSpace->gammaIsLinear())) { - return nullptr; - } - if (colorSpace && (!colorSpace->gammaCloseToSRGB() && !colorSpace->gammaIsLinear())) { return nullptr; } diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 99465f620b..60586ea503 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -300,6 +300,7 @@ GrPixelConfig GrRenderableConfigForColorSpace(const SkColorSpace* colorSpace) { if (!colorSpace) { return kRGBA_8888_GrPixelConfig; } else if (colorSpace->gammaIsLinear()) { + // TODO return kRGBA_half_GrPixelConfig; } else if (colorSpace->gammaCloseToSRGB()) { return kSRGBA_8888_GrPixelConfig; diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index b646f9e506..d86b316ef6 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -271,7 +271,7 @@ bool SkSurface_Gpu::onDraw(const SkDeferredDisplayList* ddl) { bool SkSurface_Gpu::Valid(const SkImageInfo& info) { switch (info.colorType()) { case kRGBA_F16_SkColorType: - return (!info.colorSpace()) || info.colorSpace()->gammaIsLinear(); + return true; case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: return !info.colorSpace() || info.colorSpace()->gammaCloseToSRGB(); @@ -283,7 +283,7 @@ bool SkSurface_Gpu::Valid(const SkImageInfo& info) { bool SkSurface_Gpu::Valid(const GrCaps* caps, GrPixelConfig config, SkColorSpace* colorSpace) { switch (config) { case kRGBA_half_GrPixelConfig: - return (!colorSpace) || colorSpace->gammaIsLinear(); + return true; case kSRGBA_8888_GrPixelConfig: case kSBGRA_8888_GrPixelConfig: return caps->srgbSupport() && colorSpace && colorSpace->gammaCloseToSRGB(); diff --git a/src/image/SkSurface_Raster.cpp b/src/image/SkSurface_Raster.cpp index 47d5542ac6..fd120072f4 100644 --- a/src/image/SkSurface_Raster.cpp +++ b/src/image/SkSurface_Raster.cpp @@ -68,9 +68,6 @@ bool SkSurfaceValidateRasterInfo(const SkImageInfo& info, size_t rowBytes) { } break; case kRGBA_F16_SkColorType: - if (info.colorSpace() && (!info.colorSpace()->gammaIsLinear())) { - return false; - } break; default: return false; diff --git a/src/images/SkJpegEncoder.cpp b/src/images/SkJpegEncoder.cpp index 305152d978..606b553537 100644 --- a/src/images/SkJpegEncoder.cpp +++ b/src/images/SkJpegEncoder.cpp @@ -118,7 +118,7 @@ bool SkJpegEncoderMgr::setParams(const SkImageInfo& srcInfo, const SkJpegEncoder numComponents = 1; break; case kRGBA_F16_SkColorType: - if (!srcInfo.colorSpace() || !srcInfo.colorSpace()->gammaIsLinear() || + if (!srcInfo.colorSpace() || SkTransferFunctionBehavior::kRespect != options.fBlendBehavior) { return false; } diff --git a/src/images/SkPngEncoder.cpp b/src/images/SkPngEncoder.cpp index c7952df57a..19fc27e4a6 100644 --- a/src/images/SkPngEncoder.cpp +++ b/src/images/SkPngEncoder.cpp @@ -106,7 +106,7 @@ bool SkPngEncoderMgr::setHeader(const SkImageInfo& srcInfo, const SkPngEncoder:: int bitDepth = 8; switch (srcInfo.colorType()) { case kRGBA_F16_SkColorType: - SkASSERT(srcInfo.colorSpace() && srcInfo.colorSpace()->gammaIsLinear()); + SkASSERT(srcInfo.colorSpace()); sigBit.red = 16; sigBit.green = 16; sigBit.blue = 16; diff --git a/src/images/SkWebpEncoder.cpp b/src/images/SkWebpEncoder.cpp index a7809b2fa0..ee13563ea7 100644 --- a/src/images/SkWebpEncoder.cpp +++ b/src/images/SkWebpEncoder.cpp @@ -88,10 +88,6 @@ static transform_scanline_proc choose_proc(const SkImageInfo& info, case kGray_8_SkColorType: return transform_scanline_gray; case kRGBA_F16_SkColorType: - if (!info.colorSpace() || !info.colorSpace()->gammaIsLinear()) { - return nullptr; - } - switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: |