Index: src/core/SkRecordDraw.cpp |
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp |
index ab0cb71407d5290e1764605ad0fec87dca6f3320..4847273f52a826f4eb2510abb75b4e7860cc82d2 100644 |
--- a/src/core/SkRecordDraw.cpp |
+++ b/src/core/SkRecordDraw.cpp |
@@ -80,6 +80,7 @@ DRAW(Restore, restore()); |
DRAW(Save, save()); |
DRAW(SaveLayer, saveLayer(r.bounds, r.paint, r.flags)); |
DRAW(SetMatrix, setMatrix(SkMatrix::Concat(fInitialCTM, r.matrix))); |
+DRAW(Concat, concat(r.matrix)); |
DRAW(ClipPath, clipPath(r.path, r.opAA.op, r.opAA.aa)); |
DRAW(ClipRRect, clipRRect(r.rrect, r.opAA.op, r.opAA.aa)); |
@@ -154,7 +155,7 @@ public: |
: fNumRecords(record.count()) |
, fCullRect(cullRect) |
, fBounds(bounds) { |
- fCTM = &SkMatrix::I(); |
+ fCTM = SkMatrix::I(); |
fCurrentClipBounds = fCullRect; |
} |
@@ -184,7 +185,7 @@ public: |
typedef SkRect Bounds; |
int currentOp() const { return fCurrentOp; } |
- const SkMatrix& ctm() const { return *fCTM; } |
+ const SkMatrix& ctm() const { return fCTM; } |
const Bounds& getBounds(int index) const { return fBounds[index]; } |
// Adjust rect for all paints that may affect its geometry, then map it to identity space. |
@@ -205,7 +206,7 @@ public: |
} |
// Map the rect back to identity space. |
- fCTM->mapRect(&rect); |
+ fCTM.mapRect(&rect); |
// Nothing can draw outside the current clip. |
if (!rect.intersect(fCurrentClipBounds)) { |
@@ -222,10 +223,11 @@ private: |
const SkPaint* paint; // Unowned. If set, adjusts the bounds of all ops in this block. |
}; |
- // Only Restore and SetMatrix change the CTM. |
+ // Only Restore, SetMatrix, and Concat change the CTM. |
template <typename T> void updateCTM(const T&) {} |
- void updateCTM(const Restore& op) { fCTM = &op.matrix; } |
- void updateCTM(const SetMatrix& op) { fCTM = &op.matrix; } |
+ void updateCTM(const Restore& op) { fCTM = op.matrix; } |
+ void updateCTM(const SetMatrix& op) { fCTM = op.matrix; } |
+ void updateCTM(const Concat& op) { fCTM.preConcat(op.matrix); } |
// Most ops don't change the clip. |
template <typename T> void updateClipBounds(const T&) {} |
@@ -278,6 +280,7 @@ private: |
void trackBounds(const Restore&) { fBounds[fCurrentOp] = this->popSaveBlock(); } |
void trackBounds(const SetMatrix&) { this->pushControl(); } |
+ void trackBounds(const Concat&) { this->pushControl(); } |
void trackBounds(const ClipRect&) { this->pushControl(); } |
void trackBounds(const ClipRRect&) { this->pushControl(); } |
void trackBounds(const ClipPath&) { this->pushControl(); } |
@@ -579,7 +582,7 @@ private: |
// and updateClipBounds() to maintain the exact CTM (fCTM) and conservative |
// identity-space bounds of the current clip (fCurrentClipBounds). |
int fCurrentOp; |
- const SkMatrix* fCTM; |
+ SkMatrix fCTM; |
Bounds fCurrentClipBounds; |
// Used to track the bounds of Save/Restore blocks and the control ops inside them. |