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

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

Issue 182733008: Switch the factory chunk in the skps to storing its size in bytes (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Added comment Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « include/core/SkStream.h ('k') | src/core/SkStream.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
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 #include "SkPicturePlayback.h" 8 #include "SkPicturePlayback.h"
9 #include "SkPictureRecord.h" 9 #include "SkPictureRecord.h"
10 #include "SkTypeface.h" 10 #include "SkTypeface.h"
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 } 300 }
301 } 301 }
302 return false; 302 return false;
303 } 303 }
304 304
305 /////////////////////////////////////////////////////////////////////////////// 305 ///////////////////////////////////////////////////////////////////////////////
306 /////////////////////////////////////////////////////////////////////////////// 306 ///////////////////////////////////////////////////////////////////////////////
307 307
308 #include "SkStream.h" 308 #include "SkStream.h"
309 309
310 static void writeTagSize(SkWriteBuffer& buffer, uint32_t tag, 310 static void write_tag_size(SkWriteBuffer& buffer, uint32_t tag, uint32_t size) {
311 uint32_t size) {
312 buffer.writeUInt(tag); 311 buffer.writeUInt(tag);
313 buffer.writeUInt(size); 312 buffer.writeUInt(size);
314 } 313 }
315 314
316 static void writeTagSize(SkWStream* stream, uint32_t tag, 315 static void write_tag_size(SkWStream* stream, uint32_t tag, uint32_t size) {
317 uint32_t size) {
318 stream->write32(tag); 316 stream->write32(tag);
319 stream->write32(size); 317 stream->write32(size);
320 } 318 }
321 319
322 static void writeFactories(SkWStream* stream, const SkFactorySet& rec) { 320 static size_t compute_chunk_size(SkFlattenable::Factory* array, int count) {
321 size_t size = 4; // for 'count'
322
323 for (int i = 0; i < count; i++) {
324 const char* name = SkFlattenable::FactoryToName(array[i]);
325 if (NULL == name || 0 == *name) {
326 size += SkWStream::SizeOfPackedUInt(0);
327 } else {
328 size_t len = strlen(name);
329 size += SkWStream::SizeOfPackedUInt(len);
330 size += len;
331 }
332 }
333
334 return size;
335 }
336
337 static void write_factories(SkWStream* stream, const SkFactorySet& rec) {
323 int count = rec.count(); 338 int count = rec.count();
324 339
325 writeTagSize(stream, SK_PICT_FACTORY_TAG, count);
326
327 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); 340 SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count);
328 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); 341 SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get();
329 rec.copyToArray(array); 342 rec.copyToArray(array);
330 343
344 size_t size = compute_chunk_size(array, count);
345
346 // TODO: write_tag_size should really take a size_t
347 write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size);
348 stream->write32(count);
349
331 for (int i = 0; i < count; i++) { 350 for (int i = 0; i < count; i++) {
332 const char* name = SkFlattenable::FactoryToName(array[i]); 351 const char* name = SkFlattenable::FactoryToName(array[i]);
333 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); 352 // SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name);
334 if (NULL == name || 0 == *name) { 353 if (NULL == name || 0 == *name) {
335 stream->writePackedUInt(0); 354 stream->writePackedUInt(0);
336 } else { 355 } else {
337 uint32_t len = strlen(name); 356 uint32_t len = strlen(name);
338 stream->writePackedUInt(len); 357 stream->writePackedUInt(len);
339 stream->write(name, len); 358 stream->write(name, len);
340 } 359 }
341 } 360 }
361
362
342 } 363 }
343 364
344 static void writeTypefaces(SkWStream* stream, const SkRefCntSet& rec) { 365 static void writeTypefaces(SkWStream* stream, const SkRefCntSet& rec) {
345 int count = rec.count(); 366 int count = rec.count();
346 367
347 writeTagSize(stream, SK_PICT_TYPEFACE_TAG, count); 368 write_tag_size(stream, SK_PICT_TYPEFACE_TAG, count);
348 369
349 SkAutoSTMalloc<16, SkTypeface*> storage(count); 370 SkAutoSTMalloc<16, SkTypeface*> storage(count);
350 SkTypeface** array = (SkTypeface**)storage.get(); 371 SkTypeface** array = (SkTypeface**)storage.get();
351 rec.copyToArray((SkRefCnt**)array); 372 rec.copyToArray((SkRefCnt**)array);
352 373
353 for (int i = 0; i < count; i++) { 374 for (int i = 0; i < count; i++) {
354 array[i]->serialize(stream); 375 array[i]->serialize(stream);
355 } 376 }
356 } 377 }
357 378
358 void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const { 379 void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const {
359 int i, n; 380 int i, n;
360 381
361 if ((n = SafeCount(fBitmaps)) > 0) { 382 if ((n = SafeCount(fBitmaps)) > 0) {
362 writeTagSize(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); 383 write_tag_size(buffer, SK_PICT_BITMAP_BUFFER_TAG, n);
363 for (i = 0; i < n; i++) { 384 for (i = 0; i < n; i++) {
364 buffer.writeBitmap((*fBitmaps)[i]); 385 buffer.writeBitmap((*fBitmaps)[i]);
365 } 386 }
366 } 387 }
367 388
368 if ((n = SafeCount(fPaints)) > 0) { 389 if ((n = SafeCount(fPaints)) > 0) {
369 writeTagSize(buffer, SK_PICT_PAINT_BUFFER_TAG, n); 390 write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n);
370 for (i = 0; i < n; i++) { 391 for (i = 0; i < n; i++) {
371 buffer.writePaint((*fPaints)[i]); 392 buffer.writePaint((*fPaints)[i]);
372 } 393 }
373 } 394 }
374 395
375 if ((n = SafeCount(fPathHeap.get())) > 0) { 396 if ((n = SafeCount(fPathHeap.get())) > 0) {
376 writeTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n); 397 write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n);
377 fPathHeap->flatten(buffer); 398 fPathHeap->flatten(buffer);
378 } 399 }
379 } 400 }
380 401
381 void SkPicturePlayback::serialize(SkWStream* stream, 402 void SkPicturePlayback::serialize(SkWStream* stream,
382 SkPicture::EncodeBitmap encoder) const { 403 SkPicture::EncodeBitmap encoder) const {
383 writeTagSize(stream, SK_PICT_READER_TAG, fOpData->size()); 404 write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size());
384 stream->write(fOpData->bytes(), fOpData->size()); 405 stream->write(fOpData->bytes(), fOpData->size());
385 406
386 if (fPictureCount > 0) { 407 if (fPictureCount > 0) {
387 writeTagSize(stream, SK_PICT_PICTURE_TAG, fPictureCount); 408 write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount);
388 for (int i = 0; i < fPictureCount; i++) { 409 for (int i = 0; i < fPictureCount; i++) {
389 fPictureRefs[i]->serialize(stream, encoder); 410 fPictureRefs[i]->serialize(stream, encoder);
390 } 411 }
391 } 412 }
392 413
393 // Write some of our data into a writebuffer, and then serialize that 414 // Write some of our data into a writebuffer, and then serialize that
394 // into our stream 415 // into our stream
395 { 416 {
396 SkRefCntSet typefaceSet; 417 SkRefCntSet typefaceSet;
397 SkFactorySet factSet; 418 SkFactorySet factSet;
398 419
399 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag); 420 SkWriteBuffer buffer(SkWriteBuffer::kCrossProcess_Flag);
400 buffer.setTypefaceRecorder(&typefaceSet); 421 buffer.setTypefaceRecorder(&typefaceSet);
401 buffer.setFactoryRecorder(&factSet); 422 buffer.setFactoryRecorder(&factSet);
402 buffer.setBitmapEncoder(encoder); 423 buffer.setBitmapEncoder(encoder);
403 424
404 this->flattenToBuffer(buffer); 425 this->flattenToBuffer(buffer);
405 426
406 // We have to write these to sets into the stream *before* we write 427 // We have to write these two sets into the stream *before* we write
407 // the buffer, since parsing that buffer will require that we already 428 // the buffer, since parsing that buffer will require that we already
408 // have these sets available to use. 429 // have these sets available to use.
409 writeFactories(stream, factSet); 430 write_factories(stream, factSet);
410 writeTypefaces(stream, typefaceSet); 431 writeTypefaces(stream, typefaceSet);
411 432
412 writeTagSize(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); 433 write_tag_size(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten());
413 buffer.writeToStream(stream); 434 buffer.writeToStream(stream);
414 } 435 }
415 436
416 stream->write32(SK_PICT_EOF_TAG); 437 stream->write32(SK_PICT_EOF_TAG);
417 } 438 }
418 439
419 void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const { 440 void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const {
420 writeTagSize(buffer, SK_PICT_READER_TAG, fOpData->size()); 441 write_tag_size(buffer, SK_PICT_READER_TAG, fOpData->size());
421 buffer.writeByteArray(fOpData->bytes(), fOpData->size()); 442 buffer.writeByteArray(fOpData->bytes(), fOpData->size());
422 443
423 if (fPictureCount > 0) { 444 if (fPictureCount > 0) {
424 writeTagSize(buffer, SK_PICT_PICTURE_TAG, fPictureCount); 445 write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictureCount);
425 for (int i = 0; i < fPictureCount; i++) { 446 for (int i = 0; i < fPictureCount; i++) {
426 fPictureRefs[i]->flatten(buffer); 447 fPictureRefs[i]->flatten(buffer);
427 } 448 }
428 } 449 }
429 450
430 // Write this picture playback's data into a writebuffer 451 // Write this picture playback's data into a writebuffer
431 this->flattenToBuffer(buffer); 452 this->flattenToBuffer(buffer);
432 buffer.write32(SK_PICT_EOF_TAG); 453 buffer.write32(SK_PICT_EOF_TAG);
433 } 454 }
434 455
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 case SK_PICT_READER_TAG: { 495 case SK_PICT_READER_TAG: {
475 SkAutoMalloc storage(size); 496 SkAutoMalloc storage(size);
476 if (stream->read(storage.get(), size) != size) { 497 if (stream->read(storage.get(), size) != size) {
477 return false; 498 return false;
478 } 499 }
479 SkASSERT(NULL == fOpData); 500 SkASSERT(NULL == fOpData);
480 fOpData = SkData::NewFromMalloc(storage.detach(), size); 501 fOpData = SkData::NewFromMalloc(storage.detach(), size);
481 } break; 502 } break;
482 case SK_PICT_FACTORY_TAG: { 503 case SK_PICT_FACTORY_TAG: {
483 SkASSERT(!haveBuffer); 504 SkASSERT(!haveBuffer);
505 // Remove this code when v21 and below are no longer supported. At the
506 // same time add a new 'count' variable and use it rather then reusing ' size'.
507 #ifndef DISABLE_V21_COMPATIBILITY_CODE
508 if (info.fVersion >= 22) {
509 // in v22 this tag's size represents the size of the chunk in by tes
510 // and the number of factory strings is written out separately
511 #endif
512 size = stream->readU32();
513 #ifndef DISABLE_V21_COMPATIBILITY_CODE
514 }
515 #endif
484 fFactoryPlayback = SkNEW_ARGS(SkFactoryPlayback, (size)); 516 fFactoryPlayback = SkNEW_ARGS(SkFactoryPlayback, (size));
485 for (size_t i = 0; i < size; i++) { 517 for (size_t i = 0; i < size; i++) {
486 SkString str; 518 SkString str;
487 const size_t len = stream->readPackedUInt(); 519 const size_t len = stream->readPackedUInt();
488 str.resize(len); 520 str.resize(len);
489 if (stream->read(str.writable_str(), len) != len) { 521 if (stream->read(str.writable_str(), len) != len) {
490 return false; 522 return false;
491 } 523 }
492 fFactoryPlayback->base()[i] = SkFlattenable::NameToFactory(str.c _str()); 524 fFactoryPlayback->base()[i] = SkFlattenable::NameToFactory(str.c _str());
493 } 525 }
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 for (index = 0; index < fPictureCount; index++) 1680 for (index = 0; index < fPictureCount; index++)
1649 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ), 1681 bufferPtr += snprintf(bufferPtr, DUMP_BUFFER_SIZE - (bufferPtr - pBuffer ),
1650 "picture%p, ", fPictureRefs[index]); 1682 "picture%p, ", fPictureRefs[index]);
1651 if (fPictureCount > 0) 1683 if (fPictureCount > 0)
1652 SkDebugf("%s0};\n", pBuffer); 1684 SkDebugf("%s0};\n", pBuffer);
1653 1685
1654 const_cast<SkPicturePlayback*>(this)->dumpStream(); 1686 const_cast<SkPicturePlayback*>(this)->dumpStream();
1655 } 1687 }
1656 1688
1657 #endif 1689 #endif
OLDNEW
« no previous file with comments | « include/core/SkStream.h ('k') | src/core/SkStream.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698