aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/color4f.cpp6
-rw-r--r--include/core/SkColor.h12
-rw-r--r--src/core/SkColor.cpp24
-rw-r--r--src/core/SkColorShader.cpp10
-rw-r--r--src/core/SkPixmap.cpp5
-rw-r--r--tests/Float16Test.cpp2
-rw-r--r--tests/SkColor4fTest.cpp12
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);