aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2018-05-10 11:29:15 -0400
committerGravatar Mike Klein <mtklein@chromium.org>2018-05-10 18:26:22 +0000
commitce4cf72e3487f661e53f6d0c3416c9b58da4fd00 (patch)
tree5e8a5b884c787a095ea25ea93070569731e937a1 /src
parent024615e9752d93c842ad3cad597fd65382ddb678 (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.cpp2
-rw-r--r--src/codec/SkHeifCodec.cpp4
-rw-r--r--src/codec/SkJpegCodec.cpp5
-rw-r--r--src/codec/SkWbmpCodec.cpp2
-rw-r--r--src/core/SkColorSpace.cpp4
-rw-r--r--src/core/SkColorSpace_XYZ.cpp10
-rw-r--r--src/core/SkColorSpace_XYZ.h4
-rw-r--r--src/core/SkPictureImageGenerator.cpp4
-rw-r--r--src/gpu/SkGr.cpp1
-rw-r--r--src/image/SkSurface_Gpu.cpp4
-rw-r--r--src/image/SkSurface_Raster.cpp3
-rw-r--r--src/images/SkJpegEncoder.cpp2
-rw-r--r--src/images/SkPngEncoder.cpp2
-rw-r--r--src/images/SkWebpEncoder.cpp4
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: