diff options
author | Matt Sarett <msarett@google.com> | 2017-05-05 10:38:01 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-05 15:18:03 +0000 |
commit | 9d687dfa3e341bc4bae7806b6e3262ae3d441889 (patch) | |
tree | 8138982a7237fc70cfbd01f16c849388db03d3fd | |
parent | 788c3c467a019f31e6e2c6d07a7b644bc157bb34 (diff) |
Avoid interpolating color lut with less than 2 points
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>
-rw-r--r-- | resources/icc_profiles/invalid_color_lut.icc | bin | 0 -> 688 bytes | |||
-rw-r--r-- | src/core/SkColorLookUpTable.h | 4 | ||||
-rw-r--r-- | src/core/SkColorSpace_ICC.cpp | 4 | ||||
-rw-r--r-- | tests/ColorSpaceTest.cpp | 15 |
4 files changed, 19 insertions, 4 deletions
diff --git a/resources/icc_profiles/invalid_color_lut.icc b/resources/icc_profiles/invalid_color_lut.icc Binary files differnew file mode 100644 index 0000000000..33384cd220 --- /dev/null +++ b/resources/icc_profiles/invalid_color_lut.icc diff --git a/src/core/SkColorLookUpTable.h b/src/core/SkColorLookUpTable.h index cc5415bbe7..09d81880ea 100644 --- a/src/core/SkColorLookUpTable.h +++ b/src/core/SkColorLookUpTable.h @@ -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); + } } /** diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp index 6d4bba26bd..52196091fe 100644 --- a/src/core/SkColorSpace_ICC.cpp +++ b/src/core/SkColorSpace_ICC.cpp @@ -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; } diff --git a/tests/ColorSpaceTest.cpp b/tests/ColorSpaceTest.cpp index 2eb7347092..9b2e1b3dc6 100644 --- a/tests/ColorSpaceTest.cpp +++ b/tests/ColorSpaceTest.cpp @@ -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) { |