Still very conflicted about the "right" way to proceed with this, but thought I'd experiment with a runtime flag, so we can practice seeing SKPs in various stages of "srgb correctness".
Other aspects to either fix, or at least provide runtime switches for:
- untagged images
- gradients
- colorshader
- drawVertices
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=
1891013002
TBR=
Review URL: https://codereview.chromium.org/
1891013002
#include "SkColorPriv.h"
#include "SkFixed.h"
+bool gTreatSkColorAsSRGB;
+
SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b) {
return SkPremultiplyARGBInline(a, r, g, b);
}
Sk4f value = SkNx_shuffle<3,2,1,0>(SkNx_cast<float>(Sk4b::Load(&c)));
SkColor4f c4;
(value * Sk4f(1.0f / 255)).store(&c4);
+ if (gTreatSkColorAsSRGB) {
+ c4.fR = srgb_to_linear(c4.fR);
+ c4.fG = srgb_to_linear(c4.fG);
+ c4.fB = srgb_to_linear(c4.fB);
+ }
return c4;
}
#include "SkColorPriv.h"
#include "SkPM4f.h"
+extern bool gTreatSkColorAsSRGB;
+
static inline float get_alpha(const Sk4f& f4) {
return f4[SkPM4f::A];
}
return set_alpha(l4.sqrt(), get_alpha(l4));
}
+static inline float srgb_to_linear(float x) {
+ return x * x;
+}
+
+static inline float linear_to_srgb(float x) {
+ return sqrtf(x);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
static inline Sk4f Sk4f_fromL32(uint32_t src) {