aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-16 00:53:34 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-08-16 00:53:34 +0000
commit6c157640c27ee2ed6f9a484d21691b7b19dfecde (patch)
tree4f32e7c6ba98ebb246d8a993e502e181ffe7b529
parent8f4269725bf4601965d803597b30766c611a9434 (diff)
This CL addresses "SkCanvas::save flags are not respected by GPU backend" (https://code.google.com/p/skia/issues/detail?id=1503).
R=reed@google.com, bsalomon@google.com Author: robertphillips@google.com Review URL: https://chromiumcodereview.appspot.com/22947003 git-svn-id: http://skia.googlecode.com/svn/trunk@10762 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--include/core/SkDeque.h2
-rw-r--r--src/core/SkCanvas.cpp13
2 files changed, 10 insertions, 5 deletions
diff --git a/include/core/SkDeque.h b/include/core/SkDeque.h
index eef335d0e5..0b3e37f3d0 100644
--- a/include/core/SkDeque.h
+++ b/include/core/SkDeque.h
@@ -81,7 +81,7 @@ public:
void reset(const SkDeque& d, IterStart startLoc);
private:
- SkDeque::Block* fCurBlock;
+ SkDeque::Block* fCurBlock;
char* fPos;
size_t fElemSize;
};
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 5a9a56b2c1..909e3d90f1 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -214,6 +214,7 @@ private:
class SkCanvas::MCRec {
public:
MCRec* fNext;
+ int fFlags;
SkMatrix* fMatrix; // points to either fMatrixStorage or prev MCRec
SkRasterClip* fRasterClip; // points to either fRegionStorage or prev MCRec
SkDrawFilter* fFilter; // the current filter (or null)
@@ -227,7 +228,7 @@ public:
*/
DeviceCM* fTopLayer;
- MCRec(const MCRec* prev, int flags) {
+ MCRec(const MCRec* prev, int flags) : fFlags(flags) {
if (NULL != prev) {
if (flags & SkCanvas::kMatrix_SaveFlag) {
fMatrixStorage = *prev->fMatrix;
@@ -720,8 +721,9 @@ int SkCanvas::internalSave(SaveFlags flags) {
newTop->fNext = fMCRec;
fMCRec = newTop;
- fClipStack.save();
- SkASSERT(fClipStack.getSaveCount() == this->getSaveCount() - 1);
+ if (SkCanvas::kClip_SaveFlag & flags) {
+ fClipStack.save();
+ }
return saveCount;
}
@@ -896,7 +898,10 @@ void SkCanvas::internalRestore() {
fDeviceCMDirty = true;
fLocalBoundsCompareTypeDirty = true;
- fClipStack.restore();
+ if (SkCanvas::kClip_SaveFlag & fMCRec->fFlags) {
+ fClipStack.restore();
+ }
+
// reserve our layer (if any)
DeviceCM* layer = fMCRec->fLayer; // may be null
// now detach it from fMCRec so we can pop(). Gets freed after its drawn