Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: src/core/SkPicturePlayback.cpp

Issue 316063005: Fix error revealed by Android unit test (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "SkPicturePlayback.h" 9 #include "SkPicturePlayback.h"
10 #include "SkPictureRecord.h" 10 #include "SkPictureRecord.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPictInfo& info) 53 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPictInfo& info)
54 : fPicture(picture) 54 : fPicture(picture)
55 , fInfo(info) { 55 , fInfo(info) {
56 this->init(); 56 this->init();
57 } 57 }
58 58
59 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, 59 SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
60 const SkPictureRecord& record, 60 const SkPictureRecord& record,
61 const SkPictInfo& info, 61 const SkPictInfo& info,
62 bool deepCopy) 62 bool deepCopyOps)
63 : fPicture(picture) 63 : fPicture(picture)
64 , fInfo(info) { 64 , fInfo(info) {
65 #ifdef SK_DEBUG_SIZE 65 #ifdef SK_DEBUG_SIZE
66 size_t overallBytes, bitmapBytes, matricesBytes, 66 size_t overallBytes, bitmapBytes, matricesBytes,
67 paintBytes, pathBytes, pictureBytes, regionBytes; 67 paintBytes, pathBytes, pictureBytes, regionBytes;
68 int bitmaps = record.bitmaps(&bitmapBytes); 68 int bitmaps = record.bitmaps(&bitmapBytes);
69 int matrices = record.matrices(&matricesBytes); 69 int matrices = record.matrices(&matricesBytes);
70 int paints = record.paints(&paintBytes); 70 int paints = record.paints(&paintBytes);
71 int paths = record.paths(&pathBytes); 71 int paths = record.paths(&pathBytes);
72 int pictures = record.pictures(&pictureBytes); 72 int pictures = record.pictures(&pictureBytes);
(...skipping 27 matching lines...) Expand all
100 #endif 100 #endif
101 101
102 record.validate(record.writeStream().bytesWritten(), 0); 102 record.validate(record.writeStream().bytesWritten(), 0);
103 const SkWriter32& writer = record.writeStream(); 103 const SkWriter32& writer = record.writeStream();
104 this->init(); 104 this->init();
105 SkASSERT(!fOpData); 105 SkASSERT(!fOpData);
106 if (writer.bytesWritten() == 0) { 106 if (writer.bytesWritten() == 0) {
107 fOpData = SkData::NewEmpty(); 107 fOpData = SkData::NewEmpty();
108 return; 108 return;
109 } 109 }
110 fOpData = writer.snapshotAsData(); 110 if (deepCopyOps) {
111 // Don't try to do anything clever w.r.t. copy on write
112 fOpData = SkData::NewWithCopy(writer.contiguousArray(), writer.bytesWrit ten());
reed1 2014/06/10 12:29:03 I presume this continuousArray() call can mutate t
robertphillips 2014/06/10 17:26:28 Right now SkWriter32 does store its data contiguou
113 } else {
114 fOpData = writer.snapshotAsData();
115 }
111 116
112 fBoundingHierarchy = record.fBoundingHierarchy; 117 fBoundingHierarchy = record.fBoundingHierarchy;
113 fStateTree = record.fStateTree; 118 fStateTree = record.fStateTree;
114 119
115 SkSafeRef(fBoundingHierarchy); 120 SkSafeRef(fBoundingHierarchy);
116 SkSafeRef(fStateTree); 121 SkSafeRef(fStateTree);
117 122
118 if (NULL != fBoundingHierarchy) { 123 if (NULL != fBoundingHierarchy) {
119 fBoundingHierarchy->flushDeferredInserts(); 124 fBoundingHierarchy->flushDeferredInserts();
120 } 125 }
121 126
122 // copy over the refcnt dictionary to our reader 127 // copy over the refcnt dictionary to our reader
123 record.fFlattenableHeap.setupPlaybacks(); 128 record.fFlattenableHeap.setupPlaybacks();
124 129
125 fBitmaps = record.fBitmapHeap->extractBitmaps(); 130 fBitmaps = record.fBitmapHeap->extractBitmaps();
126 fPaints = record.fPaints.unflattenToArray(); 131 fPaints = record.fPaints.unflattenToArray();
127 132
128 fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); 133 fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap));
129 134
130 picture->initForPlayback(); 135 picture->initForPlayback();
131 136
132 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); 137 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs();
133 fPictureCount = pictures.count(); 138 fPictureCount = pictures.count();
134 if (fPictureCount > 0) { 139 if (fPictureCount > 0) {
135 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); 140 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount);
136 for (int i = 0; i < fPictureCount; i++) { 141 for (int i = 0; i < fPictureCount; i++) {
137 if (deepCopy) { 142 fPictureRefs[i] = pictures[i];
138 fPictureRefs[i] = pictures[i]->clone(); 143 fPictureRefs[i]->ref();
scroggo 2014/06/10 13:31:25 Why this change? deepCopy is used when we are clon
robertphillips 2014/06/10 17:26:28 TL;DR - this change has been split off into: (Remo
139 } else {
140 fPictureRefs[i] = pictures[i];
141 fPictureRefs[i]->ref();
142 }
143 } 144 }
144 } 145 }
145 146
146 #ifdef SK_DEBUG_SIZE 147 #ifdef SK_DEBUG_SIZE
147 int overall = fPlayback->size(&overallBytes); 148 int overall = fPlayback->size(&overallBytes);
148 bitmaps = fPlayback->bitmaps(&bitmapBytes); 149 bitmaps = fPlayback->bitmaps(&bitmapBytes);
149 paints = fPlayback->paints(&paintBytes); 150 paints = fPlayback->paints(&paintBytes);
150 paths = fPlayback->paths(&pathBytes); 151 paths = fPlayback->paths(&pathBytes);
151 pictures = fPlayback->pictures(&pictureBytes); 152 pictures = fPlayback->pictures(&pictureBytes);
152 regions = fPlayback->regions(&regionBytes); 153 regions = fPlayback->regions(&regionBytes);
(...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 for (index = 0; index < fPictureCount; index++) 1839 for (index = 0; index < fPictureCount; index++)
1839 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ), 1840 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ),
1840 "picture%p, ", fPictureRefs[index]); 1841 "picture%p, ", fPictureRefs[index]);
1841 if (fPictureCount > 0) 1842 if (fPictureCount > 0)
1842 SkDebugf("%s0};\n", pBuffer); 1843 SkDebugf("%s0};\n", pBuffer);
1843 1844
1844 const_cast<SkPicturePlayback*>(this)->dumpStream(); 1845 const_cast<SkPicturePlayback*>(this)->dumpStream();
1845 } 1846 }
1846 1847
1847 #endif 1848 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698