diff options
-rw-r--r-- | gm/color4f.cpp | 6 | ||||
-rw-r--r-- | include/core/SkColor.h | 12 | ||||
-rw-r--r-- | src/core/SkColor.cpp | 24 | ||||
-rw-r--r-- | src/core/SkColorShader.cpp | 10 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 5 | ||||
-rw-r--r-- | tests/Float16Test.cpp | 2 | ||||
-rw-r--r-- | tests/SkColor4fTest.cpp | 12 |
7 files changed, 37 insertions, 34 deletions
diff --git a/gm/color4f.cpp b/gm/color4f.cpp index 5a516a569b..b3be57bdf9 100644 --- a/gm/color4f.cpp +++ b/gm/color4f.cpp @@ -99,10 +99,10 @@ DEF_SIMPLE_GM(color4shader, canvas, 1024, 260) { mat.set3x3(0, 1, 0, 0, 0, 1, 1, 0, 0); const SkColor4f colors[] { - { 1, 1, 0, 0 }, - { 1, 0, 1, 0 }, { 1, 0, 0, 1 }, - { 1, 0.5, 0.5, 0.5 }, + { 0, 1, 0, 1 }, + { 0, 0, 1, 1 }, + { 0.5, 0.5, 0.5, 1 }, }; SkPaint paint; diff --git a/include/core/SkColor.h b/include/core/SkColor.h index a40e5f1f15..e473db486a 100644 --- a/include/core/SkColor.h +++ b/include/core/SkColor.h @@ -166,10 +166,10 @@ struct SkPM4f; * The float values are 0...1 unpremultiplied */ struct SkColor4f { - float fA; float fR; float fG; float fB; + float fA; bool operator==(const SkColor4f& other) const { return fA == other.fA && fR == other.fR && fG == other.fG && fB == other.fB; @@ -178,14 +178,16 @@ struct SkColor4f { return !(*this == other); } - const float* vec() const { return &fA; } - float* vec() { return &fA; } + const float* vec() const { return &fR; } + float* vec() { return &fR; } - static SkColor4f Pin(float a, float r, float g, float b); + static SkColor4f Pin(float r, float g, float b, float a); static SkColor4f FromColor(SkColor); + SkColor toSkColor() const; + SkColor4f pin() const { - return Pin(fA, fR, fG, fB); + return Pin(fR, fG, fB, fA); } SkPM4f premul() const; diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp index 1c6f0b6579..985790dfe5 100644 --- a/src/core/SkColor.cpp +++ b/src/core/SkColor.cpp @@ -120,7 +120,7 @@ SkColor4f SkPM4f::unpremul() const { return { 0, 0, 0, 0 }; } else { float invAlpha = 1 / alpha; - return { alpha, fVec[R] * invAlpha, fVec[G] * invAlpha, fVec[B] * invAlpha }; + return { fVec[R] * invAlpha, fVec[G] * invAlpha, fVec[B] * invAlpha, alpha }; } } @@ -155,7 +155,7 @@ void SkPM4f::assertIsUnit() const { /////////////////////////////////////////////////////////////////////////////////////////////////// SkColor4f SkColor4f::FromColor(SkColor c) { - Sk4f value = SkNx_shuffle<3,2,1,0>(SkNx_cast<float>(Sk4b::Load(&c))); + Sk4f value = SkNx_shuffle<2,1,0,3>(SkNx_cast<float>(Sk4b::Load(&c))); SkColor4f c4; (value * Sk4f(1.0f / 255)).store(&c4); if (gTreatSkColorAsSRGB) { @@ -166,19 +166,23 @@ SkColor4f SkColor4f::FromColor(SkColor c) { return c4; } -SkColor4f SkColor4f::Pin(float a, float r, float g, float b) { +SkColor SkColor4f::toSkColor() const { + SkColor result; + Sk4f value = SkNx_shuffle<2, 1, 0, 3>(Sk4f::Load(this->vec())); + SkNx_cast<uint8_t>(value * Sk4f(255) + Sk4f(0.5f)).store(&result); + return result; +} + +SkColor4f SkColor4f::Pin(float r, float g, float b, float a) { SkColor4f c4; - Sk4f::Min(Sk4f::Max(Sk4f(a, r, g, b), Sk4f(0)), Sk4f(1)).store(c4.vec()); + Sk4f::Min(Sk4f::Max(Sk4f(r, g, b, a), Sk4f(0)), Sk4f(1)).store(c4.vec()); return c4; } SkPM4f SkColor4f::premul() const { auto src = Sk4f::Load(this->pin().vec()); - float srcAlpha = src[0]; // need the pinned version of our alpha - src = src * Sk4f(1, srcAlpha, srcAlpha, srcAlpha); - - // ARGB -> RGBA - Sk4f dst = SkNx_shuffle<1,2,3,0>(src); + float srcAlpha = src[3]; // need the pinned version of our alpha + src = src * Sk4f(srcAlpha, srcAlpha, srcAlpha, 1); - return SkPM4f::From4f(dst); + return SkPM4f::From4f(src); } diff --git a/src/core/SkColorShader.cpp b/src/core/SkColorShader.cpp index 250a367822..c61081603d 100644 --- a/src/core/SkColorShader.cpp +++ b/src/core/SkColorShader.cpp @@ -133,10 +133,10 @@ SkColor4Shader::SkColor4Shader(const SkColor4f& color, sk_sp<SkColorSpace> space sk_sp<SkFlattenable> SkColor4Shader::CreateProc(SkReadBuffer& buffer) { SkColor4f color; - color.fA = buffer.readScalar(); // readFloat() - color.fR = buffer.readScalar(); + color.fR = buffer.readScalar(); // readFloat() color.fG = buffer.readScalar(); color.fB = buffer.readScalar(); + color.fA = buffer.readScalar(); if (buffer.readBool()) { // TODO how do we unflatten colorspaces } @@ -144,10 +144,10 @@ sk_sp<SkFlattenable> SkColor4Shader::CreateProc(SkReadBuffer& buffer) { } void SkColor4Shader::flatten(SkWriteBuffer& buffer) const { - buffer.writeScalar(fColor4.fA); // writeFloat() - buffer.writeScalar(fColor4.fR); + buffer.writeScalar(fColor4.fR); // writeFloat() buffer.writeScalar(fColor4.fG); buffer.writeScalar(fColor4.fB); + buffer.writeScalar(fColor4.fA); buffer.writeBool(false); // TODO how do we flatten colorspaces? } @@ -232,7 +232,7 @@ sk_sp<GrFragmentProcessor> SkColor4Shader::asFragmentProcessor(GrContext*, const void SkColor4Shader::toString(SkString* str) const { str->append("SkColor4Shader: ("); - str->append("ARGB:"); + str->append("RGBA:"); for (int i = 0; i < 4; ++i) { str->appendf(" %g", fColor4.vec()[i]); } diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index 887fdb46e9..77498396b0 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -228,10 +228,7 @@ bool SkPixmap::erase(const SkColor4f& origColor, const SkIRect* subset) const { const SkColor4f color = origColor.pin(); if (kRGBA_F16_SkColorType != pm.colorType()) { - Sk4f c4 = Sk4f::Load(color.vec()); - SkColor c; - SkNx_cast<uint8_t>(c4 * Sk4f(255) + Sk4f(0.5f)).store(&c); - return pm.erase(c); + return pm.erase(color.toSkColor()); } const uint64_t half4 = color.premul().toF16(); diff --git a/tests/Float16Test.cpp b/tests/Float16Test.cpp index 6a7f9842f4..d80fe29439 100644 --- a/tests/Float16Test.cpp +++ b/tests/Float16Test.cpp @@ -43,7 +43,7 @@ DEF_TEST(color_half_float, reporter) { pm.alloc(info); REPORTER_ASSERT(reporter, pm.getSafeSize() == SkToSizeT(w * h * sizeof(uint64_t))); - SkColor4f c4 { 0.5f, 1, 0.5f, 0.25f }; + SkColor4f c4 { 1, 0.5f, 0.25f, 0.5f }; pm.erase(c4); SkPM4f origpm4 = c4.premul(); diff --git a/tests/SkColor4fTest.cpp b/tests/SkColor4fTest.cpp index 00cb3fed27..1dacfb2d95 100644 --- a/tests/SkColor4fTest.cpp +++ b/tests/SkColor4fTest.cpp @@ -37,13 +37,13 @@ DEF_TEST(SkColor4f_FromColor, reporter) { SkColor fC; SkColor4f fC4; } recs[] = { - { SK_ColorBLACK, { 1, 0, 0, 0 } }, + { SK_ColorBLACK, { 0, 0, 0, 1 } }, { SK_ColorWHITE, { 1, 1, 1, 1 } }, - { SK_ColorRED, { 1, 1, 0, 0 } }, - { SK_ColorGREEN, { 1, 0, 1, 0 } }, - { SK_ColorBLUE, { 1, 0, 0, 1 } }, + { SK_ColorRED, { 1, 0, 0, 1 } }, + { SK_ColorGREEN, { 0, 1, 0, 1 } }, + { SK_ColorBLUE, { 0, 0, 1, 1 } }, { 0, { 0, 0, 0, 0 } }, - { 0x55AAFF00, { 1/3.0f, 2/3.0f, 1, 0 } }, + { 0x55AAFF00, { 2/3.0f, 1, 0, 1 / 3.0f } }, }; for (const auto& r : recs) { @@ -58,7 +58,7 @@ DEF_TEST(Color4f_premul, reporter) { for (int i = 0; i < 1000000; ++i) { // First just test opaque colors, so that the premul should be exact SkColor4f c4 { - 1, rand.nextUScalar1(), rand.nextUScalar1(), rand.nextUScalar1() + rand.nextUScalar1(), rand.nextUScalar1(), rand.nextUScalar1(), 1 }; SkPM4f pm4 = c4.premul(); REPORTER_ASSERT(reporter, pm4.a() == c4.fA); |