diff options
author | halcanary <halcanary@google.com> | 2016-08-10 07:13:21 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-10 07:13:21 -0700 |
commit | c5769b2e49a63516f313f42969983f2b9e4d59e0 (patch) | |
tree | 70037e2b33d9ceb7740409c1400d05e2ef152601 /src/core/SkMatrix.cpp | |
parent | d8a620b173113f73ec708bcd2f56d4c2b2bba60c (diff) |
Revert of Change mapRectScaleTranslate to pass args/ret by value (patchset #2 id:20001 of https://codereview.chromium.org/2138943002/ )
Reason for revert:
Build-Ubuntu-GCC-Arm7-Release-Android fails.
Original issue's description:
> Change mapRectScaleTranslate to pass args/ret by value
>
> This reverts commit 6092b6e0e57be20d2e1ad079c0af133d2f67bfd3.
>
> BUG=skia:
> GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2138943002
>
> Committed: https://skia.googlesource.com/skia/+/1bd13ca922d6448d595064faee486eaf3fa56e56
TBR=mtklein@google.com,msarett@google.com,reed@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review-Url: https://codereview.chromium.org/2234843002
Diffstat (limited to 'src/core/SkMatrix.cpp')
-rw-r--r-- | src/core/SkMatrix.cpp | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp index f9c8c9d07e..0fd802087f 100644 --- a/src/core/SkMatrix.cpp +++ b/src/core/SkMatrix.cpp @@ -1097,7 +1097,8 @@ void SkMatrix::mapVectors(SkPoint dst[], const SkPoint src[], int count) const { } } -SkRect SkMatrix::mapRectScaleTranslate(SkRect src) const { +void SkMatrix::mapRectScaleTranslate(SkRect* dst, const SkRect& src) const { + SkASSERT(dst); SkASSERT(this->isScaleTranslate()); SkScalar sx = fMat[kMScaleX]; @@ -1106,25 +1107,22 @@ SkRect SkMatrix::mapRectScaleTranslate(SkRect src) const { 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. - // However, the current ABI for returning multiple floats is to use only 2 slots in each - // vector register. Thus we take [0..1] from min and max, as that perfectly matches the ABI. - SkRect dst; - Sk4f(min[0], min[1], max[0], max[1]).store(&dst.fLeft); - return dst; + // 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->isScaleTranslate()) { - *dst = this->mapRectScaleTranslate(src); + this->mapRectScaleTranslate(dst, src); return true; } else { SkPoint quad[4]; |