| Index: src/core/SkWriter32.cpp
|
| diff --git a/src/core/SkWriter32.cpp b/src/core/SkWriter32.cpp
|
| index e5befbafb40c9165e9ba519f9efe36fe22a8e324..5e89ed655b70e5d83da4df2588704689898b52e6 100644
|
| --- a/src/core/SkWriter32.cpp
|
| +++ b/src/core/SkWriter32.cpp
|
| @@ -5,239 +5,9 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| -#include "SkWriter32.h"
|
| -
|
| -SkWriter32::SkWriter32(size_t minSize, void* storage, size_t storageSize) {
|
| - fMinSize = minSize;
|
| - fSize = 0;
|
| - fWrittenBeforeLastBlock = 0;
|
| - fHead = fTail = NULL;
|
| -
|
| - if (storageSize) {
|
| - this->reset(storage, storageSize);
|
| - }
|
| -}
|
| -
|
| -SkWriter32::~SkWriter32() {
|
| - this->reset();
|
| -}
|
| -
|
| -void SkWriter32::reset() {
|
| - Block* block = fHead;
|
| -
|
| - if (this->isHeadExternallyAllocated()) {
|
| - SkASSERT(block);
|
| - // don't 'free' the first block, since it is owned by the caller
|
| - block = block->fNext;
|
| - }
|
| - while (block) {
|
| - Block* next = block->fNext;
|
| - sk_free(block);
|
| - block = next;
|
| - }
|
| -
|
| - fSize = 0;
|
| - fWrittenBeforeLastBlock = 0;
|
| - fHead = fTail = NULL;
|
| -}
|
| -
|
| -void SkWriter32::reset(void* storage, size_t storageSize) {
|
| - this->reset();
|
| -
|
| - storageSize &= ~3; // trunc down to multiple of 4
|
| - if (storageSize > 0 && SkIsAlign4((intptr_t)storage)) {
|
| - fHead = fTail = fExternalBlock.initFromStorage(storage, storageSize);
|
| - }
|
| -}
|
| -
|
| -SkWriter32::Block* SkWriter32::doReserve(size_t size) {
|
| - SkASSERT(SkAlign4(size) == size);
|
| -
|
| - Block* block = fTail;
|
| - SkASSERT(NULL == block || block->available() < size);
|
| -
|
| - if (NULL == block) {
|
| - SkASSERT(NULL == fHead);
|
| - fHead = fTail = block = Block::Create(SkMax32(size, fMinSize));
|
| - SkASSERT(0 == fWrittenBeforeLastBlock);
|
| - } else {
|
| - fWrittenBeforeLastBlock = fSize;
|
| -
|
| - fTail = Block::Create(SkMax32(size, fMinSize));
|
| - block->fNext = fTail;
|
| - block = fTail;
|
| - }
|
| - return block;
|
| -}
|
| -
|
| -uint32_t* SkWriter32::peek32(size_t offset) {
|
| - SkDEBUGCODE(this->validate();)
|
| -
|
| - SkASSERT(SkAlign4(offset) == offset);
|
| - SkASSERT(offset <= fSize);
|
| -
|
| - // try the fast case, where offset is within fTail
|
| - if (offset >= fWrittenBeforeLastBlock) {
|
| - return fTail->peek32(offset - fWrittenBeforeLastBlock);
|
| - }
|
| -
|
| - Block* block = fHead;
|
| - SkASSERT(NULL != block);
|
| -
|
| - while (offset >= block->fAllocatedSoFar) {
|
| - offset -= block->fAllocatedSoFar;
|
| - block = block->fNext;
|
| - SkASSERT(NULL != block);
|
| - }
|
| - return block->peek32(offset);
|
| -}
|
| -
|
| -void SkWriter32::rewindToOffset(size_t offset) {
|
| - if (offset >= fSize) {
|
| - return;
|
| - }
|
| - if (0 == offset) {
|
| - this->reset();
|
| - return;
|
| - }
|
| -
|
| - SkDEBUGCODE(this->validate();)
|
| -
|
| - SkASSERT(SkAlign4(offset) == offset);
|
| - SkASSERT(offset <= fSize);
|
| - fSize = offset;
|
| -
|
| - // Try the fast case, where offset is within fTail
|
| - if (offset >= fWrittenBeforeLastBlock) {
|
| - fTail->fAllocatedSoFar = offset - fWrittenBeforeLastBlock;
|
| - } else {
|
| - // Similar to peek32, except that we free up any following blocks.
|
| - // We have to re-compute fWrittenBeforeLastBlock as well.
|
| -
|
| - size_t globalOffset = offset;
|
| - Block* block = fHead;
|
| - SkASSERT(NULL != block);
|
| - while (offset >= block->fAllocatedSoFar) {
|
| - offset -= block->fAllocatedSoFar;
|
| - block = block->fNext;
|
| - SkASSERT(NULL != block);
|
| - }
|
| -
|
| - // this has to be recomputed, since we may free up fTail
|
| - fWrittenBeforeLastBlock = globalOffset - offset;
|
| -
|
| - // update the size on the "last" block
|
| - block->fAllocatedSoFar = offset;
|
| - // end our list
|
| - fTail = block;
|
| - Block* next = block->fNext;
|
| - block->fNext = NULL;
|
| - // free up any trailing blocks
|
| - block = next;
|
| - while (block) {
|
| - Block* next = block->fNext;
|
| - sk_free(block);
|
| - block = next;
|
| - }
|
| - }
|
| - SkDEBUGCODE(this->validate();)
|
| -}
|
| -
|
| -void SkWriter32::flatten(void* dst) const {
|
| - const Block* block = fHead;
|
| - SkDEBUGCODE(size_t total = 0;)
|
| -
|
| - while (block) {
|
| - size_t allocated = block->fAllocatedSoFar;
|
| - memcpy(dst, block->base(), allocated);
|
| - dst = (char*)dst + allocated;
|
| - block = block->fNext;
|
| -
|
| - SkDEBUGCODE(total += allocated;)
|
| - SkASSERT(total <= fSize);
|
| - }
|
| - SkASSERT(total == fSize);
|
| -}
|
| -
|
| -uint32_t* SkWriter32::reservePad(size_t size) {
|
| - if (size > 0) {
|
| - size_t alignedSize = SkAlign4(size);
|
| - char* dst = (char*)this->reserve(alignedSize);
|
| - // Pad the last four bytes with zeroes in one step.
|
| - uint32_t* padding = (uint32_t*)(dst + (alignedSize - 4));
|
| - *padding = 0;
|
| - return (uint32_t*) dst;
|
| - }
|
| - return this->reserve(0);
|
| -}
|
| -
|
| -void SkWriter32::writePad(const void* src, size_t size) {
|
| - if (size > 0) {
|
| - char* dst = (char*)this->reservePad(size);
|
| - // Copy the actual data.
|
| - memcpy(dst, src, size);
|
| - }
|
| -}
|
| -
|
| -#include "SkStream.h"
|
| -
|
| -size_t SkWriter32::readFromStream(SkStream* stream, size_t length) {
|
| - char scratch[1024];
|
| - const size_t MAX = sizeof(scratch);
|
| - size_t remaining = length;
|
| -
|
| - while (remaining != 0) {
|
| - size_t n = remaining;
|
| - if (n > MAX) {
|
| - n = MAX;
|
| - }
|
| - size_t bytes = stream->read(scratch, n);
|
| - this->writePad(scratch, bytes);
|
| - remaining -= bytes;
|
| - if (bytes != n) {
|
| - break;
|
| - }
|
| - }
|
| - return length - remaining;
|
| -}
|
| -
|
| -bool SkWriter32::writeToStream(SkWStream* stream) {
|
| - const Block* block = fHead;
|
| - while (block) {
|
| - if (!stream->write(block->base(), block->fAllocatedSoFar)) {
|
| - return false;
|
| - }
|
| - block = block->fNext;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -#ifdef SK_DEBUG
|
| -void SkWriter32::validate() const {
|
| - SkASSERT(SkIsAlign4(fSize));
|
| -
|
| - size_t accum = 0;
|
| - const Block* block = fHead;
|
| - while (block) {
|
| - SkASSERT(SkIsAlign4(block->fSizeOfBlock));
|
| - SkASSERT(SkIsAlign4(block->fAllocatedSoFar));
|
| - SkASSERT(block->fAllocatedSoFar <= block->fSizeOfBlock);
|
| - if (NULL == block->fNext) {
|
| - SkASSERT(fTail == block);
|
| - SkASSERT(fWrittenBeforeLastBlock == accum);
|
| - }
|
| - accum += block->fAllocatedSoFar;
|
| - SkASSERT(accum <= fSize);
|
| - block = block->fNext;
|
| - }
|
| - SkASSERT(accum == fSize);
|
| -}
|
| -#endif
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| #include "SkReader32.h"
|
| #include "SkString.h"
|
| +#include "SkWriter32.h"
|
|
|
| /*
|
| * Strings are stored as: length[4-bytes] + string_data + '\0' + pad_to_mul_4
|
| @@ -247,7 +17,7 @@ const char* SkReader32::readString(size_t* outLen) {
|
| size_t len = this->readInt();
|
| const void* ptr = this->peek();
|
|
|
| - // skip over teh string + '\0' and then pad to a multiple of 4
|
| + // skip over the string + '\0' and then pad to a multiple of 4
|
| size_t alignedSize = SkAlign4(len + 1);
|
| this->skip(alignedSize);
|
|
|
|
|