aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkMatrix.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2016-08-10 07:13:21 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-10 07:13:21 -0700
commitc5769b2e49a63516f313f42969983f2b9e4d59e0 (patch)
tree70037e2b33d9ceb7740409c1400d05e2ef152601 /src/core/SkMatrix.cpp
parentd8a620b173113f73ec708bcd2f56d4c2b2bba60c (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.cpp16
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];