Consolidate SkCanvas matrix virtuals.
Remove didTranslate, didScale, didRotate & didSkew, and rely on
didConcat instead. Subclasses can sniff the matrix type if they want to
differentiate.
(work in progress)
R=reed@google.com, robertphillips@google.com
Author: fmalita@chromium.org
Review URL: https://codereview.chromium.org/203203004
git-svn-id: http://skia.googlecode.com/svn/trunk@13940 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkBBoxHierarchyRecord.cpp b/src/core/SkBBoxHierarchyRecord.cpp
index eadd206..16ade77 100644
--- a/src/core/SkBBoxHierarchyRecord.cpp
+++ b/src/core/SkBBoxHierarchyRecord.cpp
@@ -43,26 +43,6 @@
this->INHERITED::willRestore();
}
-void SkBBoxHierarchyRecord::didTranslate(SkScalar dx, SkScalar dy) {
- fStateTree->appendTransform(getTotalMatrix());
- INHERITED::didTranslate(dx, dy);
-}
-
-void SkBBoxHierarchyRecord::didScale(SkScalar sx, SkScalar sy) {
- fStateTree->appendTransform(getTotalMatrix());
- INHERITED::didScale(sx, sy);
-}
-
-void SkBBoxHierarchyRecord::didRotate(SkScalar degrees) {
- fStateTree->appendTransform(getTotalMatrix());
- INHERITED::didRotate(degrees);
-}
-
-void SkBBoxHierarchyRecord::didSkew(SkScalar sx, SkScalar sy) {
- fStateTree->appendTransform(getTotalMatrix());
- INHERITED::didSkew(sx, sy);
-}
-
void SkBBoxHierarchyRecord::didConcat(const SkMatrix& matrix) {
fStateTree->appendTransform(getTotalMatrix());
INHERITED::didConcat(matrix);
diff --git a/src/core/SkBBoxHierarchyRecord.h b/src/core/SkBBoxHierarchyRecord.h
index 08de7db..51fce0d 100644
--- a/src/core/SkBBoxHierarchyRecord.h
+++ b/src/core/SkBBoxHierarchyRecord.h
@@ -31,10 +31,6 @@
virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
virtual void willRestore() SK_OVERRIDE;
- virtual void didTranslate(SkScalar, SkScalar) SK_OVERRIDE;
- virtual void didScale(SkScalar, SkScalar) SK_OVERRIDE;
- virtual void didRotate(SkScalar) SK_OVERRIDE;
- virtual void didSkew(SkScalar, SkScalar) SK_OVERRIDE;
virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 787d89d..45f5e07 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1325,52 +1325,28 @@
}
/////////////////////////////////////////////////////////////////////////////
-void SkCanvas::didTranslate(SkScalar, SkScalar) {
- // Do nothing. Subclasses may do something.
-}
-
void SkCanvas::translate(SkScalar dx, SkScalar dy) {
- fDeviceCMDirty = true;
- fCachedLocalClipBoundsDirty = true;
- fMCRec->fMatrix->preTranslate(dx, dy);
-
- this->didTranslate(dx, dy);
-}
-
-void SkCanvas::didScale(SkScalar, SkScalar) {
- // Do nothing. Subclasses may do something.
+ SkMatrix m;
+ m.setTranslate(dx, dy);
+ this->concat(m);
}
void SkCanvas::scale(SkScalar sx, SkScalar sy) {
- fDeviceCMDirty = true;
- fCachedLocalClipBoundsDirty = true;
- fMCRec->fMatrix->preScale(sx, sy);
-
- this->didScale(sx, sy);
-}
-
-void SkCanvas::didRotate(SkScalar) {
- // Do nothing. Subclasses may do something.
+ SkMatrix m;
+ m.setScale(sx, sy);
+ this->concat(m);
}
void SkCanvas::rotate(SkScalar degrees) {
- fDeviceCMDirty = true;
- fCachedLocalClipBoundsDirty = true;
- fMCRec->fMatrix->preRotate(degrees);
-
- this->didRotate(degrees);
-}
-
-void SkCanvas::didSkew(SkScalar, SkScalar) {
- // Do nothing. Subclasses may do something.
+ SkMatrix m;
+ m.setRotate(degrees);
+ this->concat(m);
}
void SkCanvas::skew(SkScalar sx, SkScalar sy) {
- fDeviceCMDirty = true;
- fCachedLocalClipBoundsDirty = true;
- fMCRec->fMatrix->preSkew(sx, sy);
-
- this->didSkew(sx, sy);
+ SkMatrix m;
+ m.setSkew(sx, sy);
+ this->concat(m);
}
void SkCanvas::didConcat(const SkMatrix&) {
@@ -1378,6 +1354,10 @@
}
void SkCanvas::concat(const SkMatrix& matrix) {
+ if (matrix.isIdentity()) {
+ return;
+ }
+
fDeviceCMDirty = true;
fCachedLocalClipBoundsDirty = true;
fMCRec->fMatrix->preConcat(matrix);
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index ce21d95..997b974 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -664,62 +664,26 @@
this->validate(initialOffset, size);
}
-void SkPictureRecord::didTranslate(SkScalar dx, SkScalar dy) {
-#ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
- fMCMgr.translate(dx, dy);
-#else
+void SkPictureRecord::recordTranslate(const SkMatrix& m) {
+ SkASSERT(SkMatrix::kTranslate_Mask == m.getType());
+
// op + dx + dy
uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar);
size_t initialOffset = this->addDraw(TRANSLATE, &size);
- this->addScalar(dx);
- this->addScalar(dy);
+ this->addScalar(m.getTranslateX());
+ this->addScalar(m.getTranslateY());
this->validate(initialOffset, size);
-#endif
- this->INHERITED::didTranslate(dx, dy);
}
-void SkPictureRecord::didScale(SkScalar sx, SkScalar sy) {
+void SkPictureRecord::recordScale(const SkMatrix& m) {
+ SkASSERT(SkMatrix::kScale_Mask == m.getType());
-#ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
- fMCMgr.scale(sx, sy);
-#else
// op + sx + sy
uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar);
size_t initialOffset = this->addDraw(SCALE, &size);
- this->addScalar(sx);
- this->addScalar(sy);
+ this->addScalar(m.getScaleX());
+ this->addScalar(m.getScaleY());
this->validate(initialOffset, size);
-#endif
- this->INHERITED::didScale(sx, sy);
-}
-
-void SkPictureRecord::didRotate(SkScalar degrees) {
-
-#ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
- fMCMgr.rotate(degrees);
-#else
- // op + degrees
- uint32_t size = 1 * kUInt32Size + sizeof(SkScalar);
- size_t initialOffset = this->addDraw(ROTATE, &size);
- this->addScalar(degrees);
- this->validate(initialOffset, size);
-#endif
- this->INHERITED::didRotate(degrees);
-}
-
-void SkPictureRecord::didSkew(SkScalar sx, SkScalar sy) {
-
-#ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
- fMCMgr.skew(sx, sy);
-#else
- // op + sx + sy
- uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar);
- size_t initialOffset = this->addDraw(SKEW, &size);
- this->addScalar(sx);
- this->addScalar(sy);
- this->validate(initialOffset, size);
-#endif
- this->INHERITED::didSkew(sx, sy);
}
void SkPictureRecord::didConcat(const SkMatrix& matrix) {
@@ -727,7 +691,17 @@
#ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
fMCMgr.concat(matrix);
#else
- this->recordConcat(matrix);
+ switch (matrix.getType()) {
+ case SkMatrix::kTranslate_Mask:
+ this->recordTranslate(matrix);
+ break;
+ case SkMatrix::kScale_Mask:
+ this->recordScale(matrix);
+ break;
+ default:
+ this->recordConcat(matrix);
+ break;
+ }
#endif
this->INHERITED::didConcat(matrix);
}
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index c0b0eb1..eca42aa 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -223,10 +223,6 @@
virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
virtual void willRestore() SK_OVERRIDE;
- virtual void didTranslate(SkScalar, SkScalar) SK_OVERRIDE;
- virtual void didScale(SkScalar, SkScalar) SK_OVERRIDE;
- virtual void didRotate(SkScalar) SK_OVERRIDE;
- virtual void didSkew(SkScalar, SkScalar) SK_OVERRIDE;
virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
@@ -266,6 +262,8 @@
// restores to be deferred (e.g., if the MC state is being collapsed and
// only written out as needed).
void recordConcat(const SkMatrix& matrix);
+ void recordTranslate(const SkMatrix& matrix);
+ void recordScale(const SkMatrix& matrix);
int recordClipRect(const SkRect& rect, SkRegion::Op op, bool doAA);
int recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA);
int recordClipPath(int pathID, SkRegion::Op op, bool doAA);