OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
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 #include "SkPictureRecord.h" | 8 #include "SkPictureRecord.h" |
9 #include "SkTSearch.h" | 9 #include "SkTSearch.h" |
10 #include "SkPixelRef.h" | 10 #include "SkPixelRef.h" |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 void SkPictureRecord::endRecording() { | 708 void SkPictureRecord::endRecording() { |
709 SkASSERT(kNoInitialSave != fInitialSaveCount); | 709 SkASSERT(kNoInitialSave != fInitialSaveCount); |
710 this->restoreToCount(fInitialSaveCount); | 710 this->restoreToCount(fInitialSaveCount); |
711 } | 711 } |
712 | 712 |
713 void SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { | 713 void SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { |
714 if (fRestoreOffsetStack.isEmpty()) { | 714 if (fRestoreOffsetStack.isEmpty()) { |
715 return; | 715 return; |
716 } | 716 } |
717 | 717 |
| 718 // The RestoreOffset field is initially filled with a placeholder |
| 719 // value that points to the offset of the previous RestoreOffset |
| 720 // in the current stack level, thus forming a linked list so that |
| 721 // the restore offsets can be filled in when the corresponding |
| 722 // restore command is recorded. |
| 723 int32_t prevOffset = fRestoreOffsetStack.top(); |
| 724 |
718 if (regionOpExpands(op)) { | 725 if (regionOpExpands(op)) { |
719 // Run back through any previous clip ops, and mark their offset to | 726 // Run back through any previous clip ops, and mark their offset to |
720 // be 0, disabling their ability to trigger a jump-to-restore, otherwise | 727 // be 0, disabling their ability to trigger a jump-to-restore, otherwise |
721 // they could hide this clips ability to expand the clip (i.e. go from | 728 // they could hide this clips ability to expand the clip (i.e. go from |
722 // empty to non-empty). | 729 // empty to non-empty). |
723 fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); | 730 fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); |
| 731 |
| 732 // Reset the pointer back to the previous clip so that subsequent |
| 733 // restores don't overwrite the offsets we just cleared. |
| 734 prevOffset = 0; |
724 } | 735 } |
725 | 736 |
726 size_t offset = fWriter.size(); | 737 size_t offset = fWriter.size(); |
727 // The RestoreOffset field is initially filled with a placeholder | 738 addInt(prevOffset); |
728 // value that points to the offset of the previous RestoreOffset | |
729 // in the current stack level, thus forming a linked list so that | |
730 // the restore offsets can be filled in when the corresponding | |
731 // restore command is recorded. | |
732 addInt(fRestoreOffsetStack.top()); | |
733 fRestoreOffsetStack.top() = offset; | 739 fRestoreOffsetStack.top() = offset; |
734 } | 740 } |
735 | 741 |
736 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { | 742 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { |
737 // id + rect + clip params | 743 // id + rect + clip params |
738 uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; | 744 uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; |
739 // recordRestoreOffsetPlaceholder doesn't always write an offset | 745 // recordRestoreOffsetPlaceholder doesn't always write an offset |
740 if (!fRestoreOffsetStack.isEmpty()) { | 746 if (!fRestoreOffsetStack.isEmpty()) { |
741 // + restore offset | 747 // + restore offset |
742 size += kUInt32Size; | 748 size += kUInt32Size; |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1495 void SkPictureRecord::validateRegions() const { | 1501 void SkPictureRecord::validateRegions() const { |
1496 int count = fRegions.count(); | 1502 int count = fRegions.count(); |
1497 SkASSERT((unsigned) count < 0x1000); | 1503 SkASSERT((unsigned) count < 0x1000); |
1498 for (int index = 0; index < count; index++) { | 1504 for (int index = 0; index < count; index++) { |
1499 const SkFlatData* region = fRegions[index]; | 1505 const SkFlatData* region = fRegions[index]; |
1500 SkASSERT(region); | 1506 SkASSERT(region); |
1501 // region->validate(); | 1507 // region->validate(); |
1502 } | 1508 } |
1503 } | 1509 } |
1504 #endif | 1510 #endif |
OLD | NEW |