diff options
author | Mike Reed <reed@google.com> | 2018-02-01 16:34:03 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-01 21:59:09 +0000 |
commit | a12c419679e5b37b6140a2b33d207fb00a2b891a (patch) | |
tree | 7d7ed2dde942dc3481cd3a450a73c2c4559497af /src/shaders | |
parent | d653cac70ed17983125ceed053138c09f1401846 (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.cpp | 33 |
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; |