diff options
author | Florin Malita <fmalita@chromium.org> | 2017-07-17 16:26:57 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-17 20:57:48 +0000 |
commit | 0983268dd52150fb968fb10bed2e8541095f12a1 (patch) | |
tree | 29f8febe012adcdd0cdebac12db0b79896dd879f /src/core/SkBitmapProcState.cpp | |
parent | 3cf6b79e50f148cae7ed8c6ec0cd79f1ede71c95 (diff) |
Skip bilerp for integral-translate-only matrices
BUG=chromium:744674
Change-Id: I053a0c26b0f644faa11f469b8a6486302a5efae6
Reviewed-on: https://skia-review.googlesource.com/24126
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkBitmapProcState.cpp')
-rw-r--r-- | src/core/SkBitmapProcState.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 3e7bc880a5..0e534274ef 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -61,6 +61,18 @@ static bool just_trans_general(const SkMatrix& matrix) { && SkScalarNearlyZero(matrix[SkMatrix::kMScaleY] - SK_Scalar1, tol); } +/** + * Determine if the matrix can be treated as integral-only-translate, + * for the purpose of filtering. + */ +static bool just_trans_integral(const SkMatrix& m) { + static constexpr SkScalar tol = SK_Scalar1 / 256; + + return m.getType() <= SkMatrix::kTranslate_Mask + && SkScalarNearlyEqual(m.getTranslateX(), SkScalarRoundToScalar(m.getTranslateX()), tol) + && SkScalarNearlyEqual(m.getTranslateY(), SkScalarRoundToScalar(m.getTranslateY()), tol); +} + static bool valid_for_filtering(unsigned dimension) { // for filtering, width and height must fit in 14bits, since we use steal // 2 bits from each to store our 4bit subpixel data @@ -118,12 +130,11 @@ bool SkBitmapProcInfo::init(const SkMatrix& inv, const SkPaint& paint) { fInvType = fInvMatrix.getType(); if (kLow_SkFilterQuality == fFilterQuality && - !valid_for_filtering(fPixmap.width() | fPixmap.height())) { + (!valid_for_filtering(fPixmap.width() | fPixmap.height()) || + just_trans_integral(fInvMatrix))) { fFilterQuality = kNone_SkFilterQuality; } - // TODO: skip bilerp for integral translates - return true; } |