| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 sizeof(fMatrixClipStackStorage)) | 105 sizeof(fMatrixClipStackStorage)) |
| 106 , fCurOpenStateID(kIdentityWideOpenStateID) { | 106 , fCurOpenStateID(kIdentityWideOpenStateID) { |
| 107 | 107 |
| 108 fSkipOffsets = SkNEW(SkTDArray<int>); | 108 fSkipOffsets = SkNEW(SkTDArray<int>); |
| 109 | 109 |
| 110 // The first slot in the matrix dictionary is reserved for the identity matr
ix | 110 // The first slot in the matrix dictionary is reserved for the identity matr
ix |
| 111 fMatrixDict.append()->reset(); | 111 fMatrixDict.append()->reset(); |
| 112 | 112 |
| 113 fCurMCState = (MatrixClipState*)fMatrixClipStack.push_back(); | 113 fCurMCState = (MatrixClipState*)fMatrixClipStack.push_back(); |
| 114 new (fCurMCState) MatrixClipState(NULL, 0); // balanced in restore() | 114 new (fCurMCState) MatrixClipState(NULL, 0); // balanced in restore() |
| 115 |
| 116 #ifdef SK_DEBUG |
| 117 fActualDepth = 0; |
| 118 #endif |
| 115 } | 119 } |
| 116 | 120 |
| 117 SkMatrixClipStateMgr::~SkMatrixClipStateMgr() { | 121 SkMatrixClipStateMgr::~SkMatrixClipStateMgr() { |
| 118 for (int i = 0; i < fRegionDict.count(); ++i) { | 122 for (int i = 0; i < fRegionDict.count(); ++i) { |
| 119 SkDELETE(fRegionDict[i]); | 123 SkDELETE(fRegionDict[i]); |
| 120 } | 124 } |
| 121 | 125 |
| 122 SkDELETE(fSkipOffsets); | 126 SkDELETE(fSkipOffsets); |
| 123 } | 127 } |
| 124 | 128 |
| 125 | 129 |
| 126 int SkMatrixClipStateMgr::MCStackPush(SkCanvas::SaveFlags flags) { | 130 int SkMatrixClipStateMgr::MCStackPush(SkCanvas::SaveFlags flags) { |
| 127 MatrixClipState* newTop = (MatrixClipState*)fMatrixClipStack.push_back(); | 131 MatrixClipState* newTop = (MatrixClipState*)fMatrixClipStack.push_back(); |
| 128 new (newTop) MatrixClipState(fCurMCState, flags); // balanced in restore() | 132 new (newTop) MatrixClipState(fCurMCState, flags); // balanced in restore() |
| 129 fCurMCState = newTop; | 133 fCurMCState = newTop; |
| 130 | 134 |
| 131 SkDEBUGCODE(this->validate();) | 135 SkDEBUGCODE(this->validate();) |
| 132 | 136 |
| 133 return fMatrixClipStack.count(); | 137 return fMatrixClipStack.count(); |
| 134 } | 138 } |
| 135 | 139 |
| 136 int SkMatrixClipStateMgr::save(SkCanvas::SaveFlags flags) { | 140 int SkMatrixClipStateMgr::save(SkCanvas::SaveFlags flags) { |
| 137 SkDEBUGCODE(this->validate();) | 141 SkDEBUGCODE(this->validate();) |
| 138 | 142 |
| 139 return this->MCStackPush(flags); | 143 return this->MCStackPush(flags); |
| 140 } | 144 } |
| 141 | 145 |
| 142 int SkMatrixClipStateMgr::saveLayer(const SkRect* bounds, const SkPaint* paint, | 146 int SkMatrixClipStateMgr::saveLayer(const SkRect* bounds, const SkPaint* paint, |
| 143 SkCanvas::SaveFlags flags) { | 147 SkCanvas::SaveFlags flags) { |
| 148 #ifdef SK_DEBUG |
| 149 if (fCurMCState->fIsSaveLayer) { |
| 150 SkASSERT(0 == fSkipOffsets->count()); |
| 151 } |
| 152 #endif |
| 153 |
| 144 // Since the saveLayer call draws something we need to potentially dump | 154 // Since the saveLayer call draws something we need to potentially dump |
| 145 // out the MC state | 155 // out the MC state |
| 146 this->call(kOther_CallType); | 156 SkDEBUGCODE(bool saved =) this->call(kOther_CallType); |
| 147 | 157 |
| 148 int result = this->MCStackPush(flags); | 158 int result = this->MCStackPush(flags); |
| 149 ++fCurMCState->fLayerID; | 159 ++fCurMCState->fLayerID; |
| 150 fCurMCState->fIsSaveLayer = true; | 160 fCurMCState->fIsSaveLayer = true; |
| 151 | 161 |
| 162 #ifdef SK_DEBUG |
| 163 if (saved) { |
| 164 fCurMCState->fExpectedDepth++; // 1 for nesting save |
| 165 } |
| 166 fCurMCState->fExpectedDepth++; // 1 for saveLayer |
| 167 #endif |
| 168 |
| 152 fCurMCState->fSaveLayerBaseStateID = fCurOpenStateID; | 169 fCurMCState->fSaveLayerBaseStateID = fCurOpenStateID; |
| 153 fCurMCState->fSavedSkipOffsets = fSkipOffsets; | 170 fCurMCState->fSavedSkipOffsets = fSkipOffsets; |
| 154 | 171 |
| 155 // TODO: recycle these rather then new & deleting them on every saveLayer/ | 172 // TODO: recycle these rather then new & deleting them on every saveLayer/ |
| 156 // restore | 173 // restore |
| 157 fSkipOffsets = SkNEW(SkTDArray<int>); | 174 fSkipOffsets = SkNEW(SkTDArray<int>); |
| 158 | 175 |
| 159 fPicRecord->recordSaveLayer(bounds, paint, | 176 fPicRecord->recordSaveLayer(bounds, paint, |
| 160 (SkCanvas::SaveFlags)(flags| SkCanvas::kMatrixCl
ip_SaveFlag)); | 177 (SkCanvas::SaveFlags)(flags| SkCanvas::kMatrixCl
ip_SaveFlag)); |
| 178 #ifdef SK_DEBUG |
| 179 fActualDepth++; |
| 180 #endif |
| 161 return result; | 181 return result; |
| 162 } | 182 } |
| 163 | 183 |
| 164 void SkMatrixClipStateMgr::restore() { | 184 void SkMatrixClipStateMgr::restore() { |
| 165 SkDEBUGCODE(this->validate();) | 185 SkDEBUGCODE(this->validate();) |
| 166 | 186 |
| 167 if (fCurMCState->fIsSaveLayer) { | 187 if (fCurMCState->fIsSaveLayer) { |
| 168 if (fCurMCState->fSaveLayerBaseStateID != fCurOpenStateID) { | 188 if (fCurMCState->fHasOpen) { |
| 189 fCurMCState->fHasOpen = false; |
| 169 fPicRecord->recordRestore(); // Close the open block inside the save
Layer | 190 fPicRecord->recordRestore(); // Close the open block inside the save
Layer |
| 191 #ifdef SK_DEBUG |
| 192 SkASSERT(fActualDepth > 0); |
| 193 fActualDepth--; |
| 194 #endif |
| 195 } else { |
| 196 SkASSERT(0 == fSkipOffsets->count()); |
| 170 } | 197 } |
| 198 |
| 171 // The saveLayer's don't carry any matrix or clip state in the | 199 // The saveLayer's don't carry any matrix or clip state in the |
| 172 // new scheme so make sure the saveLayer's recordRestore doesn't | 200 // new scheme so make sure the saveLayer's recordRestore doesn't |
| 173 // try to finalize them (i.e., fill in their skip offsets). | 201 // try to finalize them (i.e., fill in their skip offsets). |
| 174 fPicRecord->recordRestore(false); // close of saveLayer | 202 fPicRecord->recordRestore(false); // close of saveLayer |
| 203 #ifdef SK_DEBUG |
| 204 SkASSERT(fActualDepth > 0); |
| 205 fActualDepth--; |
| 206 #endif |
| 175 | 207 |
| 176 fCurOpenStateID = fCurMCState->fSaveLayerBaseStateID; | 208 fCurOpenStateID = fCurMCState->fSaveLayerBaseStateID; |
| 177 | 209 |
| 178 SkASSERT(0 == fSkipOffsets->count()); | 210 SkASSERT(0 == fSkipOffsets->count()); |
| 179 SkASSERT(NULL != fCurMCState->fSavedSkipOffsets); | 211 SkASSERT(NULL != fCurMCState->fSavedSkipOffsets); |
| 180 | 212 |
| 181 SkDELETE(fSkipOffsets); | 213 SkDELETE(fSkipOffsets); |
| 182 fSkipOffsets = fCurMCState->fSavedSkipOffsets; | 214 fSkipOffsets = fCurMCState->fSavedSkipOffsets; |
| 183 } | 215 } |
| 184 | 216 |
| 217 bool prevHadOpen = fCurMCState->fHasOpen; |
| 218 bool prevWasSaveLayer = fCurMCState->fIsSaveLayer; |
| 219 |
| 185 fCurMCState->~MatrixClipState(); // balanced in save() | 220 fCurMCState->~MatrixClipState(); // balanced in save() |
| 186 fMatrixClipStack.pop_back(); | 221 fMatrixClipStack.pop_back(); |
| 187 fCurMCState = (MatrixClipState*)fMatrixClipStack.back(); | 222 fCurMCState = (MatrixClipState*)fMatrixClipStack.back(); |
| 188 | 223 |
| 224 if (!prevWasSaveLayer) { |
| 225 fCurMCState->fHasOpen = prevHadOpen; |
| 226 } |
| 227 |
| 228 if (fCurMCState->fIsSaveLayer) { |
| 229 if (0 != fSkipOffsets->count()) { |
| 230 SkASSERT(fCurMCState->fHasOpen); |
| 231 } |
| 232 } |
| 233 |
| 189 SkDEBUGCODE(this->validate();) | 234 SkDEBUGCODE(this->validate();) |
| 190 } | 235 } |
| 191 | 236 |
| 192 // kIdentityWideOpenStateID (0) is reserved for the identity/wide-open clip stat
e | 237 // kIdentityWideOpenStateID (0) is reserved for the identity/wide-open clip stat
e |
| 193 int32_t SkMatrixClipStateMgr::NewMCStateID() { | 238 int32_t SkMatrixClipStateMgr::NewMCStateID() { |
| 194 // TODO: guard against wrap around | 239 // TODO: guard against wrap around |
| 195 // TODO: make uint32_t | 240 // TODO: make uint32_t |
| 196 static int32_t gMCStateID = kIdentityWideOpenStateID; | 241 static int32_t gMCStateID = kIdentityWideOpenStateID; |
| 197 ++gMCStateID; | 242 ++gMCStateID; |
| 198 return gMCStateID; | 243 return gMCStateID; |
| 199 } | 244 } |
| 200 | 245 |
| 246 bool SkMatrixClipStateMgr::isCurrentlyOpen(int32_t stateID) { |
| 247 if (fCurMCState->fIsSaveLayer) |
| 248 return false; |
| 249 |
| 250 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); |
| 251 |
| 252 for (const MatrixClipState* state = (const MatrixClipState*) iter.prev(); |
| 253 state != NULL; |
| 254 state = (const MatrixClipState*) iter.prev()) { |
| 255 if (state->fIsSaveLayer) { |
| 256 if (state->fSaveLayerBaseStateID == stateID) { |
| 257 return true; |
| 258 } |
| 259 } |
| 260 } |
| 261 |
| 262 return false; |
| 263 } |
| 264 |
| 201 bool SkMatrixClipStateMgr::call(CallType callType) { | 265 bool SkMatrixClipStateMgr::call(CallType callType) { |
| 202 SkDEBUGCODE(this->validate();) | 266 SkDEBUGCODE(this->validate();) |
| 203 | 267 |
| 204 if (kMatrix_CallType == callType || kClip_CallType == callType) { | 268 if (kMatrix_CallType == callType || kClip_CallType == callType) { |
| 205 fCurMCState->fMCStateID = NewMCStateID(); | 269 fCurMCState->fMCStateID = NewMCStateID(); |
| 206 SkDEBUGCODE(this->validate();) | 270 SkDEBUGCODE(this->validate();) |
| 207 return false; | 271 return false; |
| 208 } | 272 } |
| 209 | 273 |
| 210 SkASSERT(kOther_CallType == callType); | 274 SkASSERT(kOther_CallType == callType); |
| 211 | 275 |
| 212 if (fCurMCState->fMCStateID == fCurOpenStateID) { | 276 if (fCurMCState->fMCStateID == fCurOpenStateID) { |
| 213 // Required MC state is already active one - nothing to do | 277 // Required MC state is already active one - nothing to do |
| 214 SkDEBUGCODE(this->validate();) | 278 SkDEBUGCODE(this->validate();) |
| 215 return false; | 279 return false; |
| 216 } | 280 } |
| 217 | 281 |
| 218 if (kIdentityWideOpenStateID != fCurOpenStateID && | 282 if (kIdentityWideOpenStateID != fCurOpenStateID && |
| 219 (!fCurMCState->fIsSaveLayer || | 283 !this->isCurrentlyOpen(fCurOpenStateID)) { |
| 220 fCurMCState->fSaveLayerBaseStateID != fCurOpenStateID)) { | |
| 221 // Don't write a restore if the open state is one in which a saveLayer | 284 // Don't write a restore if the open state is one in which a saveLayer |
| 222 // is nested. The save after the saveLayer's restore will close it. | 285 // is nested. The save after the saveLayer's restore will close it. |
| 223 fPicRecord->recordRestore(); // Close the open block | 286 fPicRecord->recordRestore(); // Close the open block |
| 287 fCurMCState->fHasOpen = false; |
| 288 #ifdef SK_DEBUG |
| 289 SkASSERT(fActualDepth > 0); |
| 290 fActualDepth--; |
| 291 #endif |
| 224 } | 292 } |
| 225 | 293 |
| 226 // Install the required MC state as the active one | 294 // Install the required MC state as the active one |
| 227 fCurOpenStateID = fCurMCState->fMCStateID; | 295 fCurOpenStateID = fCurMCState->fMCStateID; |
| 228 | 296 |
| 297 if (kIdentityWideOpenStateID == fCurOpenStateID) { |
| 298 SkASSERT(0 == fActualDepth); |
| 299 SkASSERT(!fCurMCState->fHasOpen); |
| 300 SkASSERT(0 == fSkipOffsets->count()); |
| 301 return false; |
| 302 } |
| 303 |
| 304 SkASSERT(!fCurMCState->fHasOpen); |
| 305 SkASSERT(0 == fSkipOffsets->count()); |
| 306 fCurMCState->fHasOpen = true; |
| 229 fPicRecord->recordSave(SkCanvas::kMatrixClip_SaveFlag); | 307 fPicRecord->recordSave(SkCanvas::kMatrixClip_SaveFlag); |
| 308 #ifdef SK_DEBUG |
| 309 fActualDepth++; |
| 310 SkASSERT(fActualDepth == fCurMCState->fExpectedDepth); |
| 311 #endif |
| 230 | 312 |
| 231 // write out clips | 313 // write out clips |
| 232 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); | 314 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); |
| 233 const MatrixClipState* state; | 315 const MatrixClipState* state; |
| 234 // Loop back across the MC states until the last saveLayer. The MC | 316 // Loop back across the MC states until the last saveLayer. The MC |
| 235 // state in front of the saveLayer has already been written out. | 317 // state in front of the saveLayer has already been written out. |
| 236 for (state = (const MatrixClipState*) iter.prev(); | 318 for (state = (const MatrixClipState*) iter.prev(); |
| 237 state != NULL; | 319 state != NULL; |
| 238 state = (const MatrixClipState*) iter.prev()) { | 320 state = (const MatrixClipState*) iter.prev()) { |
| 239 if (state->fIsSaveLayer) { | 321 if (state->fIsSaveLayer) { |
| 240 break; | 322 break; |
| 241 } | 323 } |
| 242 } | 324 } |
| 243 | 325 |
| 326 int curMatID; |
| 327 |
| 244 if (NULL == state) { | 328 if (NULL == state) { |
| 245 // There was no saveLayer in the MC stack so we need to output them all | 329 // There was no saveLayer in the MC stack so we need to output them all |
| 246 iter.reset(fMatrixClipStack, SkDeque::Iter::kFront_IterStart); | 330 iter.reset(fMatrixClipStack, SkDeque::Iter::kFront_IterStart); |
| 247 state = (const MatrixClipState*) iter.next(); | 331 state = (const MatrixClipState*) iter.next(); |
| 332 curMatID = kIdentityMatID; |
| 248 } else { | 333 } else { |
| 249 // SkDeque's iterators actually return the previous location so we | 334 // SkDeque's iterators actually return the previous location so we |
| 250 // need to reverse and go forward one to get back on track. | 335 // need to reverse and go forward one to get back on track. |
| 251 iter.next(); | 336 iter.next(); |
| 252 SkDEBUGCODE(const MatrixClipState* test = (const MatrixClipState*)) iter
.next(); | 337 SkDEBUGCODE(const MatrixClipState* test = (const MatrixClipState*)) iter
.next(); |
| 253 SkASSERT(test == state); | 338 SkASSERT(test == state); |
| 339 |
| 340 curMatID = state->fMatrixInfo->getID(this); |
| 341 |
| 342 // TODO: this assumes that, in the case of Save|SaveLayer when the SaveL
ayer |
| 343 // doesn't save the clip, that the SaveLayer doesn't add any additional
clip state. |
| 344 // This assumption will be removed when we explicitly store the clip sta
te in |
| 345 // self-contained objects. It is valid for the small set of skps. |
| 346 if (NULL != state->fPrev && state->fClipInfo == state->fPrev->fClipInfo)
{ |
| 347 // By the above assumption the SaveLayer's MC state has already been |
| 348 // written out by the prior Save so don't output it again. |
| 349 state = (const MatrixClipState*) iter.next(); |
| 350 } |
| 254 } | 351 } |
| 255 | 352 |
| 256 int curMatID = NULL != state ? state->fMatrixInfo->getID(this) : kIdentityMa
tID; | |
| 257 for ( ; state != NULL; state = (const MatrixClipState*) iter.next()) { | 353 for ( ; state != NULL; state = (const MatrixClipState*) iter.next()) { |
| 258 state->fClipInfo->writeClip(&curMatID, this); | 354 state->fClipInfo->writeClip(&curMatID, this); |
| 259 } | 355 } |
| 260 | 356 |
| 261 // write out matrix | 357 // write out matrix |
| 262 // TODO: this test isn't quite right. It should be: | 358 // TODO: this test isn't quite right. It should be: |
| 263 // if (curMatID != fCurMCState->fMatrixInfo->getID(this)) { | 359 // if (curMatID != fCurMCState->fMatrixInfo->getID(this)) { |
| 264 // but right now the testing harness always expects a matrix if | 360 // but right now the testing harness always expects a matrix if |
| 265 // the matrices are non-I | 361 // the matrices are non-I |
| 266 if (kIdentityMatID != fCurMCState->fMatrixInfo->getID(this)) { | 362 if (kIdentityMatID != fCurMCState->fMatrixInfo->getID(this)) { |
| 267 // TODO: writing out the delta matrix here is an artifact of the writing | 363 // TODO: writing out the delta matrix here is an artifact of the writing |
| 268 // out of the entire clip stack (with its matrices). Ultimately we will | 364 // out of the entire clip stack (with its matrices). Ultimately we will |
| 269 // write out the CTM here when the clip state is collapsed to a single p
ath. | 365 // write out the CTM here when the clip state is collapsed to a single p
ath. |
| 270 this->writeDeltaMat(curMatID, fCurMCState->fMatrixInfo->getID(this)); | 366 this->writeDeltaMat(curMatID, fCurMCState->fMatrixInfo->getID(this)); |
| 271 } | 367 } |
| 272 | 368 |
| 273 SkDEBUGCODE(this->validate();) | 369 SkDEBUGCODE(this->validate();) |
| 274 | |
| 275 return true; | 370 return true; |
| 276 } | 371 } |
| 277 | 372 |
| 278 // Fill in the skip offsets for all the clips written in the current block | 373 // Fill in the skip offsets for all the clips written in the current block |
| 279 void SkMatrixClipStateMgr::fillInSkips(SkWriter32* writer, int32_t restoreOffset
) { | 374 void SkMatrixClipStateMgr::fillInSkips(SkWriter32* writer, int32_t restoreOffset
) { |
| 280 for (int i = 0; i < fSkipOffsets->count(); ++i) { | 375 for (int i = 0; i < fSkipOffsets->count(); ++i) { |
| 281 SkDEBUGCODE(int32_t peek = writer->readTAt<int32_t>((*fSkipOffsets)[i]);
) | 376 SkDEBUGCODE(int32_t peek = writer->readTAt<int32_t>((*fSkipOffsets)[i]);
) |
| 282 SkASSERT(-1 == peek); | 377 SkASSERT(-1 == peek); |
| 283 writer->overwriteTAt<int32_t>((*fSkipOffsets)[i], restoreOffset); | 378 writer->overwriteTAt<int32_t>((*fSkipOffsets)[i], restoreOffset); |
| 284 } | 379 } |
| 285 | 380 |
| 286 fSkipOffsets->rewind(); | 381 fSkipOffsets->rewind(); |
| 382 SkASSERT(0 == fSkipOffsets->count()); |
| 287 } | 383 } |
| 288 | 384 |
| 289 void SkMatrixClipStateMgr::finish() { | 385 void SkMatrixClipStateMgr::finish() { |
| 290 if (kIdentityWideOpenStateID != fCurOpenStateID) { | 386 if (kIdentityWideOpenStateID != fCurOpenStateID) { |
| 291 fPicRecord->recordRestore(); // Close the open block | 387 fPicRecord->recordRestore(); // Close the open block |
| 388 fCurMCState->fHasOpen = false; |
| 389 #ifdef SK_DEBUG |
| 390 SkASSERT(fActualDepth > 0); |
| 391 fActualDepth--; |
| 392 #endif |
| 292 fCurOpenStateID = kIdentityWideOpenStateID; | 393 fCurOpenStateID = kIdentityWideOpenStateID; |
| 394 SkASSERT(!fCurMCState->fHasOpen); |
| 293 } | 395 } |
| 294 } | 396 } |
| 295 | 397 |
| 296 #ifdef SK_DEBUG | 398 #ifdef SK_DEBUG |
| 297 void SkMatrixClipStateMgr::validate() { | 399 void SkMatrixClipStateMgr::validate() { |
| 298 if (fCurOpenStateID == fCurMCState->fMCStateID && | 400 if (fCurOpenStateID == fCurMCState->fMCStateID && |
| 299 (!fCurMCState->fIsSaveLayer || | 401 (!fCurMCState->fIsSaveLayer || |
| 300 fCurOpenStateID != fCurMCState->fSaveLayerBaseStateID)) { | 402 fCurOpenStateID != fCurMCState->fSaveLayerBaseStateID)) { |
| 301 // The current state is the active one so it should have a skip | 403 // The current state is the active one so it should have a skip |
| 302 // offset for each clip | 404 // offset for each clip |
| 303 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); | 405 SkDeque::Iter iter(fMatrixClipStack, SkDeque::Iter::kBack_IterStart); |
| 304 int clipCount = 0; | 406 int clipCount = 0; |
| 305 for (const MatrixClipState* state = (const MatrixClipState*) iter.prev()
; | 407 for (const MatrixClipState* state = (const MatrixClipState*) iter.prev()
; |
| 306 state != NULL; | 408 state != NULL; |
| 307 state = (const MatrixClipState*) iter.prev()) { | 409 state = (const MatrixClipState*) iter.prev()) { |
| 308 clipCount += state->fClipInfo->numClips(); | 410 if (NULL == state->fPrev || state->fPrev->fClipInfo != state->fClipI
nfo) { |
| 309 if (state->fIsSaveLayer) { | 411 clipCount += state->fClipInfo->numClips(); |
| 310 break; | 412 } |
| 311 } | 413 if (state->fIsSaveLayer) { |
| 414 break; |
| 415 } |
| 312 } | 416 } |
| 313 | 417 |
| 314 SkASSERT(fSkipOffsets->count() == clipCount); | 418 SkASSERT(fSkipOffsets->count() == clipCount); |
| 315 } | 419 } |
| 316 } | 420 } |
| 317 #endif | 421 #endif |
| 318 | 422 |
| 319 int SkMatrixClipStateMgr::addRegionToDict(const SkRegion& region) { | 423 int SkMatrixClipStateMgr::addRegionToDict(const SkRegion& region) { |
| 320 int index = fRegionDict.count(); | 424 int index = fRegionDict.count(); |
| 321 *fRegionDict.append() = SkNEW(SkRegion(region)); | 425 *fRegionDict.append() = SkNEW(SkRegion(region)); |
| 322 return index; | 426 return index; |
| 323 } | 427 } |
| 324 | 428 |
| 325 int SkMatrixClipStateMgr::addMatToDict(const SkMatrix& mat) { | 429 int SkMatrixClipStateMgr::addMatToDict(const SkMatrix& mat) { |
| 326 if (mat.isIdentity()) { | 430 if (mat.isIdentity()) { |
| 327 return kIdentityMatID; | 431 return kIdentityMatID; |
| 328 } | 432 } |
| 329 | 433 |
| 330 *fMatrixDict.append() = mat; | 434 *fMatrixDict.append() = mat; |
| 331 return fMatrixDict.count()-1; | 435 return fMatrixDict.count()-1; |
| 332 } | 436 } |
| OLD | NEW |