Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: src/core/SkCanvas.cpp

Issue 22947003: Make ClipStack honor save flags (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Store flags in MCRec rather then using odd check Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « include/core/SkDeque.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 /* This is the record we keep for each save/restore level in the stack. 207 /* This is the record we keep for each save/restore level in the stack.
208 Since a level optionally copies the matrix and/or stack, we have pointers 208 Since a level optionally copies the matrix and/or stack, we have pointers
209 for these fields. If the value is copied for this level, the copy is 209 for these fields. If the value is copied for this level, the copy is
210 stored in the ...Storage field, and the pointer points to that. If the 210 stored in the ...Storage field, and the pointer points to that. If the
211 value is not copied for this level, we ignore ...Storage, and just point 211 value is not copied for this level, we ignore ...Storage, and just point
212 at the corresponding value in the previous level in the stack. 212 at the corresponding value in the previous level in the stack.
213 */ 213 */
214 class SkCanvas::MCRec { 214 class SkCanvas::MCRec {
215 public: 215 public:
216 MCRec* fNext; 216 MCRec* fNext;
217 int fFlags;
217 SkMatrix* fMatrix; // points to either fMatrixStorage or prev M CRec 218 SkMatrix* fMatrix; // points to either fMatrixStorage or prev M CRec
218 SkRasterClip* fRasterClip; // points to either fRegionStorage or prev M CRec 219 SkRasterClip* fRasterClip; // points to either fRegionStorage or prev M CRec
219 SkDrawFilter* fFilter; // the current filter (or null) 220 SkDrawFilter* fFilter; // the current filter (or null)
220 221
221 DeviceCM* fLayer; 222 DeviceCM* fLayer;
222 /* If there are any layers in the stack, this points to the top-most 223 /* If there are any layers in the stack, this points to the top-most
223 one that is at or below this level in the stack (so we know what 224 one that is at or below this level in the stack (so we know what
224 bitmap/device to draw into from this level. This value is NOT 225 bitmap/device to draw into from this level. This value is NOT
225 reference counted, since the real owner is either our fLayer field, 226 reference counted, since the real owner is either our fLayer field,
226 or a previous one in a lower level.) 227 or a previous one in a lower level.)
227 */ 228 */
228 DeviceCM* fTopLayer; 229 DeviceCM* fTopLayer;
229 230
230 MCRec(const MCRec* prev, int flags) { 231 MCRec(const MCRec* prev, int flags) : fFlags(flags) {
231 if (NULL != prev) { 232 if (NULL != prev) {
232 if (flags & SkCanvas::kMatrix_SaveFlag) { 233 if (flags & SkCanvas::kMatrix_SaveFlag) {
233 fMatrixStorage = *prev->fMatrix; 234 fMatrixStorage = *prev->fMatrix;
234 fMatrix = &fMatrixStorage; 235 fMatrix = &fMatrixStorage;
235 } else { 236 } else {
236 fMatrix = prev->fMatrix; 237 fMatrix = prev->fMatrix;
237 } 238 }
238 239
239 if (flags & SkCanvas::kClip_SaveFlag) { 240 if (flags & SkCanvas::kClip_SaveFlag) {
240 fRasterClipStorage = *prev->fRasterClip; 241 fRasterClipStorage = *prev->fRasterClip;
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 714
714 int SkCanvas::internalSave(SaveFlags flags) { 715 int SkCanvas::internalSave(SaveFlags flags) {
715 int saveCount = this->getSaveCount(); // record this before the actual save 716 int saveCount = this->getSaveCount(); // record this before the actual save
716 717
717 MCRec* newTop = (MCRec*)fMCStack.push_back(); 718 MCRec* newTop = (MCRec*)fMCStack.push_back();
718 new (newTop) MCRec(fMCRec, flags); // balanced in restore() 719 new (newTop) MCRec(fMCRec, flags); // balanced in restore()
719 720
720 newTop->fNext = fMCRec; 721 newTop->fNext = fMCRec;
721 fMCRec = newTop; 722 fMCRec = newTop;
722 723
723 fClipStack.save(); 724 if (SkCanvas::kClip_SaveFlag & flags) {
724 SkASSERT(fClipStack.getSaveCount() == this->getSaveCount() - 1); 725 fClipStack.save();
726 }
725 727
726 return saveCount; 728 return saveCount;
727 } 729 }
728 730
729 int SkCanvas::save(SaveFlags flags) { 731 int SkCanvas::save(SaveFlags flags) {
730 // call shared impl 732 // call shared impl
731 return this->internalSave(flags); 733 return this->internalSave(flags);
732 } 734 }
733 735
734 #define C32MASK (1 << SkBitmap::kARGB_8888_Config) 736 #define C32MASK (1 << SkBitmap::kARGB_8888_Config)
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 this->internalRestore(); 891 this->internalRestore();
890 } 892 }
891 } 893 }
892 894
893 void SkCanvas::internalRestore() { 895 void SkCanvas::internalRestore() {
894 SkASSERT(fMCStack.count() != 0); 896 SkASSERT(fMCStack.count() != 0);
895 897
896 fDeviceCMDirty = true; 898 fDeviceCMDirty = true;
897 fLocalBoundsCompareTypeDirty = true; 899 fLocalBoundsCompareTypeDirty = true;
898 900
899 fClipStack.restore(); 901 if (SkCanvas::kClip_SaveFlag & fMCRec->fFlags) {
902 fClipStack.restore();
903 }
904
900 // reserve our layer (if any) 905 // reserve our layer (if any)
901 DeviceCM* layer = fMCRec->fLayer; // may be null 906 DeviceCM* layer = fMCRec->fLayer; // may be null
902 // now detach it from fMCRec so we can pop(). Gets freed after its drawn 907 // now detach it from fMCRec so we can pop(). Gets freed after its drawn
903 fMCRec->fLayer = NULL; 908 fMCRec->fLayer = NULL;
904 909
905 // now do the normal restore() 910 // now do the normal restore()
906 fMCRec->~MCRec(); // balanced in save() 911 fMCRec->~MCRec(); // balanced in save()
907 fMCStack.pop_back(); 912 fMCStack.pop_back();
908 fMCRec = (MCRec*)fMCStack.back(); 913 fMCRec = (MCRec*)fMCStack.back();
909 914
(...skipping 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 return *paint; 2218 return *paint;
2214 } 2219 }
2215 2220
2216 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); } 2221 const SkRegion& SkCanvas::LayerIter::clip() const { return fImpl->getClip(); }
2217 int SkCanvas::LayerIter::x() const { return fImpl->getX(); } 2222 int SkCanvas::LayerIter::x() const { return fImpl->getX(); }
2218 int SkCanvas::LayerIter::y() const { return fImpl->getY(); } 2223 int SkCanvas::LayerIter::y() const { return fImpl->getY(); }
2219 2224
2220 /////////////////////////////////////////////////////////////////////////////// 2225 ///////////////////////////////////////////////////////////////////////////////
2221 2226
2222 SkCanvas::ClipVisitor::~ClipVisitor() { } 2227 SkCanvas::ClipVisitor::~ClipVisitor() { }
OLDNEW
« no previous file with comments | « include/core/SkDeque.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698