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 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 dst.fLocalMat = src.fLocalMat; | 675 dst.fLocalMat = src.fLocalMat; |
676 dst.fPreMat = src.fPreMat; | 676 dst.fPreMat = src.fPreMat; |
677 dst.fPreMat.postConcat(fFillBounds.ctm()); | 677 dst.fPreMat.postConcat(fFillBounds.ctm()); |
678 if (src.fPaint) { | 678 if (src.fPaint) { |
679 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); | 679 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); |
680 } | 680 } |
681 dst.fSaveLayerOpID = src.fSaveLayerOpID; | 681 dst.fSaveLayerOpID = src.fSaveLayerOpID; |
682 dst.fRestoreOpID = src.fRestoreOpID; | 682 dst.fRestoreOpID = src.fRestoreOpID; |
683 dst.fHasNestedLayers = src.fHasNestedLayers; | 683 dst.fHasNestedLayers = src.fHasNestedLayers; |
684 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; | 684 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; |
| 685 |
| 686 dst.fKeySize = fSaveLayerOpStack.count() + src.fKeySize; |
| 687 dst.fKey = SkNEW_ARRAY(int, dst.fKeySize); |
| 688 memcpy(dst.fKey, fSaveLayerOpStack.begin(), fSaveLayerOpStack.count(
) * sizeof(int)); |
| 689 memcpy(&dst.fKey[fSaveLayerOpStack.count()], src.fKey, src.fKeySize
* sizeof(int)); |
685 } | 690 } |
686 } | 691 } |
687 | 692 |
688 // Inform all the saveLayers already on the stack that they now have a | 693 // Inform all the saveLayers already on the stack that they now have a |
689 // nested saveLayer inside them | 694 // nested saveLayer inside them |
690 void updateStackForSaveLayer() { | 695 void updateStackForSaveLayer() { |
691 for (int index = fSaveLayerStack.count() - 1; index >= 0; --index) { | 696 for (int index = fSaveLayerStack.count() - 1; index >= 0; --index) { |
692 if (fSaveLayerStack[index].fHasNestedSaveLayer) { | 697 if (fSaveLayerStack[index].fHasNestedSaveLayer) { |
693 break; | 698 break; |
694 } | 699 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 block.fBounds = fFillBounds.getBounds(sli.fStartIndex); | 735 block.fBounds = fFillBounds.getBounds(sli.fStartIndex); |
731 block.fLocalMat = fFillBounds.ctm(); | 736 block.fLocalMat = fFillBounds.ctm(); |
732 block.fPreMat = SkMatrix::I(); | 737 block.fPreMat = SkMatrix::I(); |
733 if (sli.fPaint) { | 738 if (sli.fPaint) { |
734 block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); | 739 block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); |
735 } | 740 } |
736 block.fSaveLayerOpID = sli.fStartIndex; | 741 block.fSaveLayerOpID = sli.fStartIndex; |
737 block.fRestoreOpID = fFillBounds.currentOp(); | 742 block.fRestoreOpID = fFillBounds.currentOp(); |
738 block.fHasNestedLayers = sli.fHasNestedSaveLayer; | 743 block.fHasNestedLayers = sli.fHasNestedSaveLayer; |
739 block.fIsNested = fSaveLayersInStack > 0; | 744 block.fIsNested = fSaveLayersInStack > 0; |
| 745 |
| 746 block.fKeySize = fSaveLayerOpStack.count(); |
| 747 block.fKey = SkNEW_ARRAY(int, block.fKeySize); |
| 748 memcpy(block.fKey, fSaveLayerOpStack.begin(), block.fKeySize * sizeof(in
t)); |
740 } | 749 } |
741 | 750 |
742 // Used to collect saveLayer information for layer hoisting | 751 // Used to collect saveLayer information for layer hoisting |
743 int fSaveLayersInStack; | 752 int fSaveLayersInStack; |
744 SkTDArray<SaveLayerInfo> fSaveLayerStack; | 753 SkTDArray<SaveLayerInfo> fSaveLayerStack; |
745 SkLayerInfo* fAccelData; | 754 SkTDArray<int> fSaveLayerOpStack; |
| 755 SkLayerInfo* fAccelData; |
746 | 756 |
747 SkRecords::FillBounds fFillBounds; | 757 SkRecords::FillBounds fFillBounds; |
748 }; | 758 }; |
749 | 759 |
750 } // namespace SkRecords | 760 } // namespace SkRecords |
751 | 761 |
752 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
erarchy* bbh) { | 762 void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
erarchy* bbh) { |
753 SkRecords::FillBounds visitor(cullRect, record); | 763 SkRecords::FillBounds visitor(cullRect, record); |
754 | 764 |
755 for (unsigned curOp = 0; curOp < record.count(); curOp++) { | 765 for (unsigned curOp = 0; curOp < record.count(); curOp++) { |
756 visitor.setCurrentOp(curOp); | 766 visitor.setCurrentOp(curOp); |
757 record.visit<void>(curOp, visitor); | 767 record.visit<void>(curOp, visitor); |
758 } | 768 } |
759 | 769 |
760 visitor.cleanUp(bbh); | 770 visitor.cleanUp(bbh); |
761 } | 771 } |
762 | 772 |
763 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record, | 773 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record, |
764 SkBBoxHierarchy* bbh, SkLayerInfo* data) { | 774 SkBBoxHierarchy* bbh, SkLayerInfo* data) { |
765 SkRecords::CollectLayers visitor(cullRect, record, data); | 775 SkRecords::CollectLayers visitor(cullRect, record, data); |
766 | 776 |
767 for (unsigned curOp = 0; curOp < record.count(); curOp++) { | 777 for (unsigned curOp = 0; curOp < record.count(); curOp++) { |
768 visitor.setCurrentOp(curOp); | 778 visitor.setCurrentOp(curOp); |
769 record.visit<void>(curOp, visitor); | 779 record.visit<void>(curOp, visitor); |
770 } | 780 } |
771 | 781 |
772 visitor.cleanUp(bbh); | 782 visitor.cleanUp(bbh); |
773 } | 783 } |
774 | 784 |
OLD | NEW |