| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkPictureRecord.h" | 8 #include "SkPictureRecord.h" |
| 9 #include "SkTSearch.h" | 9 #include "SkTSearch.h" |
| 10 #include "SkPixelRef.h" | 10 #include "SkPixelRef.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 SkSafeUnref(fStateTree); | 62 SkSafeUnref(fStateTree); |
| 63 fFlattenableHeap.setBitmapStorage(NULL); | 63 fFlattenableHeap.setBitmapStorage(NULL); |
| 64 fPictureRefs.unrefAll(); | 64 fPictureRefs.unrefAll(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 /////////////////////////////////////////////////////////////////////////////// | 67 /////////////////////////////////////////////////////////////////////////////// |
| 68 | 68 |
| 69 // Return the offset of the paint inside a given op's byte stream. A zero | 69 // Return the offset of the paint inside a given op's byte stream. A zero |
| 70 // return value means there is no paint (and you really shouldn't be calling | 70 // return value means there is no paint (and you really shouldn't be calling |
| 71 // this method) | 71 // this method) |
| 72 static inline uint32_t getPaintOffset(DrawType op, uint32_t opSize) { | 72 static inline size_t getPaintOffset(DrawType op, size_t opSize) { |
| 73 // These offsets are where the paint would be if the op size doesn't overflo
w | 73 // These offsets are where the paint would be if the op size doesn't overflo
w |
| 74 static const uint8_t gPaintOffsets[LAST_DRAWTYPE_ENUM + 1] = { | 74 static const uint8_t gPaintOffsets[LAST_DRAWTYPE_ENUM + 1] = { |
| 75 0, // UNUSED - no paint | 75 0, // UNUSED - no paint |
| 76 0, // CLIP_PATH - no paint | 76 0, // CLIP_PATH - no paint |
| 77 0, // CLIP_REGION - no paint | 77 0, // CLIP_REGION - no paint |
| 78 0, // CLIP_RECT - no paint | 78 0, // CLIP_RECT - no paint |
| 79 0, // CLIP_RRECT - no paint | 79 0, // CLIP_RRECT - no paint |
| 80 0, // CONCAT - no paint | 80 0, // CONCAT - no paint |
| 81 1, // DRAW_BITMAP - right after op code | 81 1, // DRAW_BITMAP - right after op code |
| 82 1, // DRAW_BITMAP_MATRIX - right after op code | 82 1, // DRAW_BITMAP_MATRIX - right after op code |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 // from a clip entry. | 153 // from a clip entry. |
| 154 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); | 154 fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten()); |
| 155 this->recordSave(flags); | 155 this->recordSave(flags); |
| 156 #endif | 156 #endif |
| 157 | 157 |
| 158 this->INHERITED::willSave(flags); | 158 this->INHERITED::willSave(flags); |
| 159 } | 159 } |
| 160 | 160 |
| 161 void SkPictureRecord::recordSave(SaveFlags flags) { | 161 void SkPictureRecord::recordSave(SaveFlags flags) { |
| 162 // op + flags | 162 // op + flags |
| 163 uint32_t size = kSaveSize; | 163 size_t size = kSaveSize; |
| 164 size_t initialOffset = this->addDraw(SAVE, &size); | 164 size_t initialOffset = this->addDraw(SAVE, &size); |
| 165 this->addInt(flags); | 165 this->addInt(flags); |
| 166 | 166 |
| 167 this->validate(initialOffset, size); | 167 this->validate(initialOffset, size); |
| 168 } | 168 } |
| 169 | 169 |
| 170 SkCanvas::SaveLayerStrategy SkPictureRecord::willSaveLayer(const SkRect* bounds, | 170 SkCanvas::SaveLayerStrategy SkPictureRecord::willSaveLayer(const SkRect* bounds, |
| 171 const SkPaint* paint,
SaveFlags flags) { | 171 const SkPaint* paint,
SaveFlags flags) { |
| 172 | 172 |
| 173 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 173 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| (...skipping 13 matching lines...) Expand all Loading... |
| 187 at this time (and may not be able to afford since during record our | 187 at this time (and may not be able to afford since during record our |
| 188 clip starts out the size of the picture, which is often much larger | 188 clip starts out the size of the picture, which is often much larger |
| 189 than the size of the actual device we'll use during playback). | 189 than the size of the actual device we'll use during playback). |
| 190 */ | 190 */ |
| 191 return kNoLayer_SaveLayerStrategy; | 191 return kNoLayer_SaveLayerStrategy; |
| 192 } | 192 } |
| 193 | 193 |
| 194 void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint
, | 194 void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint
, |
| 195 SaveFlags flags) { | 195 SaveFlags flags) { |
| 196 // op + bool for 'bounds' | 196 // op + bool for 'bounds' |
| 197 uint32_t size = 2 * kUInt32Size; | 197 size_t size = 2 * kUInt32Size; |
| 198 if (NULL != bounds) { | 198 if (NULL != bounds) { |
| 199 size += sizeof(*bounds); // + rect | 199 size += sizeof(*bounds); // + rect |
| 200 } | 200 } |
| 201 // + paint index + flags | 201 // + paint index + flags |
| 202 size += 2 * kUInt32Size; | 202 size += 2 * kUInt32Size; |
| 203 | 203 |
| 204 SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
; | 204 SkASSERT(kSaveLayerNoBoundsSize == size || kSaveLayerWithBoundsSize == size)
; |
| 205 | 205 |
| 206 size_t initialOffset = this->addDraw(SAVE_LAYER, &size); | 206 size_t initialOffset = this->addDraw(SAVE_LAYER, &size); |
| 207 this->addRectPtr(bounds); | 207 this->addRectPtr(bounds); |
| 208 SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
ten()); | 208 SkASSERT(initialOffset+getPaintOffset(SAVE_LAYER, size) == fWriter.bytesWrit
ten()); |
| 209 this->addPaintPtr(paint); | 209 this->addPaintPtr(paint); |
| 210 this->addInt(flags); | 210 this->addInt(flags); |
| 211 | 211 |
| 212 this->validate(initialOffset, size); | 212 this->validate(initialOffset, size); |
| 213 } | 213 } |
| 214 | 214 |
| 215 bool SkPictureRecord::isDrawingToLayer() const { | 215 bool SkPictureRecord::isDrawingToLayer() const { |
| 216 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 216 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 217 return fMCMgr.isDrawingToLayer(); | 217 return fMCMgr.isDrawingToLayer(); |
| 218 #else | 218 #else |
| 219 return fFirstSavedLayerIndex != kNoSavedLayerIndex; | 219 return fFirstSavedLayerIndex != kNoSavedLayerIndex; |
| 220 #endif | 220 #endif |
| 221 } | 221 } |
| 222 | 222 |
| 223 /* | 223 /* |
| 224 * Read the op code from 'offset' in 'writer'. | 224 * Read the op code from 'offset' in 'writer'. |
| 225 */ | 225 */ |
| 226 #ifdef SK_DEBUG | 226 #ifdef SK_DEBUG |
| 227 static DrawType peek_op(SkWriter32* writer, int32_t offset) { | 227 static DrawType peek_op(SkWriter32* writer, size_t offset) { |
| 228 return (DrawType)(writer->readTAt<uint32_t>(offset) >> 24); | 228 return (DrawType)(writer->readTAt<uint32_t>(offset) >> 24); |
| 229 } | 229 } |
| 230 #endif | 230 #endif |
| 231 | 231 |
| 232 /* | 232 /* |
| 233 * Read the op code from 'offset' in 'writer' and extract the size too. | 233 * Read the op code from 'offset' in 'writer' and extract the size too. |
| 234 */ | 234 */ |
| 235 static DrawType peek_op_and_size(SkWriter32* writer, int32_t offset, uint32_t* s
ize) { | 235 static DrawType peek_op_and_size(SkWriter32* writer, size_t offset, uint32_t* si
ze) { |
| 236 uint32_t peek = writer->readTAt<uint32_t>(offset); | 236 uint32_t peek = writer->readTAt<uint32_t>(offset); |
| 237 | 237 |
| 238 uint32_t op; | 238 uint32_t op; |
| 239 UNPACK_8_24(peek, op, *size); | 239 UNPACK_8_24(peek, op, *size); |
| 240 if (MASK_24 == *size) { | 240 if (MASK_24 == *size) { |
| 241 // size required its own slot right after the op code | 241 // size required its own slot right after the op code |
| 242 *size = writer->readTAt<uint32_t>(offset + kUInt32Size); | 242 *size = writer->readTAt<uint32_t>(offset + kUInt32Size); |
| 243 } | 243 } |
| 244 return (DrawType) op; | 244 return (DrawType) op; |
| 245 } | 245 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 static bool merge_savelayer_paint_into_drawbitmp(SkWriter32* writer, | 377 static bool merge_savelayer_paint_into_drawbitmp(SkWriter32* writer, |
| 378 SkPaintDictionary* paintDict, | 378 SkPaintDictionary* paintDict, |
| 379 const CommandInfo& saveLayerInf
o, | 379 const CommandInfo& saveLayerInf
o, |
| 380 const CommandInfo& dbmInfo) { | 380 const CommandInfo& dbmInfo) { |
| 381 SkASSERT(SAVE_LAYER == saveLayerInfo.fActualOp); | 381 SkASSERT(SAVE_LAYER == saveLayerInfo.fActualOp); |
| 382 SkASSERT(DRAW_BITMAP == dbmInfo.fActualOp || | 382 SkASSERT(DRAW_BITMAP == dbmInfo.fActualOp || |
| 383 DRAW_BITMAP_MATRIX == dbmInfo.fActualOp || | 383 DRAW_BITMAP_MATRIX == dbmInfo.fActualOp || |
| 384 DRAW_BITMAP_NINE == dbmInfo.fActualOp || | 384 DRAW_BITMAP_NINE == dbmInfo.fActualOp || |
| 385 DRAW_BITMAP_RECT_TO_RECT == dbmInfo.fActualOp); | 385 DRAW_BITMAP_RECT_TO_RECT == dbmInfo.fActualOp); |
| 386 | 386 |
| 387 uint32_t dbmPaintOffset = getPaintOffset(dbmInfo.fActualOp, dbmInfo.fSize); | 387 size_t dbmPaintOffset = getPaintOffset(dbmInfo.fActualOp, dbmInfo.fSize); |
| 388 uint32_t slPaintOffset = getPaintOffset(SAVE_LAYER, saveLayerInfo.fSize); | 388 size_t slPaintOffset = getPaintOffset(SAVE_LAYER, saveLayerInfo.fSize); |
| 389 | 389 |
| 390 // we have a match, now we need to get the paints involved | 390 // we have a match, now we need to get the paints involved |
| 391 uint32_t dbmPaintId = writer->readTAt<uint32_t>(dbmInfo.fOffset + dbmPaintOf
fset); | 391 uint32_t dbmPaintId = writer->readTAt<uint32_t>(dbmInfo.fOffset + dbmPaintOf
fset); |
| 392 uint32_t saveLayerPaintId = writer->readTAt<uint32_t>(saveLayerInfo.fOffset
+ slPaintOffset); | 392 uint32_t saveLayerPaintId = writer->readTAt<uint32_t>(saveLayerInfo.fOffset
+ slPaintOffset); |
| 393 | 393 |
| 394 if (0 == saveLayerPaintId) { | 394 if (0 == saveLayerPaintId) { |
| 395 // In this case the saveLayer/restore isn't needed at all - just kill th
e saveLayer | 395 // In this case the saveLayer/restore isn't needed at all - just kill th
e saveLayer |
| 396 // and signal the caller (by returning true) to not add the RESTORE op | 396 // and signal the caller (by returning true) to not add the RESTORE op |
| 397 convert_command_to_noop(writer, saveLayerInfo.fOffset); | 397 convert_command_to_noop(writer, saveLayerInfo.fOffset); |
| 398 return true; | 398 return true; |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 this->recordRestore(); | 646 this->recordRestore(); |
| 647 } | 647 } |
| 648 | 648 |
| 649 fRestoreOffsetStack.pop(); | 649 fRestoreOffsetStack.pop(); |
| 650 #endif | 650 #endif |
| 651 | 651 |
| 652 this->INHERITED::willRestore(); | 652 this->INHERITED::willRestore(); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void SkPictureRecord::recordRestore(bool fillInSkips) { | 655 void SkPictureRecord::recordRestore(bool fillInSkips) { |
| 656 uint32_t initialOffset, size; | |
| 657 if (fillInSkips) { | 656 if (fillInSkips) { |
| 658 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWrite
r.bytesWritten()); | 657 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWrite
r.bytesWritten()); |
| 659 } | 658 } |
| 660 size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code | 659 size_t size = 1 * kUInt32Size; // RESTORE consists solely of 1 op code |
| 661 initialOffset = this->addDraw(RESTORE, &size); | 660 size_t initialOffset = this->addDraw(RESTORE, &size); |
| 662 this->validate(initialOffset, size); | 661 this->validate(initialOffset, size); |
| 663 } | 662 } |
| 664 | 663 |
| 665 void SkPictureRecord::recordTranslate(const SkMatrix& m) { | 664 void SkPictureRecord::recordTranslate(const SkMatrix& m) { |
| 666 SkASSERT(SkMatrix::kTranslate_Mask == m.getType()); | 665 SkASSERT(SkMatrix::kTranslate_Mask == m.getType()); |
| 667 | 666 |
| 668 // op + dx + dy | 667 // op + dx + dy |
| 669 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 668 size_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |
| 670 size_t initialOffset = this->addDraw(TRANSLATE, &size); | 669 size_t initialOffset = this->addDraw(TRANSLATE, &size); |
| 671 this->addScalar(m.getTranslateX()); | 670 this->addScalar(m.getTranslateX()); |
| 672 this->addScalar(m.getTranslateY()); | 671 this->addScalar(m.getTranslateY()); |
| 673 this->validate(initialOffset, size); | 672 this->validate(initialOffset, size); |
| 674 } | 673 } |
| 675 | 674 |
| 676 void SkPictureRecord::recordScale(const SkMatrix& m) { | 675 void SkPictureRecord::recordScale(const SkMatrix& m) { |
| 677 SkASSERT(SkMatrix::kScale_Mask == m.getType()); | 676 SkASSERT(SkMatrix::kScale_Mask == m.getType()); |
| 678 | 677 |
| 679 // op + sx + sy | 678 // op + sx + sy |
| 680 uint32_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); | 679 size_t size = 1 * kUInt32Size + 2 * sizeof(SkScalar); |
| 681 size_t initialOffset = this->addDraw(SCALE, &size); | 680 size_t initialOffset = this->addDraw(SCALE, &size); |
| 682 this->addScalar(m.getScaleX()); | 681 this->addScalar(m.getScaleX()); |
| 683 this->addScalar(m.getScaleY()); | 682 this->addScalar(m.getScaleY()); |
| 684 this->validate(initialOffset, size); | 683 this->validate(initialOffset, size); |
| 685 } | 684 } |
| 686 | 685 |
| 687 void SkPictureRecord::didConcat(const SkMatrix& matrix) { | 686 void SkPictureRecord::didConcat(const SkMatrix& matrix) { |
| 688 | 687 |
| 689 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 688 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 690 fMCMgr.concat(matrix); | 689 fMCMgr.concat(matrix); |
| 691 #else | 690 #else |
| 692 switch (matrix.getType()) { | 691 switch (matrix.getType()) { |
| 693 case SkMatrix::kTranslate_Mask: | 692 case SkMatrix::kTranslate_Mask: |
| 694 this->recordTranslate(matrix); | 693 this->recordTranslate(matrix); |
| 695 break; | 694 break; |
| 696 case SkMatrix::kScale_Mask: | 695 case SkMatrix::kScale_Mask: |
| 697 this->recordScale(matrix); | 696 this->recordScale(matrix); |
| 698 break; | 697 break; |
| 699 default: | 698 default: |
| 700 this->recordConcat(matrix); | 699 this->recordConcat(matrix); |
| 701 break; | 700 break; |
| 702 } | 701 } |
| 703 #endif | 702 #endif |
| 704 this->INHERITED::didConcat(matrix); | 703 this->INHERITED::didConcat(matrix); |
| 705 } | 704 } |
| 706 | 705 |
| 707 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { | 706 void SkPictureRecord::recordConcat(const SkMatrix& matrix) { |
| 708 this->validate(fWriter.bytesWritten(), 0); | 707 this->validate(fWriter.bytesWritten(), 0); |
| 709 // op + matrix | 708 // op + matrix |
| 710 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 709 size_t size = kUInt32Size + matrix.writeToMemory(NULL); |
| 711 size_t initialOffset = this->addDraw(CONCAT, &size); | 710 size_t initialOffset = this->addDraw(CONCAT, &size); |
| 712 this->addMatrix(matrix); | 711 this->addMatrix(matrix); |
| 713 this->validate(initialOffset, size); | 712 this->validate(initialOffset, size); |
| 714 } | 713 } |
| 715 | 714 |
| 716 void SkPictureRecord::didSetMatrix(const SkMatrix& matrix) { | 715 void SkPictureRecord::didSetMatrix(const SkMatrix& matrix) { |
| 717 | 716 |
| 718 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 717 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 719 fMCMgr.setMatrix(matrix); | 718 fMCMgr.setMatrix(matrix); |
| 720 #else | 719 #else |
| 721 this->validate(fWriter.bytesWritten(), 0); | 720 this->validate(fWriter.bytesWritten(), 0); |
| 722 // op + matrix | 721 // op + matrix |
| 723 uint32_t size = kUInt32Size + matrix.writeToMemory(NULL); | 722 size_t size = kUInt32Size + matrix.writeToMemory(NULL); |
| 724 size_t initialOffset = this->addDraw(SET_MATRIX, &size); | 723 size_t initialOffset = this->addDraw(SET_MATRIX, &size); |
| 725 this->addMatrix(matrix); | 724 this->addMatrix(matrix); |
| 726 this->validate(initialOffset, size); | 725 this->validate(initialOffset, size); |
| 727 #endif | 726 #endif |
| 728 this->INHERITED::didSetMatrix(matrix); | 727 this->INHERITED::didSetMatrix(matrix); |
| 729 } | 728 } |
| 730 | 729 |
| 731 static bool regionOpExpands(SkRegion::Op op) { | 730 static bool regionOpExpands(SkRegion::Op op) { |
| 732 switch (op) { | 731 switch (op) { |
| 733 case SkRegion::kUnion_Op: | 732 case SkRegion::kUnion_Op: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 #endif | 780 #endif |
| 782 } | 781 } |
| 783 | 782 |
| 784 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 783 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 785 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { | 784 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { |
| 786 size_t offset = fWriter.bytesWritten(); | 785 size_t offset = fWriter.bytesWritten(); |
| 787 this->addInt(-1); | 786 this->addInt(-1); |
| 788 return offset; | 787 return offset; |
| 789 } | 788 } |
| 790 #else | 789 #else |
| 791 int SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { | 790 size_t SkPictureRecord::recordRestoreOffsetPlaceholder(SkRegion::Op op) { |
| 792 if (fRestoreOffsetStack.isEmpty()) { | 791 if (fRestoreOffsetStack.isEmpty()) { |
| 793 return -1; | 792 return -1; |
| 794 } | 793 } |
| 795 | 794 |
| 796 // The RestoreOffset field is initially filled with a placeholder | 795 // The RestoreOffset field is initially filled with a placeholder |
| 797 // value that points to the offset of the previous RestoreOffset | 796 // value that points to the offset of the previous RestoreOffset |
| 798 // in the current stack level, thus forming a linked list so that | 797 // in the current stack level, thus forming a linked list so that |
| 799 // the restore offsets can be filled in when the corresponding | 798 // the restore offsets can be filled in when the corresponding |
| 800 // restore command is recorded. | 799 // restore command is recorded. |
| 801 int32_t prevOffset = fRestoreOffsetStack.top(); | 800 int32_t prevOffset = fRestoreOffsetStack.top(); |
| 802 | 801 |
| 803 if (regionOpExpands(op)) { | 802 if (regionOpExpands(op)) { |
| 804 // Run back through any previous clip ops, and mark their offset to | 803 // Run back through any previous clip ops, and mark their offset to |
| 805 // be 0, disabling their ability to trigger a jump-to-restore, otherwise | 804 // be 0, disabling their ability to trigger a jump-to-restore, otherwise |
| 806 // they could hide this clips ability to expand the clip (i.e. go from | 805 // they could hide this clips ability to expand the clip (i.e. go from |
| 807 // empty to non-empty). | 806 // empty to non-empty). |
| 808 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); | 807 this->fillRestoreOffsetPlaceholdersForCurrentStackLevel(0); |
| 809 | 808 |
| 810 // Reset the pointer back to the previous clip so that subsequent | 809 // Reset the pointer back to the previous clip so that subsequent |
| 811 // restores don't overwrite the offsets we just cleared. | 810 // restores don't overwrite the offsets we just cleared. |
| 812 prevOffset = 0; | 811 prevOffset = 0; |
| 813 } | 812 } |
| 814 | 813 |
| 815 size_t offset = fWriter.bytesWritten(); | 814 size_t offset = fWriter.bytesWritten(); |
| 816 this->addInt(prevOffset); | 815 this->addInt(prevOffset); |
| 817 fRestoreOffsetStack.top() = offset; | 816 fRestoreOffsetStack.top() = SkToU32(offset); |
| 818 return offset; | 817 return offset; |
| 819 } | 818 } |
| 820 #endif | 819 #endif |
| 821 | 820 |
| 822 void SkPictureRecord::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeSt
yle edgeStyle) { | 821 void SkPictureRecord::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeSt
yle edgeStyle) { |
| 823 | 822 |
| 824 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 823 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 825 fMCMgr.clipRect(rect, op, doAA); | 824 fMCMgr.clipRect(rect, op, doAA); |
| 826 #else | 825 #else |
| 827 this->recordClipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle); | 826 this->recordClipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle); |
| 828 #endif | 827 #endif |
| 829 this->INHERITED::onClipRect(rect, op, edgeStyle); | 828 this->INHERITED::onClipRect(rect, op, edgeStyle); |
| 830 } | 829 } |
| 831 | 830 |
| 832 int SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool do
AA) { | 831 size_t SkPictureRecord::recordClipRect(const SkRect& rect, SkRegion::Op op, bool
doAA) { |
| 833 // id + rect + clip params | 832 // id + rect + clip params |
| 834 uint32_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; | 833 size_t size = 1 * kUInt32Size + sizeof(rect) + 1 * kUInt32Size; |
| 835 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 834 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 836 size += kUInt32Size; // + restore offset | 835 size += kUInt32Size; // + restore offset |
| 837 #else | 836 #else |
| 838 // recordRestoreOffsetPlaceholder doesn't always write an offset | 837 // recordRestoreOffsetPlaceholder doesn't always write an offset |
| 839 if (!fRestoreOffsetStack.isEmpty()) { | 838 if (!fRestoreOffsetStack.isEmpty()) { |
| 840 // + restore offset | 839 // + restore offset |
| 841 size += kUInt32Size; | 840 size += kUInt32Size; |
| 842 } | 841 } |
| 843 #endif | 842 #endif |
| 844 size_t initialOffset = this->addDraw(CLIP_RECT, &size); | 843 size_t initialOffset = this->addDraw(CLIP_RECT, &size); |
| 845 this->addRect(rect); | 844 this->addRect(rect); |
| 846 this->addInt(ClipParams_pack(op, doAA)); | 845 this->addInt(ClipParams_pack(op, doAA)); |
| 847 int offset = this->recordRestoreOffsetPlaceholder(op); | 846 size_t offset = this->recordRestoreOffsetPlaceholder(op); |
| 848 | 847 |
| 849 this->validate(initialOffset, size); | 848 this->validate(initialOffset, size); |
| 850 return offset; | 849 return offset; |
| 851 } | 850 } |
| 852 | 851 |
| 853 void SkPictureRecord::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdg
eStyle edgeStyle) { | 852 void SkPictureRecord::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdg
eStyle edgeStyle) { |
| 854 | 853 |
| 855 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 854 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 856 fMCMgr.clipRRect(rrect, op, doAA); | 855 fMCMgr.clipRRect(rrect, op, doAA); |
| 857 #else | 856 #else |
| 858 this->recordClipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); | 857 this->recordClipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); |
| 859 #endif | 858 #endif |
| 860 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { | 859 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { |
| 861 this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false); | 860 this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false); |
| 862 } else { | 861 } else { |
| 863 this->INHERITED::onClipRRect(rrect, op, edgeStyle); | 862 this->INHERITED::onClipRRect(rrect, op, edgeStyle); |
| 864 } | 863 } |
| 865 } | 864 } |
| 866 | 865 |
| 867 int SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool
doAA) { | 866 size_t SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, b
ool doAA) { |
| 868 // op + rrect + clip params | 867 // op + rrect + clip params |
| 869 uint32_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; | 868 size_t size = 1 * kUInt32Size + SkRRect::kSizeInMemory + 1 * kUInt32Size; |
| 870 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 869 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 871 size += kUInt32Size; // + restore offset | 870 size += kUInt32Size; // + restore offset |
| 872 #else | 871 #else |
| 873 // recordRestoreOffsetPlaceholder doesn't always write an offset | 872 // recordRestoreOffsetPlaceholder doesn't always write an offset |
| 874 if (!fRestoreOffsetStack.isEmpty()) { | 873 if (!fRestoreOffsetStack.isEmpty()) { |
| 875 // + restore offset | 874 // + restore offset |
| 876 size += kUInt32Size; | 875 size += kUInt32Size; |
| 877 } | 876 } |
| 878 #endif | 877 #endif |
| 879 size_t initialOffset = this->addDraw(CLIP_RRECT, &size); | 878 size_t initialOffset = this->addDraw(CLIP_RRECT, &size); |
| 880 this->addRRect(rrect); | 879 this->addRRect(rrect); |
| 881 this->addInt(ClipParams_pack(op, doAA)); | 880 this->addInt(ClipParams_pack(op, doAA)); |
| 882 int offset = recordRestoreOffsetPlaceholder(op); | 881 size_t offset = recordRestoreOffsetPlaceholder(op); |
| 883 this->validate(initialOffset, size); | 882 this->validate(initialOffset, size); |
| 884 return offset; | 883 return offset; |
| 885 } | 884 } |
| 886 | 885 |
| 887 void SkPictureRecord::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeSt
yle edgeStyle) { | 886 void SkPictureRecord::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeSt
yle edgeStyle) { |
| 888 | 887 |
| 889 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 888 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 890 fMCMgr.clipPath(path, op, doAA); | 889 fMCMgr.clipPath(path, op, doAA); |
| 891 #else | 890 #else |
| 892 int pathID = this->addPathToHeap(path); | 891 int pathID = this->addPathToHeap(path); |
| 893 this->recordClipPath(pathID, op, kSoft_ClipEdgeStyle == edgeStyle); | 892 this->recordClipPath(pathID, op, kSoft_ClipEdgeStyle == edgeStyle); |
| 894 #endif | 893 #endif |
| 895 | 894 |
| 896 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { | 895 if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { |
| 897 this->updateClipConservativelyUsingBounds(path.getBounds(), op, | 896 this->updateClipConservativelyUsingBounds(path.getBounds(), op, |
| 898 path.isInverseFillType()); | 897 path.isInverseFillType()); |
| 899 } else { | 898 } else { |
| 900 this->INHERITED::onClipPath(path, op, edgeStyle); | 899 this->INHERITED::onClipPath(path, op, edgeStyle); |
| 901 } | 900 } |
| 902 } | 901 } |
| 903 | 902 |
| 904 int SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { | 903 size_t SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { |
| 905 // op + path index + clip params | 904 // op + path index + clip params |
| 906 uint32_t size = 3 * kUInt32Size; | 905 size_t size = 3 * kUInt32Size; |
| 907 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 906 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 908 size += kUInt32Size; // + restore offset | 907 size += kUInt32Size; // + restore offset |
| 909 #else | 908 #else |
| 910 // recordRestoreOffsetPlaceholder doesn't always write an offset | 909 // recordRestoreOffsetPlaceholder doesn't always write an offset |
| 911 if (!fRestoreOffsetStack.isEmpty()) { | 910 if (!fRestoreOffsetStack.isEmpty()) { |
| 912 // + restore offset | 911 // + restore offset |
| 913 size += kUInt32Size; | 912 size += kUInt32Size; |
| 914 } | 913 } |
| 915 #endif | 914 #endif |
| 916 size_t initialOffset = this->addDraw(CLIP_PATH, &size); | 915 size_t initialOffset = this->addDraw(CLIP_PATH, &size); |
| 917 this->addInt(pathID); | 916 this->addInt(pathID); |
| 918 this->addInt(ClipParams_pack(op, doAA)); | 917 this->addInt(ClipParams_pack(op, doAA)); |
| 919 int offset = recordRestoreOffsetPlaceholder(op); | 918 size_t offset = recordRestoreOffsetPlaceholder(op); |
| 920 this->validate(initialOffset, size); | 919 this->validate(initialOffset, size); |
| 921 return offset; | 920 return offset; |
| 922 } | 921 } |
| 923 | 922 |
| 924 void SkPictureRecord::onClipRegion(const SkRegion& region, SkRegion::Op op) { | 923 void SkPictureRecord::onClipRegion(const SkRegion& region, SkRegion::Op op) { |
| 925 | 924 |
| 926 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 925 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 927 fMCMgr.clipRegion(region, op); | 926 fMCMgr.clipRegion(region, op); |
| 928 #else | 927 #else |
| 929 this->recordClipRegion(region, op); | 928 this->recordClipRegion(region, op); |
| 930 #endif | 929 #endif |
| 931 this->INHERITED::onClipRegion(region, op); | 930 this->INHERITED::onClipRegion(region, op); |
| 932 } | 931 } |
| 933 | 932 |
| 934 int SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op) { | 933 size_t SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op
) { |
| 935 // op + clip params + region | 934 // op + clip params + region |
| 936 uint32_t size = 2 * kUInt32Size + region.writeToMemory(NULL); | 935 size_t size = 2 * kUInt32Size + region.writeToMemory(NULL); |
| 937 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 936 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 938 size += kUInt32Size; // + restore offset | 937 size += kUInt32Size; // + restore offset |
| 939 #else | 938 #else |
| 940 // recordRestoreOffsetPlaceholder doesn't always write an offset | 939 // recordRestoreOffsetPlaceholder doesn't always write an offset |
| 941 if (!fRestoreOffsetStack.isEmpty()) { | 940 if (!fRestoreOffsetStack.isEmpty()) { |
| 942 // + restore offset | 941 // + restore offset |
| 943 size += kUInt32Size; | 942 size += kUInt32Size; |
| 944 } | 943 } |
| 945 #endif | 944 #endif |
| 946 size_t initialOffset = this->addDraw(CLIP_REGION, &size); | 945 size_t initialOffset = this->addDraw(CLIP_REGION, &size); |
| 947 this->addRegion(region); | 946 this->addRegion(region); |
| 948 this->addInt(ClipParams_pack(op, false)); | 947 this->addInt(ClipParams_pack(op, false)); |
| 949 int offset = this->recordRestoreOffsetPlaceholder(op); | 948 size_t offset = this->recordRestoreOffsetPlaceholder(op); |
| 950 | 949 |
| 951 this->validate(initialOffset, size); | 950 this->validate(initialOffset, size); |
| 952 return offset; | 951 return offset; |
| 953 } | 952 } |
| 954 | 953 |
| 955 void SkPictureRecord::clear(SkColor color) { | 954 void SkPictureRecord::clear(SkColor color) { |
| 956 | 955 |
| 957 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 956 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 958 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 957 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 959 #endif | 958 #endif |
| 960 | 959 |
| 961 // op + color | 960 // op + color |
| 962 uint32_t size = 2 * kUInt32Size; | 961 size_t size = 2 * kUInt32Size; |
| 963 size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); | 962 size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); |
| 964 this->addInt(color); | 963 this->addInt(color); |
| 965 this->validate(initialOffset, size); | 964 this->validate(initialOffset, size); |
| 966 } | 965 } |
| 967 | 966 |
| 968 void SkPictureRecord::drawPaint(const SkPaint& paint) { | 967 void SkPictureRecord::drawPaint(const SkPaint& paint) { |
| 969 | 968 |
| 970 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 969 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 971 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 970 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 972 #endif | 971 #endif |
| 973 | 972 |
| 974 // op + paint index | 973 // op + paint index |
| 975 uint32_t size = 2 * kUInt32Size; | 974 size_t size = 2 * kUInt32Size; |
| 976 size_t initialOffset = this->addDraw(DRAW_PAINT, &size); | 975 size_t initialOffset = this->addDraw(DRAW_PAINT, &size); |
| 977 SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
ten()); | 976 SkASSERT(initialOffset+getPaintOffset(DRAW_PAINT, size) == fWriter.bytesWrit
ten()); |
| 978 this->addPaint(paint); | 977 this->addPaint(paint); |
| 979 this->validate(initialOffset, size); | 978 this->validate(initialOffset, size); |
| 980 } | 979 } |
| 981 | 980 |
| 982 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
[], | 981 void SkPictureRecord::drawPoints(PointMode mode, size_t count, const SkPoint pts
[], |
| 983 const SkPaint& paint) { | 982 const SkPaint& paint) { |
| 984 | 983 |
| 985 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 984 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 986 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 985 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 987 #endif | 986 #endif |
| 988 | 987 |
| 989 // op + paint index + mode + count + point data | 988 // op + paint index + mode + count + point data |
| 990 uint32_t size = 4 * kUInt32Size + count * sizeof(SkPoint); | 989 size_t size = 4 * kUInt32Size + count * sizeof(SkPoint); |
| 991 size_t initialOffset = this->addDraw(DRAW_POINTS, &size); | 990 size_t initialOffset = this->addDraw(DRAW_POINTS, &size); |
| 992 SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
tten()); | 991 SkASSERT(initialOffset+getPaintOffset(DRAW_POINTS, size) == fWriter.bytesWri
tten()); |
| 993 this->addPaint(paint); | 992 this->addPaint(paint); |
| 994 this->addInt(mode); | 993 this->addInt(mode); |
| 995 this->addInt(count); | 994 this->addInt(SkToInt(count)); |
| 996 fWriter.writeMul4(pts, count * sizeof(SkPoint)); | 995 fWriter.writeMul4(pts, count * sizeof(SkPoint)); |
| 997 this->validate(initialOffset, size); | 996 this->validate(initialOffset, size); |
| 998 } | 997 } |
| 999 | 998 |
| 1000 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { | 999 void SkPictureRecord::drawOval(const SkRect& oval, const SkPaint& paint) { |
| 1001 | 1000 |
| 1002 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1001 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1003 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1002 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1004 #endif | 1003 #endif |
| 1005 | 1004 |
| 1006 // op + paint index + rect | 1005 // op + paint index + rect |
| 1007 uint32_t size = 2 * kUInt32Size + sizeof(oval); | 1006 size_t size = 2 * kUInt32Size + sizeof(oval); |
| 1008 size_t initialOffset = this->addDraw(DRAW_OVAL, &size); | 1007 size_t initialOffset = this->addDraw(DRAW_OVAL, &size); |
| 1009 SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
en()); | 1008 SkASSERT(initialOffset+getPaintOffset(DRAW_OVAL, size) == fWriter.bytesWritt
en()); |
| 1010 this->addPaint(paint); | 1009 this->addPaint(paint); |
| 1011 this->addRect(oval); | 1010 this->addRect(oval); |
| 1012 this->validate(initialOffset, size); | 1011 this->validate(initialOffset, size); |
| 1013 } | 1012 } |
| 1014 | 1013 |
| 1015 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { | 1014 void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) { |
| 1016 | 1015 |
| 1017 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1016 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1018 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1017 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1019 #endif | 1018 #endif |
| 1020 | 1019 |
| 1021 // op + paint index + rect | 1020 // op + paint index + rect |
| 1022 uint32_t size = 2 * kUInt32Size + sizeof(rect); | 1021 size_t size = 2 * kUInt32Size + sizeof(rect); |
| 1023 size_t initialOffset = this->addDraw(DRAW_RECT, &size); | 1022 size_t initialOffset = this->addDraw(DRAW_RECT, &size); |
| 1024 SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
en()); | 1023 SkASSERT(initialOffset+getPaintOffset(DRAW_RECT, size) == fWriter.bytesWritt
en()); |
| 1025 this->addPaint(paint); | 1024 this->addPaint(paint); |
| 1026 this->addRect(rect); | 1025 this->addRect(rect); |
| 1027 this->validate(initialOffset, size); | 1026 this->validate(initialOffset, size); |
| 1028 } | 1027 } |
| 1029 | 1028 |
| 1030 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { | 1029 void SkPictureRecord::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
| 1031 | 1030 |
| 1032 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1031 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1033 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1032 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1034 #endif | 1033 #endif |
| 1035 | 1034 |
| 1036 if (rrect.isRect()) { | 1035 if (rrect.isRect()) { |
| 1037 this->SkPictureRecord::drawRect(rrect.getBounds(), paint); | 1036 this->SkPictureRecord::drawRect(rrect.getBounds(), paint); |
| 1038 } else if (rrect.isOval()) { | 1037 } else if (rrect.isOval()) { |
| 1039 this->SkPictureRecord::drawOval(rrect.getBounds(), paint); | 1038 this->SkPictureRecord::drawOval(rrect.getBounds(), paint); |
| 1040 } else { | 1039 } else { |
| 1041 // op + paint index + rrect | 1040 // op + paint index + rrect |
| 1042 uint32_t initialOffset, size; | 1041 size_t size = 2 * kUInt32Size + SkRRect::kSizeInMemory; |
| 1043 size = 2 * kUInt32Size + SkRRect::kSizeInMemory; | 1042 size_t initialOffset = this->addDraw(DRAW_RRECT, &size); |
| 1044 initialOffset = this->addDraw(DRAW_RRECT, &size); | |
| 1045 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); | 1043 SkASSERT(initialOffset+getPaintOffset(DRAW_RRECT, size) == fWriter.bytes
Written()); |
| 1046 this->addPaint(paint); | 1044 this->addPaint(paint); |
| 1047 this->addRRect(rrect); | 1045 this->addRRect(rrect); |
| 1048 this->validate(initialOffset, size); | 1046 this->validate(initialOffset, size); |
| 1049 } | 1047 } |
| 1050 } | 1048 } |
| 1051 | 1049 |
| 1052 void SkPictureRecord::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, | 1050 void SkPictureRecord::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
| 1053 const SkPaint& paint) { | 1051 const SkPaint& paint) { |
| 1054 | 1052 |
| 1055 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1053 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1056 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1054 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1057 #endif | 1055 #endif |
| 1058 | 1056 |
| 1059 // op + paint index + rrects | 1057 // op + paint index + rrects |
| 1060 uint32_t initialOffset, size; | 1058 size_t size = 2 * kUInt32Size + SkRRect::kSizeInMemory * 2; |
| 1061 size = 2 * kUInt32Size + SkRRect::kSizeInMemory * 2; | 1059 size_t initialOffset = this->addDraw(DRAW_DRRECT, &size); |
| 1062 initialOffset = this->addDraw(DRAW_DRRECT, &size); | |
| 1063 SkASSERT(initialOffset+getPaintOffset(DRAW_DRRECT, size) == fWriter.bytesWri
tten()); | 1060 SkASSERT(initialOffset+getPaintOffset(DRAW_DRRECT, size) == fWriter.bytesWri
tten()); |
| 1064 this->addPaint(paint); | 1061 this->addPaint(paint); |
| 1065 this->addRRect(outer); | 1062 this->addRRect(outer); |
| 1066 this->addRRect(inner); | 1063 this->addRRect(inner); |
| 1067 this->validate(initialOffset, size); | 1064 this->validate(initialOffset, size); |
| 1068 } | 1065 } |
| 1069 | 1066 |
| 1070 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { | 1067 void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) { |
| 1071 | 1068 |
| 1072 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1069 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1073 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1070 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1074 #endif | 1071 #endif |
| 1075 | 1072 |
| 1076 // op + paint index + path index | 1073 // op + paint index + path index |
| 1077 uint32_t size = 3 * kUInt32Size; | 1074 size_t size = 3 * kUInt32Size; |
| 1078 size_t initialOffset = this->addDraw(DRAW_PATH, &size); | 1075 size_t initialOffset = this->addDraw(DRAW_PATH, &size); |
| 1079 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); | 1076 SkASSERT(initialOffset+getPaintOffset(DRAW_PATH, size) == fWriter.bytesWritt
en()); |
| 1080 this->addPaint(paint); | 1077 this->addPaint(paint); |
| 1081 this->addPath(path); | 1078 this->addPath(path); |
| 1082 this->validate(initialOffset, size); | 1079 this->validate(initialOffset, size); |
| 1083 } | 1080 } |
| 1084 | 1081 |
| 1085 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
top, | 1082 void SkPictureRecord::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar
top, |
| 1086 const SkPaint* paint = NULL) { | 1083 const SkPaint* paint = NULL) { |
| 1087 if (bitmap.drawsNothing()) { | 1084 if (bitmap.drawsNothing()) { |
| 1088 return; | 1085 return; |
| 1089 } | 1086 } |
| 1090 | 1087 |
| 1091 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1088 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1092 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1089 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1093 #endif | 1090 #endif |
| 1094 | 1091 |
| 1095 // op + paint index + bitmap index + left + top | 1092 // op + paint index + bitmap index + left + top |
| 1096 uint32_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); | 1093 size_t size = 3 * kUInt32Size + 2 * sizeof(SkScalar); |
| 1097 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); | 1094 size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); |
| 1098 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
tten()); | 1095 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWri
tten()); |
| 1099 this->addPaintPtr(paint); | 1096 this->addPaintPtr(paint); |
| 1100 this->addBitmap(bitmap); | 1097 this->addBitmap(bitmap); |
| 1101 this->addScalar(left); | 1098 this->addScalar(left); |
| 1102 this->addScalar(top); | 1099 this->addScalar(top); |
| 1103 this->validate(initialOffset, size); | 1100 this->validate(initialOffset, size); |
| 1104 } | 1101 } |
| 1105 | 1102 |
| 1106 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
src, | 1103 void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect*
src, |
| 1107 const SkRect& dst, const SkPaint* pai
nt, | 1104 const SkRect& dst, const SkPaint* pai
nt, |
| 1108 DrawBitmapRectFlags flags) { | 1105 DrawBitmapRectFlags flags) { |
| 1109 if (bitmap.drawsNothing()) { | 1106 if (bitmap.drawsNothing()) { |
| 1110 return; | 1107 return; |
| 1111 } | 1108 } |
| 1112 | 1109 |
| 1113 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1110 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1114 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1111 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1115 #endif | 1112 #endif |
| 1116 // id + paint index + bitmap index + bool for 'src' + flags | 1113 // id + paint index + bitmap index + bool for 'src' + flags |
| 1117 uint32_t size = 5 * kUInt32Size; | 1114 size_t size = 5 * kUInt32Size; |
| 1118 if (NULL != src) { | 1115 if (NULL != src) { |
| 1119 size += sizeof(*src); // + rect | 1116 size += sizeof(*src); // + rect |
| 1120 } | 1117 } |
| 1121 size += sizeof(dst); // + rect | 1118 size += sizeof(dst); // + rect |
| 1122 | 1119 |
| 1123 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); | 1120 size_t initialOffset = this->addDraw(DRAW_BITMAP_RECT_TO_RECT, &size); |
| 1124 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) | 1121 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) |
| 1125 == fWriter.bytesWritten()); | 1122 == fWriter.bytesWritten()); |
| 1126 this->addPaintPtr(paint); | 1123 this->addPaintPtr(paint); |
| 1127 this->addBitmap(bitmap); | 1124 this->addBitmap(bitmap); |
| 1128 this->addRectPtr(src); // may be null | 1125 this->addRectPtr(src); // may be null |
| 1129 this->addRect(dst); | 1126 this->addRect(dst); |
| 1130 this->addInt(flags); | 1127 this->addInt(flags); |
| 1131 this->validate(initialOffset, size); | 1128 this->validate(initialOffset, size); |
| 1132 } | 1129 } |
| 1133 | 1130 |
| 1134 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
atrix, | 1131 void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m
atrix, |
| 1135 const SkPaint* paint) { | 1132 const SkPaint* paint) { |
| 1136 if (bitmap.drawsNothing()) { | 1133 if (bitmap.drawsNothing()) { |
| 1137 return; | 1134 return; |
| 1138 } | 1135 } |
| 1139 | 1136 |
| 1140 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1137 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1141 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1138 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1142 #endif | 1139 #endif |
| 1143 | 1140 |
| 1144 // id + paint index + bitmap index + matrix | 1141 // id + paint index + bitmap index + matrix |
| 1145 uint32_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); | 1142 size_t size = 3 * kUInt32Size + matrix.writeToMemory(NULL); |
| 1146 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); | 1143 size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); |
| 1147 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
ytesWritten()); | 1144 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.b
ytesWritten()); |
| 1148 this->addPaintPtr(paint); | 1145 this->addPaintPtr(paint); |
| 1149 this->addBitmap(bitmap); | 1146 this->addBitmap(bitmap); |
| 1150 this->addMatrix(matrix); | 1147 this->addMatrix(matrix); |
| 1151 this->validate(initialOffset, size); | 1148 this->validate(initialOffset, size); |
| 1152 } | 1149 } |
| 1153 | 1150 |
| 1154 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
er, | 1151 void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& cent
er, |
| 1155 const SkRect& dst, const SkPaint* paint) { | 1152 const SkRect& dst, const SkPaint* paint) { |
| 1156 if (bitmap.drawsNothing()) { | 1153 if (bitmap.drawsNothing()) { |
| 1157 return; | 1154 return; |
| 1158 } | 1155 } |
| 1159 | 1156 |
| 1160 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1157 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1161 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1158 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1162 #endif | 1159 #endif |
| 1163 | 1160 |
| 1164 // op + paint index + bitmap id + center + dst rect | 1161 // op + paint index + bitmap id + center + dst rect |
| 1165 uint32_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); | 1162 size_t size = 3 * kUInt32Size + sizeof(center) + sizeof(dst); |
| 1166 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); | 1163 size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); |
| 1167 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
esWritten()); | 1164 SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.byt
esWritten()); |
| 1168 this->addPaintPtr(paint); | 1165 this->addPaintPtr(paint); |
| 1169 this->addBitmap(bitmap); | 1166 this->addBitmap(bitmap); |
| 1170 this->addIRect(center); | 1167 this->addIRect(center); |
| 1171 this->addRect(dst); | 1168 this->addRect(dst); |
| 1172 this->validate(initialOffset, size); | 1169 this->validate(initialOffset, size); |
| 1173 } | 1170 } |
| 1174 | 1171 |
| 1175 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, | 1172 void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |
| 1176 const SkPaint* paint = NULL) { | 1173 const SkPaint* paint = NULL) { |
| 1177 if (bitmap.drawsNothing()) { | 1174 if (bitmap.drawsNothing()) { |
| 1178 return; | 1175 return; |
| 1179 } | 1176 } |
| 1180 | 1177 |
| 1181 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1178 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1182 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1179 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1183 #endif | 1180 #endif |
| 1184 | 1181 |
| 1185 // op + paint index + bitmap index + left + top | 1182 // op + paint index + bitmap index + left + top |
| 1186 uint32_t size = 5 * kUInt32Size; | 1183 size_t size = 5 * kUInt32Size; |
| 1187 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); | 1184 size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |
| 1188 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
tten()); | 1185 SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWri
tten()); |
| 1189 this->addPaintPtr(paint); | 1186 this->addPaintPtr(paint); |
| 1190 this->addBitmap(bitmap); | 1187 this->addBitmap(bitmap); |
| 1191 this->addInt(left); | 1188 this->addInt(left); |
| 1192 this->addInt(top); | 1189 this->addInt(top); |
| 1193 this->validate(initialOffset, size); | 1190 this->validate(initialOffset, size); |
| 1194 } | 1191 } |
| 1195 | 1192 |
| 1196 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar
topbot[2]) { | 1193 void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar
topbot[2]) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1215 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, | 1212 void SkPictureRecord::drawText(const void* text, size_t byteLength, SkScalar x, |
| 1216 SkScalar y, const SkPaint& paint) { | 1213 SkScalar y, const SkPaint& paint) { |
| 1217 | 1214 |
| 1218 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1215 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1219 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1216 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1220 #endif | 1217 #endif |
| 1221 | 1218 |
| 1222 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1219 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
| 1223 | 1220 |
| 1224 // op + paint index + length + 'length' worth of chars + x + y | 1221 // op + paint index + length + 'length' worth of chars + x + y |
| 1225 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar
); | 1222 size_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 2 * sizeof(SkScalar); |
| 1226 if (fast) { | 1223 if (fast) { |
| 1227 size += 2 * sizeof(SkScalar); // + top & bottom | 1224 size += 2 * sizeof(SkScalar); // + top & bottom |
| 1228 } | 1225 } |
| 1229 | 1226 |
| 1230 DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; | 1227 DrawType op = fast ? DRAW_TEXT_TOP_BOTTOM : DRAW_TEXT; |
| 1231 size_t initialOffset = this->addDraw(op, &size); | 1228 size_t initialOffset = this->addDraw(op, &size); |
| 1232 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); | 1229 SkASSERT(initialOffset+getPaintOffset(op, size) == fWriter.bytesWritten()); |
| 1233 const SkFlatData* flatPaintData = addPaint(paint); | 1230 const SkFlatData* flatPaintData = addPaint(paint); |
| 1234 SkASSERT(flatPaintData); | 1231 SkASSERT(flatPaintData); |
| 1235 this->addText(text, byteLength); | 1232 this->addText(text, byteLength); |
| 1236 this->addScalar(x); | 1233 this->addScalar(x); |
| 1237 this->addScalar(y); | 1234 this->addScalar(y); |
| 1238 if (fast) { | 1235 if (fast) { |
| 1239 this->addFontMetricsTopBottom(paint, *flatPaintData, y, y); | 1236 this->addFontMetricsTopBottom(paint, *flatPaintData, y, y); |
| 1240 } | 1237 } |
| 1241 this->validate(initialOffset, size); | 1238 this->validate(initialOffset, size); |
| 1242 } | 1239 } |
| 1243 | 1240 |
| 1244 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, | 1241 void SkPictureRecord::drawPosText(const void* text, size_t byteLength, |
| 1245 const SkPoint pos[], const SkPaint& paint) { | 1242 const SkPoint pos[], const SkPaint& paint) { |
| 1246 | 1243 |
| 1247 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1244 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1248 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1245 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1249 #endif | 1246 #endif |
| 1250 | 1247 |
| 1251 size_t points = paint.countText(text, byteLength); | 1248 int points = paint.countText(text, byteLength); |
| 1252 if (0 == points) | 1249 if (0 == points) |
| 1253 return; | 1250 return; |
| 1254 | 1251 |
| 1255 bool canUseDrawH = true; | 1252 bool canUseDrawH = true; |
| 1256 SkScalar minY = pos[0].fY; | 1253 SkScalar minY = pos[0].fY; |
| 1257 SkScalar maxY = pos[0].fY; | 1254 SkScalar maxY = pos[0].fY; |
| 1258 // check if the caller really should have used drawPosTextH() | 1255 // check if the caller really should have used drawPosTextH() |
| 1259 { | 1256 { |
| 1260 const SkScalar firstY = pos[0].fY; | 1257 const SkScalar firstY = pos[0].fY; |
| 1261 for (size_t index = 1; index < points; index++) { | 1258 for (int index = 1; index < points; index++) { |
| 1262 if (pos[index].fY != firstY) { | 1259 if (pos[index].fY != firstY) { |
| 1263 canUseDrawH = false; | 1260 canUseDrawH = false; |
| 1264 if (pos[index].fY < minY) { | 1261 if (pos[index].fY < minY) { |
| 1265 minY = pos[index].fY; | 1262 minY = pos[index].fY; |
| 1266 } else if (pos[index].fY > maxY) { | 1263 } else if (pos[index].fY > maxY) { |
| 1267 maxY = pos[index].fY; | 1264 maxY = pos[index].fY; |
| 1268 } | 1265 } |
| 1269 } | 1266 } |
| 1270 } | 1267 } |
| 1271 } | 1268 } |
| 1272 | 1269 |
| 1273 bool fastBounds = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1270 bool fastBounds = !paint.isVerticalText() && paint.canComputeFastBounds(); |
| 1274 bool fast = canUseDrawH && fastBounds; | 1271 bool fast = canUseDrawH && fastBounds; |
| 1275 | 1272 |
| 1276 // op + paint index + length + 'length' worth of data + num points | 1273 // op + paint index + length + 'length' worth of data + num points |
| 1277 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; | 1274 size_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; |
| 1278 if (canUseDrawH) { | 1275 if (canUseDrawH) { |
| 1279 if (fast) { | 1276 if (fast) { |
| 1280 size += 2 * sizeof(SkScalar); // + top & bottom | 1277 size += 2 * sizeof(SkScalar); // + top & bottom |
| 1281 } | 1278 } |
| 1282 // + y-pos + actual x-point data | 1279 // + y-pos + actual x-point data |
| 1283 size += sizeof(SkScalar) + points * sizeof(SkScalar); | 1280 size += sizeof(SkScalar) + points * sizeof(SkScalar); |
| 1284 } else { | 1281 } else { |
| 1285 // + x&y point data | 1282 // + x&y point data |
| 1286 size += points * sizeof(SkPoint); | 1283 size += points * sizeof(SkPoint); |
| 1287 if (fastBounds) { | 1284 if (fastBounds) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1308 | 1305 |
| 1309 #ifdef SK_DEBUG_SIZE | 1306 #ifdef SK_DEBUG_SIZE |
| 1310 size_t start = fWriter.bytesWritten(); | 1307 size_t start = fWriter.bytesWritten(); |
| 1311 #endif | 1308 #endif |
| 1312 if (canUseDrawH) { | 1309 if (canUseDrawH) { |
| 1313 if (fast) { | 1310 if (fast) { |
| 1314 this->addFontMetricsTopBottom(paint, *flatPaintData, pos[0].fY, pos[
0].fY); | 1311 this->addFontMetricsTopBottom(paint, *flatPaintData, pos[0].fY, pos[
0].fY); |
| 1315 } | 1312 } |
| 1316 this->addScalar(pos[0].fY); | 1313 this->addScalar(pos[0].fY); |
| 1317 SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); | 1314 SkScalar* xptr = (SkScalar*)fWriter.reserve(points * sizeof(SkScalar)); |
| 1318 for (size_t index = 0; index < points; index++) | 1315 for (int index = 0; index < points; index++) |
| 1319 *xptr++ = pos[index].fX; | 1316 *xptr++ = pos[index].fX; |
| 1320 } else { | 1317 } else { |
| 1321 fWriter.writeMul4(pos, points * sizeof(SkPoint)); | 1318 fWriter.writeMul4(pos, points * sizeof(SkPoint)); |
| 1322 if (fastBounds) { | 1319 if (fastBounds) { |
| 1323 this->addFontMetricsTopBottom(paint, *flatPaintData, minY, maxY); | 1320 this->addFontMetricsTopBottom(paint, *flatPaintData, minY, maxY); |
| 1324 } | 1321 } |
| 1325 } | 1322 } |
| 1326 #ifdef SK_DEBUG_SIZE | 1323 #ifdef SK_DEBUG_SIZE |
| 1327 fPointBytes += fWriter.bytesWritten() - start; | 1324 fPointBytes += fWriter.bytesWritten() - start; |
| 1328 fPointWrites += points; | 1325 fPointWrites += points; |
| 1329 #endif | 1326 #endif |
| 1330 this->validate(initialOffset, size); | 1327 this->validate(initialOffset, size); |
| 1331 } | 1328 } |
| 1332 | 1329 |
| 1333 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, | 1330 void SkPictureRecord::drawPosTextH(const void* text, size_t byteLength, |
| 1334 const SkScalar xpos[], SkScalar constY, | 1331 const SkScalar xpos[], SkScalar constY, |
| 1335 const SkPaint& paint) { | 1332 const SkPaint& paint) { |
| 1336 | 1333 |
| 1337 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1334 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1338 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1335 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1339 #endif | 1336 #endif |
| 1340 | 1337 |
| 1341 const SkFlatData* flatPaintData = this->getFlatPaintData(paint); | 1338 const SkFlatData* flatPaintData = this->getFlatPaintData(paint); |
| 1342 this->drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData)
; | 1339 this->drawPosTextHImpl(text, byteLength, xpos, constY, paint, flatPaintData)
; |
| 1343 } | 1340 } |
| 1344 | 1341 |
| 1345 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, | 1342 void SkPictureRecord::drawPosTextHImpl(const void* text, size_t byteLength, |
| 1346 const SkScalar xpos[], SkScalar constY, | 1343 const SkScalar xpos[], SkScalar constY, |
| 1347 const SkPaint& paint, const SkFlatData* flatPaintData)
{ | 1344 const SkPaint& paint, const SkFlatData* flatPaintData)
{ |
| 1348 size_t points = paint.countText(text, byteLength); | 1345 int points = paint.countText(text, byteLength); |
| 1349 if (0 == points) | 1346 if (0 == points) |
| 1350 return; | 1347 return; |
| 1351 | 1348 |
| 1352 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); | 1349 bool fast = !paint.isVerticalText() && paint.canComputeFastBounds(); |
| 1353 | 1350 |
| 1354 // op + paint index + length + 'length' worth of data + num points | 1351 // op + paint index + length + 'length' worth of data + num points |
| 1355 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; | 1352 size_t size = 3 * kUInt32Size + SkAlign4(byteLength) + 1 * kUInt32Size; |
| 1356 if (fast) { | 1353 if (fast) { |
| 1357 size += 2 * sizeof(SkScalar); // + top & bottom | 1354 size += 2 * sizeof(SkScalar); // + top & bottom |
| 1358 } | 1355 } |
| 1359 // + y + the actual points | 1356 // + y + the actual points |
| 1360 size += 1 * kUInt32Size + points * sizeof(SkScalar); | 1357 size += 1 * kUInt32Size + points * sizeof(SkScalar); |
| 1361 size_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRA
W_POS_TEXT_H, | 1358 size_t initialOffset = this->addDraw(fast ? DRAW_POS_TEXT_H_TOP_BOTTOM : DRA
W_POS_TEXT_H, |
| 1362 &size); | 1359 &size); |
| 1363 SkASSERT(flatPaintData); | 1360 SkASSERT(flatPaintData); |
| 1364 this->addFlatPaint(flatPaintData); | 1361 this->addFlatPaint(flatPaintData); |
| 1365 | 1362 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1384 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, | 1381 void SkPictureRecord::drawTextOnPath(const void* text, size_t byteLength, |
| 1385 const SkPath& path, const SkMatrix* matrix, | 1382 const SkPath& path, const SkMatrix* matrix, |
| 1386 const SkPaint& paint) { | 1383 const SkPaint& paint) { |
| 1387 | 1384 |
| 1388 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1385 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1389 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1386 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1390 #endif | 1387 #endif |
| 1391 | 1388 |
| 1392 // op + paint index + length + 'length' worth of data + path index + matrix | 1389 // op + paint index + length + 'length' worth of data + path index + matrix |
| 1393 const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); | 1390 const SkMatrix& m = matrix ? *matrix : SkMatrix::I(); |
| 1394 uint32_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.wri
teToMemory(NULL); | 1391 size_t size = 3 * kUInt32Size + SkAlign4(byteLength) + kUInt32Size + m.write
ToMemory(NULL); |
| 1395 size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); | 1392 size_t initialOffset = this->addDraw(DRAW_TEXT_ON_PATH, &size); |
| 1396 SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
tesWritten()); | 1393 SkASSERT(initialOffset+getPaintOffset(DRAW_TEXT_ON_PATH, size) == fWriter.by
tesWritten()); |
| 1397 this->addPaint(paint); | 1394 this->addPaint(paint); |
| 1398 this->addText(text, byteLength); | 1395 this->addText(text, byteLength); |
| 1399 this->addPath(path); | 1396 this->addPath(path); |
| 1400 this->addMatrix(m); | 1397 this->addMatrix(m); |
| 1401 this->validate(initialOffset, size); | 1398 this->validate(initialOffset, size); |
| 1402 } | 1399 } |
| 1403 | 1400 |
| 1404 void SkPictureRecord::drawPicture(SkPicture& picture) { | 1401 void SkPictureRecord::drawPicture(SkPicture& picture) { |
| 1405 | 1402 |
| 1406 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1403 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1407 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1404 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1408 #endif | 1405 #endif |
| 1409 | 1406 |
| 1410 // op + picture index | 1407 // op + picture index |
| 1411 uint32_t size = 2 * kUInt32Size; | 1408 size_t size = 2 * kUInt32Size; |
| 1412 size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); | 1409 size_t initialOffset = this->addDraw(DRAW_PICTURE, &size); |
| 1413 this->addPicture(picture); | 1410 this->addPicture(picture); |
| 1414 this->validate(initialOffset, size); | 1411 this->validate(initialOffset, size); |
| 1415 } | 1412 } |
| 1416 | 1413 |
| 1417 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, | 1414 void SkPictureRecord::drawVertices(VertexMode vmode, int vertexCount, |
| 1418 const SkPoint vertices[], const SkPoint texs[], | 1415 const SkPoint vertices[], const SkPoint texs[], |
| 1419 const SkColor colors[], SkXfermode* xfer, | 1416 const SkColor colors[], SkXfermode* xfer, |
| 1420 const uint16_t indices[], int indexCount, | 1417 const uint16_t indices[], int indexCount, |
| 1421 const SkPaint& paint) { | 1418 const SkPaint& paint) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1435 flags |= DRAW_VERTICES_HAS_INDICES; | 1432 flags |= DRAW_VERTICES_HAS_INDICES; |
| 1436 } | 1433 } |
| 1437 if (NULL != xfer) { | 1434 if (NULL != xfer) { |
| 1438 SkXfermode::Mode mode; | 1435 SkXfermode::Mode mode; |
| 1439 if (xfer->asMode(&mode) && SkXfermode::kModulate_Mode != mode) { | 1436 if (xfer->asMode(&mode) && SkXfermode::kModulate_Mode != mode) { |
| 1440 flags |= DRAW_VERTICES_HAS_XFER; | 1437 flags |= DRAW_VERTICES_HAS_XFER; |
| 1441 } | 1438 } |
| 1442 } | 1439 } |
| 1443 | 1440 |
| 1444 // op + paint index + flags + vmode + vCount + vertices | 1441 // op + paint index + flags + vmode + vCount + vertices |
| 1445 uint32_t size = 5 * kUInt32Size + vertexCount * sizeof(SkPoint); | 1442 size_t size = 5 * kUInt32Size + vertexCount * sizeof(SkPoint); |
| 1446 if (flags & DRAW_VERTICES_HAS_TEXS) { | 1443 if (flags & DRAW_VERTICES_HAS_TEXS) { |
| 1447 size += vertexCount * sizeof(SkPoint); // + uvs | 1444 size += vertexCount * sizeof(SkPoint); // + uvs |
| 1448 } | 1445 } |
| 1449 if (flags & DRAW_VERTICES_HAS_COLORS) { | 1446 if (flags & DRAW_VERTICES_HAS_COLORS) { |
| 1450 size += vertexCount * sizeof(SkColor); // + vert colors | 1447 size += vertexCount * sizeof(SkColor); // + vert colors |
| 1451 } | 1448 } |
| 1452 if (flags & DRAW_VERTICES_HAS_INDICES) { | 1449 if (flags & DRAW_VERTICES_HAS_INDICES) { |
| 1453 // + num indices + indices | 1450 // + num indices + indices |
| 1454 size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); | 1451 size += 1 * kUInt32Size + SkAlign4(indexCount * sizeof(uint16_t)); |
| 1455 } | 1452 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1482 this->validate(initialOffset, size); | 1479 this->validate(initialOffset, size); |
| 1483 } | 1480 } |
| 1484 | 1481 |
| 1485 void SkPictureRecord::drawData(const void* data, size_t length) { | 1482 void SkPictureRecord::drawData(const void* data, size_t length) { |
| 1486 | 1483 |
| 1487 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1484 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
| 1488 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1485 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
| 1489 #endif | 1486 #endif |
| 1490 | 1487 |
| 1491 // op + length + 'length' worth of data | 1488 // op + length + 'length' worth of data |
| 1492 uint32_t size = 2 * kUInt32Size + SkAlign4(length); | 1489 size_t size = 2 * kUInt32Size + SkAlign4(length); |
| 1493 size_t initialOffset = this->addDraw(DRAW_DATA, &size); | 1490 size_t initialOffset = this->addDraw(DRAW_DATA, &size); |
| 1494 this->addInt(length); | 1491 this->addInt(SkToInt(length)); |
| 1495 fWriter.writePad(data, length); | 1492 fWriter.writePad(data, length); |
| 1496 this->validate(initialOffset, size); | 1493 this->validate(initialOffset, size); |
| 1497 } | 1494 } |
| 1498 | 1495 |
| 1499 void SkPictureRecord::beginCommentGroup(const char* description) { | 1496 void SkPictureRecord::beginCommentGroup(const char* description) { |
| 1500 // op/size + length of string + \0 terminated chars | 1497 // op/size + length of string + \0 terminated chars |
| 1501 int length = strlen(description); | 1498 size_t length = strlen(description); |
| 1502 uint32_t size = 2 * kUInt32Size + SkAlign4(length + 1); | 1499 size_t size = 2 * kUInt32Size + SkAlign4(length + 1); |
| 1503 size_t initialOffset = this->addDraw(BEGIN_COMMENT_GROUP, &size); | 1500 size_t initialOffset = this->addDraw(BEGIN_COMMENT_GROUP, &size); |
| 1504 fWriter.writeString(description, length); | 1501 fWriter.writeString(description, length); |
| 1505 this->validate(initialOffset, size); | 1502 this->validate(initialOffset, size); |
| 1506 } | 1503 } |
| 1507 | 1504 |
| 1508 void SkPictureRecord::addComment(const char* kywd, const char* value) { | 1505 void SkPictureRecord::addComment(const char* kywd, const char* value) { |
| 1509 // op/size + 2x length of string + 2x \0 terminated chars | 1506 // op/size + 2x length of string + 2x \0 terminated chars |
| 1510 int kywdLen = strlen(kywd); | 1507 size_t kywdLen = strlen(kywd); |
| 1511 int valueLen = strlen(value); | 1508 size_t valueLen = strlen(value); |
| 1512 uint32_t size = 3 * kUInt32Size + SkAlign4(kywdLen + 1) + SkAlign4(valueLen
+ 1); | 1509 size_t size = 3 * kUInt32Size + SkAlign4(kywdLen + 1) + SkAlign4(valueLen +
1); |
| 1513 size_t initialOffset = this->addDraw(COMMENT, &size); | 1510 size_t initialOffset = this->addDraw(COMMENT, &size); |
| 1514 fWriter.writeString(kywd, kywdLen); | 1511 fWriter.writeString(kywd, kywdLen); |
| 1515 fWriter.writeString(value, valueLen); | 1512 fWriter.writeString(value, valueLen); |
| 1516 this->validate(initialOffset, size); | 1513 this->validate(initialOffset, size); |
| 1517 } | 1514 } |
| 1518 | 1515 |
| 1519 void SkPictureRecord::endCommentGroup() { | 1516 void SkPictureRecord::endCommentGroup() { |
| 1520 // op/size | 1517 // op/size |
| 1521 uint32_t size = 1 * kUInt32Size; | 1518 size_t size = 1 * kUInt32Size; |
| 1522 size_t initialOffset = this->addDraw(END_COMMENT_GROUP, &size); | 1519 size_t initialOffset = this->addDraw(END_COMMENT_GROUP, &size); |
| 1523 this->validate(initialOffset, size); | 1520 this->validate(initialOffset, size); |
| 1524 } | 1521 } |
| 1525 | 1522 |
| 1526 // [op/size] [rect] [skip offset] | 1523 // [op/size] [rect] [skip offset] |
| 1527 static const uint32_t kPushCullOpSize = 2 * kUInt32Size + sizeof(SkRect); | 1524 static const uint32_t kPushCullOpSize = 2 * kUInt32Size + sizeof(SkRect); |
| 1528 void SkPictureRecord::onPushCull(const SkRect& cullRect) { | 1525 void SkPictureRecord::onPushCull(const SkRect& cullRect) { |
| 1529 uint32_t size = kPushCullOpSize; | 1526 size_t size = kPushCullOpSize; |
| 1530 size_t initialOffset = this->addDraw(PUSH_CULL, &size); | 1527 size_t initialOffset = this->addDraw(PUSH_CULL, &size); |
| 1531 // PUSH_CULL's size should stay constant (used to rewind). | 1528 // PUSH_CULL's size should stay constant (used to rewind). |
| 1532 SkASSERT(size == kPushCullOpSize); | 1529 SkASSERT(size == kPushCullOpSize); |
| 1533 | 1530 |
| 1534 this->addRect(cullRect); | 1531 this->addRect(cullRect); |
| 1535 fCullOffsetStack.push(fWriter.bytesWritten()); | 1532 fCullOffsetStack.push(SkToU32(fWriter.bytesWritten())); |
| 1536 this->addInt(0); | 1533 this->addInt(0); |
| 1537 this->validate(initialOffset, size); | 1534 this->validate(initialOffset, size); |
| 1538 } | 1535 } |
| 1539 | 1536 |
| 1540 void SkPictureRecord::onPopCull() { | 1537 void SkPictureRecord::onPopCull() { |
| 1541 SkASSERT(!fCullOffsetStack.isEmpty()); | 1538 SkASSERT(!fCullOffsetStack.isEmpty()); |
| 1542 | 1539 |
| 1543 uint32_t cullSkipOffset = fCullOffsetStack.top(); | 1540 uint32_t cullSkipOffset = fCullOffsetStack.top(); |
| 1544 fCullOffsetStack.pop(); | 1541 fCullOffsetStack.pop(); |
| 1545 | 1542 |
| 1546 // Collapse empty push/pop pairs. | 1543 // Collapse empty push/pop pairs. |
| 1547 if ((size_t)(cullSkipOffset + kUInt32Size) == fWriter.bytesWritten()) { | 1544 if ((size_t)(cullSkipOffset + kUInt32Size) == fWriter.bytesWritten()) { |
| 1548 SkASSERT(fWriter.bytesWritten() >= kPushCullOpSize); | 1545 SkASSERT(fWriter.bytesWritten() >= kPushCullOpSize); |
| 1549 SkASSERT(PUSH_CULL == peek_op(&fWriter, fWriter.bytesWritten() - kPushCu
llOpSize)); | 1546 SkASSERT(PUSH_CULL == peek_op(&fWriter, fWriter.bytesWritten() - kPushCu
llOpSize)); |
| 1550 fWriter.rewindToOffset(fWriter.bytesWritten() - kPushCullOpSize); | 1547 fWriter.rewindToOffset(fWriter.bytesWritten() - kPushCullOpSize); |
| 1551 return; | 1548 return; |
| 1552 } | 1549 } |
| 1553 | 1550 |
| 1554 // op only | 1551 // op only |
| 1555 uint32_t size = kUInt32Size; | 1552 size_t size = kUInt32Size; |
| 1556 size_t initialOffset = this->addDraw(POP_CULL, &size); | 1553 size_t initialOffset = this->addDraw(POP_CULL, &size); |
| 1557 | 1554 |
| 1558 // update the cull skip offset to point past this op. | 1555 // update the cull skip offset to point past this op. |
| 1559 fWriter.overwriteTAt<uint32_t>(cullSkipOffset, fWriter.bytesWritten()); | 1556 fWriter.overwriteTAt<uint32_t>(cullSkipOffset, SkToU32(fWriter.bytesWritten(
))); |
| 1560 | 1557 |
| 1561 this->validate(initialOffset, size); | 1558 this->validate(initialOffset, size); |
| 1562 } | 1559 } |
| 1563 | 1560 |
| 1564 /////////////////////////////////////////////////////////////////////////////// | 1561 /////////////////////////////////////////////////////////////////////////////// |
| 1565 | 1562 |
| 1566 SkSurface* SkPictureRecord::onNewSurface(const SkImageInfo& info) { | 1563 SkSurface* SkPictureRecord::onNewSurface(const SkImageInfo& info) { |
| 1567 return NULL; | 1564 return NULL; |
| 1568 } | 1565 } |
| 1569 | 1566 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 } | 1670 } |
| 1674 | 1671 |
| 1675 void SkPictureRecord::addRegion(const SkRegion& region) { | 1672 void SkPictureRecord::addRegion(const SkRegion& region) { |
| 1676 fWriter.writeRegion(region); | 1673 fWriter.writeRegion(region); |
| 1677 } | 1674 } |
| 1678 | 1675 |
| 1679 void SkPictureRecord::addText(const void* text, size_t byteLength) { | 1676 void SkPictureRecord::addText(const void* text, size_t byteLength) { |
| 1680 #ifdef SK_DEBUG_SIZE | 1677 #ifdef SK_DEBUG_SIZE |
| 1681 size_t start = fWriter.bytesWritten(); | 1678 size_t start = fWriter.bytesWritten(); |
| 1682 #endif | 1679 #endif |
| 1683 addInt(byteLength); | 1680 addInt(SkToInt(byteLength)); |
| 1684 fWriter.writePad(text, byteLength); | 1681 fWriter.writePad(text, byteLength); |
| 1685 #ifdef SK_DEBUG_SIZE | 1682 #ifdef SK_DEBUG_SIZE |
| 1686 fTextBytes += fWriter.bytesWritten() - start; | 1683 fTextBytes += fWriter.bytesWritten() - start; |
| 1687 fTextWrites++; | 1684 fTextWrites++; |
| 1688 #endif | 1685 #endif |
| 1689 } | 1686 } |
| 1690 | 1687 |
| 1691 /////////////////////////////////////////////////////////////////////////////// | 1688 /////////////////////////////////////////////////////////////////////////////// |
| 1692 | 1689 |
| 1693 #ifdef SK_DEBUG_SIZE | 1690 #ifdef SK_DEBUG_SIZE |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1814 void SkPictureRecord::validateRegions() const { | 1811 void SkPictureRecord::validateRegions() const { |
| 1815 int count = fRegions.count(); | 1812 int count = fRegions.count(); |
| 1816 SkASSERT((unsigned) count < 0x1000); | 1813 SkASSERT((unsigned) count < 0x1000); |
| 1817 for (int index = 0; index < count; index++) { | 1814 for (int index = 0; index < count; index++) { |
| 1818 const SkFlatData* region = fRegions[index]; | 1815 const SkFlatData* region = fRegions[index]; |
| 1819 SkASSERT(region); | 1816 SkASSERT(region); |
| 1820 // region->validate(); | 1817 // region->validate(); |
| 1821 } | 1818 } |
| 1822 } | 1819 } |
| 1823 #endif | 1820 #endif |
| OLD | NEW |