Write ICC profiles from SkColorSpace object

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2001203003

Review-Url: https://codereview.chromium.org/2001203003
diff --git a/tests/ColorSpaceTest.cpp b/tests/ColorSpaceTest.cpp
index da69ea7..b26cec2 100644
--- a/tests/ColorSpaceTest.cpp
+++ b/tests/ColorSpaceTest.cpp
@@ -46,10 +46,11 @@
                              0.3853f, 0.7170f, 0.0971f,   // G
                              0.1430f, 0.0606f, 0.7139f }; // B
 
+const float g_sRGB_gamma[] = { 2.2f, 2.2f, 2.2f };
+
 DEF_TEST(ColorSpace_sRGB, r) {
-    const float srgb_gamma[] = { 2.2f, 2.2f, 2.2f };
     test_space(r, SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named).get(),
-               g_sRGB_XYZ, &g_sRGB_XYZ[3], &g_sRGB_XYZ[6], srgb_gamma);
+               g_sRGB_XYZ, &g_sRGB_XYZ[3], &g_sRGB_XYZ[6], g_sRGB_gamma);
 
 }
 
@@ -72,11 +73,7 @@
     SkColorSpace* colorSpace = codec->getColorSpace();
     REPORTER_ASSERT(r, nullptr != colorSpace);
 
-    const float red[] = { 0.436066f, 0.222488f, 0.013916f };
-    const float green[] = { 0.385147f, 0.716873f, 0.0970764f };
-    const float blue[] = { 0.143066f, 0.0606079f, 0.714096f };
-    const float gamma[] = { 2.2f, 2.2f, 2.2f };
-    test_space(r, colorSpace, red, green, blue, gamma);
+    test_space(r, colorSpace, &g_sRGB_XYZ[0], &g_sRGB_XYZ[3], &g_sRGB_XYZ[6], g_sRGB_gamma);
 #endif
 }
 
@@ -99,24 +96,45 @@
     const float red[] = { 0.385117f, 0.716904f, 0.0970612f };
     const float green[] = { 0.143051f, 0.0606079f, 0.713913f };
     const float blue[] = { 0.436035f, 0.222488f, 0.013916f };
-    const float gamma[] = { 2.2f, 2.2f, 2.2f };
-    test_space(r, colorSpace, red, green, blue, gamma);
+    test_space(r, colorSpace, red, green, blue, g_sRGB_gamma);
 }
 
 DEF_TEST(ColorSpaceSRGBCompare, r) {
     // Create an sRGB color space by name
     sk_sp<SkColorSpace> namedColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
 
-
     // Create an sRGB color space by value
     SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
-    float sRGBGammas[3] = { 2.2f, 2.2f, 2.2f };
     srgbToxyzD50.set3x3ColMajorf(g_sRGB_XYZ);
-    sk_sp<SkColorSpace> rgbColorSpace = SkColorSpace::NewRGB(sRGBGammas, srgbToxyzD50);
-    REPORTER_ASSERT(r, namedColorSpace == namedColorSpace);
+    sk_sp<SkColorSpace> rgbColorSpace = SkColorSpace::NewRGB(g_sRGB_gamma, srgbToxyzD50);
+    REPORTER_ASSERT(r, rgbColorSpace == namedColorSpace);
 
     // Change a single value from the sRGB matrix
     srgbToxyzD50.set(2, 2, 0.5f);
-    sk_sp<SkColorSpace> strangeColorSpace = SkColorSpace::NewRGB(sRGBGammas, srgbToxyzD50);
+    sk_sp<SkColorSpace> strangeColorSpace = SkColorSpace::NewRGB(g_sRGB_gamma, srgbToxyzD50);
     REPORTER_ASSERT(r, strangeColorSpace != namedColorSpace);
 }
+
+DEF_TEST(ColorSpaceWriteICC, r) {
+    // Test writing a new ICC profile
+    sk_sp<SkColorSpace> namedColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
+    sk_sp<SkData> namedData = as_CSB(namedColorSpace)->writeToICC();
+    sk_sp<SkColorSpace> iccColorSpace = SkColorSpace::NewICC(namedData->data(), namedData->size());
+    test_space(r, iccColorSpace.get(), g_sRGB_XYZ, &g_sRGB_XYZ[3], &g_sRGB_XYZ[6], g_sRGB_gamma);
+    REPORTER_ASSERT(r, iccColorSpace == namedColorSpace);
+
+    // Test saving the original ICC data
+    sk_sp<SkData> monitorData = SkData::MakeFromFileName(
+            GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str());
+    REPORTER_ASSERT(r, monitorData);
+    if (!monitorData) {
+        return;
+    }
+    sk_sp<SkColorSpace> monitorSpace = SkColorSpace::NewICC(monitorData->data(),
+                                                            monitorData->size());
+    sk_sp<SkData> newMonitorData = as_CSB(monitorSpace)->writeToICC();
+    sk_sp<SkColorSpace> newMonitorSpace = SkColorSpace::NewICC(newMonitorData->data(),
+                                                               newMonitorData->size());
+    REPORTER_ASSERT(r, monitorSpace->xyz() == newMonitorSpace->xyz());
+    REPORTER_ASSERT(r, as_CSB(monitorSpace)->gammas() == as_CSB(newMonitorSpace)->gammas());
+}