Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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, ©Info))); | 259 clone->fData.reset(SkNEW_ARGS(SkPictureData, (*fData, ©Info))); |
| 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>(©I 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, ©Info))); | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |