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);