aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2017-02-01 15:01:43 -0800
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-02 16:03:58 +0000
commitebfbba9bbdacd754c8ad7429ee066f53f17bc66b (patch)
treea54ded2d599d3649c933f1f67937467f001429d1 /src
parent41511604ae0aadddef0c4defeb73dcbe4408ff66 (diff)
Don't instantiate shaders with non-invertible local matrix
Change-Id: If11f7d57cbf45929632d858f91c02d8f5fa9f442 Reviewed-on: https://skia-review.googlesource.com/7885 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/core/SkShader.cpp6
-rw-r--r--src/effects/gradients/SkGradientShader.cpp12
2 files changed, 18 insertions, 0 deletions
diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp
index 9e562c9276..9f97a7a74a 100644
--- a/src/core/SkShader.cpp
+++ b/src/core/SkShader.cpp
@@ -241,11 +241,17 @@ sk_sp<SkShader> SkShader::MakeColorShader(SkColor color) { return sk_make_sp<SkC
sk_sp<SkShader> SkShader::MakeBitmapShader(const SkBitmap& src, TileMode tmx, TileMode tmy,
const SkMatrix* localMatrix) {
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
return SkMakeBitmapShader(src, tmx, tmy, localMatrix, kIfMutable_SkCopyPixelsMode, nullptr);
}
sk_sp<SkShader> SkShader::MakePictureShader(sk_sp<SkPicture> src, TileMode tmx, TileMode tmy,
const SkMatrix* localMatrix, const SkRect* tile) {
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
return SkPictureShader::Make(std::move(src), tmx, tmy, localMatrix, tile);
}
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
index 7b91a60f75..03a2db0995 100644
--- a/src/effects/gradients/SkGradientShader.cpp
+++ b/src/effects/gradients/SkGradientShader.cpp
@@ -944,6 +944,9 @@ sk_sp<SkShader> SkGradientShader::MakeLinear(const SkPoint pts[2],
if (1 == colorCount) {
return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
}
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
ColorStopOptimizer opt(colors, pos, colorCount, mode);
@@ -980,6 +983,9 @@ sk_sp<SkShader> SkGradientShader::MakeRadial(const SkPoint& center, SkScalar rad
if (1 == colorCount) {
return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
}
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
ColorStopOptimizer opt(colors, pos, colorCount, mode);
@@ -1026,6 +1032,9 @@ sk_sp<SkShader> SkGradientShader::MakeTwoPointConical(const SkPoint& start,
return SkShader::MakeEmptyShader();
}
}
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
EXPAND_1_COLOR(colorCount);
ColorStopOptimizer opt(colors, pos, colorCount, mode);
@@ -1086,6 +1095,9 @@ sk_sp<SkShader> SkGradientShader::MakeSweep(SkScalar cx, SkScalar cy,
if (1 == colorCount) {
return SkShader::MakeColorShader(colors[0], std::move(colorSpace));
}
+ if (localMatrix && !localMatrix->invert(nullptr)) {
+ return nullptr;
+ }
auto mode = SkShader::kClamp_TileMode;