diff options
author | reed <reed@google.com> | 2016-06-30 06:38:54 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-06-30 06:38:54 -0700 |
commit | 47df89ebfd548de2ccd91387e1d7eee418b65f96 (patch) | |
tree | 97ef6df66cec123f559f7feb98dd5942670bf744 /src/core/SkMatrix.cpp | |
parent | 501ca7f538f129efd27113e641ad17363920886e (diff) |
speed up maprect for scale+trans case
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2111703002
Review-Url: https://codereview.chromium.org/2111703002
Diffstat (limited to 'src/core/SkMatrix.cpp')
-rw-r--r-- | src/core/SkMatrix.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp index 5711bd9aef..492f3f6ac4 100644 --- a/src/core/SkMatrix.cpp +++ b/src/core/SkMatrix.cpp @@ -1097,12 +1097,32 @@ void SkMatrix::mapVectors(SkPoint dst[], const SkPoint src[], int count) const { } } +void SkMatrix::mapRectScaleTranslate(SkRect* dst, const SkRect& src) const { + SkASSERT(dst); + SkASSERT(this->isScaleTranslate()); + + SkScalar sx = fMat[kMScaleX]; + SkScalar sy = fMat[kMScaleY]; + SkScalar tx = fMat[kMTransX]; + SkScalar ty = fMat[kMTransY]; + Sk4f scale(sx, sy, sx, sy); + Sk4f trans(tx, ty, tx, ty); + + Sk4f ltrb = Sk4f::Load(&src.fLeft) * scale + trans; + // need to sort so we're not inverted + Sk4f rblt(ltrb[2], ltrb[3], ltrb[0], ltrb[1]); + Sk4f min = Sk4f::Min(ltrb, rblt); + Sk4f max = Sk4f::Max(ltrb, rblt); + // We can extract either pair [0,1] or [2,3] from min and max and be correct, but on + // ARM this sequence generates the fastest (a single instruction). + Sk4f(min[2], min[3], max[0], max[1]).store(&dst->fLeft); +} + bool SkMatrix::mapRect(SkRect* dst, const SkRect& src) const { SkASSERT(dst); - if (this->rectStaysRect()) { - this->mapPoints((SkPoint*)dst, (const SkPoint*)&src, 2); - dst->sort(); + if (this->isScaleTranslate()) { + this->mapRectScaleTranslate(dst, src); return true; } else { SkPoint quad[4]; |