Index: src/core/SkPicturePlayback.cpp |
=================================================================== |
--- src/core/SkPicturePlayback.cpp (revision 13672) |
+++ src/core/SkPicturePlayback.cpp (working copy) |
@@ -307,27 +307,46 @@ |
#include "SkStream.h" |
-static void writeTagSize(SkWriteBuffer& buffer, uint32_t tag, |
- uint32_t size) { |
+static void write_tag_size(SkWriteBuffer& buffer, uint32_t tag, uint32_t size) { |
buffer.writeUInt(tag); |
buffer.writeUInt(size); |
} |
-static void writeTagSize(SkWStream* stream, uint32_t tag, |
- uint32_t size) { |
+static void write_tag_size(SkWStream* stream, uint32_t tag, uint32_t size) { |
stream->write32(tag); |
stream->write32(size); |
} |
-static void writeFactories(SkWStream* stream, const SkFactorySet& rec) { |
+static size_t compute_chunk_size(SkFlattenable::Factory* array, int count) { |
+ size_t size = 4; // for 'count' |
+ |
+ for (int i = 0; i < count; i++) { |
+ const char* name = SkFlattenable::FactoryToName(array[i]); |
+ if (NULL == name || 0 == *name) { |
+ size += SkWStream::SizeOfPackedUInt(0); |
+ } else { |
+ size_t len = strlen(name); |
+ size += SkWStream::SizeOfPackedUInt(len); |
+ size += len; |
+ } |
+ } |
+ |
+ return size; |
+} |
+ |
+static void write_factories(SkWStream* stream, const SkFactorySet& rec) { |
int count = rec.count(); |
- writeTagSize(stream, SK_PICT_FACTORY_TAG, count); |
- |
SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); |
SkFlattenable::Factory* array = (SkFlattenable::Factory*)storage.get(); |
rec.copyToArray(array); |
+ size_t size = compute_chunk_size(array, count); |
+ |
+ // TODO: write_tag_size should really take a size_t |
+ write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); |
+ stream->write32(count); |
+ |
for (int i = 0; i < count; i++) { |
const char* name = SkFlattenable::FactoryToName(array[i]); |
// SkDebugf("---- write factories [%d] %p <%s>\n", i, array[i], name); |
@@ -339,12 +358,14 @@ |
stream->write(name, len); |
} |
} |
+ |
+ |
} |
static void writeTypefaces(SkWStream* stream, const SkRefCntSet& rec) { |
int count = rec.count(); |
- writeTagSize(stream, SK_PICT_TYPEFACE_TAG, count); |
+ write_tag_size(stream, SK_PICT_TYPEFACE_TAG, count); |
SkAutoSTMalloc<16, SkTypeface*> storage(count); |
SkTypeface** array = (SkTypeface**)storage.get(); |
@@ -359,32 +380,32 @@ |
int i, n; |
if ((n = SafeCount(fBitmaps)) > 0) { |
- writeTagSize(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); |
+ write_tag_size(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); |
for (i = 0; i < n; i++) { |
buffer.writeBitmap((*fBitmaps)[i]); |
} |
} |
if ((n = SafeCount(fPaints)) > 0) { |
- writeTagSize(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
+ write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
for (i = 0; i < n; i++) { |
buffer.writePaint((*fPaints)[i]); |
} |
} |
if ((n = SafeCount(fPathHeap.get())) > 0) { |
- writeTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n); |
+ write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); |
fPathHeap->flatten(buffer); |
} |
} |
void SkPicturePlayback::serialize(SkWStream* stream, |
SkPicture::EncodeBitmap encoder) const { |
- writeTagSize(stream, SK_PICT_READER_TAG, fOpData->size()); |
+ write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); |
stream->write(fOpData->bytes(), fOpData->size()); |
if (fPictureCount > 0) { |
- writeTagSize(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
+ write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
for (int i = 0; i < fPictureCount; i++) { |
fPictureRefs[i]->serialize(stream, encoder); |
} |
@@ -403,13 +424,13 @@ |
this->flattenToBuffer(buffer); |
- // We have to write these to sets into the stream *before* we write |
+ // We have to write these two sets into the stream *before* we write |
// the buffer, since parsing that buffer will require that we already |
// have these sets available to use. |
- writeFactories(stream, factSet); |
+ write_factories(stream, factSet); |
writeTypefaces(stream, typefaceSet); |
- writeTagSize(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); |
+ write_tag_size(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); |
buffer.writeToStream(stream); |
} |
@@ -417,11 +438,11 @@ |
} |
void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const { |
- writeTagSize(buffer, SK_PICT_READER_TAG, fOpData->size()); |
+ write_tag_size(buffer, SK_PICT_READER_TAG, fOpData->size()); |
buffer.writeByteArray(fOpData->bytes(), fOpData->size()); |
if (fPictureCount > 0) { |
- writeTagSize(buffer, SK_PICT_PICTURE_TAG, fPictureCount); |
+ write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictureCount); |
for (int i = 0; i < fPictureCount; i++) { |
fPictureRefs[i]->flatten(buffer); |
} |
@@ -481,6 +502,17 @@ |
} break; |
case SK_PICT_FACTORY_TAG: { |
SkASSERT(!haveBuffer); |
+ // Remove this code when v21 and below are no longer supported. At the |
+ // same time add a new 'count' variable and use it rather then reusing 'size'. |
+#ifndef DISABLE_V21_COMPATIBILITY_CODE |
+ if (info.fVersion >= 22) { |
+ // in v22 this tag's size represents the size of the chunk in bytes |
+ // and the number of factory strings is written out separately |
+#endif |
+ size = stream->readU32(); |
+#ifndef DISABLE_V21_COMPATIBILITY_CODE |
+ } |
+#endif |
fFactoryPlayback = SkNEW_ARGS(SkFactoryPlayback, (size)); |
for (size_t i = 0; i < size; i++) { |
SkString str; |