SkPictureData::SkPictureData(const SkPictureRecord& record, const SkPictInfo& info, bool deepCopyOps) : fInfo(info) { this->init(); fOpData = record.opData(deepCopyOps); fContentInfo.set(record.fContentInfo); fBitmaps = record.fBitmaps; fPaints = record.fPaints; fPaths = record.fPaths; this->initForPlayback(); const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); fPictureCount = pictures.count(); if (fPictureCount > 0) { fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); for (int i = 0; i < fPictureCount; i++) { fPictureRefs[i] = pictures[i]; fPictureRefs[i]->ref(); } }
SkPictureData::SkPictureData(const SkPictureRecord& record, const SkPictInfo& info, bool deepCopyOps) : fInfo(info) { this->init(); fOpData = record.opData(deepCopyOps); fContentInfo.set(record.fContentInfo); fBitmaps = record.fBitmaps; fPaints = record.fPaints; fPaths.reset(record.fPaths.count()); record.fPaths.foreach([this](const SkPath& path, int n) { // These indices are logically 1-based, but we need to serialize them // 0-based to keep the deserializing SkPictureData::getPath() working. fPaths[n-1] = path; }); this->initForPlayback(); const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); fPictureCount = pictures.count(); if (fPictureCount > 0) { fPictureRefs = new const SkPicture* [fPictureCount]; for (int i = 0; i < fPictureCount; i++) { fPictureRefs[i] = pictures[i]; fPictureRefs[i]->ref(); } } // templatize to consolidate with similar picture logic? const SkTDArray<const SkTextBlob*>& blobs = record.getTextBlobRefs(); fTextBlobCount = blobs.count(); if (fTextBlobCount > 0) { fTextBlobRefs = new const SkTextBlob* [fTextBlobCount]; for (int i = 0; i < fTextBlobCount; ++i) { fTextBlobRefs[i] = SkRef(blobs[i]); } } const SkTDArray<const SkImage*>& imgs = record.getImageRefs(); fImageCount = imgs.count(); if (fImageCount > 0) { fImageRefs = new const SkImage* [fImageCount]; for (int i = 0; i < fImageCount; ++i) { fImageRefs[i] = SkRef(imgs[i]); } } }
SkPictureData::SkPictureData(const SkPictureRecord& record, const SkPictInfo& info, bool deepCopyOps) : fInfo(info) { this->init(); fOpData = record.opData(deepCopyOps); fContentInfo.set(record.fContentInfo); fBitmaps = record.fBitmaps; fPaints = record.fPaints; fPaths = record.fPaths; this->initForPlayback(); const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); fPictureCount = pictures.count(); if (fPictureCount > 0) { fPictureRefs = new const SkPicture* [fPictureCount]; for (int i = 0; i < fPictureCount; i++) { fPictureRefs[i] = pictures[i]; fPictureRefs[i]->ref(); } } // templatize to consolidate with similar picture logic? const SkTDArray<const SkTextBlob*>& blobs = record.getTextBlobRefs(); fTextBlobCount = blobs.count(); if (fTextBlobCount > 0) { fTextBlobRefs = new const SkTextBlob* [fTextBlobCount]; for (int i = 0; i < fTextBlobCount; ++i) { fTextBlobRefs[i] = SkRef(blobs[i]); } } const SkTDArray<const SkImage*>& imgs = record.getImageRefs(); fImageCount = imgs.count(); if (fImageCount > 0) { fImageRefs = new const SkImage* [fImageCount]; for (int i = 0; i < fImageCount; ++i) { fImageRefs[i] = SkRef(imgs[i]); } } }
SkPictureData::SkPictureData(const SkPictureRecord& record, const SkPictInfo& info, bool deepCopyOps) : fInfo(info) { this->init(); fOpData = record.opData(deepCopyOps); fBoundingHierarchy = record.fBoundingHierarchy; fStateTree = record.fStateTree; SkSafeRef(fBoundingHierarchy); SkSafeRef(fStateTree); fContentInfo.set(record.fContentInfo); if (NULL != fBoundingHierarchy) { fBoundingHierarchy->flushDeferredInserts(); } // copy over the refcnt dictionary to our reader record.fFlattenableHeap.setupPlaybacks(); fBitmaps = record.fBitmapHeap->extractBitmaps(); fPaints = record.fPaints.unflattenToArray(); fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); fPathHeap.reset(SkSafeRef(record.pathHeap())); this->initForPlayback(); const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); fPictureCount = pictures.count(); if (fPictureCount > 0) { fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); for (int i = 0; i < fPictureCount; i++) { fPictureRefs[i] = pictures[i]; fPictureRefs[i]->ref(); } }
SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record, bool deepCopy) { #ifdef SK_DEBUG_SIZE size_t overallBytes, bitmapBytes, matricesBytes, paintBytes, pathBytes, pictureBytes, regionBytes; int bitmaps = record.bitmaps(&bitmapBytes); int matrices = record.matrices(&matricesBytes); int paints = record.paints(&paintBytes); int paths = record.paths(&pathBytes); int pictures = record.pictures(&pictureBytes); int regions = record.regions(®ionBytes); SkDebugf("picture record mem used %zd (stream %zd) ", record.size(), record.streamlen()); if (bitmaps != 0) SkDebugf("bitmaps size %zd (bitmaps:%d) ", bitmapBytes, bitmaps); if (matrices != 0) SkDebugf("matrices size %zd (matrices:%d) ", matricesBytes, matrices); if (paints != 0) SkDebugf("paints size %zd (paints:%d) ", paintBytes, paints); if (paths != 0) SkDebugf("paths size %zd (paths:%d) ", pathBytes, paths); if (pictures != 0) SkDebugf("pictures size %zd (pictures:%d) ", pictureBytes, pictures); if (regions != 0) SkDebugf("regions size %zd (regions:%d) ", regionBytes, regions); if (record.fPointWrites != 0) SkDebugf("points size %zd (points:%d) ", record.fPointBytes, record.fPointWrites); if (record.fRectWrites != 0) SkDebugf("rects size %zd (rects:%d) ", record.fRectBytes, record.fRectWrites); if (record.fTextWrites != 0) SkDebugf("text size %zd (text strings:%d) ", record.fTextBytes, record.fTextWrites); SkDebugf("\n"); #endif #ifdef SK_DEBUG_DUMP record.dumpMatrices(); record.dumpPaints(); #endif record.validate(); const SkWriter32& writer = record.writeStream(); init(); if (writer.size() == 0) return; fBoundingHierarchy = record.fBoundingHierarchy; fStateTree = record.fStateTree; SkSafeRef(fBoundingHierarchy); SkSafeRef(fStateTree); if (NULL != fBoundingHierarchy) { fBoundingHierarchy->flushDeferredInserts(); } { size_t size = writer.size(); void* buffer = sk_malloc_throw(size); writer.flatten(buffer); SkASSERT(!fOpData); fOpData = SkData::NewFromMalloc(buffer, size); } // copy over the refcnt dictionary to our reader record.fFlattenableHeap.setupPlaybacks(); fBitmaps = record.fBitmapHeap->extractBitmaps(); fMatrices = record.fMatrices.unflattenToArray(); fPaints = record.fPaints.unflattenToArray(); fRegions = record.fRegions.unflattenToArray(); fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); fPathHeap.reset(SkSafeRef(record.fPathHeap)); // ensure that the paths bounds are pre-computed if (fPathHeap.get()) { for (int i = 0; i < fPathHeap->count(); i++) { (*fPathHeap)[i].updateBoundsCache(); } } const SkTDArray<SkPicture* >& pictures = record.getPictureRefs(); fPictureCount = pictures.count(); if (fPictureCount > 0) { fPictureRefs = SkNEW_ARRAY(SkPicture*, fPictureCount); for (int i = 0; i < fPictureCount; i++) { if (deepCopy) { fPictureRefs[i] = pictures[i]->clone(); } else { fPictureRefs[i] = pictures[i]; fPictureRefs[i]->ref(); } } }