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 "SkRecordDraw.h" | 8 #include "SkRecordDraw.h" |
9 #include "SkPatchUtils.h" | 9 #include "SkPatchUtils.h" |
10 | 10 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 this->updateCTM(op); | 179 this->updateCTM(op); |
180 this->updateClipBounds(op); | 180 this->updateClipBounds(op); |
181 this->trackBounds(op); | 181 this->trackBounds(op); |
182 } | 182 } |
183 | 183 |
184 // In this file, SkRect are in local coordinates, Bounds are translated back
to identity space. | 184 // In this file, SkRect are in local coordinates, Bounds are translated back
to identity space. |
185 typedef SkRect Bounds; | 185 typedef SkRect Bounds; |
186 | 186 |
187 unsigned currentOp() const { return fCurrentOp; } | 187 unsigned currentOp() const { return fCurrentOp; } |
188 const SkMatrix& ctm() const { return *fCTM; } | 188 const SkMatrix& ctm() const { return *fCTM; } |
189 const Bounds& currentClipBounds() const { return fCurrentClipBounds; } | |
190 const Bounds& getBounds(unsigned index) const { return fBounds[index]; } | 189 const Bounds& getBounds(unsigned index) const { return fBounds[index]; } |
191 | 190 |
192 // Adjust rect for all paints that may affect its geometry, then map it to i
dentity space. | 191 // Adjust rect for all paints that may affect its geometry, then map it to i
dentity space. |
193 Bounds adjustAndMap(SkRect rect, const SkPaint* paint) const { | 192 Bounds adjustAndMap(SkRect rect, const SkPaint* paint) const { |
194 // Inverted rectangles really confuse our BBHs. | 193 // Inverted rectangles really confuse our BBHs. |
195 rect.sort(); | 194 rect.sort(); |
196 | 195 |
197 // Adjust the rect for its own paint. | 196 // Adjust the rect for its own paint. |
198 if (!AdjustForPaint(paint, &rect)) { | 197 if (!AdjustForPaint(paint, &rect)) { |
199 // The paint could do anything to our bounds. The only safe answer
is the current clip. | 198 // The paint could do anything to our bounds. The only safe answer
is the current clip. |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 } | 594 } |
596 | 595 |
597 template <typename T> void operator()(const T& op) { | 596 template <typename T> void operator()(const T& op) { |
598 fFillBounds(op); | 597 fFillBounds(op); |
599 this->trackSaveLayers(op); | 598 this->trackSaveLayers(op); |
600 } | 599 } |
601 | 600 |
602 private: | 601 private: |
603 struct SaveLayerInfo { | 602 struct SaveLayerInfo { |
604 SaveLayerInfo() { } | 603 SaveLayerInfo() { } |
605 SaveLayerInfo(int opIndex, bool isSaveLayer, const SkPaint* paint, | 604 SaveLayerInfo(int opIndex, bool isSaveLayer, const SkPaint* paint) |
606 const FillBounds::Bounds& clipBound) | |
607 : fStartIndex(opIndex) | 605 : fStartIndex(opIndex) |
608 , fIsSaveLayer(isSaveLayer) | 606 , fIsSaveLayer(isSaveLayer) |
609 , fHasNestedSaveLayer(false) | 607 , fHasNestedSaveLayer(false) |
610 , fPaint(paint) | 608 , fPaint(paint) { |
611 , fClipBound(clipBound) { | |
612 } | 609 } |
613 | 610 |
614 int fStartIndex; | 611 int fStartIndex; |
615 bool fIsSaveLayer; | 612 bool fIsSaveLayer; |
616 bool fHasNestedSaveLayer; | 613 bool fHasNestedSaveLayer; |
617 const SkPaint* fPaint; | 614 const SkPaint* fPaint; |
618 FillBounds::Bounds fClipBound; | |
619 }; | 615 }; |
620 | 616 |
621 template <typename T> void trackSaveLayers(const T& op) { | 617 template <typename T> void trackSaveLayers(const T& op) { |
622 /* most ops aren't involved in saveLayers */ | 618 /* most ops aren't involved in saveLayers */ |
623 } | 619 } |
624 void trackSaveLayers(const Save& s) { this->pushSaveLayerInfo(false, NULL);
} | 620 void trackSaveLayers(const Save& s) { this->pushSaveLayerInfo(false, NULL);
} |
625 void trackSaveLayers(const SaveLayer& sl) { this->pushSaveLayerInfo(true, sl
.paint); } | 621 void trackSaveLayers(const SaveLayer& sl) { this->pushSaveLayerInfo(true, sl
.paint); } |
626 void trackSaveLayers(const Restore& r) { this->popSaveLayerInfo(); } | 622 void trackSaveLayers(const Restore& r) { this->popSaveLayerInfo(); } |
627 | 623 |
628 void trackSaveLayers(const DrawPicture& dp) { | 624 void trackSaveLayers(const DrawPicture& dp) { |
629 // For sub-pictures, we wrap their layer information within the parent | 625 // For sub-pictures, we wrap their layer information within the parent |
630 // picture's rendering hierarchy | 626 // picture's rendering hierarchy |
631 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey(); | 627 SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey(); |
632 | 628 |
633 const GrAccelData* childData = | 629 const GrAccelData* childData = |
634 static_cast<const GrAccelData*>(dp.picture->EXPERIMENTAL_getAccelDat
a(key)); | 630 static_cast<const GrAccelData*>(dp.picture->EXPERIMENTAL_getAccelDat
a(key)); |
635 if (!childData) { | 631 if (!childData) { |
636 // If the child layer hasn't been generated with saveLayer data we | 632 // If the child layer hasn't been generated with saveLayer data we |
637 // assume the worst (i.e., that it does contain layers which nest | 633 // assume the worst (i.e., that it does contain layers which nest |
638 // inside existing layers). Layers within sub-pictures that don't | 634 // inside existing layers). Layers within sub-pictures that don't |
639 // have saveLayer data cannot be hoisted. | 635 // have saveLayer data cannot be hoisted. |
640 // TODO: could the analysis data be use to fine tune this? | 636 // TODO: could the analysis data be use to fine tune this? |
641 this->updateStackForSaveLayer(); | 637 this->updateStackForSaveLayer(); |
642 return; | 638 return; |
643 } | 639 } |
644 | 640 |
645 for (int i = 0; i < childData->numSaveLayers(); ++i) { | 641 for (int i = 0; i < childData->numSaveLayers(); ++i) { |
646 const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i); | 642 const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i); |
647 | 643 |
648 FillBounds::Bounds newClip(fFillBounds.currentClipBounds()); | 644 FillBounds::Bounds newBound = fFillBounds.adjustAndMap(src.fBounds,
dp.paint); |
649 | 645 if (newBound.isEmpty()) { |
650 if (!newClip.intersect(fFillBounds.adjustAndMap(src.fBounds, dp.pain
t))) { | |
651 continue; | 646 continue; |
652 } | 647 } |
653 | 648 |
654 this->updateStackForSaveLayer(); | 649 this->updateStackForSaveLayer(); |
655 | 650 |
656 GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo(); | 651 GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo(); |
657 | 652 |
658 // If src.fPicture is NULL the layer is in dp.picture; otherwise | 653 // If src.fPicture is NULL the layer is in dp.picture; otherwise |
659 // it belongs to a sub-picture. | 654 // it belongs to a sub-picture. |
660 dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPic
ture*>(dp.picture); | 655 dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPic
ture*>(dp.picture); |
661 dst.fPicture->ref(); | 656 dst.fPicture->ref(); |
662 dst.fBounds = newClip; | 657 dst.fBounds = newBound; |
663 dst.fLocalMat = src.fLocalMat; | 658 dst.fLocalMat = src.fLocalMat; |
664 dst.fPreMat = src.fPreMat; | 659 dst.fPreMat = src.fPreMat; |
665 dst.fPreMat.postConcat(fFillBounds.ctm()); | 660 dst.fPreMat.postConcat(fFillBounds.ctm()); |
666 if (src.fPaint) { | 661 if (src.fPaint) { |
667 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); | 662 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); |
668 } | 663 } |
669 dst.fSaveLayerOpID = src.fSaveLayerOpID; | 664 dst.fSaveLayerOpID = src.fSaveLayerOpID; |
670 dst.fRestoreOpID = src.fRestoreOpID; | 665 dst.fRestoreOpID = src.fRestoreOpID; |
671 dst.fHasNestedLayers = src.fHasNestedLayers; | 666 dst.fHasNestedLayers = src.fHasNestedLayers; |
672 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; | 667 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; |
(...skipping 13 matching lines...) Expand all Loading... |
686 } | 681 } |
687 } | 682 } |
688 } | 683 } |
689 | 684 |
690 void pushSaveLayerInfo(bool isSaveLayer, const SkPaint* paint) { | 685 void pushSaveLayerInfo(bool isSaveLayer, const SkPaint* paint) { |
691 if (isSaveLayer) { | 686 if (isSaveLayer) { |
692 this->updateStackForSaveLayer(); | 687 this->updateStackForSaveLayer(); |
693 ++fSaveLayersInStack; | 688 ++fSaveLayersInStack; |
694 } | 689 } |
695 | 690 |
696 fSaveLayerStack.push(SaveLayerInfo(fFillBounds.currentOp(), isSaveLayer,
paint, | 691 fSaveLayerStack.push(SaveLayerInfo(fFillBounds.currentOp(), isSaveLayer,
paint)); |
697 fFillBounds.currentClipBounds())); | |
698 } | 692 } |
699 | 693 |
700 void popSaveLayerInfo() { | 694 void popSaveLayerInfo() { |
701 if (fSaveLayerStack.count() <= 0) { | 695 if (fSaveLayerStack.count() <= 0) { |
702 SkASSERT(false); | 696 SkASSERT(false); |
703 return; | 697 return; |
704 } | 698 } |
705 | 699 |
706 SaveLayerInfo sli; | 700 SaveLayerInfo sli; |
707 fSaveLayerStack.pop(&sli); | 701 fSaveLayerStack.pop(&sli); |
708 | 702 |
709 if (!sli.fIsSaveLayer) { | 703 if (!sli.fIsSaveLayer) { |
710 return; | 704 return; |
711 } | 705 } |
712 | 706 |
713 --fSaveLayersInStack; | 707 --fSaveLayersInStack; |
714 | 708 |
715 GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo(); | 709 GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo(); |
716 | 710 |
717 SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most pic
ture | 711 SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most pic
ture |
718 | 712 |
719 slInfo.fBounds = fFillBounds.getBounds(sli.fStartIndex); | 713 slInfo.fBounds = fFillBounds.getBounds(sli.fStartIndex); |
720 slInfo.fBounds.intersect(sli.fClipBound); | |
721 slInfo.fLocalMat = fFillBounds.ctm(); | 714 slInfo.fLocalMat = fFillBounds.ctm(); |
722 slInfo.fPreMat = SkMatrix::I(); | 715 slInfo.fPreMat = SkMatrix::I(); |
723 if (sli.fPaint) { | 716 if (sli.fPaint) { |
724 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); | 717 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint)); |
725 } | 718 } |
726 slInfo.fSaveLayerOpID = sli.fStartIndex; | 719 slInfo.fSaveLayerOpID = sli.fStartIndex; |
727 slInfo.fRestoreOpID = fFillBounds.currentOp(); | 720 slInfo.fRestoreOpID = fFillBounds.currentOp(); |
728 slInfo.fHasNestedLayers = sli.fHasNestedSaveLayer; | 721 slInfo.fHasNestedLayers = sli.fHasNestedSaveLayer; |
729 slInfo.fIsNested = fSaveLayersInStack > 0; | 722 slInfo.fIsNested = fSaveLayersInStack > 0; |
730 } | 723 } |
(...skipping 27 matching lines...) Expand all Loading... |
758 | 751 |
759 for (unsigned curOp = 0; curOp < record.count(); curOp++) { | 752 for (unsigned curOp = 0; curOp < record.count(); curOp++) { |
760 visitor.setCurrentOp(curOp); | 753 visitor.setCurrentOp(curOp); |
761 record.visit<void>(curOp, visitor); | 754 record.visit<void>(curOp, visitor); |
762 } | 755 } |
763 | 756 |
764 visitor.cleanUp(bbh); | 757 visitor.cleanUp(bbh); |
765 } | 758 } |
766 #endif | 759 #endif |
767 | 760 |
OLD | NEW |