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

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

Issue 200923008: Fix cull nesting assertion. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Split validation method. Created 6 years, 9 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 | « src/core/SkCanvas.cpp ('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 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "SkPictureRecord.h" 8 #include "SkPictureRecord.h"
9 #include "SkTSearch.h" 9 #include "SkTSearch.h"
10 #include "SkPixelRef.h" 10 #include "SkPixelRef.h"
(...skipping 1541 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 void SkPictureRecord::endCommentGroup() { 1552 void SkPictureRecord::endCommentGroup() {
1553 // op/size 1553 // op/size
1554 uint32_t size = 1 * kUInt32Size; 1554 uint32_t size = 1 * kUInt32Size;
1555 size_t initialOffset = this->addDraw(END_COMMENT_GROUP, &size); 1555 size_t initialOffset = this->addDraw(END_COMMENT_GROUP, &size);
1556 this->validate(initialOffset, size); 1556 this->validate(initialOffset, size);
1557 } 1557 }
1558 1558
1559 // [op/size] [rect] [skip offset] 1559 // [op/size] [rect] [skip offset]
1560 static const uint32_t kPushCullOpSize = 2 * kUInt32Size + sizeof(SkRect); 1560 static const uint32_t kPushCullOpSize = 2 * kUInt32Size + sizeof(SkRect);
1561 void SkPictureRecord::onPushCull(const SkRect& cullRect) { 1561 void SkPictureRecord::onPushCull(const SkRect& cullRect) {
1562 // Skip identical cull rects.
1563 if (!fCullOffsetStack.isEmpty()) {
1564 const SkRect& prevCull = fWriter.readTAt<SkRect>(fCullOffsetStack.top() - sizeof(SkRect));
1565 if (prevCull == cullRect) {
1566 // Skipped culls are tracked on the stack, but they point to the pre vious offset.
1567 fCullOffsetStack.push(fCullOffsetStack.top());
1568 return;
1569 }
1570
1571 SkASSERT(prevCull.contains(cullRect));
1572 }
1573
1574 uint32_t size = kPushCullOpSize; 1562 uint32_t size = kPushCullOpSize;
1575 size_t initialOffset = this->addDraw(PUSH_CULL, &size); 1563 size_t initialOffset = this->addDraw(PUSH_CULL, &size);
1576 // PUSH_CULL's size should stay constant (used to rewind). 1564 // PUSH_CULL's size should stay constant (used to rewind).
1577 SkASSERT(size == kPushCullOpSize); 1565 SkASSERT(size == kPushCullOpSize);
1578 1566
1579 this->addRect(cullRect); 1567 this->addRect(cullRect);
1580 fCullOffsetStack.push(fWriter.bytesWritten()); 1568 fCullOffsetStack.push(fWriter.bytesWritten());
1581 this->addInt(0); 1569 this->addInt(0);
1582 this->validate(initialOffset, size); 1570 this->validate(initialOffset, size);
1583 } 1571 }
1584 1572
1585 void SkPictureRecord::onPopCull() { 1573 void SkPictureRecord::onPopCull() {
1586 SkASSERT(!fCullOffsetStack.isEmpty()); 1574 SkASSERT(!fCullOffsetStack.isEmpty());
1587 1575
1588 uint32_t cullSkipOffset = fCullOffsetStack.top(); 1576 uint32_t cullSkipOffset = fCullOffsetStack.top();
1589 fCullOffsetStack.pop(); 1577 fCullOffsetStack.pop();
1590 1578
1591 // Skipped push, do the same for pop.
1592 if (!fCullOffsetStack.isEmpty() && cullSkipOffset == fCullOffsetStack.top()) {
1593 return;
1594 }
1595
1596 // Collapse empty push/pop pairs. 1579 // Collapse empty push/pop pairs.
1597 if ((size_t)(cullSkipOffset + kUInt32Size) == fWriter.bytesWritten()) { 1580 if ((size_t)(cullSkipOffset + kUInt32Size) == fWriter.bytesWritten()) {
1598 SkASSERT(fWriter.bytesWritten() >= kPushCullOpSize); 1581 SkASSERT(fWriter.bytesWritten() >= kPushCullOpSize);
1599 SkASSERT(PUSH_CULL == peek_op(&fWriter, fWriter.bytesWritten() - kPushCu llOpSize)); 1582 SkASSERT(PUSH_CULL == peek_op(&fWriter, fWriter.bytesWritten() - kPushCu llOpSize));
1600 fWriter.rewindToOffset(fWriter.bytesWritten() - kPushCullOpSize); 1583 fWriter.rewindToOffset(fWriter.bytesWritten() - kPushCullOpSize);
1601 return; 1584 return;
1602 } 1585 }
1603 1586
1604 // op only 1587 // op only
1605 uint32_t size = kUInt32Size; 1588 uint32_t size = kUInt32Size;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 void SkPictureRecord::validateRegions() const { 1867 void SkPictureRecord::validateRegions() const {
1885 int count = fRegions.count(); 1868 int count = fRegions.count();
1886 SkASSERT((unsigned) count < 0x1000); 1869 SkASSERT((unsigned) count < 0x1000);
1887 for (int index = 0; index < count; index++) { 1870 for (int index = 0; index < count; index++) {
1888 const SkFlatData* region = fRegions[index]; 1871 const SkFlatData* region = fRegions[index];
1889 SkASSERT(region); 1872 SkASSERT(region);
1890 // region->validate(); 1873 // region->validate();
1891 } 1874 }
1892 } 1875 }
1893 #endif 1876 #endif
OLDNEW
« no previous file with comments | « src/core/SkCanvas.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698