From e8db3ef2a2161084fa8eb1fd1d54c35bfff52d6c Mon Sep 17 00:00:00 2001 From: reed Date: Tue, 30 Sep 2014 07:24:46 -0700 Subject: [PATCH] specialize setConcat for scale+translate, helps drawText perf BUG=skia: R=jvanverth@google.com Author: reed@google.com Review URL: https://codereview.chromium.org/620433002 --- include/core/SkMatrix.h | 23 ++++++++++++++++++ src/core/SkMatrix.cpp | 62 +++++++++++++++++-------------------------------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/include/core/SkMatrix.h b/include/core/SkMatrix.h index 9f44bed..b3c7378 100644 --- a/include/core/SkMatrix.h +++ b/include/core/SkMatrix.h @@ -646,6 +646,29 @@ private: SkScalar fMat[9]; mutable SkTRacy fTypeMask; + void setScaleTranslate(SkScalar sx, SkScalar sy, SkScalar tx, SkScalar ty) { + fMat[kMScaleX] = sx; + fMat[kMSkewX] = 0; + fMat[kMTransX] = tx; + + fMat[kMSkewY] = 0; + fMat[kMScaleY] = sy; + fMat[kMTransY] = ty; + + fMat[kMPersp0] = 0; + fMat[kMPersp1] = 0; + fMat[kMPersp2] = 1; + + unsigned mask = 0; + if (sx != 1 || sy != 1) { + mask |= kScale_Mask; + } + if (tx || ty) { + mask |= kTranslate_Mask; + } + this->setTypeMask(mask | kRectStaysRect_Mask); + } + uint8_t computeTypeMask() const; uint8_t computePerspectiveTypeMask() const; diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp index 956cf46..3f235d5 100644 --- a/src/core/SkMatrix.cpp +++ b/src/core/SkMatrix.cpp @@ -280,16 +280,7 @@ void SkMatrix::setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py) { if (1 == sx && 1 == sy) { this->reset(); } else { - fMat[kMScaleX] = sx; - fMat[kMScaleY] = sy; - fMat[kMTransX] = px - sx * px; - fMat[kMTransY] = py - sy * py; - fMat[kMPersp2] = 1; - - fMat[kMSkewX] = fMat[kMSkewY] = - fMat[kMPersp0] = fMat[kMPersp1] = 0; - - this->setTypeMask(kScale_Mask | kTranslate_Mask | kRectStaysRect_Mask); + this->setScaleTranslate(sx, sy, px - sx * px, py - sy * py); } } @@ -390,8 +381,7 @@ bool SkMatrix::postIDiv(int divx, int divy) { //////////////////////////////////////////////////////////////////////////////////// -void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, - SkScalar px, SkScalar py) { +void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, SkScalar px, SkScalar py) { const SkScalar oneMinusCosV = 1 - cosV; fMat[kMScaleX] = cosV; @@ -517,9 +507,7 @@ void SkMatrix::postSkew(SkScalar sx, SkScalar sy) { /////////////////////////////////////////////////////////////////////////////// -bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, - ScaleToFit align) -{ +bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit align) { if (src.isEmpty()) { this->reset(); return false; @@ -527,6 +515,7 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, if (dst.isEmpty()) { sk_bzero(fMat, 8 * sizeof(SkScalar)); + fMat[kMPersp2] = 1; this->setTypeMask(kScale_Mask | kRectStaysRect_Mask); } else { SkScalar tx, sx = dst.width() / src.width(); @@ -564,24 +553,8 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, } } - fMat[kMScaleX] = sx; - fMat[kMScaleY] = sy; - fMat[kMTransX] = tx; - fMat[kMTransY] = ty; - fMat[kMSkewX] = fMat[kMSkewY] = - fMat[kMPersp0] = fMat[kMPersp1] = 0; - - unsigned mask = kRectStaysRect_Mask; - if (sx != 1 || sy != 1) { - mask |= kScale_Mask; - } - if (tx || ty) { - mask |= kTranslate_Mask; - } - this->setTypeMask(mask); + this->setScaleTranslate(sx, sy, tx, ty); } - // shared cleanup - fMat[kMPersp2] = 1; return true; } @@ -602,14 +575,23 @@ static void normalize_perspective(SkScalar mat[9]) { } } +static bool only_scale_and_translate(unsigned mask) { + return 0 == (mask & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)); +} + void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { - TypeMask aType = a.getPerspectiveTypeMaskOnly(); - TypeMask bType = b.getPerspectiveTypeMaskOnly(); + TypeMask aType = a.getType(); + TypeMask bType = b.getType(); if (a.isTriviallyIdentity()) { *this = b; } else if (b.isTriviallyIdentity()) { *this = a; + } else if (only_scale_and_translate(aType | bType)) { + this->setScaleTranslate(a.fMat[kMScaleX] * b.fMat[kMScaleX], + a.fMat[kMScaleY] * b.fMat[kMScaleY], + a.fMat[kMScaleX] * b.fMat[kMTransX] + a.fMat[kMTransX], + a.fMat[kMScaleY] * b.fMat[kMTransY] + a.fMat[kMTransY]); } else { SkMatrix tmp; @@ -626,7 +608,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { normalize_perspective(tmp.fMat); tmp.setTypeMask(kUnknown_Mask); - } else { // not perspective + } else { tmp.fMat[kMScaleX] = muladdmul(a.fMat[kMScaleX], b.fMat[kMScaleX], a.fMat[kMSkewX], @@ -640,9 +622,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { tmp.fMat[kMTransX] = muladdmul(a.fMat[kMScaleX], b.fMat[kMTransX], a.fMat[kMSkewX], - b.fMat[kMTransY]); - - tmp.fMat[kMTransX] += a.fMat[kMTransX]; + b.fMat[kMTransY]) + a.fMat[kMTransX]; tmp.fMat[kMSkewY] = muladdmul(a.fMat[kMSkewY], b.fMat[kMScaleX], @@ -657,10 +637,10 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) { tmp.fMat[kMTransY] = muladdmul(a.fMat[kMSkewY], b.fMat[kMTransX], a.fMat[kMScaleY], - b.fMat[kMTransY]); + b.fMat[kMTransY]) + a.fMat[kMTransY]; - tmp.fMat[kMTransY] += a.fMat[kMTransY]; - tmp.fMat[kMPersp0] = tmp.fMat[kMPersp1] = 0; + tmp.fMat[kMPersp0] = 0; + tmp.fMat[kMPersp1] = 0; tmp.fMat[kMPersp2] = 1; //SkDebugf("Concat mat non-persp type: %d\n", tmp.getType()); //SkASSERT(!(tmp.getType() & kPerspective_Mask)); -- 2.7.4