Add SkColor4f serialization
Adjusted usage in color shader, and will also be using this
in gradients, soon.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2334123003
Review-Url: https://codereview.chromium.org/2334123003
diff --git a/src/core/SkColorShader.cpp b/src/core/SkColorShader.cpp
index d8c9f29..cfa071f 100644
--- a/src/core/SkColorShader.cpp
+++ b/src/core/SkColorShader.cpp
@@ -130,10 +130,7 @@
sk_sp<SkFlattenable> SkColor4Shader::CreateProc(SkReadBuffer& buffer) {
SkColor4f color;
- color.fR = buffer.readScalar(); // readFloat()
- color.fG = buffer.readScalar();
- color.fB = buffer.readScalar();
- color.fA = buffer.readScalar();
+ buffer.readColor4f(&color);
if (buffer.readBool()) {
// TODO how do we unflatten colorspaces
}
@@ -141,10 +138,7 @@
}
void SkColor4Shader::flatten(SkWriteBuffer& buffer) const {
- buffer.writeScalar(fColor4.fR); // writeFloat()
- buffer.writeScalar(fColor4.fG);
- buffer.writeScalar(fColor4.fB);
- buffer.writeScalar(fColor4.fA);
+ buffer.writeColor4f(fColor4);
buffer.writeBool(false); // TODO how do we flatten colorspaces?
}
diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
index 4b9d598..7679622 100644
--- a/src/core/SkReadBuffer.cpp
+++ b/src/core/SkReadBuffer.cpp
@@ -142,6 +142,10 @@
string->set(strContents, len);
}
+void SkReadBuffer::readColor4f(SkColor4f* color) {
+ memcpy(color, fReader.skip(sizeof(SkColor4f)), sizeof(SkColor4f));
+}
+
void SkReadBuffer::readPoint(SkPoint* point) {
point->fX = fReader.readScalar();
point->fY = fReader.readScalar();
@@ -192,6 +196,10 @@
return readArray(colors, size, sizeof(SkColor));
}
+bool SkReadBuffer::readColor4fArray(SkColor4f* colors, size_t size) {
+ return readArray(colors, size, sizeof(SkColor4f));
+}
+
bool SkReadBuffer::readIntArray(int32_t* values, size_t size) {
return readArray(values, size, sizeof(int32_t));
}
diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h
index 1873c7d..d29fef8 100644
--- a/src/core/SkReadBuffer.h
+++ b/src/core/SkReadBuffer.h
@@ -123,6 +123,7 @@
virtual void readString(SkString* string);
// common data structures
+ virtual void readColor4f(SkColor4f* color);
virtual void readPoint(SkPoint* point);
SkPoint readPoint() { SkPoint p; this->readPoint(&p); return p; }
virtual void readMatrix(SkMatrix* matrix);
@@ -150,6 +151,7 @@
// binary data and arrays
virtual bool readByteArray(void* value, size_t size);
virtual bool readColorArray(SkColor* colors, size_t size);
+ virtual bool readColor4fArray(SkColor4f* colors, size_t size);
virtual bool readIntArray(int32_t* values, size_t size);
virtual bool readPointArray(SkPoint* points, size_t size);
virtual bool readScalarArray(SkScalar* values, size_t size);
diff --git a/src/core/SkValidatingReadBuffer.cpp b/src/core/SkValidatingReadBuffer.cpp
index 1566af9..d57e499 100644
--- a/src/core/SkValidatingReadBuffer.cpp
+++ b/src/core/SkValidatingReadBuffer.cpp
@@ -110,6 +110,13 @@
}
}
+void SkValidatingReadBuffer::readColor4f(SkColor4f* color) {
+ const void* ptr = this->skip(sizeof(SkColor4f));
+ if (!fError) {
+ memcpy(color, ptr, sizeof(SkColor4f));
+ }
+}
+
void SkValidatingReadBuffer::readPoint(SkPoint* point) {
point->fX = this->readScalar();
point->fY = this->readScalar();
@@ -197,6 +204,10 @@
return readArray(colors, size, sizeof(SkColor));
}
+bool SkValidatingReadBuffer::readColor4fArray(SkColor4f* colors, size_t size) {
+ return readArray(colors, size, sizeof(SkColor4f));
+}
+
bool SkValidatingReadBuffer::readIntArray(int32_t* values, size_t size) {
return readArray(values, size, sizeof(int32_t));
}
diff --git a/src/core/SkValidatingReadBuffer.h b/src/core/SkValidatingReadBuffer.h
index bad5f2f..825c4b9 100644
--- a/src/core/SkValidatingReadBuffer.h
+++ b/src/core/SkValidatingReadBuffer.h
@@ -44,6 +44,7 @@
// common data structures
SkFlattenable* readFlattenable(SkFlattenable::Type type) override;
+ void readColor4f(SkColor4f* color) override;
void readPoint(SkPoint* point) override;
void readMatrix(SkMatrix* matrix) override;
void readIRect(SkIRect* rect) override;
@@ -55,6 +56,7 @@
// binary data and arrays
bool readByteArray(void* value, size_t size) override;
bool readColorArray(SkColor* colors, size_t size) override;
+ bool readColor4fArray(SkColor4f* colors, size_t size) override;
bool readIntArray(int32_t* values, size_t size) override;
bool readPointArray(SkPoint* points, size_t size) override;
bool readScalarArray(SkScalar* values, size_t size) override;
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
index 1159ef3..019bc24 100644
--- a/src/core/SkWriteBuffer.cpp
+++ b/src/core/SkWriteBuffer.cpp
@@ -78,6 +78,15 @@
fWriter.write(color, count * sizeof(SkColor));
}
+void SkBinaryWriteBuffer::writeColor4f(const SkColor4f& color) {
+ fWriter.write(&color, sizeof(SkColor4f));
+}
+
+void SkBinaryWriteBuffer::writeColor4fArray(const SkColor4f* color, uint32_t count) {
+ fWriter.write32(count);
+ fWriter.write(color, count * sizeof(SkColor4f));
+}
+
void SkBinaryWriteBuffer::writePoint(const SkPoint& point) {
fWriter.writeScalar(point.fX);
fWriter.writeScalar(point.fY);