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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 // from a clip entry. | 142 // from a clip entry. |
143 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); | 143 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); |
144 this->recordSave(flags); | 144 this->recordSave(flags); |
145 return this->INHERITED::save(flags); | 145 return this->INHERITED::save(flags); |
146 } | 146 } |
147 | 147 |
148 void SkPictureRecord::recordSave(SaveFlags flags) { | 148 void SkPictureRecord::recordSave(SaveFlags flags) { |
149 // op + flags | 149 // op + flags |
150 uint32_t size = kSaveSize; | 150 uint32_t size = kSaveSize; |
151 size_t initialOffset = this->addDraw(SAVE, &size); | 151 size_t initialOffset = this->addDraw(SAVE, &size); |
152 addInt(flags); | 152 this->addInt(flags); |
153 | 153 |
154 this->validate(initialOffset, size); | 154 this->validate(initialOffset, size); |
155 } | 155 } |
156 | 156 |
157 int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, | 157 int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint, |
158 SaveFlags flags) { | 158 SaveFlags flags) { |
159 // record the offset to us, making it non-positive to distinguish a save | 159 // record the offset to us, making it non-positive to distinguish a save |
160 // from a clip entry. | 160 // from a clip entry. |
161 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); | 161 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); |
162 this->recordSaveLayer(bounds, paint, flags); | 162 this->recordSaveLayer(bounds, paint, flags); |
(...skipping 18 matching lines...) Expand all Loading... |
181 uint32_t size = 2 * kUInt32Size; | 181 uint32_t size = 2 * kUInt32Size; |
182 if (NULL != bounds) { | 182 if (NULL != bounds) { |
183 size += sizeof(*bounds); // + rect | 183 size += sizeof(*bounds); // + rect |
184 } | 184 } |
185 // + paint index + flags | 185 // + paint index + flags |
186 size += 2 * kUInt32Size; | 186 size += 2 * kUInt32Size; |
187 | 187 |
188 SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
; | 188 SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
; |
189 | 189 |
190 size_t initialOffset = this->addDraw(SAVE_LAYER, &size); | 190 size_t initialOffset = this->addDraw(SAVE_LAYER, &size); |
191 addRectPtr(bounds); | 191 this->addRectPtr(bounds); |
192 SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
ten()); | 192 SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
ten()); |
193 addPaintPtr(paint); | 193 this->addPaintPtr(paint); |
194 addInt(flags); | 194 this->addInt(flags); |
195 | 195 |
196 this->validate(initialOffset, size); | 196 this->validate(initialOffset, size); |
197 } | 197 } |
198 | 198 |
199 bool SkPictureRecord::isDrawingToLayer() const { | 199 bool SkPictureRecord::isDrawingToLayer() const { |
200 return fFirstSavedLayerIndex != kNoSavedLayerIndex; | 200 return fFirstSavedLayerIndex != kNoSavedLayerIndex; |
201 } | 201 } |
202 | 202 |
203 /* | 203 /* |
204 * Read the op code from 'offset' in 'writer' and extract the size too. | 204 * Read the op code from 'offset' in 'writer' and extract the size too. |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 this->recordRestore(); | 607 this->recordRestore(); |
608 } | 608 } |
609 | 609 |
610 fRestoreOffsetStack.pop(); | 610 fRestoreOffsetStack.pop(); |
611 | 611 |
612 return this->INHERITED::restore(); | 612 return this->INHERITED::restore(); |
613 } | 613 } |
614 | 614 |
615 void SkPictureRecord::recordRestore() { | 615 void SkPictureRecord::recordRestore() { |
616 uint32_t initialOffset, size; | 616 uint32_t initialOffset, size; |
617 fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.bytesWri
tten()); | 617 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.by
tesWritten()); |
618 size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code | 618 size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code |
619 initialOffset = this->addDraw(RESTORE, &size); | 619 initialOffset = this->addDraw(RESTORE, &size); |
620 this->validate(initialOffset, size); | 620 this->validate(initialOffset, size); |
621 } | 621 } |
622 | 622 |
623 bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { | 623 bool SkPictureRecord::translate(SkScalar dx, SkScalar dy) { |
624 // op + dx + dy | 624 // op + dx + dy |
625 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 625 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |
626 size_t initialOffset = this->addDraw(TRANSLATE, &size); | 626 size_t initialOffset = this->addDraw(TRANSLATE, &size); |
627 addScalar(dx); | 627 this->addScalar(dx); |
628 addScalar(dy); | 628 this->addScalar(dy); |
629 this->validate(initialOffset, size); | 629 this->validate(initialOffset, size); |
630 return this->INHERITED::translate(dx, dy); | 630 return this->INHERITED::translate(dx, dy); |
631 } | 631 } |
632 | 632 |
633 bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { | 633 bool SkPictureRecord::scale(SkScalar sx, SkScalar sy) { |
634 // op + sx + sy | 634 // op + sx + sy |
635 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 635 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |
636 size_t initialOffset = this->addDraw(SCALE, &size); | 636 size_t initialOffset = this->addDraw(SCALE, &size); |
637 addScalar(sx); | 637 this->addScalar(sx); |
638 addScalar(sy); | 638 this->addScalar(sy); |
639 this->validate(initialOffset, size); | 639 this->validate(initialOffset, size); |
640 return this->INHERITED::scale(sx, sy); | 640 return this->INHERITED::scale(sx, sy); |
641 } | 641 } |
642 | 642 |
643 bool SkPictureRecord::rotate(SkScalar degrees) { | 643 bool SkPictureRecord::rotate(SkScalar degrees) { |
644 // op + degrees | 644 // op + degrees |
645 uint32_t size = 1 * kUInt32Size + sizeof(SkScalar); | 645 uint32_t size = 1 * kUInt32Size + sizeof(SkScalar); |
646 size_t initialOffset = this->addDraw(ROTATE, &size); | 646 size_t initialOffset = this->addDraw(ROTATE, &size); |
647 addScalar(degrees); | 647 this->addScalar(degrees); |
648 this->validate(initialOffset, size); | 648 this->validate(initialOffset, size); |
649 return this->INHERITED::rotate(degrees); | 649 return this->INHERITED::rotate(degrees); |
650 } | 650 } |
651 | 651 |
652 bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { | 652 bool SkPictureRecord::skew(SkScalar sx, SkScalar sy) { |
653 // op + sx + sy | 653 // op + sx + sy |
654 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 654 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |
655 size_t initialOffset = this->addDraw(SKEW, &size); | 655 size_t initialOffset = this->addDraw(SKEW, &size); |
656 addScalar(sx); | 656 this->addScalar(sx); |
657 addScalar(sy); | 657 this->addScalar(sy); |
658 this->validate(initialOffset, size); | 658 this->validate(initialOffset, size); |
659 return this->INHERITED::skew(sx, sy); | 659 return this->INHERITED::skew(sx, sy); |
660 } | 660 } |
661 | 661 |
662 bool SkPictureRecord::concat(const SkMatrix& matrix) { | 662 bool SkPictureRecord::concat(const SkMatrix& matrix) { |
663 this->recordConcat(matrix); | 663 this->recordConcat(matrix); |
664 return this->INHERITED::concat(matrix); | 664 return this->INHERITED::concat(matrix); |
665 } | 665 } |
666 | 666 |
667 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { | 667 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { |
668 this->validate(fWriter.bytesWritten(), 0); | 668 this->validate(fWriter.bytesWritten(), 0); |
669 // op + matrix | 669 // op + matrix |
670 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 670 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); |
671 size_t initialOffset = this->addDraw(CONCAT, &size); | 671 size_t initialOffset = this->addDraw(CONCAT, &size); |
672 addMatrix(matrix); | 672 this->addMatrix(matrix); |
673 this->validate(initialOffset, size); | 673 this->validate(initialOffset, size); |
674 } | 674 } |
675 | 675 |
676 void SkPictureRecord::setMatrix(const SkMatrix& matrix) { | 676 void SkPictureRecord::setMatrix(const SkMatrix& matrix) { |
677 this->validate(fWriter.bytesWritten(), 0); | 677 this->validate(fWriter.bytesWritten(), 0); |
678 // op + matrix | 678 // op + matrix |
679 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 679 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); |
680 size_t initialOffset = this->addDraw(SET_MATRIX, &size); | 680 size_t initialOffset = this->addDraw(SET_MATRIX, &size); |
681 addMatrix(matrix); | 681 this->addMatrix(matrix); |
682 this->validate(initialOffset, size); | 682 this->validate(initialOffset, size); |
683 this->INHERITED::setMatrix(matrix); | 683 this->INHERITED::setMatrix(matrix); |
684 } | 684 } |
685 | 685 |
686 static bool regionOpExpands(SkRegion::Op op) { | 686 static bool regionOpExpands(SkRegion::Op op) { |
687 switch (op) { | 687 switch (op) { |
688 case SkRegion::kUnion_Op: | 688 case SkRegion::kUnion_Op: |
689 case SkRegion::kXOR_Op: | 689 case SkRegion::kXOR_Op: |
690 case SkRegion::kReverseDifference_Op: | 690 case SkRegion::kReverseDifference_Op: |
691 case SkRegion::kReplace_Op: | 691 case SkRegion::kReplace_Op: |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 // in the current stack level, thus forming a linked list so that | 737 // in the current stack level, thus forming a linked list so that |
738 // the restore offsets can be filled in when the corresponding | 738 // the restore offsets can be filled in when the corresponding |
739 // restore command is recorded. | 739 // restore command is recorded. |
740 int32_t prevOffset = fRestoreOffsetStack.top(); | 740 int32_t prevOffset = fRestoreOffsetStack.top(); |
741 | 741 |
742 if (regionOpExpands(op)) { | 742 if (regionOpExpands(op)) { |
743 // Run back through any previous clip ops, and mark their offset to | 743 // Run back through any previous clip ops, and mark their offset to |
744 // be 0, disabling their ability to trigger a jump-to-restore, otherwise | 744 // be 0, disabling their ability to trigger a jump-to-restore, otherwise |
745 // they could hide this clips ability to expand the clip (i.e. go from | 745 // they could hide this clips ability to expand the clip (i.e. go from |
746 // empty to non-empty). | 746 // empty to non-empty). |
747 fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); | 747 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); |
748 | 748 |
749 // Reset the pointer back to the previous clip so that subsequent | 749 // Reset the pointer back to the previous clip so that subsequent |
750 // restores don't overwrite the offsets we just cleared. | 750 // restores don't overwrite the offsets we just cleared. |
751 prevOffset = 0; | 751 prevOffset = 0; |
752 } | 752 } |
753 | 753 |
754 size_t offset = fWriter.bytesWritten(); | 754 size_t offset = fWriter.bytesWritten(); |
755 addInt(prevOffset); | 755 this->addInt(prevOffset); |
756 fRestoreOffsetStack.top() = offset; | 756 fRestoreOffsetStack.top() = offset; |
757 return offset; | 757 return offset; |
758 } | 758 } |
759 | 759 |
760 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { | 760 bool SkPictureRecord::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { |
761 this->recordClipRect(rect, op, doAA); | 761 this->recordClipRect(rect, op, doAA); |
762 return this->INHERITED::clipRect(rect, op, doAA); | 762 return this->INHERITED::clipRect(rect, op, doAA); |
763 } | 763 } |
764 | 764 |
765 int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool do
AA) { | 765 int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool do
AA) { |
766 | 766 |
767 // id + rect + clip params | 767 // id + rect + clip params |
768 uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; | 768 uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; |
769 // recordRestoreOffsetPlaceholder doesn't always write an offset | 769 // recordRestoreOffsetPlaceholder doesn't always write an offset |
770 if (!fRestoreOffsetStack.isEmpty()) { | 770 if (!fRestoreOffsetStack.isEmpty()) { |
771 // + restore offset | 771 // + restore offset |
772 size += kUInt32Size; | 772 size += kUInt32Size; |
773 } | 773 } |
774 | 774 |
775 size_t initialOffset = this->addDraw(CLIP_RECT, &size); | 775 size_t initialOffset = this->addDraw(CLIP_RECT, &size); |
776 addRect(rect); | 776 this->addRect(rect); |
777 addInt(ClipParams_pack(op, doAA)); | 777 this->addInt(ClipParams_pack(op, doAA)); |
778 int offset = this->recordRestoreOffsetPlaceholder(op); | 778 int offset = this->recordRestoreOffsetPlaceholder(op); |
779 | 779 |
780 this->validate(initialOffset, size); | 780 this->validate(initialOffset, size); |
781 return offset; | 781 return offset; |
782 } | 782 } |
783 | 783 |
784 bool SkPictureRecord::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA
) { | 784 bool SkPictureRecord::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA
) { |
785 if (rrect.isRect()) { | 785 if (rrect.isRect()) { |
786 return this->SkPictureRecord::clipRect(rrect.getBounds(), op, doAA); | 786 return this->SkPictureRecord::clipRect(rrect.getBounds(), op, doAA); |
787 } | 787 } |
788 | 788 |
789 this->recordClipRRect(rrect, op, doAA); | 789 this->recordClipRRect(rrect, op, doAA); |
790 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { | 790 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { |
791 return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op,
false); | 791 return this->updateClipConservativelyUsingBounds(rrect.getBounds(), op,
false); |
792 } else { | 792 } else { |
793 return this->INHERITED::clipRRect(rrect, op, doAA); | 793 return this->INHERITED::clipRRect(rrect, op, doAA); |
794 } | 794 } |
795 } | 795 } |
796 | 796 |
797 int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool
doAA) { | 797 int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool
doAA) { |
798 | 798 |
799 // op + rrect + clip params | 799 // op + rrect + clip params |
800 uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; | 800 uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; |
801 // recordRestoreOffsetPlaceholder doesn't always write an offset | 801 // recordRestoreOffsetPlaceholder doesn't always write an offset |
802 if (!fRestoreOffsetStack.isEmpty()) { | 802 if (!fRestoreOffsetStack.isEmpty()) { |
803 // + restore offset | 803 // + restore offset |
804 size += kUInt32Size; | 804 size += kUInt32Size; |
805 } | 805 } |
806 size_t initialOffset = this->addDraw(CLIP_RRECT, &size); | 806 size_t initialOffset = this->addDraw(CLIP_RRECT, &size); |
807 addRRect(rrect); | 807 this->addRRect(rrect); |
808 addInt(ClipParams_pack(op, doAA)); | 808 this->addInt(ClipParams_pack(op, doAA)); |
809 int offset = recordRestoreOffsetPlaceholder(op); | 809 int offset = recordRestoreOffsetPlaceholder(op); |
810 | 810 |
811 this->validate(initialOffset, size); | 811 this->validate(initialOffset, size); |
812 return offset; | 812 return offset; |
813 } | 813 } |
814 | 814 |
815 bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { | 815 bool SkPictureRecord::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { |
816 | 816 |
817 SkRect r; | 817 SkRect r; |
818 if (!path.isInverseFillType() && path.isRect(&r)) { | 818 if (!path.isInverseFillType() && path.isRect(&r)) { |
(...skipping 14 matching lines...) Expand all Loading... |
833 int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { | 833 int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { |
834 | 834 |
835 // op + path index + clip params | 835 // op + path index + clip params |
836 uint32_t size = 3 * kUInt32Size; | 836 uint32_t size = 3 * kUInt32Size; |
837 // recordRestoreOffsetPlaceholder doesn't always write an offset | 837 // recordRestoreOffsetPlaceholder doesn't always write an offset |
838 if (!fRestoreOffsetStack.isEmpty()) { | 838 if (!fRestoreOffsetStack.isEmpty()) { |
839 // + restore offset | 839 // + restore offset |
840 size += kUInt32Size; | 840 size += kUInt32Size; |
841 } | 841 } |
842 size_t initialOffset = this->addDraw(CLIP_PATH, &size); | 842 size_t initialOffset = this->addDraw(CLIP_PATH, &size); |
843 addInt(pathID); | 843 this->addInt(pathID); |
844 addInt(ClipParams_pack(op, doAA)); | 844 this->addInt(ClipParams_pack(op, doAA)); |
845 int offset = recordRestoreOffsetPlaceholder(op); | 845 int offset = recordRestoreOffsetPlaceholder(op); |
846 | 846 |
847 this->validate(initialOffset, size); | 847 this->validate(initialOffset, size); |
848 return offset; | 848 return offset; |
849 } | 849 } |
850 | 850 |
851 bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { | 851 bool SkPictureRecord::clipRegion(const SkRegion& region, SkRegion::Op op) { |
852 this->recordClipRegion(region, op); | 852 this->recordClipRegion(region, op); |
853 return this->INHERITED::clipRegion(region, op); | 853 return this->INHERITED::clipRegion(region, op); |
854 } | 854 } |
855 | 855 |
856 int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) { | 856 int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) { |
857 // op + clip params + region | 857 // op + clip params + region |
858 uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL); | 858 uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL); |
859 // recordRestoreOffsetPlaceholder doesn't always write an offset | 859 // recordRestoreOffsetPlaceholder doesn't always write an offset |
860 if (!fRestoreOffsetStack.isEmpty()) { | 860 if (!fRestoreOffsetStack.isEmpty()) { |
861 // + restore offset | 861 // + restore offset |
862 size += kUInt32Size; | 862 size += kUInt32Size; |
863 } | 863 } |
864 size_t initialOffset = this->addDraw(CLIP_REGION, &size); | 864 size_t initialOffset = this->addDraw(CLIP_REGION, &size); |
865 addRegion(region); | 865 this->addRegion(region); |
866 addInt(ClipParams_pack(op, false)); | 866 this->addInt(ClipParams_pack(op, false)); |
867 int offset = recordRestoreOffsetPlaceholder(op); | 867 int offset = this->recordRestoreOffsetPlaceholder(op); |
868 | 868 |
869 this->validate(initialOffset, size); | 869 this->validate(initialOffset, size); |
870 return offset; | 870 return offset; |
871 } | 871 } |
872 | 872 |
873 void SkPictureRecord::clear(SkColor color) { | 873 void SkPictureRecord::clear(SkColor color) { |
874 // op + color | 874 // op + color |
875 uint32_t size = 2 * kUInt32Size; | 875 uint32_t size = 2 * kUInt32Size; |
876 size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); | 876 size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); |
877 addInt(color); | 877 this->addInt(color); |
878 this->validate(initialOffset, size); | 878 this->validate(initialOffset, size); |
879 } | 879 } |
880 | 880 |
881 void SkPictureRecord::drawPaint(const SkPaint& paint) { | 881 void SkPictureRecord::drawPaint(const SkPaint& paint) { |
882 // op + paint index | 882 // op + paint index |
883 uint32_t size = 2 * kUInt32Size; | 883 uint32_t size = 2 * kUInt32Size; |
884 size_t initialOffset = this->addDraw(DRAW_PAINT, &size); | 884 size_t initialOffset = this->addDraw(DRAW_PAINT, &size); |
885 SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
ten()); | 885 SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
ten()); |
886 addPaint(paint); | 886 this->addPaint(paint); |
887 this->validate(initialOffset, size); | 887 this->validate(initialOffset, size); |
888 } | 888 } |
889 | 889 |
890 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
[], | 890 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
[], |
891 const SkPaint& paint) { | 891 const SkPaint& paint) { |
892 // op + paint index + mode + count + point data | 892 // op + paint index + mode + count + point data |
893 uint32_t size = 4 * kUInt32Size + count * sizeof(SkPoint); | 893 uint32_t size = 4 * kUInt32Size + count * sizeof(SkPoint); |
894 size_t initialOffset = this->addDraw(DRAW_POINTS, &size); | 894 size_t initialOffset = this->addDraw(DRAW_POINTS, &size); |
895 SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
tten()); | 895 SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
tten()); |
896 addPaint(paint); | 896 this->addPaint(paint); |
897 addInt(mode); | 897 this->addInt(mode); |
898 addInt(count); | 898 this->addInt(count); |
899 fWriter.writeMul4(pts, count * sizeof(SkPoint)); | 899 fWriter.writeMul4(pts, count * sizeof(SkPoint)); |
900 this->validate(initialOffset, size); | 900 this->validate(initialOffset, size); |
901 } | 901 } |
902 | 902 |
903 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { | 903 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { |
904 // op + paint index + rect | 904 // op + paint index + rect |
905 uint32_t size = 2 * kUInt32Size + sizeof(oval); | 905 uint32_t size = 2 * kUInt32Size + sizeof(oval); |
906 size_t initialOffset = this->addDraw(DRAW_OVAL, &size); | 906 size_t initialOffset = this->addDraw(DRAW_OVAL, &size); |
907 SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
en()); | 907 SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
en()); |
908 addPaint(paint); | 908 this->addPaint(paint); |
909 addRect(oval); | 909 this->addRect(oval); |
910 this->validate(initialOffset, size); | 910 this->validate(initialOffset, size); |
911 } | 911 } |
912 | 912 |
913 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { | 913 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { |
914 // op + paint index + rect | 914 // op + paint index + rect |
915 uint32_t size = 2 * kUInt32Size + sizeof(rect); | 915 uint32_t size = 2 * kUInt32Size + sizeof(rect); |
916 size_t initialOffset = this->addDraw(DRAW_RECT, &size); | 916 size_t initialOffset = this->addDraw(DRAW_RECT, &size); |
917 SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
en()); | 917 SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
en()); |
918 addPaint(paint); | 918 this->addPaint(paint); |
919 addRect(rect); | 919 this->addRect(rect); |
920 this->validate(initialOffset, size); | 920 this->validate(initialOffset, size); |
921 } | 921 } |
922 | 922 |
923 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { | 923 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
924 if (rrect.isRect()) { | 924 if (rrect.isRect()) { |
925 this->SkPictureRecord::drawRect(rrect.getBounds(), paint); | 925 this->SkPictureRecord::drawRect(rrect.getBounds(), paint); |
926 } else if (rrect.isOval()) { | 926 } else if (rrect.isOval()) { |
927 this->SkPictureRecord::drawOval(rrect.getBounds(), paint); | 927 this->SkPictureRecord::drawOval(rrect.getBounds(), paint); |
928 } else { | 928 } else { |
929 // op + paint index + rrect | 929 // op + paint index + rrect |
930 uint32_t initialOffset, size; | 930 uint32_t initialOffset, size; |
931 size = 2 * kUInt32Size + SkRRect::kSizeInMemory; | 931 size = 2 * kUInt32Size + SkRRect::kSizeInMemory; |
932 initialOffset = this->addDraw(DRAW_RRECT, &size); | 932 initialOffset = this->addDraw(DRAW_RRECT, &size); |
933 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); | 933 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); |
934 addPaint(paint); | 934 this->addPaint(paint); |
935 addRRect(rrect); | 935 this->addRRect(rrect); |
936 this->validate(initialOffset, size); | 936 this->validate(initialOffset, size); |
937 } | 937 } |
938 } | 938 } |
939 | 939 |
940 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { | 940 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { |
941 // op + paint index + path index | 941 // op + paint index + path index |
942 uint32_t size = 3 * kUInt32Size; | 942 uint32_t size = 3 * kUInt32Size; |
943 size_t initialOffset = this->addDraw(DRAW_PATH, &size); | 943 size_t initialOffset = this->addDraw(DRAW_PATH, &size); |
944 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); | 944 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); |
945 addPaint(paint); | 945 this->addPaint(paint); |
946 addPath(path); | 946 this->addPath(path); |
947 this->validate(initialOffset, size); | 947 this->validate(initialOffset, size); |
948 } | 948 } |
949 | 949 |
950 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
top, | 950 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
top, |
951 const SkPaint* paint = NULL) { | 951 const SkPaint* paint = NULL) { |
952 // op + paint index + bitmap index + left + top | 952 // op + paint index + bitmap index + left + top |
953 uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); | 953 uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); |
954 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); | 954 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); |
955 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
tten()); | 955 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
tten()); |
956 addPaintPtr(paint); | 956 this->addPaintPtr(paint); |
957 addBitmap(bitmap); | 957 this->addBitmap(bitmap); |
958 addScalar(left); | 958 this->addScalar(left); |
959 addScalar(top); | 959 this->addScalar(top); |
960 this->validate(initialOffset, size); | 960 this->validate(initialOffset, size); |
961 } | 961 } |
962 | 962 |
963 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
src, | 963 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
src, |
964 const SkRect& dst, const SkPaint* pai
nt, | 964 const SkRect& dst, const SkPaint* pai
nt, |
965 DrawBitmapRectFlags flags) { | 965 DrawBitmapRectFlags flags) { |
966 // id + paint index + bitmap index + bool for 'src' + flags | 966 // id + paint index + bitmap index + bool for 'src' + flags |
967 uint32_t size = 5 * kUInt32Size; | 967 uint32_t size = 5 * kUInt32Size; |
968 if (NULL != src) { | 968 if (NULL != src) { |
969 size += sizeof(*src); // + rect | 969 size += sizeof(*src); // + rect |
970 } | 970 } |
971 size += sizeof(dst); // + rect | 971 size += sizeof(dst); // + rect |
972 | 972 |
973 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); | 973 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); |
974 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) == fWr
iter.bytesWritten()); | 974 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) == fWr
iter.bytesWritten()); |
975 addPaintPtr(paint); | 975 this->addPaintPtr(paint); |
976 addBitmap(bitmap); | 976 this->addBitmap(bitmap); |
977 addRectPtr(src); // may be null | 977 this->addRectPtr(src); // may be null |
978 addRect(dst); | 978 this->addRect(dst); |
979 addInt(flags); | 979 this->addInt(flags); |
980 this->validate(initialOffset, size); | 980 this->validate(initialOffset, size); |
981 } | 981 } |
982 | 982 |
983 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
atrix, | 983 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
atrix, |
984 const SkPaint* paint) { | 984 const SkPaint* paint) { |
985 // id + paint index + bitmap index + matrix | 985 // id + paint index + bitmap index + matrix |
986 uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); | 986 uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); |
987 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); | 987 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); |
988 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
ytesWritten()); | 988 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
ytesWritten()); |
989 addPaintPtr(paint); | 989 this->addPaintPtr(paint); |
990 addBitmap(bitmap); | 990 this->addBitmap(bitmap); |
991 addMatrix(matrix); | 991 this->addMatrix(matrix); |
992 this->validate(initialOffset, size); | 992 this->validate(initialOffset, size); |
993 } | 993 } |
994 | 994 |
995 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
er, | 995 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
er, |
996 const SkRect& dst, const SkPaint* paint) { | 996 const SkRect& dst, const SkPaint* paint) { |
997 // op + paint index + bitmap id + center + dst rect | 997 // op + paint index + bitmap id + center + dst rect |
998 uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); | 998 uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); |
999 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); | 999 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); |
1000 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
esWritten()); | 1000 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
esWritten()); |
1001 addPaintPtr(paint); | 1001 this->addPaintPtr(paint); |
1002 addBitmap(bitmap); | 1002 this->addBitmap(bitmap); |
1003 addIRect(center); | 1003 this->addIRect(center); |
1004 addRect(dst); | 1004 this->addRect(dst); |
1005 this->validate(initialOffset, size); | 1005 this->validate(initialOffset, size); |
1006 } | 1006 } |
1007 | 1007 |
1008 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, | 1008 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |
1009 const SkPaint* paint = NULL) { | 1009 const SkPaint* paint = NULL) { |
1010 // op + paint index + bitmap index + left + top | 1010 // op + paint index + bitmap index + left + top |
1011 uint32_t size = 5 * kUInt32Size; | 1011 uint32_t size = 5 * kUInt32Size; |
1012 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); | 1012 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |
1013 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
tten()); | 1013 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
tten()); |
1014 addPaintPtr(paint); | 1014 this->addPaintPtr(paint); |
1015 addBitmap(bitmap); | 1015 this->addBitmap(bitmap); |
1016 addInt(left); | 1016 this->addInt(left); |
1017 addInt(top); | 1017 this->addInt(top); |
1018 this->validate(initialOffset, size); | 1018 this->validate(initialOffset, size); |
1019 } | 1019 } |
1020 | 1020 |
1021 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar
topbot[2]) { | 1021 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar
topbot[2]) { |
1022 SkPaint::FontMetrics metrics; | 1022 SkPaint::FontMetrics metrics; |
1023 paint.getFontMetrics(&metrics); | 1023 paint.getFontMetrics(&metrics); |
1024 SkRect bounds; | 1024 SkRect bounds; |
1025 // construct a rect so we can see any adjustments from the paint. | 1025 // construct a rect so we can see any adjustments from the paint. |
1026 // we use 0,1 for left,right, just so the rect isn't empty | 1026 // we use 0,1 for left,right, just so the rect isn't empty |
1027 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); | 1027 bounds.set(0, metrics.fTop, SK_Scalar1, metrics.fBottom); |
1028 (void)paint.computeFastBounds(bounds, &bounds); | 1028 (void)paint.computeFastBounds(bounds, &bounds); |
1029 topbot[0] = bounds.fTop; | 1029 topbot[0] = bounds.fTop; |
1030 topbot[1] = bounds.fBottom; | 1030 topbot[1] = bounds.fBottom; |
1031 } | 1031 } |
1032 | 1032 |
1033 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
Data& flat, | 1033 void SkPictureRecord::addFontMetricsTopBottom(const SkPaint& paint, const SkFlat
Data& flat, |
1034 SkScalar minY, SkScalar maxY) { | 1034 SkScalar minY, SkScalar maxY) { |
1035 WriteTopBot(paint, flat); | 1035 WriteTopBot(paint, flat); |
1036 addScalar(flat.topBot()[0] + minY); | 1036 this->addScalar(flat.topBot()[0] + minY); |
1037 addScalar(flat.topBot()[1] + maxY); | 1037 this->addScalar(flat.topBot()[1] + maxY); |
1038 } | 1038 } |
1039 | 1039 |
1040 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, | 1040 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, |
1041 SkScalar y, const SkPaint& paint) { | 1041 SkScalar y, const SkPaint& paint) { |
1042 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1042 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
1043 | 1043 |
1044 // op + paint index + length + 'length' worth of chars + x + y | 1044 // op + paint index + length + 'length' worth of chars + x + y |
1045 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
); | 1045 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
); |
1046 if (fast) { | 1046 if (fast) { |
1047 size += 2 * sizeof(SkScalar); // + top & bottom | 1047 size += 2 * sizeof(SkScalar); // + top & bottom |
1048 } | 1048 } |
1049 | 1049 |
1050 DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; | 1050 DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; |
1051 size_t initialOffset = this->addDraw(op, &size); | 1051 size_t initialOffset = this->addDraw(op, &size); |
1052 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); | 1052 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); |
1053 const SkFlatData* flatPaintData = addPaint(paint); | 1053 const SkFlatData* flatPaintData = addPaint(paint); |
1054 SkASSERT(flatPaintData); | 1054 SkASSERT(flatPaintData); |
1055 addText(text, byteLength); | 1055 this->addText(text, byteLength); |
1056 addScalar(x); | 1056 this->addScalar(x); |
1057 addScalar(y); | 1057 this->addScalar(y); |
1058 if (fast) { | 1058 if (fast) { |
1059 addFontMetricsTopBottom(paint, *flatPaintData, y, y); | 1059 this->addFontMetricsTopBottom(paint, *flatPaintData, y, y); |
1060 } | 1060 } |
1061 this->validate(initialOffset, size); | 1061 this->validate(initialOffset, size); |
1062 } | 1062 } |
1063 | 1063 |
1064 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, | 1064 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, |
1065 const SkPoint pos[], const SkPaint& paint) { | 1065 const SkPoint pos[], const SkPaint& paint) { |
1066 size_t points = paint.countText(text, byteLength); | 1066 size_t points = paint.countText(text, byteLength); |
1067 if (0 == points) | 1067 if (0 == points) |
1068 return; | 1068 return; |
1069 | 1069 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 op = DRAW_POS_TEXT_H_TOP_BOTTOM; | 1109 op = DRAW_POS_TEXT_H_TOP_BOTTOM; |
1110 } else if (canUseDrawH) { | 1110 } else if (canUseDrawH) { |
1111 op = DRAW_POS_TEXT_H; | 1111 op = DRAW_POS_TEXT_H; |
1112 } else if (fastBounds) { | 1112 } else if (fastBounds) { |
1113 op = DRAW_POS_TEXT_TOP_BOTTOM; | 1113 op = DRAW_POS_TEXT_TOP_BOTTOM; |
1114 } else { | 1114 } else { |
1115 op = DRAW_POS_TEXT; | 1115 op = DRAW_POS_TEXT; |
1116 } | 1116 } |
1117 size_t initialOffset = this->addDraw(op, &size); | 1117 size_t initialOffset = this->addDraw(op, &size); |
1118 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); | 1118 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); |
1119 const SkFlatData* flatPaintData = addPaint(paint); | 1119 const SkFlatData* flatPaintData = this->addPaint(paint); |
1120 SkASSERT(flatPaintData); | 1120 SkASSERT(flatPaintData); |
1121 addText(text, byteLength); | 1121 this->addText(text, byteLength); |
1122 addInt(points); | 1122 this->addInt(points); |
1123 | 1123 |
1124 #ifdef SK_DEBUG_SIZE | 1124 #ifdef SK_DEBUG_SIZE |
1125 size_t start = fWriter.bytesWritten(); | 1125 size_t start = fWriter.bytesWritten(); |
1126 #endif | 1126 #endif |
1127 if (canUseDrawH) { | 1127 if (canUseDrawH) { |
1128 if (fast) { | 1128 if (fast) { |
1129 addFontMetricsTopBottom(paint, *flatPaintData, pos[0].fY, pos[0].fY)
; | 1129 this->addFontMetricsTopBottom(paint, *flatPaintData, pos[0].fY, pos[
0].fY); |
1130 } | 1130 } |
1131 addScalar(pos[0].fY); | 1131 this->addScalar(pos[0].fY); |
1132 SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); | 1132 SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); |
1133 for (size_t index = 0; index < points; index++) | 1133 for (size_t index = 0; index < points; index++) |
1134 *xptr++ = pos[index].fX; | 1134 *xptr++ = pos[index].fX; |
1135 } else { | 1135 } else { |
1136 fWriter.writeMul4(pos, points * sizeof(SkPoint)); | 1136 fWriter.writeMul4(pos, points * sizeof(SkPoint)); |
1137 if (fastBounds) { | 1137 if (fastBounds) { |
1138 addFontMetricsTopBottom(paint, *flatPaintData, minY, maxY); | 1138 this->addFontMetricsTopBottom(paint, *flatPaintData, minY, maxY); |
1139 } | 1139 } |
1140 } | 1140 } |
1141 #ifdef SK_DEBUG_SIZE | 1141 #ifdef SK_DEBUG_SIZE |
1142 fPointBytes += fWriter.bytesWritten() - start; | 1142 fPointBytes += fWriter.bytesWritten() - start; |
1143 fPointWrites += points; | 1143 fPointWrites += points; |
1144 #endif | 1144 #endif |
1145 this->validate(initialOffset, size); | 1145 this->validate(initialOffset, size); |
1146 } | 1146 } |
1147 | 1147 |
1148 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, | 1148 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, |
1149 const SkScalar xpos[], SkScalar constY, | 1149 const SkScalar xpos[], SkScalar constY, |
1150 const SkPaint& paint) { | 1150 const SkPaint& paint) { |
1151 | 1151 |
1152 const SkFlatData* flatPaintData = this->getFlatPaintData(paint); | 1152 const SkFlatData* flatPaintData = this->getFlatPaintData(paint); |
1153 drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData); | 1153 this->drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData)
; |
1154 } | 1154 } |
1155 | 1155 |
1156 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, | 1156 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, |
1157 const SkScalar xpos[], SkScalar constY, | 1157 const SkScalar xpos[], SkScalar constY, |
1158 const SkPaint& paint, const SkFlatData* flatPaintData)
{ | 1158 const SkPaint& paint, const SkFlatData* flatPaintData)
{ |
1159 size_t points = paint.countText(text, byteLength); | 1159 size_t points = paint.countText(text, byteLength); |
1160 if (0 == points) | 1160 if (0 == points) |
1161 return; | 1161 return; |
1162 | 1162 |
1163 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1163 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
1164 | 1164 |
1165 // op + paint index + length + 'length' worth of data + num points | 1165 // op + paint index + length + 'length' worth of data + num points |
1166 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; | 1166 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; |
1167 if (fast) { | 1167 if (fast) { |
1168 size += 2 * sizeof(SkScalar); // + top & bottom | 1168 size += 2 * sizeof(SkScalar); // + top & bottom |
1169 } | 1169 } |
1170 // + y + the actual points | 1170 // + y + the actual points |
1171 size += 1 * kUInt32Size + points * sizeof(SkScalar); | 1171 size += 1 * kUInt32Size + points * sizeof(SkScalar); |
1172 size_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRA
W_POS_TEXT_H, | 1172 size_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRA
W_POS_TEXT_H, |
1173 &size); | 1173 &size); |
1174 SkASSERT(flatPaintData); | 1174 SkASSERT(flatPaintData); |
1175 addFlatPaint(flatPaintData); | 1175 this->addFlatPaint(flatPaintData); |
1176 | 1176 |
1177 addText(text, byteLength); | 1177 this->addText(text, byteLength); |
1178 addInt(points); | 1178 this->addInt(points); |
1179 | 1179 |
1180 #ifdef SK_DEBUG_SIZE | 1180 #ifdef SK_DEBUG_SIZE |
1181 size_t start = fWriter.bytesWritten(); | 1181 size_t start = fWriter.bytesWritten(); |
1182 #endif | 1182 #endif |
1183 if (fast) { | 1183 if (fast) { |
1184 addFontMetricsTopBottom(paint, *flatPaintData, constY, constY); | 1184 this->addFontMetricsTopBottom(paint, *flatPaintData, constY, constY); |
1185 } | 1185 } |
1186 addScalar(constY); | 1186 this->addScalar(constY); |
1187 fWriter.writeMul4(xpos, points * sizeof(SkScalar)); | 1187 fWriter.writeMul4(xpos, points * sizeof(SkScalar)); |
1188 #ifdef SK_DEBUG_SIZE | 1188 #ifdef SK_DEBUG_SIZE |
1189 fPointBytes += fWriter.bytesWritten() - start; | 1189 fPointBytes += fWriter.bytesWritten() - start; |
1190 fPointWrites += points; | 1190 fPointWrites += points; |
1191 #endif | 1191 #endif |
1192 this->validate(initialOffset, size); | 1192 this->validate(initialOffset, size); |
1193 } | 1193 } |
1194 | 1194 |
1195 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, | 1195 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, |
1196 const SkPath& path, const SkMatrix* matrix, | 1196 const SkPath& path, const SkMatrix* matrix, |
1197 const SkPaint& paint) { | 1197 const SkPaint& paint) { |
1198 // op + paint index + length + 'length' worth of data + path index + matrix | 1198 // op + paint index + length + 'length' worth of data + path index + matrix |
1199 const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); | 1199 const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); |
1200 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.wri
teToMemory(NULL); | 1200 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.wri
teToMemory(NULL); |
1201 size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); | 1201 size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); |
1202 SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
tesWritten()); | 1202 SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
tesWritten()); |
1203 addPaint(paint); | 1203 this->addPaint(paint); |
1204 addText(text, byteLength); | 1204 this->addText(text, byteLength); |
1205 addPath(path); | 1205 this->addPath(path); |
1206 addMatrix(m); | 1206 this->addMatrix(m); |
1207 this->validate(initialOffset, size); | 1207 this->validate(initialOffset, size); |
1208 } | 1208 } |
1209 | 1209 |
1210 void SkPictureRecord::drawPicture(SkPicture& picture) { | 1210 void SkPictureRecord::drawPicture(SkPicture& picture) { |
1211 // op + picture index | 1211 // op + picture index |
1212 uint32_t size = 2 * kUInt32Size; | 1212 uint32_t size = 2 * kUInt32Size; |
1213 size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); | 1213 size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); |
1214 addPicture(picture); | 1214 this->addPicture(picture); |
1215 this->validate(initialOffset, size); | 1215 this->validate(initialOffset, size); |
1216 } | 1216 } |
1217 | 1217 |
1218 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, | 1218 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, |
1219 const SkPoint vertices[], const SkPoint texs[], | 1219 const SkPoint vertices[], const SkPoint texs[], |
1220 const SkColor colors[], SkXfermode* xfer, | 1220 const SkColor colors[], SkXfermode* xfer, |
1221 const uint16_t indices[], int indexCount, | 1221 const uint16_t indices[], int indexCount, |
1222 const SkPaint& paint) { | 1222 const SkPaint& paint) { |
1223 uint32_t flags = 0; | 1223 uint32_t flags = 0; |
1224 if (texs) { | 1224 if (texs) { |
(...skipping 23 matching lines...) Expand all Loading... |
1248 if (flags & DRAW_VERTICES_HAS_INDICES) { | 1248 if (flags & DRAW_VERTICES_HAS_INDICES) { |
1249 // + num indices + indices | 1249 // + num indices + indices |
1250 size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); | 1250 size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); |
1251 } | 1251 } |
1252 if (flags & DRAW_VERTICES_HAS_XFER) { | 1252 if (flags & DRAW_VERTICES_HAS_XFER) { |
1253 size += kUInt32Size; // mode enum | 1253 size += kUInt32Size; // mode enum |
1254 } | 1254 } |
1255 | 1255 |
1256 size_t initialOffset = this->addDraw(DRAW_VERTICES, &size); | 1256 size_t initialOffset = this->addDraw(DRAW_VERTICES, &size); |
1257 SkASSERT(initialOffset+getPaintOffset(DRAW_VERTICES, size) == fWriter.bytesW
ritten()); | 1257 SkASSERT(initialOffset+getPaintOffset(DRAW_VERTICES, size) == fWriter.bytesW
ritten()); |
1258 addPaint(paint); | 1258 this->addPaint(paint); |
1259 addInt(flags); | 1259 this->addInt(flags); |
1260 addInt(vmode); | 1260 this->addInt(vmode); |
1261 addInt(vertexCount); | 1261 this->addInt(vertexCount); |
1262 addPoints(vertices, vertexCount); | 1262 this->addPoints(vertices, vertexCount); |
1263 if (flags & DRAW_VERTICES_HAS_TEXS) { | 1263 if (flags & DRAW_VERTICES_HAS_TEXS) { |
1264 addPoints(texs, vertexCount); | 1264 this->addPoints(texs, vertexCount); |
1265 } | 1265 } |
1266 if (flags & DRAW_VERTICES_HAS_COLORS) { | 1266 if (flags & DRAW_VERTICES_HAS_COLORS) { |
1267 fWriter.writeMul4(colors, vertexCount * sizeof(SkColor)); | 1267 fWriter.writeMul4(colors, vertexCount * sizeof(SkColor)); |
1268 } | 1268 } |
1269 if (flags & DRAW_VERTICES_HAS_INDICES) { | 1269 if (flags & DRAW_VERTICES_HAS_INDICES) { |
1270 addInt(indexCount); | 1270 this->addInt(indexCount); |
1271 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); | 1271 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); |
1272 } | 1272 } |
1273 if (flags & DRAW_VERTICES_HAS_XFER) { | 1273 if (flags & DRAW_VERTICES_HAS_XFER) { |
1274 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; | 1274 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; |
1275 (void)xfer->asMode(&mode); | 1275 (void)xfer->asMode(&mode); |
1276 addInt(mode); | 1276 this->addInt(mode); |
1277 } | 1277 } |
1278 this->validate(initialOffset, size); | 1278 this->validate(initialOffset, size); |
1279 } | 1279 } |
1280 | 1280 |
1281 void SkPictureRecord::drawData(const void* data, size_t length) { | 1281 void SkPictureRecord::drawData(const void* data, size_t length) { |
1282 // op + length + 'length' worth of data | 1282 // op + length + 'length' worth of data |
1283 uint32_t size = 2 * kUInt32Size + SkAlign4(length); | 1283 uint32_t size = 2 * kUInt32Size + SkAlign4(length); |
1284 size_t initialOffset = this->addDraw(DRAW_DATA, &size); | 1284 size_t initialOffset = this->addDraw(DRAW_DATA, &size); |
1285 addInt(length); | 1285 this->addInt(length); |
1286 fWriter.writePad(data, length); | 1286 fWriter.writePad(data, length); |
1287 this->validate(initialOffset, size); | 1287 this->validate(initialOffset, size); |
1288 } | 1288 } |
1289 | 1289 |
1290 void SkPictureRecord::beginCommentGroup(const char* description) { | 1290 void SkPictureRecord::beginCommentGroup(const char* description) { |
1291 // op/size + length of string + \0 terminated chars | 1291 // op/size + length of string + \0 terminated chars |
1292 int length = strlen(description); | 1292 int length = strlen(description); |
1293 uint32_t size = 2 * kUInt32Size + SkAlign4(length + 1); | 1293 uint32_t size = 2 * kUInt32Size + SkAlign4(length + 1); |
1294 size_t initialOffset = this->addDraw(BEGIN_COMMENT_GROUP, &size); | 1294 size_t initialOffset = this->addDraw(BEGIN_COMMENT_GROUP, &size); |
1295 fWriter.writeString(description, length); | 1295 fWriter.writeString(description, length); |
(...skipping 19 matching lines...) Expand all Loading... |
1315 } | 1315 } |
1316 | 1316 |
1317 /////////////////////////////////////////////////////////////////////////////// | 1317 /////////////////////////////////////////////////////////////////////////////// |
1318 | 1318 |
1319 void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { | 1319 void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { |
1320 const int index = fBitmapHeap->insert(bitmap); | 1320 const int index = fBitmapHeap->insert(bitmap); |
1321 // In debug builds, a bad return value from insert() will crash, allowing fo
r debugging. In | 1321 // In debug builds, a bad return value from insert() will crash, allowing fo
r debugging. In |
1322 // release builds, the invalid value will be recorded so that the reader wil
l know that there | 1322 // release builds, the invalid value will be recorded so that the reader wil
l know that there |
1323 // was a problem. | 1323 // was a problem. |
1324 SkASSERT(index != SkBitmapHeap::INVALID_SLOT); | 1324 SkASSERT(index != SkBitmapHeap::INVALID_SLOT); |
1325 addInt(index); | 1325 this->addInt(index); |
1326 } | 1326 } |
1327 | 1327 |
1328 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { | 1328 void SkPictureRecord::addMatrix(const SkMatrix& matrix) { |
1329 fWriter.writeMatrix(matrix); | 1329 fWriter.writeMatrix(matrix); |
1330 } | 1330 } |
1331 | 1331 |
1332 const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) { | 1332 const SkFlatData* SkPictureRecord::getFlatPaintData(const SkPaint& paint) { |
1333 return fPaints.findAndReturnFlat(paint); | 1333 return fPaints.findAndReturnFlat(paint); |
1334 } | 1334 } |
1335 | 1335 |
1336 const SkFlatData* SkPictureRecord::addPaintPtr(const SkPaint* paint) { | 1336 const SkFlatData* SkPictureRecord::addPaintPtr(const SkPaint* paint) { |
1337 const SkFlatData* data = paint ? getFlatPaintData(*paint) : NULL; | 1337 const SkFlatData* data = paint ? getFlatPaintData(*paint) : NULL; |
1338 this->addFlatPaint(data); | 1338 this->addFlatPaint(data); |
1339 return data; | 1339 return data; |
1340 } | 1340 } |
1341 | 1341 |
1342 void SkPictureRecord::addFlatPaint(const SkFlatData* flatPaint) { | 1342 void SkPictureRecord::addFlatPaint(const SkFlatData* flatPaint) { |
1343 int index = flatPaint ? flatPaint->index() : 0; | 1343 int index = flatPaint ? flatPaint->index() : 0; |
1344 this->addInt(index); | 1344 this->addInt(index); |
1345 } | 1345 } |
1346 | 1346 |
1347 int SkPictureRecord::addPathToHeap(const SkPath& path) { | 1347 int SkPictureRecord::addPathToHeap(const SkPath& path) { |
1348 if (NULL == fPathHeap) { | 1348 if (NULL == fPathHeap) { |
1349 fPathHeap = SkNEW(SkPathHeap); | 1349 fPathHeap = SkNEW(SkPathHeap); |
1350 } | 1350 } |
1351 return fPathHeap->append(path); | 1351 return fPathHeap->append(path); |
1352 } | 1352 } |
1353 | 1353 |
1354 void SkPictureRecord::addPath(const SkPath& path) { | 1354 void SkPictureRecord::addPath(const SkPath& path) { |
1355 addInt(this->addPathToHeap(path)); | 1355 this->addInt(this->addPathToHeap(path)); |
1356 } | 1356 } |
1357 | 1357 |
1358 void SkPictureRecord::addPicture(SkPicture& picture) { | 1358 void SkPictureRecord::addPicture(SkPicture& picture) { |
1359 int index = fPictureRefs.find(&picture); | 1359 int index = fPictureRefs.find(&picture); |
1360 if (index < 0) { // not found | 1360 if (index < 0) { // not found |
1361 index = fPictureRefs.count(); | 1361 index = fPictureRefs.count(); |
1362 *fPictureRefs.append() = &picture; | 1362 *fPictureRefs.append() = &picture; |
1363 picture.ref(); | 1363 picture.ref(); |
1364 } | 1364 } |
1365 // follow the convention of recording a 1-based index | 1365 // follow the convention of recording a 1-based index |
1366 addInt(index + 1); | 1366 this->addInt(index + 1); |
1367 } | 1367 } |
1368 | 1368 |
1369 void SkPictureRecord::addPoint(const SkPoint& point) { | 1369 void SkPictureRecord::addPoint(const SkPoint& point) { |
1370 #ifdef SK_DEBUG_SIZE | 1370 #ifdef SK_DEBUG_SIZE |
1371 size_t start = fWriter.bytesWritten(); | 1371 size_t start = fWriter.bytesWritten(); |
1372 #endif | 1372 #endif |
1373 fWriter.writePoint(point); | 1373 fWriter.writePoint(point); |
1374 #ifdef SK_DEBUG_SIZE | 1374 #ifdef SK_DEBUG_SIZE |
1375 fPointBytes += fWriter.bytesWritten() - start; | 1375 fPointBytes += fWriter.bytesWritten() - start; |
1376 fPointWrites++; | 1376 fPointWrites++; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 void SkPictureRecord::validateRegions() const { | 1558 void SkPictureRecord::validateRegions() const { |
1559 int count = fRegions.count(); | 1559 int count = fRegions.count(); |
1560 SkASSERT((unsigned) count < 0x1000); | 1560 SkASSERT((unsigned) count < 0x1000); |
1561 for (int index = 0; index < count; index++) { | 1561 for (int index = 0; index < count; index++) { |
1562 const SkFlatData* region = fRegions[index]; | 1562 const SkFlatData* region = fRegions[index]; |
1563 SkASSERT(region); | 1563 SkASSERT(region); |
1564 // region->validate(); | 1564 // region->validate(); |
1565 } | 1565 } |
1566 } | 1566 } |
1567 #endif | 1567 #endif |
OLD | NEW |