diff options
author | 2014-03-05 18:25:20 +0000 | |
---|---|---|
committer | 2014-03-05 18:25:20 +0000 | |
commit | dcb8e54ffdc9194744c0ec839969102bd0f582c6 (patch) | |
tree | cf72b49c4037daafc9ffb7bc4000d84693ef176c /src | |
parent | 890b826fa381643969a65792339f5274f75d5e9a (diff) |
This CL is motivated by the desire to make the skpinfo tool work a bit better. The main concern is that the assumptions made w.r.t. written bytes may not be valid for all SkWStream sub-classes.
R=bungeman@gmail.com, bungeman@google.com, reed@google.com, mtklein@google.com
Author: robertphillips@google.com
Review URL: https://codereview.chromium.org/182733008
git-svn-id: http://skia.googlecode.com/svn/trunk@13673 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPicturePlayback.cpp | 68 | ||||
-rw-r--r-- | src/core/SkStream.cpp | 9 | ||||
-rw-r--r-- | src/utils/SkMD5.h | 2 |
3 files changed, 60 insertions, 19 deletions
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp index 7cc2a556be..abddf8225a 100644 --- a/src/core/SkPicturePlayback.cpp +++ b/src/core/SkPicturePlayback.cpp @@ -307,27 +307,46 @@ bool SkPicturePlayback::containsBitmaps() const { #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) { - int count = rec.count(); +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; +} - writeTagSize(stream, SK_PICT_FACTORY_TAG, count); +static void write_factories(SkWStream* stream, const SkFactorySet& rec) { + int count = rec.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 @@ static void writeFactories(SkWStream* stream, const SkFactorySet& rec) { 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 @@ void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const { 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 @@ void SkPicturePlayback::serialize(SkWStream* stream, 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::serialize(SkWStream* stream, } 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 @@ bool SkPicturePlayback::parseStreamTag(SkStream* stream, const SkPictInfo& info, } 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; diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp index 0d30b5214c..70f97d2f7c 100644 --- a/src/core/SkStream.cpp +++ b/src/core/SkStream.cpp @@ -140,6 +140,15 @@ bool SkWStream::writeScalar(SkScalar value) { return this->write(&value, sizeof(value)); } +int SkWStream::SizeOfPackedUInt(size_t value) { + if (value <= SK_MAX_BYTE_FOR_U8) { + return 1; + } else if (value <= 0xFFFF) { + return 3; + } + return 5; +} + bool SkWStream::writePackedUInt(size_t value) { uint8_t data[5]; size_t len = 1; diff --git a/src/utils/SkMD5.h b/src/utils/SkMD5.h index 6b4fc53636..0148641edc 100644 --- a/src/utils/SkMD5.h +++ b/src/utils/SkMD5.h @@ -25,7 +25,7 @@ public: * Note that this treats the buffer as a series of uint8_t values. */ virtual bool write(const void* buffer, size_t size) SK_OVERRIDE { - update(reinterpret_cast<const uint8_t*>(buffer), size); + this->update(reinterpret_cast<const uint8_t*>(buffer), size); return true; } |