OLD | NEW |
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 | 7 |
8 #include "SkMatrixClipStateMgr.h" | 8 #include "SkMatrixClipStateMgr.h" |
9 #include "SkPictureRecord.h" | 9 #include "SkPictureRecord.h" |
10 | 10 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 fMatrixClipStackStorage, | 103 fMatrixClipStackStorage, |
104 sizeof(fMatrixClipStackStorage)) | 104 sizeof(fMatrixClipStackStorage)) |
105 , fCurOpenStateID(kIdentityWideOpenStateID) { | 105 , fCurOpenStateID(kIdentityWideOpenStateID) { |
106 | 106 |
107 fSkipOffsets = SkNEW(SkTDArray<int>); | 107 fSkipOffsets = SkNEW(SkTDArray<int>); |
108 | 108 |
109 // The first slot in the matrix dictionary is reserved for the identity matr
ix | 109 // The first slot in the matrix dictionary is reserved for the identity matr
ix |
110 fMatrixDict.append()->reset(); | 110 fMatrixDict.append()->reset(); |
111 | 111 |
112 fCurMCState = (MatrixClipState*)fMatrixClipStack.push_back(); | 112 fCurMCState = (MatrixClipState*)fMatrixClipStack.push_back(); |
113 new (fCurMCState) MatrixClipState(NULL, 0); // balanced in restore() | 113 new (fCurMCState) MatrixClipState(NULL); // balanced in restore() |
114 | 114 |
115 #ifdef SK_DEBUG | 115 #ifdef SK_DEBUG |
116 fActualDepth = 0; | 116 fActualDepth = 0; |
117 #endif | 117 #endif |
118 } | 118 } |
119 | 119 |
120 SkMatrixClipStateMgr::~SkMatrixClipStateMgr() { | 120 SkMatrixClipStateMgr::~SkMatrixClipStateMgr() { |
121 for (int i = 0; i < fRegionDict.count(); ++i) { | 121 for (int i = 0; i < fRegionDict.count(); ++i) { |
122 SkDELETE(fRegionDict[i]); | 122 SkDELETE(fRegionDict[i]); |
123 } | 123 } |
124 | 124 |
125 SkDELETE(fSkipOffsets); | 125 SkDELETE(fSkipOffsets); |
126 } | 126 } |
127 | 127 |
128 | 128 |
129 int SkMatrixClipStateMgr::MCStackPush(SkCanvas::SaveFlags flags) { | 129 int SkMatrixClipStateMgr::MCStackPush() { |
130 MatrixClipState* newTop = (MatrixClipState*)fMatrixClipStack.push_back(); | 130 MatrixClipState* newTop = (MatrixClipState*)fMatrixClipStack.push_back(); |
131 new (newTop) MatrixClipState(fCurMCState, flags); // balanced in restore() | 131 new (newTop) MatrixClipState(fCurMCState); // balanced in restore() |
132 fCurMCState = newTop; | 132 fCurMCState = newTop; |
133 | 133 |
134 SkDEBUGCODE(this->validate();) | 134 SkDEBUGCODE(this->validate();) |
135 | 135 |
136 return fMatrixClipStack.count(); | 136 return fMatrixClipStack.count(); |
137 } | 137 } |
138 | 138 |
139 int SkMatrixClipStateMgr::save(SkCanvas::SaveFlags flags) { | 139 int SkMatrixClipStateMgr::save() { |
140 SkDEBUGCODE(this->validate();) | 140 SkDEBUGCODE(this->validate();) |
141 | 141 |
142 return this->MCStackPush(flags); | 142 return this->MCStackPush(); |
143 } | 143 } |
144 | 144 |
145 int SkMatrixClipStateMgr::saveLayer(const SkRect* bounds, const SkPaint* paint, | 145 int SkMatrixClipStateMgr::saveLayer(const SkRect* bounds, const SkPaint* paint, |
146 SkCanvas::SaveFlags flags) { | 146 SkCanvas::SaveFlags flags) { |
147 #ifdef SK_DEBUG | 147 #ifdef SK_DEBUG |
148 if (fCurMCState->fIsSaveLayer) { | 148 if (fCurMCState->fIsSaveLayer) { |
149 SkASSERT(0 == fSkipOffsets->count()); | 149 SkASSERT(0 == fSkipOffsets->count()); |
150 } | 150 } |
151 #endif | 151 #endif |
152 | 152 |
153 // Since the saveLayer call draws something we need to potentially dump | 153 // Since the saveLayer call draws something we need to potentially dump |
154 // out the MC state | 154 // out the MC state |
155 SkDEBUGCODE(bool saved =) this->call(kOther_CallType); | 155 SkDEBUGCODE(bool saved =) this->call(kOther_CallType); |
156 | 156 |
157 int result = this->MCStackPush(flags); | 157 int result = this->MCStackPush(); |
158 ++fCurMCState->fLayerID; | 158 ++fCurMCState->fLayerID; |
159 fCurMCState->fIsSaveLayer = true; | 159 fCurMCState->fIsSaveLayer = true; |
160 | 160 |
161 #ifdef SK_DEBUG | 161 #ifdef SK_DEBUG |
162 if (saved) { | 162 if (saved) { |
163 fCurMCState->fExpectedDepth++; // 1 for nesting save | 163 fCurMCState->fExpectedDepth++; // 1 for nesting save |
164 } | 164 } |
165 fCurMCState->fExpectedDepth++; // 1 for saveLayer | 165 fCurMCState->fExpectedDepth++; // 1 for saveLayer |
166 #endif | 166 #endif |
167 | 167 |
168 *fStateIDStack.append() = fCurOpenStateID; | 168 *fStateIDStack.append() = fCurOpenStateID; |
169 fCurMCState->fSavedSkipOffsets = fSkipOffsets; | 169 fCurMCState->fSavedSkipOffsets = fSkipOffsets; |
170 | 170 |
171 // TODO: recycle these rather then new & deleting them on every saveLayer/ | 171 // TODO: recycle these rather then new & deleting them on every saveLayer/ |
172 // restore | 172 // restore |
173 fSkipOffsets = SkNEW(SkTDArray<int>); | 173 fSkipOffsets = SkNEW(SkTDArray<int>); |
174 | 174 |
175 fPicRecord->recordSaveLayer(bounds, paint, flags | SkCanvas::kMatrixClip_Sav
eFlag); | 175 fPicRecord->recordSaveLayer(bounds, paint, flags); |
176 #ifdef SK_DEBUG | 176 #ifdef SK_DEBUG |
177 fActualDepth++; | 177 fActualDepth++; |
178 #endif | 178 #endif |
179 return result; | 179 return result; |
180 } | 180 } |
181 | 181 |
182 void SkMatrixClipStateMgr::restore() { | 182 void SkMatrixClipStateMgr::restore() { |
183 SkDEBUGCODE(this->validate();) | 183 SkDEBUGCODE(this->validate();) |
184 | 184 |
185 if (fCurMCState->fIsSaveLayer) { | 185 if (fCurMCState->fIsSaveLayer) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 if (kIdentityWideOpenStateID == fCurOpenStateID) { | 282 if (kIdentityWideOpenStateID == fCurOpenStateID) { |
283 SkASSERT(0 == fActualDepth); | 283 SkASSERT(0 == fActualDepth); |
284 SkASSERT(!fCurMCState->fHasOpen); | 284 SkASSERT(!fCurMCState->fHasOpen); |
285 SkASSERT(0 == fSkipOffsets->count()); | 285 SkASSERT(0 == fSkipOffsets->count()); |
286 return false; | 286 return false; |
287 } | 287 } |
288 | 288 |
289 SkASSERT(!fCurMCState->fHasOpen); | 289 SkASSERT(!fCurMCState->fHasOpen); |
290 SkASSERT(0 == fSkipOffsets->count()); | 290 SkASSERT(0 == fSkipOffsets->count()); |
291 fCurMCState->fHasOpen = true; | 291 fCurMCState->fHasOpen = true; |
292 fPicRecord->recordSave(SkCanvas::kMatrixClip_SaveFlag); | 292 fPicRecord->recordSave(); |
293 #ifdef SK_DEBUG | 293 #ifdef SK_DEBUG |
294 fActualDepth++; | 294 fActualDepth++; |
295 SkASSERT(fActualDepth == fCurMCState->fExpectedDepth); | 295 SkASSERT(fActualDepth == fCurMCState->fExpectedDepth); |
296 #endif | 296 #endif |
297 | 297 |
298 // write out clips | 298 // write out clips |
299 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); | 299 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); |
300 const MatrixClipState* state; | 300 const MatrixClipState* state; |
301 // Loop back across the MC states until the last saveLayer. The MC | 301 // Loop back across the MC states until the last saveLayer. The MC |
302 // state in front of the saveLayer has already been written out. | 302 // state in front of the saveLayer has already been written out. |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 } | 410 } |
411 | 411 |
412 int SkMatrixClipStateMgr::addMatToDict(const SkMatrix& mat) { | 412 int SkMatrixClipStateMgr::addMatToDict(const SkMatrix& mat) { |
413 if (mat.isIdentity()) { | 413 if (mat.isIdentity()) { |
414 return kIdentityMatID; | 414 return kIdentityMatID; |
415 } | 415 } |
416 | 416 |
417 *fMatrixDict.append() = mat; | 417 *fMatrixDict.append() = mat; |
418 return fMatrixDict.count()-1; | 418 return fMatrixDict.count()-1; |
419 } | 419 } |
OLD | NEW |