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

Side by Side Diff: src/core/SkMatrixClipStateMgr.h

Issue 169283011: Fix saveLayer bugs in SkMatrixClipStateMgr (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 10 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 | « no previous file | src/core/SkMatrixClipStateMgr.cpp » ('j') | 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 * Copyright 2014 Google Inc. 2 * Copyright 2014 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 #ifndef SkMatrixClipStateMgr_DEFINED 7 #ifndef SkMatrixClipStateMgr_DEFINED
8 #define SkMatrixClipStateMgr_DEFINED 8 #define SkMatrixClipStateMgr_DEFINED
9 9
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 // The CTM in effect when this clip call was issued 173 // The CTM in effect when this clip call was issued
174 int fMatrixID; 174 int fMatrixID;
175 }; 175 };
176 176
177 SkTDArray<ClipOp> fClips; 177 SkTDArray<ClipOp> fClips;
178 178
179 typedef SkNoncopyable INHERITED; 179 typedef SkNoncopyable INHERITED;
180 }; 180 };
181 181
182 MatrixClipState(MatrixClipState* prev, int flags) 182 MatrixClipState(MatrixClipState* prev, int flags)
183 #ifdef SK_DEBUG
184 : fPrev(prev) 183 : fPrev(prev)
185 #endif
186 { 184 {
185 fHasOpen = false;
186
187 if (NULL == prev) { 187 if (NULL == prev) {
188 fLayerID = 0; 188 fLayerID = 0;
189 189
190 fMatrixInfoStorage.reset(); 190 fMatrixInfoStorage.reset();
191 fMatrixInfo = &fMatrixInfoStorage; 191 fMatrixInfo = &fMatrixInfoStorage;
192 fClipInfo = &fClipInfoStorage; // ctor handles init of fClipInf oStorage 192 fClipInfo = &fClipInfoStorage; // ctor handles init of fClipInf oStorage
193 193
194 // The identity/wide-open-clip state is current by default 194 // The identity/wide-open-clip state is current by default
195 fMCStateID = kIdentityWideOpenStateID; 195 fMCStateID = kIdentityWideOpenStateID;
196 #ifdef SK_DEBUG
197 fExpectedDepth = 1;
198 #endif
196 } 199 }
197 else { 200 else {
198 fLayerID = prev->fLayerID; 201 fLayerID = prev->fLayerID;
199 202
200 if (flags & SkCanvas::kMatrix_SaveFlag) { 203 if (flags & SkCanvas::kMatrix_SaveFlag) {
201 fMatrixInfoStorage = *prev->fMatrixInfo; 204 fMatrixInfoStorage = *prev->fMatrixInfo;
202 fMatrixInfo = &fMatrixInfoStorage; 205 fMatrixInfo = &fMatrixInfoStorage;
203 } else { 206 } else {
204 fMatrixInfo = prev->fMatrixInfo; 207 fMatrixInfo = prev->fMatrixInfo;
205 } 208 }
206 209
207 if (flags & SkCanvas::kClip_SaveFlag) { 210 if (flags & SkCanvas::kClip_SaveFlag) {
208 // We don't copy the ClipOps of the previous clip states 211 // We don't copy the ClipOps of the previous clip states
209 fClipInfo = &fClipInfoStorage; 212 fClipInfo = &fClipInfoStorage;
210 } else { 213 } else {
211 fClipInfo = prev->fClipInfo; 214 fClipInfo = prev->fClipInfo;
212 } 215 }
213 216
214 // Initially a new save/saveLayer represents the same MC state 217 // Initially a new save/saveLayer represents the same MC state
215 // as its predecessor. 218 // as its predecessor.
216 fMCStateID = prev->fMCStateID; 219 fMCStateID = prev->fMCStateID;
220 #ifdef SK_DEBUG
221 fExpectedDepth = prev->fExpectedDepth;
222 #endif
217 } 223 }
218 224
219 fIsSaveLayer = false; 225 fIsSaveLayer = false;
220 } 226 }
221 227
222 MatrixInfo* fMatrixInfo; 228 MatrixInfo* fMatrixInfo;
223 MatrixInfo fMatrixInfoStorage; 229 MatrixInfo fMatrixInfoStorage;
224 230
225 ClipInfo* fClipInfo; 231 ClipInfo* fClipInfo;
226 ClipInfo fClipInfoStorage; 232 ClipInfo fClipInfoStorage;
227 233
228 // Tracks the current depth of saveLayers to support the isDrawingToLaye r call 234 // Tracks the current depth of saveLayers to support the isDrawingToLaye r call
229 int fLayerID; 235 int fLayerID;
230 // Does this MC state represent a saveLayer call? 236 // Does this MC state represent a saveLayer call?
231 bool fIsSaveLayer; 237 bool fIsSaveLayer;
232 238
233 // The next two fields are only valid when fIsSaveLayer is set. 239 // The next two fields are only valid when fIsSaveLayer is set.
234 int32_t fSaveLayerBaseStateID; 240 int32_t fSaveLayerBaseStateID;
235 SkTDArray<int>* fSavedSkipOffsets; 241 SkTDArray<int>* fSavedSkipOffsets;
236 242
243 // Does the MC state have an open block in the skp?
244 bool fHasOpen;
245
246 MatrixClipState* fPrev;
247
237 #ifdef SK_DEBUG 248 #ifdef SK_DEBUG
238 MatrixClipState* fPrev; // debugging aid 249 int fExpectedDepth; // debugging aid
239 #endif 250 #endif
240 251
241 int32_t fMCStateID; 252 int32_t fMCStateID;
242 }; 253 };
243 254
244 enum CallType { 255 enum CallType {
245 kMatrix_CallType, 256 kMatrix_CallType,
246 kClip_CallType, 257 kClip_CallType,
247 kOther_CallType 258 kOther_CallType
248 }; 259 };
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 // can cause MC states to be nested. 369 // can cause MC states to be nested.
359 SkTDArray<int32_t> *fSkipOffsets; 370 SkTDArray<int32_t> *fSkipOffsets;
360 371
361 SkDEBUGCODE(void validate();) 372 SkDEBUGCODE(void validate();)
362 373
363 int MCStackPush(SkCanvas::SaveFlags flags); 374 int MCStackPush(SkCanvas::SaveFlags flags);
364 375
365 void addClipOffset(int offset) { 376 void addClipOffset(int offset) {
366 SkASSERT(NULL != fSkipOffsets); 377 SkASSERT(NULL != fSkipOffsets);
367 SkASSERT(kIdentityWideOpenStateID != fCurOpenStateID); 378 SkASSERT(kIdentityWideOpenStateID != fCurOpenStateID);
379 SkASSERT(fCurMCState->fHasOpen);
380 SkASSERT(!fCurMCState->fIsSaveLayer);
368 381
369 *fSkipOffsets->append() = offset; 382 *fSkipOffsets->append() = offset;
370 } 383 }
371 384
372 void writeDeltaMat(int currentMatID, int desiredMatID); 385 void writeDeltaMat(int currentMatID, int desiredMatID);
373 static int32_t NewMCStateID(); 386 static int32_t NewMCStateID();
374 387
375 int addRegionToDict(const SkRegion& region); 388 int addRegionToDict(const SkRegion& region);
376 const SkRegion* lookupRegion(int index) { 389 const SkRegion* lookupRegion(int index) {
377 SkASSERT(index >= 0 && index < fRegionDict.count()); 390 SkASSERT(index >= 0 && index < fRegionDict.count());
378 return fRegionDict[index]; 391 return fRegionDict[index];
379 } 392 }
380 393
381 // TODO: add stats to check if the dictionary really does 394 // TODO: add stats to check if the dictionary really does
382 // reduce the size of the SkPicture. 395 // reduce the size of the SkPicture.
383 int addMatToDict(const SkMatrix& mat); 396 int addMatToDict(const SkMatrix& mat);
384 const SkMatrix& lookupMat(int index) { 397 const SkMatrix& lookupMat(int index) {
385 SkASSERT(index >= 0 && index < fMatrixDict.count()); 398 SkASSERT(index >= 0 && index < fMatrixDict.count());
386 return fMatrixDict[index]; 399 return fMatrixDict[index];
387 } 400 }
401
402 bool isCurrentlyOpen(int32_t stateID);
403
404 #ifdef SK_DEBUG
405 int fActualDepth;
406 #endif
388 }; 407 };
389 408
390 #endif 409 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkMatrixClipStateMgr.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698