| 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 #include <new> | 7 #include <new> |
| 8 #include "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
| 9 #include "SkDrawPictureCallback.h" | 9 #include "SkDrawPictureCallback.h" |
| 10 #include "SkPictureData.h" | 10 #include "SkPictureData.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 for (int i = 0; i < fPathHeap->count(); i++) { | 33 for (int i = 0; i < fPathHeap->count(); i++) { |
| 34 (*fPathHeap.get())[i].updateBoundsCache(); | 34 (*fPathHeap.get())[i].updateBoundsCache(); |
| 35 } | 35 } |
| 36 } | 36 } |
| 37 } | 37 } |
| 38 | 38 |
| 39 SkPictureData::SkPictureData(const SkPictureRecord& record, | 39 SkPictureData::SkPictureData(const SkPictureRecord& record, |
| 40 const SkPictInfo& info, | 40 const SkPictInfo& info, |
| 41 bool deepCopyOps) | 41 bool deepCopyOps) |
| 42 : fInfo(info) { | 42 : fInfo(info) { |
| 43 #ifdef SK_DEBUG_SIZE | |
| 44 size_t overallBytes, bitmapBytes, matricesBytes, | |
| 45 paintBytes, pathBytes, pictureBytes, regionBytes; | |
| 46 int bitmaps = record.bitmaps(&bitmapBytes); | |
| 47 int matrices = record.matrices(&matricesBytes); | |
| 48 int paints = record.paints(&paintBytes); | |
| 49 int paths = record.paths(&pathBytes); | |
| 50 int pictures = record.pictures(&pictureBytes); | |
| 51 int regions = record.regions(®ionBytes); | |
| 52 SkDebugf("picture record mem used %zd (stream %zd) ", record.size(), | |
| 53 record.streamlen()); | |
| 54 if (bitmaps != 0) | |
| 55 SkDebugf("bitmaps size %zd (bitmaps:%d) ", bitmapBytes, bitmaps); | |
| 56 if (matrices != 0) | |
| 57 SkDebugf("matrices size %zd (matrices:%d) ", matricesBytes, matrices); | |
| 58 if (paints != 0) | |
| 59 SkDebugf("paints size %zd (paints:%d) ", paintBytes, paints); | |
| 60 if (paths != 0) | |
| 61 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); | |
| 62 if (pictures != 0) | |
| 63 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); | |
| 64 if (regions != 0) | |
| 65 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); | |
| 66 if (record.fPointWrites != 0) | |
| 67 SkDebugf("points size %zd (points:%d) ", record.fPointBytes, record.fPoi
ntWrites); | |
| 68 if (record.fRectWrites != 0) | |
| 69 SkDebugf("rects size %zd (rects:%d) ", record.fRectBytes, record.fRectWr
ites); | |
| 70 if (record.fTextWrites != 0) | |
| 71 SkDebugf("text size %zd (text strings:%d) ", record.fTextBytes, record.f
TextWrites); | |
| 72 | |
| 73 SkDebugf("\n"); | |
| 74 #endif | |
| 75 #ifdef SK_DEBUG_DUMP | |
| 76 record.dumpMatrices(); | |
| 77 record.dumpPaints(); | |
| 78 #endif | |
| 79 | 43 |
| 80 this->init(); | 44 this->init(); |
| 81 | 45 |
| 82 fOpData = record.opData(deepCopyOps); | 46 fOpData = record.opData(deepCopyOps); |
| 83 | 47 |
| 84 fBoundingHierarchy = record.fBoundingHierarchy; | 48 fBoundingHierarchy = record.fBoundingHierarchy; |
| 85 fStateTree = record.fStateTree; | 49 fStateTree = record.fStateTree; |
| 86 | 50 |
| 87 SkSafeRef(fBoundingHierarchy); | 51 SkSafeRef(fBoundingHierarchy); |
| 88 SkSafeRef(fStateTree); | 52 SkSafeRef(fStateTree); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 105 | 69 |
| 106 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); | 70 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); |
| 107 fPictureCount = pictures.count(); | 71 fPictureCount = pictures.count(); |
| 108 if (fPictureCount > 0) { | 72 if (fPictureCount > 0) { |
| 109 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); | 73 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); |
| 110 for (int i = 0; i < fPictureCount; i++) { | 74 for (int i = 0; i < fPictureCount; i++) { |
| 111 fPictureRefs[i] = pictures[i]; | 75 fPictureRefs[i] = pictures[i]; |
| 112 fPictureRefs[i]->ref(); | 76 fPictureRefs[i]->ref(); |
| 113 } | 77 } |
| 114 } | 78 } |
| 115 | |
| 116 #ifdef SK_DEBUG_SIZE | |
| 117 int overall = fPlayback->size(&overallBytes); | |
| 118 bitmaps = fPlayback->bitmaps(&bitmapBytes); | |
| 119 paints = fPlayback->paints(&paintBytes); | |
| 120 paths = fPlayback->paths(&pathBytes); | |
| 121 pictures = fPlayback->pictures(&pictureBytes); | |
| 122 regions = fPlayback->regions(®ionBytes); | |
| 123 SkDebugf("playback size %zd (objects:%d) ", overallBytes, overall); | |
| 124 if (bitmaps != 0) | |
| 125 SkDebugf("bitmaps size %zd (bitmaps:%d) ", bitmapBytes, bitmaps); | |
| 126 if (paints != 0) | |
| 127 SkDebugf("paints size %zd (paints:%d) ", paintBytes, paints); | |
| 128 if (paths != 0) | |
| 129 SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); | |
| 130 if (pictures != 0) | |
| 131 SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); | |
| 132 if (regions != 0) | |
| 133 SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); | |
| 134 SkDebugf("\n"); | |
| 135 #endif | |
| 136 } | 79 } |
| 137 | 80 |
| 138 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE | 81 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE |
| 139 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI
nfo) | 82 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI
nfo) |
| 140 : fInfo(src.fInfo) { | 83 : fInfo(src.fInfo) { |
| 141 this->init(); | 84 this->init(); |
| 142 | 85 |
| 143 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); | 86 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); |
| 144 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); | 87 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); |
| 145 | 88 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 SkSafeUnref(fStateTree); | 154 SkSafeUnref(fStateTree); |
| 212 | 155 |
| 213 for (int i = 0; i < fPictureCount; i++) { | 156 for (int i = 0; i < fPictureCount; i++) { |
| 214 fPictureRefs[i]->unref(); | 157 fPictureRefs[i]->unref(); |
| 215 } | 158 } |
| 216 SkDELETE_ARRAY(fPictureRefs); | 159 SkDELETE_ARRAY(fPictureRefs); |
| 217 | 160 |
| 218 SkDELETE(fFactoryPlayback); | 161 SkDELETE(fFactoryPlayback); |
| 219 } | 162 } |
| 220 | 163 |
| 221 void SkPictureData::dumpSize() const { | |
| 222 SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] paints=%d [%d]\n", | |
| 223 fOpData->size(), | |
| 224 SafeCount(fBitmaps), SafeCount(fBitmaps) * sizeof(SkBitmap), | |
| 225 SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint)); | |
| 226 SkDebugf("--- picture size: paths=%d\n", | |
| 227 SafeCount(fPathHeap.get())); | |
| 228 } | |
| 229 | |
| 230 bool SkPictureData::containsBitmaps() const { | 164 bool SkPictureData::containsBitmaps() const { |
| 231 if (fBitmaps && fBitmaps->count() > 0) { | 165 if (fBitmaps && fBitmaps->count() > 0) { |
| 232 return true; | 166 return true; |
| 233 } | 167 } |
| 234 for (int i = 0; i < fPictureCount; ++i) { | 168 for (int i = 0; i < fPictureCount; ++i) { |
| 235 if (fPictureRefs[i]->willPlayBackBitmaps()) { | 169 if (fPictureRefs[i]->willPlayBackBitmaps()) { |
| 236 return true; | 170 return true; |
| 237 } | 171 } |
| 238 } | 172 } |
| 239 return false; | 173 return false; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 | 214 |
| 281 size_t size = compute_chunk_size(array, count); | 215 size_t size = compute_chunk_size(array, count); |
| 282 | 216 |
| 283 // TODO: write_tag_size should really take a size_t | 217 // TODO: write_tag_size should really take a size_t |
| 284 write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); | 218 write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); |
| 285 SkDEBUGCODE(size_t start = stream->bytesWritten()); | 219 SkDEBUGCODE(size_t start = stream->bytesWritten()); |
| 286 stream->write32(count); | 220 stream->write32(count); |
| 287 | 221 |
| 288 for (int i = 0; i < count; i++) { | 222 for (int i = 0; i < count; i++) { |
| 289 const char* name = SkFlattenable::FactoryToName(array[i]); | 223 const char* name = SkFlattenable::FactoryToName(array[i]); |
| 290 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); | |
| 291 if (NULL == name || 0 == *name) { | 224 if (NULL == name || 0 == *name) { |
| 292 stream->writePackedUInt(0); | 225 stream->writePackedUInt(0); |
| 293 } else { | 226 } else { |
| 294 size_t len = strlen(name); | 227 size_t len = strlen(name); |
| 295 stream->writePackedUInt(len); | 228 stream->writePackedUInt(len); |
| 296 stream->write(name, len); | 229 stream->write(name, len); |
| 297 } | 230 } |
| 298 } | 231 } |
| 299 | 232 |
| 300 SkASSERT(size == (stream->bytesWritten() - start)); | 233 SkASSERT(size == (stream->bytesWritten() - start)); |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 return this->suitableForGpuRasterization(context, reason, | 613 return this->suitableForGpuRasterization(context, reason, |
| 681 context->getRecommendedSampleCo
unt(config, dpi)); | 614 context->getRecommendedSampleCo
unt(config, dpi)); |
| 682 } else { | 615 } else { |
| 683 return this->suitableForGpuRasterization(NULL, reason); | 616 return this->suitableForGpuRasterization(NULL, reason); |
| 684 } | 617 } |
| 685 } | 618 } |
| 686 | 619 |
| 687 #endif | 620 #endif |
| 688 /////////////////////////////////////////////////////////////////////////////// | 621 /////////////////////////////////////////////////////////////////////////////// |
| 689 | 622 |
| 690 #ifdef SK_DEBUG_SIZE | |
| 691 int SkPictureData::size(size_t* sizePtr) { | |
| 692 int objects = bitmaps(sizePtr); | |
| 693 objects += paints(sizePtr); | |
| 694 objects += paths(sizePtr); | |
| 695 objects += pictures(sizePtr); | |
| 696 objects += regions(sizePtr); | |
| 697 *sizePtr = fOpData.size(); | |
| 698 return objects; | |
| 699 } | |
| 700 | 623 |
| 701 int SkPictureData::bitmaps(size_t* size) { | |
| 702 size_t result = 0; | |
| 703 for (int index = 0; index < fBitmapCount; index++) { | |
| 704 // const SkBitmap& bitmap = fBitmaps[index]; | |
| 705 result += sizeof(SkBitmap); // bitmap->size(); | |
| 706 } | |
| 707 *size = result; | |
| 708 return fBitmapCount; | |
| 709 } | |
| 710 | |
| 711 int SkPictureData::paints(size_t* size) { | |
| 712 size_t result = 0; | |
| 713 for (int index = 0; index < fPaintCount; index++) { | |
| 714 // const SkPaint& paint = fPaints[index]; | |
| 715 result += sizeof(SkPaint); // paint->size(); | |
| 716 } | |
| 717 *size = result; | |
| 718 return fPaintCount; | |
| 719 } | |
| 720 | |
| 721 int SkPictureData::paths(size_t* size) { | |
| 722 size_t result = 0; | |
| 723 for (int index = 0; index < fPathCount; index++) { | |
| 724 const SkPath& path = fPaths[index]; | |
| 725 result += path.flatten(NULL); | |
| 726 } | |
| 727 *size = result; | |
| 728 return fPathCount; | |
| 729 } | |
| 730 #endif | |
| 731 | |
| 732 #ifdef SK_DEBUG_DUMP | |
| 733 void SkPictureData::dumpBitmap(const SkBitmap& bitmap) const { | |
| 734 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 735 char* bufferPtr = pBuffer; | |
| 736 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 737 "BitmapData bitmap%p = {", &bitmap); | |
| 738 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 739 "{kWidth, %d}, ", bitmap.width()); | |
| 740 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 741 "{kHeight, %d}, ", bitmap.height()); | |
| 742 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 743 "{kRowBytes, %d}, ", bitmap.rowBytes()); | |
| 744 // start here; | |
| 745 SkDebugf("%s{0}};\n", pBuffer); | |
| 746 } | |
| 747 | |
| 748 void dumpMatrix(const SkMatrix& matrix) const { | |
| 749 SkMatrix defaultMatrix; | |
| 750 defaultMatrix.reset(); | |
| 751 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 752 char* bufferPtr = pBuffer; | |
| 753 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 754 "MatrixData matrix%p = {", &matrix); | |
| 755 SkScalar scaleX = matrix.getScaleX(); | |
| 756 if (scaleX != defaultMatrix.getScaleX()) | |
| 757 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 758 "{kScaleX, %g}, ", SkScalarToFloat(scaleX)); | |
| 759 SkScalar scaleY = matrix.getScaleY(); | |
| 760 if (scaleY != defaultMatrix.getScaleY()) | |
| 761 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 762 "{kScaleY, %g}, ", SkScalarToFloat(scaleY)); | |
| 763 SkScalar skewX = matrix.getSkewX(); | |
| 764 if (skewX != defaultMatrix.getSkewX()) | |
| 765 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 766 "{kSkewX, %g}, ", SkScalarToFloat(skewX)); | |
| 767 SkScalar skewY = matrix.getSkewY(); | |
| 768 if (skewY != defaultMatrix.getSkewY()) | |
| 769 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 770 "{kSkewY, %g}, ", SkScalarToFloat(skewY)); | |
| 771 SkScalar translateX = matrix.getTranslateX(); | |
| 772 if (translateX != defaultMatrix.getTranslateX()) | |
| 773 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 774 "{kTranslateX, %g}, ", SkScalarToFloat(translateX)); | |
| 775 SkScalar translateY = matrix.getTranslateY(); | |
| 776 if (translateY != defaultMatrix.getTranslateY()) | |
| 777 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 778 "{kTranslateY, %g}, ", SkScalarToFloat(translateY)); | |
| 779 SkScalar perspX = matrix.getPerspX(); | |
| 780 if (perspX != defaultMatrix.getPerspX()) | |
| 781 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 782 "{kPerspX, %g}, ", perspX); | |
| 783 SkScalar perspY = matrix.getPerspY(); | |
| 784 if (perspY != defaultMatrix.getPerspY()) | |
| 785 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 786 "{kPerspY, %g}, ", perspY); | |
| 787 SkDebugf("%s{0}};\n", pBuffer); | |
| 788 } | |
| 789 | |
| 790 void dumpPaint(const SkPaint& paint) const { | |
| 791 SkPaint defaultPaint; | |
| 792 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 793 char* bufferPtr = pBuffer; | |
| 794 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 795 "PaintPointers paintPtrs%p = {", &paint); | |
| 796 const SkTypeface* typeface = paint.getTypeface(); | |
| 797 if (typeface != defaultPaint.getTypeface()) | |
| 798 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 799 "{kTypeface, %p}, ", typeface); | |
| 800 const SkPathEffect* pathEffect = paint.getPathEffect(); | |
| 801 if (pathEffect != defaultPaint.getPathEffect()) | |
| 802 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 803 "{kPathEffect, %p}, ", pathEffect); | |
| 804 const SkShader* shader = paint.getShader(); | |
| 805 if (shader != defaultPaint.getShader()) | |
| 806 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 807 "{kShader, %p}, ", shader); | |
| 808 const SkXfermode* xfermode = paint.getXfermode(); | |
| 809 if (xfermode != defaultPaint.getXfermode()) | |
| 810 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 811 "{kXfermode, %p}, ", xfermode); | |
| 812 const SkMaskFilter* maskFilter = paint.getMaskFilter(); | |
| 813 if (maskFilter != defaultPaint.getMaskFilter()) | |
| 814 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 815 "{kMaskFilter, %p}, ", maskFilter); | |
| 816 const SkColorFilter* colorFilter = paint.getColorFilter(); | |
| 817 if (colorFilter != defaultPaint.getColorFilter()) | |
| 818 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 819 "{kColorFilter, %p}, ", colorFilter); | |
| 820 const SkRasterizer* rasterizer = paint.getRasterizer(); | |
| 821 if (rasterizer != defaultPaint.getRasterizer()) | |
| 822 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 823 "{kRasterizer, %p}, ", rasterizer); | |
| 824 const SkDrawLooper* drawLooper = paint.getLooper(); | |
| 825 if (drawLooper != defaultPaint.getLooper()) | |
| 826 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 827 "{kDrawLooper, %p}, ", drawLooper); | |
| 828 SkDebugf("%s{0}};\n", pBuffer); | |
| 829 bufferPtr = pBuffer; | |
| 830 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 831 "PaintScalars paintScalars%p = {", &paint); | |
| 832 SkScalar textSize = paint.getTextSize(); | |
| 833 if (textSize != defaultPaint.getTextSize()) | |
| 834 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 835 "{kTextSize, %g}, ", SkScalarToFloat(textSize)); | |
| 836 SkScalar textScaleX = paint.getTextScaleX(); | |
| 837 if (textScaleX != defaultPaint.getTextScaleX()) | |
| 838 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 839 "{kTextScaleX, %g}, ", SkScalarToFloat(textScaleX)); | |
| 840 SkScalar textSkewX = paint.getTextSkewX(); | |
| 841 if (textSkewX != defaultPaint.getTextSkewX()) | |
| 842 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 843 "{kTextSkewX, %g}, ", SkScalarToFloat(textSkewX)); | |
| 844 SkScalar strokeWidth = paint.getStrokeWidth(); | |
| 845 if (strokeWidth != defaultPaint.getStrokeWidth()) | |
| 846 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 847 "{kStrokeWidth, %g}, ", SkScalarToFloat(strokeWidth)); | |
| 848 SkScalar strokeMiter = paint.getStrokeMiter(); | |
| 849 if (strokeMiter != defaultPaint.getStrokeMiter()) | |
| 850 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 851 "{kStrokeMiter, %g}, ", SkScalarToFloat(strokeMiter)); | |
| 852 SkDebugf("%s{0}};\n", pBuffer); | |
| 853 bufferPtr = pBuffer; | |
| 854 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer), | |
| 855 "PaintInts = paintInts%p = {", &paint); | |
| 856 unsigned color = paint.getColor(); | |
| 857 if (color != defaultPaint.getColor()) | |
| 858 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 859 "{kColor, 0x%x}, ", color); | |
| 860 unsigned flags = paint.getFlags(); | |
| 861 if (flags != defaultPaint.getFlags()) | |
| 862 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 863 "{kFlags, 0x%x}, ", flags); | |
| 864 int align = paint.getTextAlign(); | |
| 865 if (align != defaultPaint.getTextAlign()) | |
| 866 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 867 "{kAlign, 0x%x}, ", align); | |
| 868 int strokeCap = paint.getStrokeCap(); | |
| 869 if (strokeCap != defaultPaint.getStrokeCap()) | |
| 870 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 871 "{kStrokeCap, 0x%x}, ", strokeCap); | |
| 872 int strokeJoin = paint.getStrokeJoin(); | |
| 873 if (strokeJoin != defaultPaint.getStrokeJoin()) | |
| 874 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 875 "{kAlign, 0x%x}, ", strokeJoin); | |
| 876 int style = paint.getStyle(); | |
| 877 if (style != defaultPaint.getStyle()) | |
| 878 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 879 "{kStyle, 0x%x}, ", style); | |
| 880 int textEncoding = paint.getTextEncoding(); | |
| 881 if (textEncoding != defaultPaint.getTextEncoding()) | |
| 882 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 883 "{kTextEncoding, 0x%x}, ", textEncoding); | |
| 884 SkDebugf("%s{0}};\n", pBuffer); | |
| 885 | |
| 886 SkDebugf("PaintData paint%p = {paintPtrs%p, paintScalars%p, paintInts%p};\n"
, | |
| 887 &paint, &paint, &paint, &paint); | |
| 888 } | |
| 889 | |
| 890 void SkPictureData::dumpPath(const SkPath& path) const { | |
| 891 SkDebugf("path dump unimplemented\n"); | |
| 892 } | |
| 893 | |
| 894 void SkPictureData::dumpPicture(const SkPicture& picture) const { | |
| 895 SkDebugf("picture dump unimplemented\n"); | |
| 896 } | |
| 897 | |
| 898 void SkPictureData::dumpRegion(const SkRegion& region) const { | |
| 899 SkDebugf("region dump unimplemented\n"); | |
| 900 } | |
| 901 | |
| 902 int SkPictureData::dumpDrawType(char* bufferPtr, char* buffer, DrawType drawType
) { | |
| 903 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 904 "k%s, ", DrawTypeToString(drawType)); | |
| 905 } | |
| 906 | |
| 907 int SkPictureData::dumpInt(char* bufferPtr, char* buffer, char* name) { | |
| 908 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 909 "%s:%d, ", name, getInt()); | |
| 910 } | |
| 911 | |
| 912 int SkPictureData::dumpRect(char* bufferPtr, char* buffer, char* name) { | |
| 913 const SkRect* rect = fReader.skipRect(); | |
| 914 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 915 "%s:{l:%g t:%g r:%g b:%g}, ", name, SkScalarToFloat(rect.fLeft), | |
| 916 SkScalarToFloat(rect.fTop), | |
| 917 SkScalarToFloat(rect.fRight), SkScalarToFloat(rect.fBottom)); | |
| 918 } | |
| 919 | |
| 920 int SkPictureData::dumpPoint(char* bufferPtr, char* buffer, char* name) { | |
| 921 SkPoint pt; | |
| 922 getPoint(&pt); | |
| 923 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 924 "%s:{x:%g y:%g}, ", name, SkScalarToFloat(pt.fX), | |
| 925 SkScalarToFloat(pt.fY)); | |
| 926 } | |
| 927 | |
| 928 void SkPictureData::dumpPointArray(char** bufferPtrPtr, char* buffer, int count)
{ | |
| 929 char* bufferPtr = *bufferPtrPtr; | |
| 930 const SkPoint* pts = (const SkPoint*)fReadStream.getAtPos(); | |
| 931 fReadStream.skip(sizeof(SkPoint) * count); | |
| 932 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 933 "count:%d {", count); | |
| 934 for (int index = 0; index < count; index++) | |
| 935 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer)
, | |
| 936 "{x:%g y:%g}, ", SkScalarToFloat(pts[index].fX), | |
| 937 SkScalarToFloat(pts[index].fY)); | |
| 938 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 939 "} "); | |
| 940 *bufferPtrPtr = bufferPtr; | |
| 941 } | |
| 942 | |
| 943 int SkPictureData::dumpPtr(char* bufferPtr, char* buffer, char* name, void* ptr)
{ | |
| 944 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 945 "%s:%p, ", name, ptr); | |
| 946 } | |
| 947 | |
| 948 int SkPictureData::dumpRectPtr(char* bufferPtr, char* buffer, char* name) { | |
| 949 char result; | |
| 950 fReadStream.read(&result, sizeof(result)); | |
| 951 if (result) | |
| 952 return dumpRect(bufferPtr, buffer, name); | |
| 953 else | |
| 954 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 955 "%s:NULL, ", name); | |
| 956 } | |
| 957 | |
| 958 int SkPictureData::dumpScalar(char* bufferPtr, char* buffer, char* name) { | |
| 959 return snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - buffer), | |
| 960 "%s:%d, ", name, getScalar()); | |
| 961 } | |
| 962 | |
| 963 void SkPictureData::dumpText(char** bufferPtrPtr, char* buffer) { | |
| 964 char* bufferPtr = *bufferPtrPtr; | |
| 965 int length = getInt(); | |
| 966 bufferPtr += dumpDrawType(bufferPtr, buffer); | |
| 967 fReadStream.skipToAlign4(); | |
| 968 char* text = (char*) fReadStream.getAtPos(); | |
| 969 fReadStream.skip(length); | |
| 970 bufferPtr += dumpInt(bufferPtr, buffer, "length"); | |
| 971 int limit = DUMP_BUFFER_SIZE - (bufferPtr - buffer) - 2; | |
| 972 length >>= 1; | |
| 973 if (limit > length) | |
| 974 limit = length; | |
| 975 if (limit > 0) { | |
| 976 *bufferPtr++ = '"'; | |
| 977 for (int index = 0; index < limit; index++) { | |
| 978 *bufferPtr++ = *(unsigned short*) text; | |
| 979 text += sizeof(unsigned short); | |
| 980 } | |
| 981 *bufferPtr++ = '"'; | |
| 982 } | |
| 983 *bufferPtrPtr = bufferPtr; | |
| 984 } | |
| 985 | |
| 986 #define DUMP_DRAWTYPE(drawType) \ | |
| 987 bufferPtr += dumpDrawType(bufferPtr, buffer, drawType) | |
| 988 | |
| 989 #define DUMP_INT(name) \ | |
| 990 bufferPtr += dumpInt(bufferPtr, buffer, #name) | |
| 991 | |
| 992 #define DUMP_RECT_PTR(name) \ | |
| 993 bufferPtr += dumpRectPtr(bufferPtr, buffer, #name) | |
| 994 | |
| 995 #define DUMP_POINT(name) \ | |
| 996 bufferPtr += dumpRect(bufferPtr, buffer, #name) | |
| 997 | |
| 998 #define DUMP_RECT(name) \ | |
| 999 bufferPtr += dumpRect(bufferPtr, buffer, #name) | |
| 1000 | |
| 1001 #define DUMP_POINT_ARRAY(count) \ | |
| 1002 dumpPointArray(&bufferPtr, buffer, count) | |
| 1003 | |
| 1004 #define DUMP_PTR(name, ptr) \ | |
| 1005 bufferPtr += dumpPtr(bufferPtr, buffer, #name, (void*) ptr) | |
| 1006 | |
| 1007 #define DUMP_SCALAR(name) \ | |
| 1008 bufferPtr += dumpScalar(bufferPtr, buffer, #name) | |
| 1009 | |
| 1010 #define DUMP_TEXT() \ | |
| 1011 dumpText(&bufferPtr, buffer) | |
| 1012 | |
| 1013 void SkPictureData::dumpStream() { | |
| 1014 SkDebugf("RecordStream stream = {\n"); | |
| 1015 DrawType drawType; | |
| 1016 fReadStream.rewind(); | |
| 1017 char buffer[DUMP_BUFFER_SIZE], * bufferPtr; | |
| 1018 while (fReadStream.read(&drawType, sizeof(drawType))) { | |
| 1019 bufferPtr = buffer; | |
| 1020 DUMP_DRAWTYPE(drawType); | |
| 1021 switch (drawType) { | |
| 1022 case CLIP_PATH: { | |
| 1023 DUMP_PTR(SkPath, &getPath()); | |
| 1024 DUMP_INT(SkRegion::Op); | |
| 1025 DUMP_INT(offsetToRestore); | |
| 1026 } break; | |
| 1027 case CLIP_REGION: { | |
| 1028 DUMP_INT(SkRegion::Op); | |
| 1029 DUMP_INT(offsetToRestore); | |
| 1030 } break; | |
| 1031 case CLIP_RECT: { | |
| 1032 DUMP_RECT(rect); | |
| 1033 DUMP_INT(SkRegion::Op); | |
| 1034 DUMP_INT(offsetToRestore); | |
| 1035 } break; | |
| 1036 case CONCAT: | |
| 1037 break; | |
| 1038 case DRAW_BITMAP: { | |
| 1039 DUMP_PTR(SkPaint, getPaint()); | |
| 1040 DUMP_PTR(SkBitmap, &getBitmap()); | |
| 1041 DUMP_SCALAR(left); | |
| 1042 DUMP_SCALAR(top); | |
| 1043 } break; | |
| 1044 case DRAW_PAINT: | |
| 1045 DUMP_PTR(SkPaint, getPaint()); | |
| 1046 break; | |
| 1047 case DRAW_PATH: { | |
| 1048 DUMP_PTR(SkPaint, getPaint()); | |
| 1049 DUMP_PTR(SkPath, &getPath()); | |
| 1050 } break; | |
| 1051 case DRAW_PICTURE: { | |
| 1052 DUMP_PTR(SkPicture, &getPicture()); | |
| 1053 } break; | |
| 1054 case DRAW_POINTS: { | |
| 1055 DUMP_PTR(SkPaint, getPaint()); | |
| 1056 (void)getInt(); // PointMode | |
| 1057 size_t count = getInt(); | |
| 1058 fReadStream.skipToAlign4(); | |
| 1059 DUMP_POINT_ARRAY(count); | |
| 1060 } break; | |
| 1061 case DRAW_POS_TEXT: { | |
| 1062 DUMP_PTR(SkPaint, getPaint()); | |
| 1063 DUMP_TEXT(); | |
| 1064 size_t points = getInt(); | |
| 1065 fReadStream.skipToAlign4(); | |
| 1066 DUMP_POINT_ARRAY(points); | |
| 1067 } break; | |
| 1068 case DRAW_POS_TEXT_H: { | |
| 1069 DUMP_PTR(SkPaint, getPaint()); | |
| 1070 DUMP_TEXT(); | |
| 1071 size_t points = getInt(); | |
| 1072 fReadStream.skipToAlign4(); | |
| 1073 DUMP_SCALAR(top); | |
| 1074 DUMP_SCALAR(bottom); | |
| 1075 DUMP_SCALAR(constY); | |
| 1076 DUMP_POINT_ARRAY(points); | |
| 1077 } break; | |
| 1078 case DRAW_RECT: { | |
| 1079 DUMP_PTR(SkPaint, getPaint()); | |
| 1080 DUMP_RECT(rect); | |
| 1081 } break; | |
| 1082 case DRAW_SPRITE: { | |
| 1083 DUMP_PTR(SkPaint, getPaint()); | |
| 1084 DUMP_PTR(SkBitmap, &getBitmap()); | |
| 1085 DUMP_SCALAR(left); | |
| 1086 DUMP_SCALAR(top); | |
| 1087 } break; | |
| 1088 case DRAW_TEXT: { | |
| 1089 DUMP_PTR(SkPaint, getPaint()); | |
| 1090 DUMP_TEXT(); | |
| 1091 DUMP_SCALAR(x); | |
| 1092 DUMP_SCALAR(y); | |
| 1093 } break; | |
| 1094 case DRAW_TEXT_ON_PATH: { | |
| 1095 DUMP_PTR(SkPaint, getPaint()); | |
| 1096 DUMP_TEXT(); | |
| 1097 DUMP_PTR(SkPath, &getPath()); | |
| 1098 } break; | |
| 1099 case RESTORE: | |
| 1100 break; | |
| 1101 case ROTATE: | |
| 1102 DUMP_SCALAR(rotate); | |
| 1103 break; | |
| 1104 case SAVE: | |
| 1105 DUMP_INT(SkCanvas::SaveFlags); | |
| 1106 break; | |
| 1107 case SAVE_LAYER: { | |
| 1108 DUMP_RECT_PTR(layer); | |
| 1109 DUMP_PTR(SkPaint, getPaint()); | |
| 1110 DUMP_INT(SkCanvas::SaveFlags); | |
| 1111 } break; | |
| 1112 case SCALE: { | |
| 1113 DUMP_SCALAR(sx); | |
| 1114 DUMP_SCALAR(sy); | |
| 1115 } break; | |
| 1116 case SKEW: { | |
| 1117 DUMP_SCALAR(sx); | |
| 1118 DUMP_SCALAR(sy); | |
| 1119 } break; | |
| 1120 case TRANSLATE: { | |
| 1121 DUMP_SCALAR(dx); | |
| 1122 DUMP_SCALAR(dy); | |
| 1123 } break; | |
| 1124 default: | |
| 1125 SkASSERT(0); | |
| 1126 } | |
| 1127 SkDebugf("%s\n", buffer); | |
| 1128 } | |
| 1129 } | |
| 1130 | |
| 1131 void SkPictureData::dump() const { | |
| 1132 char pBuffer[DUMP_BUFFER_SIZE]; | |
| 1133 char* bufferPtr = pBuffer; | |
| 1134 int index; | |
| 1135 if (fBitmapCount > 0) | |
| 1136 SkDebugf("// bitmaps (%d)\n", fBitmapCount); | |
| 1137 for (index = 0; index < fBitmapCount; index++) { | |
| 1138 const SkBitmap& bitmap = fBitmaps[index]; | |
| 1139 dumpBitmap(bitmap); | |
| 1140 } | |
| 1141 if (fBitmapCount > 0) | |
| 1142 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1143 "Bitmaps bitmaps = {"); | |
| 1144 for (index = 0; index < fBitmapCount; index++) | |
| 1145 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1146 "bitmap%p, ", &fBitmaps[index]); | |
| 1147 if (fBitmapCount > 0) | |
| 1148 SkDebugf("%s0};\n", pBuffer); | |
| 1149 | |
| 1150 | |
| 1151 if (fPaintCount > 0) | |
| 1152 SkDebugf("// paints (%d)\n", fPaintCount); | |
| 1153 for (index = 0; index < fPaintCount; index++) { | |
| 1154 const SkPaint& paint = fPaints[index]; | |
| 1155 dumpPaint(paint); | |
| 1156 } | |
| 1157 bufferPtr = pBuffer; | |
| 1158 if (fPaintCount > 0) | |
| 1159 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1160 "Paints paints = {"); | |
| 1161 for (index = 0; index < fPaintCount; index++) | |
| 1162 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1163 "paint%p, ", &fPaints[index]); | |
| 1164 if (fPaintCount > 0) | |
| 1165 SkDebugf("%s0};\n", pBuffer); | |
| 1166 | |
| 1167 for (index = 0; index < fPathCount; index++) { | |
| 1168 const SkPath& path = fPaths[index]; | |
| 1169 dumpPath(path); | |
| 1170 } | |
| 1171 bufferPtr = pBuffer; | |
| 1172 if (fPathCount > 0) | |
| 1173 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1174 "Paths paths = {"); | |
| 1175 for (index = 0; index < fPathCount; index++) | |
| 1176 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1177 "path%p, ", &fPaths[index]); | |
| 1178 if (fPathCount > 0) | |
| 1179 SkDebugf("%s0};\n", pBuffer); | |
| 1180 | |
| 1181 for (index = 0; index < fPictureCount; index++) { | |
| 1182 dumpPicture(*fPictureRefs[index]); | |
| 1183 } | |
| 1184 bufferPtr = pBuffer; | |
| 1185 if (fPictureCount > 0) | |
| 1186 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1187 "Pictures pictures = {"); | |
| 1188 for (index = 0; index < fPictureCount; index++) | |
| 1189 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer
), | |
| 1190 "picture%p, ", fPictureRefs[index]); | |
| 1191 if (fPictureCount > 0) | |
| 1192 SkDebugf("%s0};\n", pBuffer); | |
| 1193 | |
| 1194 const_cast<SkPictureData*>(this)->dumpStream(); | |
| 1195 } | |
| 1196 | |
| 1197 #endif | |
| OLD | NEW |