| 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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 /////////////////////////////////////////////////////////////////////////////// | 124 /////////////////////////////////////////////////////////////////////////////// |
| 125 | 125 |
| 126 SkPicture::SkPicture() | 126 SkPicture::SkPicture() |
| 127 : fAccelData(NULL) { | 127 : fAccelData(NULL) { |
| 128 this->needsNewGenID(); | 128 this->needsNewGenID(); |
| 129 fRecord = NULL; | 129 fRecord = NULL; |
| 130 fPlayback = NULL; | 130 fPlayback = NULL; |
| 131 fWidth = fHeight = 0; | 131 fWidth = fHeight = 0; |
| 132 } | 132 } |
| 133 | 133 |
| 134 // This method makes a SkPicturePlayback object from an in-progress recording. |
| 135 // Unfortunately, it does not include the restoreToCount of a real endRecording |
| 136 // call. |
| 137 SkPicturePlayback* SkPicture::FakeEndRecording(const SkPicture* resourceSrc, |
| 138 const SkPictureRecord& record, |
| 139 bool deepCopy) { |
| 140 SkPictInfo info; |
| 141 resourceSrc->createHeader(&info); |
| 142 return SkNEW_ARGS(SkPicturePlayback, (resourceSrc, record, info, deepCopy)); |
| 143 } |
| 144 |
| 134 SkPicture::SkPicture(const SkPicture& src) | 145 SkPicture::SkPicture(const SkPicture& src) |
| 135 : INHERITED() | 146 : INHERITED() |
| 136 , fAccelData(NULL) | 147 , fAccelData(NULL) |
| 137 , fContentInfo(src.fContentInfo) { | 148 , fContentInfo(src.fContentInfo) { |
| 138 this->needsNewGenID(); | 149 this->needsNewGenID(); |
| 139 fWidth = src.fWidth; | 150 fWidth = src.fWidth; |
| 140 fHeight = src.fHeight; | 151 fHeight = src.fHeight; |
| 141 fRecord = NULL; | 152 fRecord = NULL; |
| 142 | 153 |
| 143 /* We want to copy the src's playback. However, if that hasn't been built | 154 /* We want to copy the src's playback. However, if that hasn't been built |
| 144 yet, we need to fake a call to endRecording() without actually calling | 155 yet, we need to fake a call to endRecording() without actually calling |
| 145 it (since it is destructive, and we don't want to change src). | 156 it (since it is destructive, and we don't want to change src). |
| 146 */ | 157 */ |
| 147 if (src.fPlayback) { | 158 if (src.fPlayback) { |
| 148 fPlayback = SkNEW_ARGS(SkPicturePlayback, (this, *src.fPlayback)); | 159 fPlayback = SkNEW_ARGS(SkPicturePlayback, (this, *src.fPlayback)); |
| 149 SkASSERT(NULL == src.fRecord); | 160 SkASSERT(NULL == src.fRecord); |
| 150 fUniqueID = src.uniqueID(); // need to call method to ensure != 0 | 161 fUniqueID = src.uniqueID(); // need to call method to ensure != 0 |
| 151 } else if (src.fRecord) { | 162 } else if (src.fRecord) { |
| 152 SkPictInfo info; | 163 fPlayback = FakeEndRecording(this, *src.fRecord, false); |
| 153 this->createHeader(&info); | |
| 154 // here we do a fake src.endRecording() | |
| 155 fPlayback = SkNEW_ARGS(SkPicturePlayback, (this, *src.fRecord, info)); | |
| 156 } else { | 164 } else { |
| 157 fPlayback = NULL; | 165 fPlayback = NULL; |
| 158 } | 166 } |
| 159 | 167 |
| 160 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); | 168 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); |
| 161 } | 169 } |
| 162 | 170 |
| 163 const SkPath& SkPicture::getPath(int index) const { | 171 const SkPath& SkPicture::getPath(int index) const { |
| 164 return (*fPathHeap.get())[index]; | 172 return (*fPathHeap.get())[index]; |
| 165 } | 173 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 } | 221 } |
| 214 | 222 |
| 215 SkPicture* SkPicture::clone() const { | 223 SkPicture* SkPicture::clone() const { |
| 216 SkPicture* clonedPicture = SkNEW(SkPicture); | 224 SkPicture* clonedPicture = SkNEW(SkPicture); |
| 217 this->clone(clonedPicture, 1); | 225 this->clone(clonedPicture, 1); |
| 218 return clonedPicture; | 226 return clonedPicture; |
| 219 } | 227 } |
| 220 | 228 |
| 221 void SkPicture::clone(SkPicture* pictures, int count) const { | 229 void SkPicture::clone(SkPicture* pictures, int count) const { |
| 222 SkPictCopyInfo copyInfo; | 230 SkPictCopyInfo copyInfo; |
| 223 SkPictInfo info; | |
| 224 this->createHeader(&info); | |
| 225 | 231 |
| 226 for (int i = 0; i < count; i++) { | 232 for (int i = 0; i < count; i++) { |
| 227 SkPicture* clone = &pictures[i]; | 233 SkPicture* clone = &pictures[i]; |
| 228 | 234 |
| 229 clone->needsNewGenID(); | 235 clone->needsNewGenID(); |
| 230 clone->fWidth = fWidth; | 236 clone->fWidth = fWidth; |
| 231 clone->fHeight = fHeight; | 237 clone->fHeight = fHeight; |
| 232 SkSafeSetNull(clone->fRecord); | 238 SkSafeSetNull(clone->fRecord); |
| 233 SkDELETE(clone->fPlayback); | 239 SkDELETE(clone->fPlayback); |
| 234 clone->fContentInfo.set(fContentInfo); | 240 clone->fContentInfo.set(fContentInfo); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 283 |
| 278 // needed to create typeface playback | 284 // needed to create typeface playback |
| 279 copyInfo.controller.setupPlaybacks(); | 285 copyInfo.controller.setupPlaybacks(); |
| 280 copyInfo.initialized = true; | 286 copyInfo.initialized = true; |
| 281 } | 287 } |
| 282 | 288 |
| 283 clone->fPlayback = SkNEW_ARGS(SkPicturePlayback, (clone, *fPlayback,
©Info)); | 289 clone->fPlayback = SkNEW_ARGS(SkPicturePlayback, (clone, *fPlayback,
©Info)); |
| 284 SkASSERT(NULL == fRecord); | 290 SkASSERT(NULL == fRecord); |
| 285 clone->fUniqueID = this->uniqueID(); // need to call method to ensur
e != 0 | 291 clone->fUniqueID = this->uniqueID(); // need to call method to ensur
e != 0 |
| 286 } else if (fRecord) { | 292 } else if (fRecord) { |
| 287 // here we do a fake src.endRecording() | 293 clone->fPlayback = FakeEndRecording(clone, *fRecord, true); |
| 288 clone->fPlayback = SkNEW_ARGS(SkPicturePlayback, (clone, *fRecord, i
nfo, true)); | |
| 289 } else { | 294 } else { |
| 290 clone->fPlayback = NULL; | 295 clone->fPlayback = NULL; |
| 291 } | 296 } |
| 292 | 297 |
| 293 clone->fPathHeap.reset(SkSafeRef(fPathHeap.get())); | 298 clone->fPathHeap.reset(SkSafeRef(fPathHeap.get())); |
| 294 } | 299 } |
| 295 } | 300 } |
| 296 | 301 |
| 297 SkPicture::AccelData::Domain SkPicture::AccelData::GenerateDomain() { | 302 SkPicture::AccelData::Domain SkPicture::AccelData::GenerateDomain() { |
| 298 static int32_t gNextID = 0; | 303 static int32_t gNextID = 0; |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; | 569 info->fFlags |= SkPictInfo::kScalarIsFloat_Flag; |
| 565 | 570 |
| 566 if (8 == sizeof(void*)) { | 571 if (8 == sizeof(void*)) { |
| 567 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; | 572 info->fFlags |= SkPictInfo::kPtrIs64Bit_Flag; |
| 568 } | 573 } |
| 569 } | 574 } |
| 570 | 575 |
| 571 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { | 576 void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const { |
| 572 SkPicturePlayback* playback = fPlayback; | 577 SkPicturePlayback* playback = fPlayback; |
| 573 | 578 |
| 579 if (NULL == playback && fRecord) { |
| 580 playback = FakeEndRecording(this, *fRecord, false); |
| 581 } |
| 582 |
| 574 SkPictInfo info; | 583 SkPictInfo info; |
| 575 this->createHeader(&info); | 584 this->createHeader(&info); |
| 576 if (NULL == playback && fRecord) { | |
| 577 playback = SkNEW_ARGS(SkPicturePlayback, (this, *fRecord, info)); | |
| 578 } | |
| 579 | |
| 580 stream->write(&info, sizeof(info)); | 585 stream->write(&info, sizeof(info)); |
| 581 if (playback) { | 586 if (playback) { |
| 582 stream->writeBool(true); | 587 stream->writeBool(true); |
| 583 playback->serialize(stream, encoder); | 588 playback->serialize(stream, encoder); |
| 584 // delete playback if it is a local version (i.e. cons'd up just now) | 589 // delete playback if it is a local version (i.e. cons'd up just now) |
| 585 if (playback != fPlayback) { | 590 if (playback != fPlayback) { |
| 586 SkDELETE(playback); | 591 SkDELETE(playback); |
| 587 } | 592 } |
| 588 } else { | 593 } else { |
| 589 stream->writeBool(false); | 594 stream->writeBool(false); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 | 627 |
| 623 if ((n = SafeCount(fPathHeap.get())) > 0) { | 628 if ((n = SafeCount(fPathHeap.get())) > 0) { |
| 624 WriteTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n); | 629 WriteTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n); |
| 625 fPathHeap->flatten(buffer); | 630 fPathHeap->flatten(buffer); |
| 626 } | 631 } |
| 627 } | 632 } |
| 628 | 633 |
| 629 void SkPicture::flatten(SkWriteBuffer& buffer) const { | 634 void SkPicture::flatten(SkWriteBuffer& buffer) const { |
| 630 SkPicturePlayback* playback = fPlayback; | 635 SkPicturePlayback* playback = fPlayback; |
| 631 | 636 |
| 637 if (NULL == playback && fRecord) { |
| 638 playback = FakeEndRecording(this, *fRecord, false); |
| 639 } |
| 640 |
| 632 SkPictInfo info; | 641 SkPictInfo info; |
| 633 this->createHeader(&info); | 642 this->createHeader(&info); |
| 634 if (NULL == playback && fRecord) { | |
| 635 playback = SkNEW_ARGS(SkPicturePlayback, (this, *fRecord, info)); | |
| 636 } | |
| 637 | |
| 638 buffer.writeByteArray(&info, sizeof(info)); | 643 buffer.writeByteArray(&info, sizeof(info)); |
| 639 if (playback) { | 644 if (playback) { |
| 640 buffer.writeBool(true); | 645 buffer.writeBool(true); |
| 641 playback->flatten(buffer); | 646 playback->flatten(buffer); |
| 642 // delete playback if it is a local version (i.e. cons'd up just now) | 647 // delete playback if it is a local version (i.e. cons'd up just now) |
| 643 if (playback != fPlayback) { | 648 if (playback != fPlayback) { |
| 644 SkDELETE(playback); | 649 SkDELETE(playback); |
| 645 } | 650 } |
| 646 } else { | 651 } else { |
| 647 buffer.writeBool(false); | 652 buffer.writeBool(false); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 if (NULL != fRecord) { | 697 if (NULL != fRecord) { |
| 693 SkASSERT(NULL == fPlayback); | 698 SkASSERT(NULL == fPlayback); |
| 694 return SK_InvalidGenID; | 699 return SK_InvalidGenID; |
| 695 } | 700 } |
| 696 | 701 |
| 697 if (SK_InvalidGenID == fUniqueID) { | 702 if (SK_InvalidGenID == fUniqueID) { |
| 698 fUniqueID = next_picture_generation_id(); | 703 fUniqueID = next_picture_generation_id(); |
| 699 } | 704 } |
| 700 return fUniqueID; | 705 return fUniqueID; |
| 701 } | 706 } |
| OLD | NEW |