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 "SkPicturePlayback.h" | 8 #include "SkPicturePlayback.h" |
9 #include "SkPictureRecord.h" | 9 #include "SkPictureRecord.h" |
10 #include "SkTypeface.h" | 10 #include "SkTypeface.h" |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 } | 700 } |
701 return (DrawType) op; | 701 return (DrawType) op; |
702 } | 702 } |
703 | 703 |
704 void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback)
{ | 704 void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback)
{ |
705 #ifdef ENABLE_TIME_DRAW | 705 #ifdef ENABLE_TIME_DRAW |
706 SkAutoTime at("SkPicture::draw", 50); | 706 SkAutoTime at("SkPicture::draw", 50); |
707 #endif | 707 #endif |
708 | 708 |
709 #ifdef SPEW_CLIP_SKIPPING | 709 #ifdef SPEW_CLIP_SKIPPING |
710 SkipClipRec skipRect, skipRRect, skipRegion, skipPath; | 710 SkipClipRec skipRect, skipRRect, skipRegion, skipPath, skipCull; |
| 711 int opCount = 0; |
711 #endif | 712 #endif |
712 | 713 |
713 #ifdef SK_BUILD_FOR_ANDROID | 714 #ifdef SK_BUILD_FOR_ANDROID |
714 SkAutoMutexAcquire autoMutex(fDrawMutex); | 715 SkAutoMutexAcquire autoMutex(fDrawMutex); |
715 #endif | 716 #endif |
716 | 717 |
717 // kDrawComplete will be the signal that we have reached the end of | 718 // kDrawComplete will be the signal that we have reached the end of |
718 // the command stream | 719 // the command stream |
719 static const uint32_t kDrawComplete = SK_MaxU32; | 720 static const uint32_t kDrawComplete = SK_MaxU32; |
720 | 721 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 if (callback && callback->abortDrawing()) { | 766 if (callback && callback->abortDrawing()) { |
766 canvas.restoreToCount(originalSaveCount); | 767 canvas.restoreToCount(originalSaveCount); |
767 return; | 768 return; |
768 } | 769 } |
769 #ifdef SK_BUILD_FOR_ANDROID | 770 #ifdef SK_BUILD_FOR_ANDROID |
770 if (fAbortCurrentPlayback) { | 771 if (fAbortCurrentPlayback) { |
771 return; | 772 return; |
772 } | 773 } |
773 #endif | 774 #endif |
774 | 775 |
| 776 #ifdef SPEW_CLIP_SKIPPING |
| 777 opCount++; |
| 778 #endif |
| 779 |
775 size_t curOffset = reader.offset(); | 780 size_t curOffset = reader.offset(); |
776 uint32_t size; | 781 uint32_t size; |
777 DrawType op = read_op_and_size(&reader, &size); | 782 DrawType op = read_op_and_size(&reader, &size); |
778 size_t skipTo = 0; | 783 size_t skipTo = 0; |
779 if (NOOP == op) { | 784 if (NOOP == op) { |
780 // NOOPs are to be ignored - do not propagate them any further | 785 // NOOPs are to be ignored - do not propagate them any further |
781 skipTo = curOffset + size; | 786 skipTo = curOffset + size; |
782 #ifdef SK_DEVELOPER | 787 #ifdef SK_DEVELOPER |
783 } else { | 788 } else { |
784 opIndex++; | 789 opIndex++; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 size_t offsetToRestore = reader.readInt(); | 865 size_t offsetToRestore = reader.readInt(); |
861 SkASSERT(!offsetToRestore || \ | 866 SkASSERT(!offsetToRestore || \ |
862 offsetToRestore >= reader.offset()); | 867 offsetToRestore >= reader.offset()); |
863 if (!canvas.clipRRect(rrect, regionOp, doAA) && offsetToRestore)
{ | 868 if (!canvas.clipRRect(rrect, regionOp, doAA) && offsetToRestore)
{ |
864 #ifdef SPEW_CLIP_SKIPPING | 869 #ifdef SPEW_CLIP_SKIPPING |
865 skipRRect.recordSkip(offsetToRestore - reader.offset()); | 870 skipRRect.recordSkip(offsetToRestore - reader.offset()); |
866 #endif | 871 #endif |
867 reader.setOffset(offsetToRestore); | 872 reader.setOffset(offsetToRestore); |
868 } | 873 } |
869 } break; | 874 } break; |
| 875 case PUSH_CULL: { |
| 876 const SkRect& cullRect = reader.skipT<SkRect>(); |
| 877 size_t offsetToRestore = reader.readInt(); |
| 878 if (offsetToRestore && canvas.quickReject(cullRect)) { |
| 879 #ifdef SPEW_CLIP_SKIPPING |
| 880 skipCull.recordSkip(offsetToRestore - reader.offset()); |
| 881 #endif |
| 882 reader.setOffset(offsetToRestore); |
| 883 } else { |
| 884 canvas.pushCull(cullRect); |
| 885 } |
| 886 } break; |
| 887 case POP_CULL: |
| 888 canvas.popCull(); |
| 889 break; |
870 case CONCAT: { | 890 case CONCAT: { |
871 SkMatrix matrix; | 891 SkMatrix matrix; |
872 this->getMatrix(reader, &matrix); | 892 this->getMatrix(reader, &matrix); |
873 canvas.concat(matrix); | 893 canvas.concat(matrix); |
874 break; | 894 break; |
875 } | 895 } |
876 case DRAW_BITMAP: { | 896 case DRAW_BITMAP: { |
877 const SkPaint* paint = getPaint(reader); | 897 const SkPaint* paint = getPaint(reader); |
878 const SkBitmap& bitmap = getBitmap(reader); | 898 const SkBitmap& bitmap = getBitmap(reader); |
879 const SkPoint& loc = reader.skipT<SkPoint>(); | 899 const SkPoint& loc = reader.skipT<SkPoint>(); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 uint32_t skipTo = it.draw(); | 1137 uint32_t skipTo = it.draw(); |
1118 if (kDrawComplete == skipTo) { | 1138 if (kDrawComplete == skipTo) { |
1119 break; | 1139 break; |
1120 } | 1140 } |
1121 reader.setOffset(skipTo); | 1141 reader.setOffset(skipTo); |
1122 } | 1142 } |
1123 } | 1143 } |
1124 | 1144 |
1125 #ifdef SPEW_CLIP_SKIPPING | 1145 #ifdef SPEW_CLIP_SKIPPING |
1126 { | 1146 { |
1127 size_t size = skipRect.fSize + skipRRect.fSize + skipPath.fSize + skipR
egion.fSize; | 1147 size_t size = skipRect.fSize + skipRRect.fSize + skipPath.fSize + skipR
egion.fSize + |
1128 SkDebugf("--- Clip skips %d%% rect:%d rrect:%d path:%d rgn:%d\n", | 1148 skipCull.fSize; |
| 1149 SkDebugf("--- Clip skips %d%% rect:%d rrect:%d path:%d rgn:%d cull:%d\n"
, |
1129 size * 100 / reader.offset(), skipRect.fCount, skipRRect.fCount, | 1150 size * 100 / reader.offset(), skipRect.fCount, skipRRect.fCount, |
1130 skipPath.fCount, skipRegion.fCount); | 1151 skipPath.fCount, skipRegion.fCount, skipCull.fCount); |
| 1152 SkDebugf("--- Total ops: %d\n", opCount); |
1131 } | 1153 } |
1132 #endif | 1154 #endif |
1133 // this->dumpSize(); | 1155 // this->dumpSize(); |
1134 } | 1156 } |
1135 | 1157 |
1136 /////////////////////////////////////////////////////////////////////////////// | 1158 /////////////////////////////////////////////////////////////////////////////// |
1137 | 1159 |
1138 #ifdef SK_DEBUG_SIZE | 1160 #ifdef SK_DEBUG_SIZE |
1139 int SkPicturePlayback::size(size_t* sizePtr) { | 1161 int SkPicturePlayback::size(size_t* sizePtr) { |
1140 int objects = bitmaps(sizePtr); | 1162 int objects = bitmaps(sizePtr); |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1637 for (index = 0; index < fPictureCount; index++) | 1659 for (index = 0; index < fPictureCount; index++) |
1638 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | 1660 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), |
1639 "picture%p, ", fPictureRefs[index]); | 1661 "picture%p, ", fPictureRefs[index]); |
1640 if (fPictureCount > 0) | 1662 if (fPictureCount > 0) |
1641 SkDebugf("%s0};\n", pBuffer); | 1663 SkDebugf("%s0};\n", pBuffer); |
1642 | 1664 |
1643 const_cast<SkPicturePlayback*>(this)->dumpStream(); | 1665 const_cast<SkPicturePlayback*>(this)->dumpStream(); |
1644 } | 1666 } |
1645 | 1667 |
1646 #endif | 1668 #endif |
OLD | NEW |