diff options
author | Mike Klein <mtklein@chromium.org> | 2017-07-25 17:26:19 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-26 12:55:09 +0000 |
commit | 7a0ba1c1323d3cdad3057d393596692d54011e91 (patch) | |
tree | 7f668bf6ff84f7ba68c43c72bf16e55d01cffa8e /tests | |
parent | 103611d4c7c64316e5839abdc7bb6153eb1d28e1 (diff) |
guard SkTableColorFilter against out-of-range inputs
I was going to be clever here and only clamp when we
know the inputs are out of range, but this filter is
rare and slow enough that I think I'd rather it just
be super paranoid safe.
The test crashes without this fix and passes with it.
Change-Id: I4e17aad2b5c1e96180ce8d73b97bee746cf985c2
Reviewed-on: https://skia-review.googlesource.com/26702
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/TableColorFilterTest.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/TableColorFilterTest.cpp b/tests/TableColorFilterTest.cpp new file mode 100644 index 0000000000..baf6a47b14 --- /dev/null +++ b/tests/TableColorFilterTest.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Test.h" + +#include "SkColorSpace.h" +#include "SkTableColorFilter.h" +#include "SkToSRGBColorFilter.h" + +// SkToSRGBColorFilter makes it easy to create out of range (>1, <0) color values. +// Those can be dangerous as inputs to naive implementation of SkTableColorFilter. +// This tests that our implementation is safe. + +DEF_TEST(TableColorFilter, r) { + // Using a wide source gamut will make saturated colors go well out of range of sRGB. + auto rec2020 = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, + SkColorSpace::kRec2020_Gamut); + sk_sp<SkColorFilter> to_srgb = SkToSRGBColorFilter::Make(rec2020); + + // Any table will work fine here. An identity table makes testing easy. + uint8_t identity[256]; + for (int i = 0; i < 256; i++) { + identity[i] = i; + } + sk_sp<SkColorFilter> table = SkTableColorFilter::Make(identity); + + // The rec2020 primaries are not representable in sRGB, but will clamp to the sRGB primaries. + SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; + sk_sp<SkColorFilter> composed = SkColorFilter::MakeComposeFilter(table, to_srgb); + for (auto color : colors) { + REPORTER_ASSERT(r, composed->filterColor(color) == color); + } +} |