Avoid interpolating color lut with less than 2 points
authorMatt Sarett <msarett@google.com>
Fri, 5 May 2017 14:38:01 +0000 (10:38 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 5 May 2017 15:18:03 +0000 (15:18 +0000)
Bug: 717935
Change-Id: Ibf15b815891eef5a0239bc408bcbfe7c8b1507c5
Reviewed-on: https://skia-review.googlesource.com/15301
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
resources/icc_profiles/invalid_color_lut.icc [new file with mode: 0644]
src/core/SkColorLookUpTable.h
src/core/SkColorSpace_ICC.cpp
tests/ColorSpaceTest.cpp

diff --git a/resources/icc_profiles/invalid_color_lut.icc b/resources/icc_profiles/invalid_color_lut.icc
new file mode 100644 (file)
index 0000000..33384cd
Binary files /dev/null and b/resources/icc_profiles/invalid_color_lut.icc differ
index cc5415b..09d8188 100644 (file)
@@ -21,6 +21,10 @@ public:
         : fInputChannels(inputChannels) {
         SkASSERT(inputChannels >= 1 && inputChannels <= kMaxColorChannels);
         memcpy(fGridPoints, gridPoints, fInputChannels * sizeof(uint8_t));
+
+        for (int i = 0; i < inputChannels; i++) {
+            SkASSERT(fGridPoints[i] > 1);
+        }
     }
 
     /**
index 6d4bba2..5219609 100644 (file)
@@ -595,8 +595,8 @@ static bool load_color_lut(sk_sp<SkColorLookUpTable>* colorLUT, uint32_t inputCh
 
     uint32_t numEntries = SkColorLookUpTable::kOutputChannels;
     for (uint32_t i = 0; i < inputChannels; i++) {
-        if (0 == gridPoints[i]) {
-            SkColorSpacePrintf("Each input channel must have at least one grid point.");
+        if (1 >= gridPoints[i]) {
+            SkColorSpacePrintf("Each input channel must have at least two grid points.");
             return false;
         }
 
index 2eb7347..9b2e1b3 100644 (file)
@@ -446,10 +446,21 @@ DEF_TEST(ColorSpace_Primaries, r) {
 
 DEF_TEST(ColorSpace_InvalidICC, r) {
     // This color space has a matrix that is not D50.
-    sk_sp<SkData> data = SkData::MakeFromFileName(
-            GetResourcePath("icc_profiles/SM2333SW.icc").c_str());
+    sk_sp<SkData> data = GetResourceAsData("icc_profiles/SM2333SW.icc");
+    if (!data) {
+        return;
+    }
     sk_sp<SkColorSpace> cs = SkColorSpace::MakeICC(data->data(), data->size());
     REPORTER_ASSERT(r, !cs);
+
+    // The color space has a color lut with only one entry in each dimension.
+    data = GetResourceAsData("icc_profiles/invalid_color_lut.icc");
+    if (!data) {
+        return;
+    }
+
+    cs = SkColorSpace::MakeICC(data->data(), data->size());
+    REPORTER_ASSERT(r, !cs);
 }
 
 DEF_TEST(ColorSpace_MatrixHash, r) {