clean up legacy sRGB stages
Nothing terribly interesting.
Change-Id: I8956c5bc3fa9098337bad8fa143de1d95f987f9f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/291655
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp
index df7d9a7..af6222b 100644
--- a/src/core/SkBlitter_Sprite.cpp
+++ b/src/core/SkBlitter_Sprite.cpp
@@ -134,7 +134,7 @@
: kPremul_SkAlphaType;
fAlloc->make<SkColorSpaceXformSteps>(srcCS, srcAT,
dstCS, kPremul_SkAlphaType)
- ->apply(&p, fSource.colorType());
+ ->apply(&p);
}
if (fPaintColor.fA != 1.0f) {
p.append(SkRasterPipeline::scale_1_float, &fPaintColor.fA);
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index e3af3f4..3731cc5 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -203,9 +203,7 @@
rec.fPipeline->append(SkRasterPipeline::unpremul);
}
- // TODO: is it valuable to thread this through appendStages()?
- bool shaderIsNormalized = false;
- fSteps.apply(rec.fPipeline, shaderIsNormalized);
+ fSteps.apply(rec.fPipeline);
if (!shaderIsOpaque) {
rec.fPipeline->append(SkRasterPipeline::premul);
diff --git a/src/core/SkColorSpaceXformSteps.cpp b/src/core/SkColorSpaceXformSteps.cpp
index d4eed8d..1d90dc2 100644
--- a/src/core/SkColorSpaceXformSteps.cpp
+++ b/src/core/SkColorSpaceXformSteps.cpp
@@ -65,9 +65,6 @@
src-> transferFn(&this->srcTF );
dst->invTransferFn(&this->dstTFInv);
- this->srcTF_is_sRGB = src->gammaCloseToSRGB();
- this->dstTF_is_sRGB = dst->gammaCloseToSRGB();
-
// If we linearize then immediately reencode with the same transfer function, skip both.
if ( this->flags.linearize &&
!this->flags.gamut_transform &&
@@ -131,29 +128,12 @@
}
}
-void SkColorSpaceXformSteps::apply(SkRasterPipeline* p, bool src_is_normalized) const {
-#ifndef SK_LEGACY_SRGB_STAGES
- src_is_normalized = false;
-#endif
- if (flags.unpremul) { p->append(SkRasterPipeline::unpremul); }
- if (flags.linearize) {
- if (src_is_normalized && srcTF_is_sRGB) {
- p->append(SkRasterPipeline::from_srgb);
- } else {
- p->append_transfer_function(srcTF);
- }
- }
- if (flags.gamut_transform) {
- p->append(SkRasterPipeline::matrix_3x3, &src_to_dst_matrix);
- }
- if (flags.encode) {
- if (src_is_normalized && dstTF_is_sRGB) {
- p->append(SkRasterPipeline::to_srgb);
- } else {
- p->append_transfer_function(dstTFInv);
- }
- }
- if (flags.premul) { p->append(SkRasterPipeline::premul); }
+void SkColorSpaceXformSteps::apply(SkRasterPipeline* p) const {
+ if (flags.unpremul) { p->append(SkRasterPipeline::unpremul); }
+ if (flags.linearize) { p->append_transfer_function(srcTF); }
+ if (flags.gamut_transform) { p->append(SkRasterPipeline::matrix_3x3, &src_to_dst_matrix); }
+ if (flags.encode) { p->append_transfer_function(dstTFInv); }
+ if (flags.premul) { p->append(SkRasterPipeline::premul); }
}
skvm::Color sk_program_transfer_fn(skvm::Builder* p, skvm::Uniforms* uniforms,
diff --git a/src/core/SkColorSpaceXformSteps.h b/src/core/SkColorSpaceXformSteps.h
index 7d15259..03c9aab 100644
--- a/src/core/SkColorSpaceXformSteps.h
+++ b/src/core/SkColorSpaceXformSteps.h
@@ -42,17 +42,11 @@
dst.colorSpace(), dst.alphaType()) {}
void apply(float rgba[4]) const;
- void apply(SkRasterPipeline*, bool src_is_normalized) const;
+ void apply(SkRasterPipeline*) const;
skvm::Color program(skvm::Builder*, skvm::Uniforms*, skvm::Color) const;
- void apply(SkRasterPipeline* p, SkColorType srcCT) const {
- return this->apply(p, SkColorTypeIsNormalized(srcCT));
- }
-
Flags flags;
- bool srcTF_is_sRGB,
- dstTF_is_sRGB;
skcms_TransferFunction srcTF, // Apply for linearize.
dstTFInv; // Apply for encode.
float src_to_dst_matrix[9]; // Apply this 3x3 column-major matrix for gamut_transform.
diff --git a/src/core/SkConvertPixels.cpp b/src/core/SkConvertPixels.cpp
index 2eb840c..c3dd1d2 100644
--- a/src/core/SkConvertPixels.cpp
+++ b/src/core/SkConvertPixels.cpp
@@ -211,7 +211,7 @@
SkRasterPipeline_<256> pipeline;
pipeline.append_load(srcInfo.colorType(), &src);
- steps.apply(&pipeline, srcInfo.colorType());
+ steps.apply(&pipeline);
pipeline.append_gamut_clamp_if_normalized(dstInfo);
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index 316e884..04d677b 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -44,7 +44,6 @@
M(unpremul) M(premul) M(premul_dst) \
M(force_opaque) M(force_opaque_dst) \
M(set_rgb) M(unbounded_set_rgb) M(swap_rb) M(swap_rb_dst) \
- M(from_srgb) M(to_srgb) \
M(black_color) M(white_color) \
M(uniform_color) M(unbounded_uniform_color) M(uniform_color_dst) \
M(seed_shader) M(dither) \
diff --git a/src/gpu/GrDataUtils.cpp b/src/gpu/GrDataUtils.cpp
index 8ba9bff..7e6a6c7 100644
--- a/src/gpu/GrDataUtils.cpp
+++ b/src/gpu/GrDataUtils.cpp
@@ -599,7 +599,7 @@
pipeline.append_transfer_function(*skcms_sRGB_TransferFunction());
}
if (alphaOrCSConversion) {
- steps->apply(&pipeline, srcIsNormalized);
+ steps->apply(&pipeline);
}
if (clampGamut) {
append_clamp_gamut(&pipeline);
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h
index 339d7a8..8c7969b 100644
--- a/src/opts/SkRasterPipeline_opts.h
+++ b/src/opts/SkRasterPipeline_opts.h
@@ -1912,45 +1912,6 @@
b = fn(b);
}
-STAGE(from_srgb, Ctx::None) {
- auto fn = [](F s) {
- U32 sign;
- s = strip_sign(s, &sign);
- auto lo = s * (1/12.92f);
- auto hi = mad(s*s, mad(s, 0.3000f, 0.6975f), 0.0025f);
- return apply_sign(if_then_else(s < 0.055f, lo, hi), sign);
- };
- r = fn(r);
- g = fn(g);
- b = fn(b);
-}
-STAGE(to_srgb, Ctx::None) {
- auto fn = [](F l) {
- U32 sign;
- l = strip_sign(l, &sign);
- // We tweak c and d for each instruction set to make sure fn(1) is exactly 1.
- #if defined(JUMPER_IS_SSE2) || defined(JUMPER_IS_SSE41) || \
- defined(JUMPER_IS_AVX ) || defined(JUMPER_IS_HSW ) || defined(JUMPER_IS_SKX)
- const float c = 1.130048394203f,
- d = 0.141357362270f;
- #elif defined(JUMPER_IS_NEON)
- const float c = 1.129999995232f,
- d = 0.141381442547f;
- #else
- const float c = 1.129999995232f,
- d = 0.141377761960f;
- #endif
- F t = rsqrt(l);
- auto lo = l * 12.92f;
- auto hi = mad(t, mad(t, -0.0024542345f, 0.013832027f), c)
- * rcp(d + t);
- return apply_sign(if_then_else(l < 0.00465985f, lo, hi), sign);
- };
- r = fn(r);
- g = fn(g);
- b = fn(b);
-}
-
STAGE(load_a8, const SkRasterPipeline_MemoryCtx* ctx) {
auto ptr = ptr_at_xy<const uint8_t>(ctx, dx,dy);
@@ -4253,8 +4214,6 @@
NOT_IMPLEMENTED(unbounded_uniform_color)
NOT_IMPLEMENTED(unpremul)
NOT_IMPLEMENTED(dither) // TODO
- NOT_IMPLEMENTED(from_srgb)
- NOT_IMPLEMENTED(to_srgb)
NOT_IMPLEMENTED(load_16161616)
NOT_IMPLEMENTED(load_16161616_dst)
NOT_IMPLEMENTED(store_16161616)
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 93bada2..a1a94cc 100755
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -464,14 +464,6 @@
};
auto append_misc = [&] {
- // This is an inessential optimization... it's logically safe to set this to false.
- // But if...
- // - we know the image is definitely normalized, and
- // - we're doing some color space conversion, and
- // - sRGB curves are involved,
- // then we can use slightly faster math that doesn't work well outside [0,1].
- bool src_is_normalized = SkColorTypeIsNormalized(info.colorType());
-
SkColorSpace* cs = info.colorSpace();
SkAlphaType at = info.alphaType();
@@ -480,7 +472,6 @@
SkColor4f rgb = rec.fPaint.getColor4f();
p->append_set_rgb(alloc, rgb);
- src_is_normalized = rgb.fitsInBytes();
cs = sk_srgb_singleton();
at = kUnpremul_SkAlphaType;
}
@@ -491,13 +482,12 @@
p->append(at == kUnpremul_SkAlphaType || fClampAsIfUnpremul
? SkRasterPipeline::clamp_1
: SkRasterPipeline::clamp_a);
- src_is_normalized = true;
}
// Transform color space and alpha type to match shader convention (dst CS, premul alpha).
alloc->make<SkColorSpaceXformSteps>(cs, at,
rec.fDstCS, kPremul_SkAlphaType)
- ->apply(p, src_is_normalized);
+ ->apply(p);
return true;
};
diff --git a/src/shaders/SkShader.cpp b/src/shaders/SkShader.cpp
index c1c09e7..766b961 100644
--- a/src/shaders/SkShader.cpp
+++ b/src/shaders/SkShader.cpp
@@ -189,7 +189,7 @@
rec.fPipeline->append(SkRasterPipeline::callback, cb);
rec.fAlloc->make<SkColorSpaceXformSteps>(sk_srgb_singleton(), kPremul_SkAlphaType,
rec.fDstCS, kPremul_SkAlphaType)
- ->apply(rec.fPipeline, true);
+ ->apply(rec.fPipeline);
return true;
}
return false;
diff --git a/tests/SRGBTest.cpp b/tests/SRGBTest.cpp
index a2c09d9..2eea2ce 100644
--- a/tests/SRGBTest.cpp
+++ b/tests/SRGBTest.cpp
@@ -13,33 +13,31 @@
#include <math.h>
DEF_TEST(srgb_roundtrip, r) {
- for (int normalized = 0; normalized < 2; normalized++) {
- uint32_t reds[256];
- for (int i = 0; i < 256; i++) {
- reds[i] = i;
- }
+ uint32_t reds[256];
+ for (int i = 0; i < 256; i++) {
+ reds[i] = i;
+ }
- SkRasterPipeline_MemoryCtx ptr = { reds, 0 };
+ SkRasterPipeline_MemoryCtx ptr = { reds, 0 };
- sk_sp<SkColorSpace> sRGB = SkColorSpace::MakeSRGB(),
- linear = sRGB->makeLinearGamma();
- const SkAlphaType upm = kUnpremul_SkAlphaType;
+ sk_sp<SkColorSpace> sRGB = SkColorSpace::MakeSRGB(),
+ linear = sRGB->makeLinearGamma();
+ const SkAlphaType upm = kUnpremul_SkAlphaType;
- SkColorSpaceXformSteps linearize{ sRGB.get(),upm, linear.get(),upm},
- reencode {linear.get(),upm, sRGB.get(),upm};
+ SkColorSpaceXformSteps linearize{ sRGB.get(),upm, linear.get(),upm},
+ reencode {linear.get(),upm, sRGB.get(),upm};
- SkRasterPipeline_<256> p;
- p.append(SkRasterPipeline::load_8888, &ptr);
- linearize.apply(&p, !!normalized);
- reencode .apply(&p, !!normalized);
- p.append(SkRasterPipeline::store_8888, &ptr);
+ SkRasterPipeline_<256> p;
+ p.append(SkRasterPipeline::load_8888, &ptr);
+ linearize.apply(&p);
+ reencode .apply(&p);
+ p.append(SkRasterPipeline::store_8888, &ptr);
- p.run(0,0,256,1);
+ p.run(0,0,256,1);
- for (int i = 0; i < 256; i++) {
- if (reds[i] != (uint32_t)i) {
- ERRORF(r, "%d doesn't round trip, %d", i, reds[i]);
- }
+ for (int i = 0; i < 256; i++) {
+ if (reds[i] != (uint32_t)i) {
+ ERRORF(r, "%d doesn't round trip, %d", i, reds[i]);
}
}
}
@@ -60,7 +58,7 @@
SkSTArenaAlloc<256> alloc;
SkRasterPipeline p(&alloc);
p.append_constant_color(&alloc, color);
- steps.apply(&p, true/*inputs are normalized*/);
+ steps.apply(&p);
p.append(SkRasterPipeline::store_f32, &dst);
p.run(0,0,4,1);
@@ -76,16 +74,12 @@
}
// Linearize and then re-encode pixel values, testing that the output is close to the input.
-static void test_roundtripping(skiatest::Reporter* r,
- sk_sp<SkColorSpace> cs,
- float range,
- float tolerance,
- bool normalized) {
+DEF_TEST(srgb_roundtrip_extended, r) {
static const int kSteps = 128;
SkColor4f rgba[kSteps];
auto expected = [=](int i) {
- float scale = range / (3*kSteps);
+ float scale = 10000.0f / (3*kSteps);
return SkColor4f{
(3*i+0) * scale,
(3*i+1) * scale,
@@ -100,6 +94,7 @@
SkRasterPipeline_MemoryCtx ptr = { rgba, 0 };
+ sk_sp<SkColorSpace> cs = SkColorSpace::MakeSRGB();
sk_sp<SkColorSpace> linear = cs->makeLinearGamma();
const SkAlphaType upm = kUnpremul_SkAlphaType;
@@ -108,14 +103,14 @@
SkRasterPipeline_<256> p;
p.append(SkRasterPipeline::load_f32, &ptr);
- linearize.apply(&p, normalized);
- reencode .apply(&p, normalized);
+ linearize.apply(&p);
+ reencode .apply(&p);
p.append(SkRasterPipeline::store_f32, &ptr);
p.run(0,0,kSteps,1);
auto close = [=](float x, float y) {
return x == y
- || (x/y < tolerance && y/x < tolerance);
+ || (x/y < 1.001f && y/x < 1.001f);
};
for (int i = 0; i < kSteps; i++) {
@@ -130,11 +125,3 @@
REPORTER_ASSERT(r, close(rgba[i].fB, want.fB));
}
}
-
-DEF_TEST(srgb_roundtrip_extended, r) {
- // We're lying when we set normalized=true, but it allows us to test the to_srgb/from_srgb path.
- test_roundtripping(r, SkColorSpace::MakeSRGB(), 2.0f, 1.025f, true);
-
- // This normalized=false path should have much better round-tripping properties.
- test_roundtripping(r, SkColorSpace::MakeSRGB(), 10000.0f, 1.001f, false);
-}