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 "SkLayerInfo.h" | 8 #include "SkLayerInfo.h" |
9 #include "SkRecordDraw.h" | 9 #include "SkRecordDraw.h" |
10 #include "SkPatchUtils.h" | 10 #include "SkPatchUtils.h" |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 dst.fLocalMat = src.fLocalMat; | 685 dst.fLocalMat = src.fLocalMat; |
686 dst.fPreMat = src.fPreMat; | 686 dst.fPreMat = src.fPreMat; |
687 dst.fPreMat.postConcat(fFillBounds.ctm()); | 687 dst.fPreMat.postConcat(fFillBounds.ctm()); |
688 if (src.fPaint) { | 688 if (src.fPaint) { |
689 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); | 689 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); |
690 } | 690 } |
691 dst.fSaveLayerOpID = src.fSaveLayerOpID; | 691 dst.fSaveLayerOpID = src.fSaveLayerOpID; |
692 dst.fRestoreOpID = src.fRestoreOpID; | 692 dst.fRestoreOpID = src.fRestoreOpID; |
693 dst.fHasNestedLayers = src.fHasNestedLayers; | 693 dst.fHasNestedLayers = src.fHasNestedLayers; |
694 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; | 694 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; |
| 695 |
| 696 // Store 'saveLayer ops from enclosing picture' + drawPict op + 'ops
from sub-picture' |
| 697 dst.fKeySize = fSaveLayerOpStack.count() + src.fKeySize + 1; |
| 698 dst.fKey = SkNEW_ARRAY(int, dst.fKeySize); |
| 699 memcpy(dst.fKey, fSaveLayerOpStack.begin(), fSaveLayerOpStack.count(
) * sizeof(int)); |
| 700 dst.fKey[fSaveLayerOpStack.count()] = fFillBounds.currentOp(); |
| 701 memcpy(&dst.fKey[fSaveLayerOpStack.count()+1], src.fKey, src.fKeySiz
e * sizeof(int)); |
695 } | 702 } |
696 } | 703 } |
697 | 704 |
698 void trackSaveLayers(const DrawPicture& dp) { | 705 void trackSaveLayers(const DrawPicture& dp) { |
699 this->trackSaveLayersForPicture(dp.picture, dp.paint); | 706 this->trackSaveLayersForPicture(dp.picture, dp.paint); |
700 } | 707 } |
701 | 708 |
702 void trackSaveLayers(const DrawDrawable& dp) { | 709 void trackSaveLayers(const DrawDrawable& dp) { |
703 SkASSERT(fPictList); | 710 SkASSERT(fPictList); |
704 SkASSERT(dp.index >= 0 && dp.index < fPictList->count()); | 711 SkASSERT(dp.index >= 0 && dp.index < fPictList->count()); |
(...skipping 12 matching lines...) Expand all Loading... |
717 if (fSaveLayerStack[index].fIsSaveLayer) { | 724 if (fSaveLayerStack[index].fIsSaveLayer) { |
718 break; | 725 break; |
719 } | 726 } |
720 } | 727 } |
721 } | 728 } |
722 | 729 |
723 void pushSaveLayerInfo(bool isSaveLayer, const SkPaint* paint) { | 730 void pushSaveLayerInfo(bool isSaveLayer, const SkPaint* paint) { |
724 if (isSaveLayer) { | 731 if (isSaveLayer) { |
725 this->updateStackForSaveLayer(); | 732 this->updateStackForSaveLayer(); |
726 ++fSaveLayersInStack; | 733 ++fSaveLayersInStack; |
| 734 fSaveLayerOpStack.push(fFillBounds.currentOp()); |
727 } | 735 } |
728 | 736 |
729 fSaveLayerStack.push(SaveLayerInfo(fFillBounds.currentOp(), isSaveLayer,
paint)); | 737 fSaveLayerStack.push(SaveLayerInfo(fFillBounds.currentOp(), isSaveLayer,
paint)); |
730 } | 738 } |
731 | 739 |
732 void popSaveLayerInfo() { | 740 void popSaveLayerInfo() { |
733 if (fSaveLayerStack.count() <= 0) { | 741 if (fSaveLayerStack.count() <= 0) { |
734 SkASSERT(false); | 742 SkASSERT(false); |
735 return; | 743 return; |
736 } | 744 } |
737 | 745 |
| 746 SkASSERT(fSaveLayersInStack == fSaveLayerOpStack.count()); |
| 747 |
738 SaveLayerInfo sli; | 748 SaveLayerInfo sli; |
739 fSaveLayerStack.pop(&sli); | 749 fSaveLayerStack.pop(&sli); |
740 | 750 |
741 if (!sli.fIsSaveLayer) { | 751 if (!sli.fIsSaveLayer) { |
742 return; | 752 return; |
743 } | 753 } |
744 | 754 |
745 --fSaveLayersInStack; | 755 --fSaveLayersInStack; |
746 | 756 |
747 SkLayerInfo::BlockInfo& block = fAccelData->addBlock(); | 757 SkLayerInfo::BlockInfo& block = fAccelData->addBlock(); |
748 | 758 |
749 SkASSERT(NULL == block.fPicture); // This layer is in the top-most pict
ure | 759 SkASSERT(NULL == block.fPicture); // This layer is in the top-most pict
ure |
750 | 760 |
751 block.fBounds = fFillBounds.getBounds(sli.fStartIndex); | 761 block.fBounds = fFillBounds.getBounds(sli.fStartIndex); |
752 block.fLocalMat = fFillBounds.ctm(); | 762 block.fLocalMat = fFillBounds.ctm(); |
753 block.fPreMat = SkMatrix::I(); | 763 block.fPreMat = SkMatrix::I(); |
754 if (sli.fPaint) { | 764 if (sli.fPaint) { |
755 block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); | 765 block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); |
756 } | 766 } |
757 block.fSaveLayerOpID = sli.fStartIndex; | 767 block.fSaveLayerOpID = sli.fStartIndex; |
758 block.fRestoreOpID = fFillBounds.currentOp(); | 768 block.fRestoreOpID = fFillBounds.currentOp(); |
759 block.fHasNestedLayers = sli.fHasNestedSaveLayer; | 769 block.fHasNestedLayers = sli.fHasNestedSaveLayer; |
760 block.fIsNested = fSaveLayersInStack > 0; | 770 block.fIsNested = fSaveLayersInStack > 0; |
| 771 |
| 772 block.fKeySize = fSaveLayerOpStack.count(); |
| 773 block.fKey = SkNEW_ARRAY(int, block.fKeySize); |
| 774 memcpy(block.fKey, fSaveLayerOpStack.begin(), block.fKeySize * sizeof(in
t)); |
| 775 |
| 776 fSaveLayerOpStack.pop(); |
761 } | 777 } |
762 | 778 |
763 // Used to collect saveLayer information for layer hoisting | 779 // Used to collect saveLayer information for layer hoisting |
764 int fSaveLayersInStack; | 780 int fSaveLayersInStack; |
765 SkTDArray<SaveLayerInfo> fSaveLayerStack; | 781 SkTDArray<SaveLayerInfo> fSaveLayerStack; |
766 SkLayerInfo* fAccelData; | 782 // The op code indices of all the currently active saveLayers |
| 783 SkTDArray<int> fSaveLayerOpStack; |
| 784 SkLayerInfo* fAccelData; |
767 const SkPicture::SnapshotArray* fPictList; | 785 const SkPicture::SnapshotArray* fPictList; |
768 | 786 |
769 SkRecords::FillBounds fFillBounds; | 787 SkRecords::FillBounds fFillBounds; |
770 }; | 788 }; |
771 | 789 |
772 } // namespace SkRecords | 790 } // namespace SkRecords |
773 | 791 |
774 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
erarchy* bbh) { | 792 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
erarchy* bbh) { |
775 SkRecords::FillBounds visitor(cullRect, record); | 793 SkRecords::FillBounds visitor(cullRect, record); |
776 | 794 |
(...skipping 11 matching lines...) Expand all Loading... |
788 SkRecords::CollectLayers visitor(cullRect, record, pictList, data); | 806 SkRecords::CollectLayers visitor(cullRect, record, pictList, data); |
789 | 807 |
790 for (unsigned curOp = 0; curOp < record.count(); curOp++) { | 808 for (unsigned curOp = 0; curOp < record.count(); curOp++) { |
791 visitor.setCurrentOp(curOp); | 809 visitor.setCurrentOp(curOp); |
792 record.visit<void>(curOp, visitor); | 810 record.visit<void>(curOp, visitor); |
793 } | 811 } |
794 | 812 |
795 visitor.cleanUp(bbh); | 813 visitor.cleanUp(bbh); |
796 } | 814 } |
797 | 815 |
OLD | NEW |