aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2018-02-01 16:34:03 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-02-01 21:59:09 +0000
commita12c419679e5b37b6140a2b33d207fb00a2b891a (patch)
tree7d7ed2dde942dc3481cd3a450a73c2c4559497af /src/shaders
parentd653cac70ed17983125ceed053138c09f1401846 (diff)
check matrix for SkFixed32.32 compatibility
Will have to see if we change any layouttest results Bug: skia:7569 Change-Id: Id9676ec76a931c9d4d40c79fb0a469c2a215ad5a Reviewed-on: https://skia-review.googlesource.com/102206 Reviewed-by: Mike Klein <mtklein@chromium.org> Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/shaders')
-rw-r--r--src/shaders/SkImageShader.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 4eaeae2d28..22c3b7633b 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -61,6 +61,34 @@ bool SkImageShader::isOpaque() const {
return fImage->isOpaque();
}
+static bool legacy_shader_can_handle(const SkMatrix& a, const SkMatrix& b) {
+ SkMatrix m = SkMatrix::Concat(a, b);
+ if (!m.isScaleTranslate()) {
+ return false;
+ }
+
+ SkMatrix inv;
+ if (!m.invert(&inv)) {
+ return false;
+ }
+
+ // legacy code uses SkFixed 32.32, so ensure the inverse doesn't map device coordinates
+ // out of range.
+ const SkScalar max_dev_coord = 32767.0f;
+ SkRect src;
+ SkAssertResult(inv.mapRect(&src, SkRect::MakeWH(max_dev_coord, max_dev_coord)));
+
+ // take 1/2 of max signed 32bits so we have room to subtract coordinates
+ const SkScalar max_fixed32dot32 = SK_MaxS32 * 0.5f;
+ if (!SkRect::MakeLTRB(-max_fixed32dot32, -max_fixed32dot32,
+ max_fixed32dot32, max_fixed32dot32).contains(src)) {
+ return false;
+ }
+
+ // legacy shader impl should be able to handle these matrices
+ return true;
+}
+
bool SkImageShader::IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType ct, SkAlphaType at,
SkShader::TileMode tx, SkShader::TileMode ty,
const SkMatrix& localM) {
@@ -75,10 +103,7 @@ bool SkImageShader::IsRasterPipelineOnly(const SkMatrix& ctm, SkColorType ct, Sk
return true;
}
#endif
- if (!ctm.isScaleTranslate()) {
- return true;
- }
- if (!localM.isScaleTranslate()) {
+ if (!legacy_shader_can_handle(ctm, localM)) {
return true;
}
return false;