specialize setConcat for scale+translate

This reverts commit 2a382f5199.

BUG=skia:

Review URL: https://codereview.chromium.org/626583002
This commit is contained in:
reed 2014-10-02 12:58:43 -07:00 committed by Commit bot
parent b4b7a4c9ea
commit d1f0ebd0e2
2 changed files with 44 additions and 41 deletions

View File

@ -646,6 +646,29 @@ private:
SkScalar fMat[9]; SkScalar fMat[9];
mutable SkTRacy<uint32_t> fTypeMask; mutable SkTRacy<uint32_t> 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 computeTypeMask() const;
uint8_t computePerspectiveTypeMask() const; uint8_t computePerspectiveTypeMask() const;

View File

@ -280,16 +280,7 @@ void SkMatrix::setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py) {
if (1 == sx && 1 == sy) { if (1 == sx && 1 == sy) {
this->reset(); this->reset();
} else { } else {
fMat[kMScaleX] = sx; this->setScaleTranslate(sx, sy, px - sx * px, py - sy * py);
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);
} }
} }
@ -390,8 +381,7 @@ bool SkMatrix::postIDiv(int divx, int divy) {
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, void SkMatrix::setSinCos(SkScalar sinV, SkScalar cosV, SkScalar px, SkScalar py) {
SkScalar px, SkScalar py) {
const SkScalar oneMinusCosV = 1 - cosV; const SkScalar oneMinusCosV = 1 - cosV;
fMat[kMScaleX] = cosV; fMat[kMScaleX] = cosV;
@ -517,9 +507,7 @@ void SkMatrix::postSkew(SkScalar sx, SkScalar sy) {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst, ScaleToFit align) {
ScaleToFit align)
{
if (src.isEmpty()) { if (src.isEmpty()) {
this->reset(); this->reset();
return false; return false;
@ -527,6 +515,7 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst,
if (dst.isEmpty()) { if (dst.isEmpty()) {
sk_bzero(fMat, 8 * sizeof(SkScalar)); sk_bzero(fMat, 8 * sizeof(SkScalar));
fMat[kMPersp2] = 1;
this->setTypeMask(kScale_Mask | kRectStaysRect_Mask); this->setTypeMask(kScale_Mask | kRectStaysRect_Mask);
} else { } else {
SkScalar tx, sx = dst.width() / src.width(); SkScalar tx, sx = dst.width() / src.width();
@ -564,24 +553,8 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst,
} }
} }
fMat[kMScaleX] = sx; this->setScaleTranslate(sx, sy, tx, ty);
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);
} }
// shared cleanup
fMat[kMPersp2] = 1;
return true; 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) { void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) {
TypeMask aType = a.getPerspectiveTypeMaskOnly(); TypeMask aType = a.getType();
TypeMask bType = b.getPerspectiveTypeMaskOnly(); TypeMask bType = b.getType();
if (a.isTriviallyIdentity()) { if (a.isTriviallyIdentity()) {
*this = b; *this = b;
} else if (b.isTriviallyIdentity()) { } else if (b.isTriviallyIdentity()) {
*this = a; *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 { } else {
SkMatrix tmp; SkMatrix tmp;
@ -626,7 +608,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) {
normalize_perspective(tmp.fMat); normalize_perspective(tmp.fMat);
tmp.setTypeMask(kUnknown_Mask); tmp.setTypeMask(kUnknown_Mask);
} else { // not perspective } else {
tmp.fMat[kMScaleX] = muladdmul(a.fMat[kMScaleX], tmp.fMat[kMScaleX] = muladdmul(a.fMat[kMScaleX],
b.fMat[kMScaleX], b.fMat[kMScaleX],
a.fMat[kMSkewX], a.fMat[kMSkewX],
@ -640,9 +622,7 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) {
tmp.fMat[kMTransX] = muladdmul(a.fMat[kMScaleX], tmp.fMat[kMTransX] = muladdmul(a.fMat[kMScaleX],
b.fMat[kMTransX], b.fMat[kMTransX],
a.fMat[kMSkewX], a.fMat[kMSkewX],
b.fMat[kMTransY]); b.fMat[kMTransY]) + a.fMat[kMTransX];
tmp.fMat[kMTransX] += a.fMat[kMTransX];
tmp.fMat[kMSkewY] = muladdmul(a.fMat[kMSkewY], tmp.fMat[kMSkewY] = muladdmul(a.fMat[kMSkewY],
b.fMat[kMScaleX], b.fMat[kMScaleX],
@ -657,10 +637,10 @@ void SkMatrix::setConcat(const SkMatrix& a, const SkMatrix& b) {
tmp.fMat[kMTransY] = muladdmul(a.fMat[kMSkewY], tmp.fMat[kMTransY] = muladdmul(a.fMat[kMSkewY],
b.fMat[kMTransX], b.fMat[kMTransX],
a.fMat[kMScaleY], a.fMat[kMScaleY],
b.fMat[kMTransY]); b.fMat[kMTransY]) + a.fMat[kMTransY];
tmp.fMat[kMTransY] += a.fMat[kMTransY]; tmp.fMat[kMPersp0] = 0;
tmp.fMat[kMPersp0] = tmp.fMat[kMPersp1] = 0; tmp.fMat[kMPersp1] = 0;
tmp.fMat[kMPersp2] = 1; tmp.fMat[kMPersp2] = 1;
//SkDebugf("Concat mat non-persp type: %d\n", tmp.getType()); //SkDebugf("Concat mat non-persp type: %d\n", tmp.getType());
//SkASSERT(!(tmp.getType() & kPerspective_Mask)); //SkASSERT(!(tmp.getType() & kPerspective_Mask));