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

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

Issue 499413002: SkTextBlob plumbing (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Deserialize using a builder. Created 6 years, 3 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 "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
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
robertphillips 2014/08/25 21:32:05 templatize (sp) ?
f(malita) 2014/08/25 23:56:02 Done.
81 // templetize 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) {
robertphillips 2014/08/25 21:32:05 Could do "= SkRef(blobs[i]);"
f(malita) 2014/08/25 23:56:02 Done.
87 fTextBlobRefs[i] = blobs[i];
88 fTextBlobRefs[i]->ref();
89 }
90 }
79 } 91 }
80 92
81 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE 93 #ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE
82 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI nfo) 94 SkPictureData::SkPictureData(const SkPictureData& src, SkPictCopyInfo* deepCopyI nfo)
83 : fInfo(src.fInfo) { 95 : fInfo(src.fInfo) {
84 this->init(); 96 this->init();
85 97
86 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); 98 fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get()));
87 fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); 99 fPathHeap.reset(SkSafeRef(src.fPathHeap.get()));
88 100
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 144 }
133 } 145 }
134 } 146 }
135 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE 147 #endif//SK_SUPPORT_LEGACY_PICTURE_CLONE
136 148
137 void SkPictureData::init() { 149 void SkPictureData::init() {
138 fBitmaps = NULL; 150 fBitmaps = NULL;
139 fPaints = NULL; 151 fPaints = NULL;
140 fPictureRefs = NULL; 152 fPictureRefs = NULL;
141 fPictureCount = 0; 153 fPictureCount = 0;
154 fTextBlobRefs = NULL;
155 fTextBlobCount = 0;
142 fOpData = NULL; 156 fOpData = NULL;
143 fFactoryPlayback = NULL; 157 fFactoryPlayback = NULL;
144 fBoundingHierarchy = NULL; 158 fBoundingHierarchy = NULL;
145 fStateTree = NULL; 159 fStateTree = NULL;
146 } 160 }
147 161
148 SkPictureData::~SkPictureData() { 162 SkPictureData::~SkPictureData() {
149 SkSafeUnref(fOpData); 163 SkSafeUnref(fOpData);
150 164
151 SkSafeUnref(fBitmaps); 165 SkSafeUnref(fBitmaps);
152 SkSafeUnref(fPaints); 166 SkSafeUnref(fPaints);
153 SkSafeUnref(fBoundingHierarchy); 167 SkSafeUnref(fBoundingHierarchy);
154 SkSafeUnref(fStateTree); 168 SkSafeUnref(fStateTree);
155 169
156 for (int i = 0; i < fPictureCount; i++) { 170 for (int i = 0; i < fPictureCount; i++) {
157 fPictureRefs[i]->unref(); 171 fPictureRefs[i]->unref();
158 } 172 }
159 SkDELETE_ARRAY(fPictureRefs); 173 SkDELETE_ARRAY(fPictureRefs);
160 174
175 for (int i = 0; i < fTextBlobCount; i++) {
176 fTextBlobRefs[i]->unref();
177 }
178 SkDELETE_ARRAY(fTextBlobRefs);
179
161 SkDELETE(fFactoryPlayback); 180 SkDELETE(fFactoryPlayback);
162 } 181 }
163 182
164 bool SkPictureData::containsBitmaps() const { 183 bool SkPictureData::containsBitmaps() const {
165 if (fBitmaps && fBitmaps->count() > 0) { 184 if (fBitmaps && fBitmaps->count() > 0) {
166 return true; 185 return true;
167 } 186 }
168 for (int i = 0; i < fPictureCount; ++i) { 187 for (int i = 0; i < fPictureCount; ++i) {
169 if (fPictureRefs[i]->willPlayBackBitmaps()) { 188 if (fPictureRefs[i]->willPlayBackBitmaps()) {
170 return true; 189 return true;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); 280 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n);
262 for (i = 0; i < n; i++) { 281 for (i = 0; i < n; i++) {
263 buffer.writePaint((*fPaints)[i]); 282 buffer.writePaint((*fPaints)[i]);
264 } 283 }
265 } 284 }
266 285
267 if ((n = SafeCount(fPathHeap.get())) > 0) { 286 if ((n = SafeCount(fPathHeap.get())) > 0) {
268 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); 287 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n);
269 fPathHeap->flatten(buffer); 288 fPathHeap->flatten(buffer);
270 } 289 }
290
291 if (fTextBlobCount > 0) {
292 write_tag_size(buffer, SK_PICT_TEXTBLOB_BUFFER_TAG, fTextBlobCount);
293 for (i = 0; i < fTextBlobCount; ++i) {
294 fTextBlobRefs[i]->flatten(buffer);
295 }
296 }
271 } 297 }
272 298
273 void SkPictureData::serialize(SkWStream* stream, 299 void SkPictureData::serialize(SkWStream* stream,
274 SkPicture::EncodeBitmap encoder) const { 300 SkPicture::EncodeBitmap encoder) const {
275 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); 301 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size());
276 stream->write(fOpData->bytes(), fOpData->size()); 302 stream->write(fOpData->bytes(), fOpData->size());
277 303
278 if (fPictureCount > 0) { 304 if (fPictureCount > 0) {
279 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); 305 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount);
280 for (int i = 0; i < fPictureCount; i++) { 306 for (int i = 0; i < fPictureCount; i++) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 fPaints = SkTRefArray<SkPaint>::Create(size); 504 fPaints = SkTRefArray<SkPaint>::Create(size);
479 for (int i = 0; i < count; ++i) { 505 for (int i = 0; i < count; ++i) {
480 buffer.readPaint(&fPaints->writableAt(i)); 506 buffer.readPaint(&fPaints->writableAt(i));
481 } 507 }
482 } break; 508 } break;
483 case SK_PICT_PATH_BUFFER_TAG: 509 case SK_PICT_PATH_BUFFER_TAG:
484 if (size > 0) { 510 if (size > 0) {
485 fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer))); 511 fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer)));
486 } 512 }
487 break; 513 break;
514 case SK_PICT_TEXTBLOB_BUFFER_TAG: {
515 if (!buffer.validate((0 == fTextBlobCount) && (NULL == fTextBlobRefs ))) {
516 return false;
517 }
518 fTextBlobCount = size;
519 fTextBlobRefs = SkNEW_ARRAY(const SkTextBlob*, fTextBlobCount);
520 bool success = true;
521 int i = 0;
522 for ( ; i < fTextBlobCount; i++) {
523 fTextBlobRefs[i] = SkTextBlob::CreateFromBuffer(buffer);
524 if (NULL == fTextBlobRefs[i]) {
525 success = false;
526 break;
527 }
528 }
529 if (!success) {
530 // Delete all of the blobs that were already created (up to but excluding i):
531 for (int j = 0; j < i; j++) {
532 fTextBlobRefs[j]->unref();
533 }
534 // Delete the array
robertphillips 2014/08/25 21:32:05 Don't we need an "fTextBlobRefs = NULL" after the
f(malita) 2014/08/25 23:56:02 That was my thought too, but it doesn't seem neede
535 SkDELETE_ARRAY(fTextBlobRefs);
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
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
OLDNEW
« no previous file with comments | « src/core/SkPictureData.h ('k') | src/core/SkPictureFlat.h » ('j') | src/core/SkPictureRecord.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698