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

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

Issue 384753004: Cleanup SkPicture* classes a bit (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Clean up 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
« no previous file with comments | « src/core/SkPictureData.h ('k') | src/core/SkPicturePlayback.cpp » ('j') | 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 * 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 "SkPictureStateTree.h"
13 #include "SkReadBuffer.h" 12 #include "SkReadBuffer.h"
14 #include "SkTypeface.h" 13 #include "SkTypeface.h"
15 #include "SkTSort.h" 14 #include "SkTSort.h"
16 #include "SkWriteBuffer.h" 15 #include "SkWriteBuffer.h"
17 16
18 #if SK_SUPPORT_GPU 17 #if SK_SUPPORT_GPU
19 #include "GrContext.h" 18 #include "GrContext.h"
20 #endif 19 #endif
21 20
22 template <typename T> int SafeCount(const T* obj) { 21 template <typename T> int SafeCount(const T* obj) {
23 return obj ? obj->count() : 0; 22 return obj ? obj->count() : 0;
24 } 23 }
25 24
26 SkPictureData::SkPictureData(const SkPictInfo& info) 25 SkPictureData::SkPictureData(const SkPictInfo& info)
27 : fInfo(info) { 26 : fInfo(info) {
28 this->init(); 27 this->init();
29 } 28 }
30 29
31 void SkPictureData::initForPlayback() const { 30 void SkPictureData::initForPlayback() const {
32 // ensure that the paths bounds are pre-computed 31 // ensure that the paths bounds are pre-computed
33 if (NULL != fPathHeap.get()) { 32 if (NULL != fPathHeap.get()) {
34 for (int i = 0; i < fPathHeap->count(); i++) { 33 for (int i = 0; i < fPathHeap->count(); i++) {
35 (*fPathHeap.get())[i].updateBoundsCache(); 34 (*fPathHeap.get())[i].updateBoundsCache();
36 } 35 }
37 } 36 }
38 } 37 }
39 38
40 SkPictureData::SkPictureData(const SkPictureRecord& record, 39 SkPictureData::SkPictureData(const SkPictureRecord& record,
41 const SkPictInfo& info, 40 const SkPictInfo& info,
42 bool deepCopyOps) 41 bool deepCopyOps)
43 : fInfo(info) { 42 : fInfo(info) {
44 #ifdef SK_DEBUG_SIZE 43 #ifdef SK_DEBUG_SIZE
45 size_t overallBytes, bitmapBytes, matricesBytes, 44 size_t overallBytes, bitmapBytes, matricesBytes,
46 paintBytes, pathBytes, pictureBytes, regionBytes; 45 paintBytes, pathBytes, pictureBytes, regionBytes;
47 int bitmaps = record.bitmaps(&bitmapBytes); 46 int bitmaps = record.bitmaps(&bitmapBytes);
48 int matrices = record.matrices(&matricesBytes); 47 int matrices = record.matrices(&matricesBytes);
49 int paints = record.paints(&paintBytes); 48 int paints = record.paints(&paintBytes);
50 int paths = record.paths(&pathBytes); 49 int paths = record.paths(&pathBytes);
51 int pictures = record.pictures(&pictureBytes); 50 int pictures = record.pictures(&pictureBytes);
52 int regions = record.regions(&regionBytes); 51 int regions = record.regions(&regionBytes);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 } else { 281 } else {
283 size_t len = strlen(name); 282 size_t len = strlen(name);
284 size += SkWStream::SizeOfPackedUInt(len); 283 size += SkWStream::SizeOfPackedUInt(len);
285 size += len; 284 size += len;
286 } 285 }
287 } 286 }
288 287
289 return size; 288 return size;
290 } 289 }
291 290
291 static void write_tag_size(SkWriteBuffer& buffer, uint32_t tag, size_t size) {
292 buffer.writeUInt(tag);
293 buffer.writeUInt(SkToU32(size));
294 }
295
296 static void write_tag_size(SkWStream* stream, uint32_t tag, size_t size) {
297 stream->write32(tag);
298 stream->write32(SkToU32(size));
299 }
300
292 void SkPictureData::WriteFactories(SkWStream* stream, const SkFactorySet& rec) { 301 void SkPictureData::WriteFactories(SkWStream* stream, const SkFactorySet& rec) {
293 int count = rec.count(); 302 int count = rec.count();
294 303
295 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); 304 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count);
296 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); 305 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get();
297 rec.copyToArray(array); 306 rec.copyToArray(array);
298 307
299 size_t size = compute_chunk_size(array, count); 308 size_t size = compute_chunk_size(array, count);
300 309
301 // TODO: write_tag_size should really take a size_t 310 // TODO: write_tag_size should really take a size_t
302 SkPicture::WriteTagSize(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); 311 write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size);
303 SkDEBUGCODE(size_t start = stream->bytesWritten()); 312 SkDEBUGCODE(size_t start = stream->bytesWritten());
304 stream->write32(count); 313 stream->write32(count);
305 314
306 for (int i = 0; i < count; i++) { 315 for (int i = 0; i < count; i++) {
307 const char* name = SkFlattenable::FactoryToName(array[i]); 316 const char* name = SkFlattenable::FactoryToName(array[i]);
308 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); 317 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name);
309 if (NULL == name || 0 == *name) { 318 if (NULL == name || 0 == *name) {
310 stream->writePackedUInt(0); 319 stream->writePackedUInt(0);
311 } else { 320 } else {
312 size_t len = strlen(name); 321 size_t len = strlen(name);
313 stream->writePackedUInt(len); 322 stream->writePackedUInt(len);
314 stream->write(name, len); 323 stream->write(name, len);
315 } 324 }
316 } 325 }
317 326
318 SkASSERT(size == (stream->bytesWritten() - start)); 327 SkASSERT(size == (stream->bytesWritten() - start));
319 } 328 }
320 329
321 void SkPictureData::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec) { 330 void SkPictureData::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec) {
322 int count = rec.count(); 331 int count = rec.count();
323 332
324 SkPicture::WriteTagSize(stream, SK_PICT_TYPEFACE_TAG, count); 333 write_tag_size(stream, SK_PICT_TYPEFACE_TAG, count);
325 334
326 SkAutoSTMalloc<16, SkTypeface*> storage(count); 335 SkAutoSTMalloc<16, SkTypeface*> storage(count);
327 SkTypeface** array = (SkTypeface**)storage.get(); 336 SkTypeface** array = (SkTypeface**)storage.get();
328 rec.copyToArray((SkRefCnt**)array); 337 rec.copyToArray((SkRefCnt**)array);
329 338
330 for (int i = 0; i < count; i++) { 339 for (int i = 0; i < count; i++) {
331 array[i]->serialize(stream); 340 array[i]->serialize(stream);
332 } 341 }
333 } 342 }
334 343
335 void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const { 344 void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const {
336 int i, n; 345 int i, n;
337 346
338 if ((n = SafeCount(fBitmaps)) > 0) { 347 if ((n = SafeCount(fBitmaps)) > 0) {
339 SkPicture::WriteTagSize(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); 348 write_tag_size(buffer, SK_PICT_BITMAP_BUFFER_TAG, n);
340 for (i = 0; i < n; i++) { 349 for (i = 0; i < n; i++) {
341 buffer.writeBitmap((*fBitmaps)[i]); 350 buffer.writeBitmap((*fBitmaps)[i]);
342 } 351 }
343 } 352 }
344 353
345 if ((n = SafeCount(fPaints)) > 0) { 354 if ((n = SafeCount(fPaints)) > 0) {
346 SkPicture::WriteTagSize(buffer, SK_PICT_PAINT_BUFFER_TAG, n); 355 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n);
347 for (i = 0; i < n; i++) { 356 for (i = 0; i < n; i++) {
348 buffer.writePaint((*fPaints)[i]); 357 buffer.writePaint((*fPaints)[i]);
349 } 358 }
350 } 359 }
351 360
352 if ((n = SafeCount(fPathHeap.get())) > 0) { 361 if ((n = SafeCount(fPathHeap.get())) > 0) {
353 SkPicture::WriteTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n); 362 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n);
354 fPathHeap->flatten(buffer); 363 fPathHeap->flatten(buffer);
355 } 364 }
356 } 365 }
357 366
358 void SkPictureData::serialize(SkWStream* stream, 367 void SkPictureData::serialize(SkWStream* stream,
359 SkPicture::EncodeBitmap encoder) const { 368 SkPicture::EncodeBitmap encoder) const {
360 SkPicture::WriteTagSize(stream, SK_PICT_READER_TAG, fOpData->size()); 369 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size());
361 stream->write(fOpData->bytes(), fOpData->size()); 370 stream->write(fOpData->bytes(), fOpData->size());
362 371
363 if (fPictureCount > 0) { 372 if (fPictureCount > 0) {
364 SkPicture::WriteTagSize(stream, SK_PICT_PICTURE_TAG, fPictureCount); 373 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount);
365 for (int i = 0; i < fPictureCount; i++) { 374 for (int i = 0; i < fPictureCount; i++) {
366 fPictureRefs[i]->serialize(stream, encoder); 375 fPictureRefs[i]->serialize(stream, encoder);
367 } 376 }
368 } 377 }
369 378
370 // Write some of our data into a writebuffer, and then serialize that 379 // Write some of our data into a writebuffer, and then serialize that
371 // into our stream 380 // into our stream
372 { 381 {
373 SkRefCntSet typefaceSet; 382 SkRefCntSet typefaceSet;
374 SkFactorySet factSet; 383 SkFactorySet factSet;
375 384
376 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag); 385 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag);
377 buffer.setTypefaceRecorder(&typefaceSet); 386 buffer.setTypefaceRecorder(&typefaceSet);
378 buffer.setFactoryRecorder(&factSet); 387 buffer.setFactoryRecorder(&factSet);
379 buffer.setBitmapEncoder(encoder); 388 buffer.setBitmapEncoder(encoder);
380 389
381 this->flattenToBuffer(buffer); 390 this->flattenToBuffer(buffer);
382 391
383 // We have to write these two sets into the stream *before* we write 392 // We have to write these two sets into the stream *before* we write
384 // the buffer, since parsing that buffer will require that we already 393 // the buffer, since parsing that buffer will require that we already
385 // have these sets available to use. 394 // have these sets available to use.
386 WriteFactories(stream, factSet); 395 WriteFactories(stream, factSet);
387 WriteTypefaces(stream, typefaceSet); 396 WriteTypefaces(stream, typefaceSet);
388 397
389 SkPicture::WriteTagSize(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWri tten()); 398 write_tag_size(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten());
390 buffer.writeToStream(stream); 399 buffer.writeToStream(stream);
391 } 400 }
392 401
393 stream->write32(SK_PICT_EOF_TAG); 402 stream->write32(SK_PICT_EOF_TAG);
394 } 403 }
395 404
396 void SkPictureData::flatten(SkWriteBuffer& buffer) const { 405 void SkPictureData::flatten(SkWriteBuffer& buffer) const {
397 SkPicture::WriteTagSize(buffer, SK_PICT_READER_TAG, fOpData->size()); 406 write_tag_size(buffer, SK_PICT_READER_TAG, fOpData->size());
398 buffer.writeByteArray(fOpData->bytes(), fOpData->size()); 407 buffer.writeByteArray(fOpData->bytes(), fOpData->size());
399 408
400 if (fPictureCount > 0) { 409 if (fPictureCount > 0) {
401 SkPicture::WriteTagSize(buffer, SK_PICT_PICTURE_TAG, fPictureCount); 410 write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictureCount);
402 for (int i = 0; i < fPictureCount; i++) { 411 for (int i = 0; i < fPictureCount; i++) {
403 fPictureRefs[i]->flatten(buffer); 412 fPictureRefs[i]->flatten(buffer);
404 } 413 }
405 } 414 }
406 415
407 // Write this picture playback's data into a writebuffer 416 // Write this picture playback's data into a writebuffer
408 this->flattenToBuffer(buffer); 417 this->flattenToBuffer(buffer);
409 buffer.write32(SK_PICT_EOF_TAG); 418 buffer.write32(SK_PICT_EOF_TAG);
410 } 419 }
411 420
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 for (index = 0; index < fPictureCount; index++) 1244 for (index = 0; index < fPictureCount; index++)
1236 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ), 1245 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ),
1237 "picture%p, ", fPictureRefs[index]); 1246 "picture%p, ", fPictureRefs[index]);
1238 if (fPictureCount > 0) 1247 if (fPictureCount > 0)
1239 SkDebugf("%s0};\n", pBuffer); 1248 SkDebugf("%s0};\n", pBuffer);
1240 1249
1241 const_cast<SkPictureData*>(this)->dumpStream(); 1250 const_cast<SkPictureData*>(this)->dumpStream();
1242 } 1251 }
1243 1252
1244 #endif 1253 #endif
OLDNEW
« no previous file with comments | « src/core/SkPictureData.h ('k') | src/core/SkPicturePlayback.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698