OLD | NEW |
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 "SkDrawPictureCallback.h" | 9 #include "SkDrawPictureCallback.h" |
10 #include "SkPictureData.h" | 10 #include "SkPictureData.h" |
11 #include "SkPictureRecord.h" | 11 #include "SkPictureRecord.h" |
12 #include "SkReadBuffer.h" | 12 #include "SkReadBuffer.h" |
| 13 #include "SkTextBlob.h" |
13 #include "SkTypeface.h" | 14 #include "SkTypeface.h" |
14 #include "SkTSort.h" | 15 #include "SkTSort.h" |
15 #include "SkWriteBuffer.h" | 16 #include "SkWriteBuffer.h" |
16 | 17 |
17 #if SK_SUPPORT_GPU | 18 #if SK_SUPPORT_GPU |
18 #include "GrContext.h" | 19 #include "GrContext.h" |
19 #endif | 20 #endif |
20 | 21 |
21 template <typename T> int SafeCount(const T* obj) { | 22 template <typename T> int SafeCount(const T* obj) { |
22 return obj ? obj->count() : 0; | 23 return obj ? obj->count() : 0; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 | 70 |
70 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); | 71 const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs(); |
71 fPictureCount = pictures.count(); | 72 fPictureCount = pictures.count(); |
72 if (fPictureCount > 0) { | 73 if (fPictureCount > 0) { |
73 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); | 74 fPictureRefs = SkNEW_ARRAY(const SkPicture*, fPictureCount); |
74 for (int i = 0; i < fPictureCount; i++) { | 75 for (int i = 0; i < fPictureCount; i++) { |
75 fPictureRefs[i] = pictures[i]; | 76 fPictureRefs[i] = pictures[i]; |
76 fPictureRefs[i]->ref(); | 77 fPictureRefs[i]->ref(); |
77 } | 78 } |
78 } | 79 } |
| 80 |
| 81 // templatize to consolidate with similar picture logic? |
| 82 const SkTDArray<const SkTextBlob*>& blobs = record.getTextBlobRefs(); |
| 83 fTextBlobCount = blobs.count(); |
| 84 if (fTextBlobCount > 0) { |
| 85 fTextBlobRefs = SkNEW_ARRAY(const SkTextBlob*, fTextBlobCount); |
| 86 for (int i = 0; i < fTextBlobCount; ++i) { |
| 87 fTextBlobRefs[i] = SkRef(blobs[i]); |
| 88 } |
| 89 } |
79 } | 90 } |
80 | 91 |
81 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE | 92 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE |
82 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI
nfo) | 93 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI
nfo) |
83 : fInfo(src.fInfo) { | 94 : fInfo(src.fInfo) { |
84 this->init(); | 95 this->init(); |
85 | 96 |
86 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); | 97 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); |
87 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); | 98 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); |
88 | 99 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 143 } |
133 } | 144 } |
134 } | 145 } |
135 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE | 146 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE |
136 | 147 |
137 void SkPictureData::init() { | 148 void SkPictureData::init() { |
138 fBitmaps = NULL; | 149 fBitmaps = NULL; |
139 fPaints = NULL; | 150 fPaints = NULL; |
140 fPictureRefs = NULL; | 151 fPictureRefs = NULL; |
141 fPictureCount = 0; | 152 fPictureCount = 0; |
| 153 fTextBlobRefs = NULL; |
| 154 fTextBlobCount = 0; |
142 fOpData = NULL; | 155 fOpData = NULL; |
143 fFactoryPlayback = NULL; | 156 fFactoryPlayback = NULL; |
144 fBoundingHierarchy = NULL; | 157 fBoundingHierarchy = NULL; |
145 fStateTree = NULL; | 158 fStateTree = NULL; |
146 } | 159 } |
147 | 160 |
148 SkPictureData::~SkPictureData() { | 161 SkPictureData::~SkPictureData() { |
149 SkSafeUnref(fOpData); | 162 SkSafeUnref(fOpData); |
150 | 163 |
151 SkSafeUnref(fBitmaps); | 164 SkSafeUnref(fBitmaps); |
152 SkSafeUnref(fPaints); | 165 SkSafeUnref(fPaints); |
153 SkSafeUnref(fBoundingHierarchy); | 166 SkSafeUnref(fBoundingHierarchy); |
154 SkSafeUnref(fStateTree); | 167 SkSafeUnref(fStateTree); |
155 | 168 |
156 for (int i = 0; i < fPictureCount; i++) { | 169 for (int i = 0; i < fPictureCount; i++) { |
157 fPictureRefs[i]->unref(); | 170 fPictureRefs[i]->unref(); |
158 } | 171 } |
159 SkDELETE_ARRAY(fPictureRefs); | 172 SkDELETE_ARRAY(fPictureRefs); |
160 | 173 |
| 174 for (int i = 0; i < fTextBlobCount; i++) { |
| 175 fTextBlobRefs[i]->unref(); |
| 176 } |
| 177 SkDELETE_ARRAY(fTextBlobRefs); |
| 178 |
161 SkDELETE(fFactoryPlayback); | 179 SkDELETE(fFactoryPlayback); |
162 } | 180 } |
163 | 181 |
164 bool SkPictureData::containsBitmaps() const { | 182 bool SkPictureData::containsBitmaps() const { |
165 if (fBitmaps && fBitmaps->count() > 0) { | 183 if (fBitmaps && fBitmaps->count() > 0) { |
166 return true; | 184 return true; |
167 } | 185 } |
168 for (int i = 0; i < fPictureCount; ++i) { | 186 for (int i = 0; i < fPictureCount; ++i) { |
169 if (fPictureRefs[i]->willPlayBackBitmaps()) { | 187 if (fPictureRefs[i]->willPlayBackBitmaps()) { |
170 return true; | 188 return true; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); | 279 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
262 for (i = 0; i < n; i++) { | 280 for (i = 0; i < n; i++) { |
263 buffer.writePaint((*fPaints)[i]); | 281 buffer.writePaint((*fPaints)[i]); |
264 } | 282 } |
265 } | 283 } |
266 | 284 |
267 if ((n = SafeCount(fPathHeap.get())) > 0) { | 285 if ((n = SafeCount(fPathHeap.get())) > 0) { |
268 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); | 286 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); |
269 fPathHeap->flatten(buffer); | 287 fPathHeap->flatten(buffer); |
270 } | 288 } |
| 289 |
| 290 if (fTextBlobCount > 0) { |
| 291 write_tag_size(buffer, SK_PICT_TEXTBLOB_BUFFER_TAG, fTextBlobCount); |
| 292 for (i = 0; i < fTextBlobCount; ++i) { |
| 293 fTextBlobRefs[i]->flatten(buffer); |
| 294 } |
| 295 } |
271 } | 296 } |
272 | 297 |
273 void SkPictureData::serialize(SkWStream* stream, | 298 void SkPictureData::serialize(SkWStream* stream, |
274 SkPicture::EncodeBitmap encoder) const { | 299 SkPicture::EncodeBitmap encoder) const { |
275 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); | 300 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); |
276 stream->write(fOpData->bytes(), fOpData->size()); | 301 stream->write(fOpData->bytes(), fOpData->size()); |
277 | 302 |
278 if (fPictureCount > 0) { | 303 if (fPictureCount > 0) { |
279 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); | 304 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
280 for (int i = 0; i < fPictureCount; i++) { | 305 for (int i = 0; i < fPictureCount; i++) { |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 fPaints = SkTRefArray<SkPaint>::Create(size); | 503 fPaints = SkTRefArray<SkPaint>::Create(size); |
479 for (int i = 0; i < count; ++i) { | 504 for (int i = 0; i < count; ++i) { |
480 buffer.readPaint(&fPaints->writableAt(i)); | 505 buffer.readPaint(&fPaints->writableAt(i)); |
481 } | 506 } |
482 } break; | 507 } break; |
483 case SK_PICT_PATH_BUFFER_TAG: | 508 case SK_PICT_PATH_BUFFER_TAG: |
484 if (size > 0) { | 509 if (size > 0) { |
485 fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer))); | 510 fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer))); |
486 } | 511 } |
487 break; | 512 break; |
| 513 case SK_PICT_TEXTBLOB_BUFFER_TAG: { |
| 514 if (!buffer.validate((0 == fTextBlobCount) && (NULL == fTextBlobRefs
))) { |
| 515 return false; |
| 516 } |
| 517 fTextBlobCount = size; |
| 518 fTextBlobRefs = SkNEW_ARRAY(const SkTextBlob*, fTextBlobCount); |
| 519 bool success = true; |
| 520 int i = 0; |
| 521 for ( ; i < fTextBlobCount; i++) { |
| 522 fTextBlobRefs[i] = SkTextBlob::CreateFromBuffer(buffer); |
| 523 if (NULL == fTextBlobRefs[i]) { |
| 524 success = false; |
| 525 break; |
| 526 } |
| 527 } |
| 528 if (!success) { |
| 529 // Delete all of the blobs that were already created (up to but
excluding i): |
| 530 for (int j = 0; j < i; j++) { |
| 531 fTextBlobRefs[j]->unref(); |
| 532 } |
| 533 // Delete the array |
| 534 SkDELETE_ARRAY(fTextBlobRefs); |
| 535 fTextBlobRefs = NULL; |
| 536 fTextBlobCount = 0; |
| 537 return false; |
| 538 } |
| 539 } break; |
488 case SK_PICT_READER_TAG: { | 540 case SK_PICT_READER_TAG: { |
489 SkAutoMalloc storage(size); | 541 SkAutoMalloc storage(size); |
490 if (!buffer.readByteArray(storage.get(), size) || | 542 if (!buffer.readByteArray(storage.get(), size) || |
491 !buffer.validate(NULL == fOpData)) { | 543 !buffer.validate(NULL == fOpData)) { |
492 return false; | 544 return false; |
493 } | 545 } |
494 SkASSERT(NULL == fOpData); | 546 SkASSERT(NULL == fOpData); |
495 fOpData = SkData::NewFromMalloc(storage.detach(), size); | 547 fOpData = SkData::NewFromMalloc(storage.detach(), size); |
496 } break; | 548 } break; |
497 case SK_PICT_PICTURE_TAG: { | 549 case SK_PICT_PICTURE_TAG: { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 } | 662 } |
611 } | 663 } |
612 | 664 |
613 bool SkPictureData::suitableForLayerOptimization() const { | 665 bool SkPictureData::suitableForLayerOptimization() const { |
614 return fContentInfo.numLayers() > 0; | 666 return fContentInfo.numLayers() > 0; |
615 } | 667 } |
616 #endif | 668 #endif |
617 /////////////////////////////////////////////////////////////////////////////// | 669 /////////////////////////////////////////////////////////////////////////////// |
618 | 670 |
619 | 671 |
OLD | NEW |