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

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

Issue 381193002: Add alternate SkPicture::clone (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 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
« include/core/SkPicture.h ('K') | « include/core/SkPicture.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2007 The Android Open Source Project 3 * Copyright 2007 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkPictureFlat.h" 10 #include "SkPictureFlat.h"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 fUniqueID = src.uniqueID(); // need to call method to ensure != 0 184 fUniqueID = src.uniqueID(); // need to call method to ensure != 0
185 } 185 }
186 } 186 }
187 187
188 // fRecord OK 188 // fRecord OK
189 SkPicture::~SkPicture() {} 189 SkPicture::~SkPicture() {}
190 190
191 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE 191 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE
192 // fRecord TODO, fix by deleting this method 192 // fRecord TODO, fix by deleting this method
193 SkPicture* SkPicture::clone() const { 193 SkPicture* SkPicture::clone() const {
194 SkPicture* clonedPicture = SkNEW(SkPicture); 194 SkPicture* clonedPicture;
195 this->clone(clonedPicture, 1); 195 this->clone(&clonedPicture, 1);
196 return clonedPicture; 196 return clonedPicture;
197 } 197 }
198 198
199 // fRecord TODO, fix by deleting this method 199 // fRecord TODO, fix by deleting this method
200 void SkPicture::clone(SkPicture* pictures, int count) const { 200 void SkPicture::clone(SkPicture* pictures, int count) const {
201 SkPictCopyInfo copyInfo; 201 SkPictCopyInfo copyInfo;
202 202
203 for (int i = 0; i < count; i++) { 203 for (int i = 0; i < count; i++) {
204 SkPicture* clone = &pictures[i]; 204 SkPicture* clone = &pictures[i];
205 205
mtklein 2014/07/10 19:14:01 Can we share somehow the code below here? Looks i
206 clone->needsNewGenID(); 206 clone->needsNewGenID();
207 clone->fWidth = fWidth; 207 clone->fWidth = fWidth;
208 clone->fHeight = fHeight; 208 clone->fHeight = fHeight;
209 clone->fData.reset(NULL); 209 clone->fData.reset(NULL);
210 clone->fRecordWillPlayBackBitmaps = fRecordWillPlayBackBitmaps; 210 clone->fRecordWillPlayBackBitmaps = fRecordWillPlayBackBitmaps;
211 211
212 /* We want to copy the src's playback. However, if that hasn't been bui lt 212 /* We want to copy the src's playback. However, if that hasn't been bui lt
213 yet, we need to fake a call to endRecording() without actually calli ng 213 yet, we need to fake a call to endRecording() without actually calli ng
214 it (since it is destructive, and we don't want to change src). 214 it (since it is destructive, and we don't want to change src).
215 */ 215 */
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 // needed to create typeface playback 254 // needed to create typeface playback
255 copyInfo.controller.setupPlaybacks(); 255 copyInfo.controller.setupPlaybacks();
256 copyInfo.initialized = true; 256 copyInfo.initialized = true;
257 } 257 }
258 258
259 clone->fData.reset(SkNEW_ARGS(SkPictureData, (*fData, &copyInfo))); 259 clone->fData.reset(SkNEW_ARGS(SkPictureData, (*fData, &copyInfo)));
260 clone->fUniqueID = this->uniqueID(); // need to call method to ensur e != 0 260 clone->fUniqueID = this->uniqueID(); // need to call method to ensur e != 0
261 } 261 }
262 } 262 }
263 } 263 }
264
265 // fRecord TODO, fix by deleting this method
266 void SkPicture::clone(SkPicture* pictures[], int count) const {
mtklein 2014/07/10 19:14:01 Can this be, for now, void SkPicture::clone(SkPic
267 SkPictCopyInfo copyInfo;
268
269 for (int i = 0; i < count; i++) {
270 SkPicture* clone = pictures[i] = SkNEW(SkPicture);
271
272 clone->needsNewGenID();
273 clone->fWidth = fWidth;
274 clone->fHeight = fHeight;
275 clone->fData.reset(NULL);
276 clone->fRecordWillPlayBackBitmaps = fRecordWillPlayBackBitmaps;
277
278 /* We want to copy the src's playback. However, if that hasn't been bui lt
279 yet, we need to fake a call to endRecording() without actually calli ng
280 it (since it is destructive, and we don't want to change src).
281 */
282 if (fData.get()) {
283 if (!copyInfo.initialized) {
284 int paintCount = SafeCount(fData->fPaints);
285
286 /* The alternative to doing this is to have a clone method on th e paint and have it
287 * make the deep copy of its internal structures as needed. The holdup to doing
288 * that is at this point we would need to pass the SkBitmapHeap so that we don't
289 * unnecessarily flatten the pixels in a bitmap shader.
290 */
291 copyInfo.paintData.setCount(paintCount);
292
293 /* Use an SkBitmapHeap to avoid flattening bitmaps in shaders. I f there already is
294 * one, use it. If this SkPictureData was created from a stream, fBitmapHeap
295 * will be NULL, so create a new one.
296 */
297 if (fData->fBitmapHeap.get() == NULL) {
298 // FIXME: Put this on the stack inside SkPicture::clone.
299 SkBitmapHeap* heap = SkNEW(SkBitmapHeap);
300 copyInfo.controller.setBitmapStorage(heap);
301 heap->unref();
302 } else {
303 copyInfo.controller.setBitmapStorage(fData->fBitmapHeap);
304 }
305
306 SkDEBUGCODE(int heapSize = SafeCount(fData->fBitmapHeap.get());)
307 for (int i = 0; i < paintCount; i++) {
308 if (NeedsDeepCopy(fData->fPaints->at(i))) {
309 copyInfo.paintData[i] =
310 SkFlatData::Create<SkPaint::FlatteningTraits>(&copyI nfo.controller,
311 fData->fPaints->at (i), 0);
312
313 } else {
314 // this is our sentinel, which we use in the unflatten l oop
315 copyInfo.paintData[i] = NULL;
316 }
317 }
318 SkASSERT(SafeCount(fData->fBitmapHeap.get()) == heapSize);
319
320 // needed to create typeface playback
321 copyInfo.controller.setupPlaybacks();
322 copyInfo.initialized = true;
323 }
324
325 clone->fData.reset(SkNEW_ARGS(SkPictureData, (*fData, &copyInfo)));
326 clone->fUniqueID = this->uniqueID(); // need to call method to ensur e != 0
327 }
328 }
329 }
264 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE 330 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE
265 331
266 // fRecord OK 332 // fRecord OK
267 void SkPicture::EXPERIMENTAL_addAccelData(const SkPicture::AccelData* data) cons t { 333 void SkPicture::EXPERIMENTAL_addAccelData(const SkPicture::AccelData* data) cons t {
268 fAccelData.reset(SkRef(data)); 334 fAccelData.reset(SkRef(data));
269 } 335 }
270 336
271 // fRecord OK 337 // fRecord OK
272 const SkPicture::AccelData* SkPicture::EXPERIMENTAL_getAccelData( 338 const SkPicture::AccelData* SkPicture::EXPERIMENTAL_getAccelData(
273 SkPicture::AccelData::Key key) const { 339 SkPicture::AccelData::Key key) const {
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 } 609 }
544 610
545 // fRecord OK 611 // fRecord OK
546 SkPicture::SkPicture(int width, int height, SkRecord* record) 612 SkPicture::SkPicture(int width, int height, SkRecord* record)
547 : fWidth(width) 613 : fWidth(width)
548 , fHeight(height) 614 , fHeight(height)
549 , fRecord(record) 615 , fRecord(record)
550 , fRecordWillPlayBackBitmaps(SkRecordWillPlaybackBitmaps(*record)) { 616 , fRecordWillPlayBackBitmaps(SkRecordWillPlaybackBitmaps(*record)) {
551 this->needsNewGenID(); 617 this->needsNewGenID();
552 } 618 }
OLDNEW
« include/core/SkPicture.h ('K') | « include/core/SkPicture.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698