| Index: src/core/SkOrderedReadBuffer.cpp
|
| diff --git a/src/core/SkOrderedReadBuffer.cpp b/src/core/SkOrderedReadBuffer.cpp
|
| deleted file mode 100644
|
| index 1ebaac4da860993fca7061add986496fb3161f85..0000000000000000000000000000000000000000
|
| --- a/src/core/SkOrderedReadBuffer.cpp
|
| +++ /dev/null
|
| @@ -1,320 +0,0 @@
|
| -
|
| -/*
|
| - * Copyright 2012 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "SkBitmap.h"
|
| -#include "SkErrorInternals.h"
|
| -#include "SkOrderedReadBuffer.h"
|
| -#include "SkStream.h"
|
| -#include "SkTypeface.h"
|
| -
|
| -SkOrderedReadBuffer::SkOrderedReadBuffer() : INHERITED() {
|
| - fMemoryPtr = NULL;
|
| -
|
| - fBitmapStorage = NULL;
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - fFactoryTDArray = NULL;
|
| - fFactoryArray = NULL;
|
| - fFactoryCount = 0;
|
| - fBitmapDecoder = NULL;
|
| -#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
|
| - fDecodedBitmapIndex = -1;
|
| -#endif // DEBUG_NON_DETERMINISTIC_ASSERT
|
| -}
|
| -
|
| -SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERITED() {
|
| - fReader.setMemory(data, size);
|
| - fMemoryPtr = NULL;
|
| -
|
| - fBitmapStorage = NULL;
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - fFactoryTDArray = NULL;
|
| - fFactoryArray = NULL;
|
| - fFactoryCount = 0;
|
| - fBitmapDecoder = NULL;
|
| -#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
|
| - fDecodedBitmapIndex = -1;
|
| -#endif // DEBUG_NON_DETERMINISTIC_ASSERT
|
| -}
|
| -
|
| -SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) {
|
| - const size_t length = stream->getLength();
|
| - fMemoryPtr = sk_malloc_throw(length);
|
| - stream->read(fMemoryPtr, length);
|
| - fReader.setMemory(fMemoryPtr, length);
|
| -
|
| - fBitmapStorage = NULL;
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - fFactoryTDArray = NULL;
|
| - fFactoryArray = NULL;
|
| - fFactoryCount = 0;
|
| - fBitmapDecoder = NULL;
|
| -#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
|
| - fDecodedBitmapIndex = -1;
|
| -#endif // DEBUG_NON_DETERMINISTIC_ASSERT
|
| -}
|
| -
|
| -SkOrderedReadBuffer::~SkOrderedReadBuffer() {
|
| - sk_free(fMemoryPtr);
|
| - SkSafeUnref(fBitmapStorage);
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readBool() {
|
| - return fReader.readBool();
|
| -}
|
| -
|
| -SkColor SkOrderedReadBuffer::readColor() {
|
| - return fReader.readInt();
|
| -}
|
| -
|
| -SkFixed SkOrderedReadBuffer::readFixed() {
|
| - return fReader.readS32();
|
| -}
|
| -
|
| -int32_t SkOrderedReadBuffer::readInt() {
|
| - return fReader.readInt();
|
| -}
|
| -
|
| -SkScalar SkOrderedReadBuffer::readScalar() {
|
| - return fReader.readScalar();
|
| -}
|
| -
|
| -uint32_t SkOrderedReadBuffer::readUInt() {
|
| - return fReader.readU32();
|
| -}
|
| -
|
| -int32_t SkOrderedReadBuffer::read32() {
|
| - return fReader.readInt();
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readString(SkString* string) {
|
| - size_t len;
|
| - const char* strContents = fReader.readString(&len);
|
| - string->set(strContents, len);
|
| -}
|
| -
|
| -void* SkOrderedReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncoding encoding) {
|
| - SkDEBUGCODE(int32_t encodingType = ) fReader.readInt();
|
| - SkASSERT(encodingType == encoding);
|
| - *length = fReader.readInt();
|
| - void* data = sk_malloc_throw(*length);
|
| - memcpy(data, fReader.skip(SkAlign4(*length)), *length);
|
| - return data;
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readPoint(SkPoint* point) {
|
| - point->fX = fReader.readScalar();
|
| - point->fY = fReader.readScalar();
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readMatrix(SkMatrix* matrix) {
|
| - fReader.readMatrix(matrix);
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readIRect(SkIRect* rect) {
|
| - memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect));
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readRect(SkRect* rect) {
|
| - memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect));
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readRegion(SkRegion* region) {
|
| - fReader.readRegion(region);
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readPath(SkPath* path) {
|
| - fReader.readPath(path);
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readArray(void* value, size_t size, size_t elementSize) {
|
| - const size_t count = this->getArrayCount();
|
| - if (count == size) {
|
| - (void)fReader.skip(sizeof(uint32_t)); // Skip array count
|
| - const size_t byteLength = count * elementSize;
|
| - memcpy(value, fReader.skip(SkAlign4(byteLength)), byteLength);
|
| - return true;
|
| - }
|
| - SkASSERT(false);
|
| - fReader.skip(fReader.available());
|
| - return false;
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readByteArray(void* value, size_t size) {
|
| - return readArray(static_cast<unsigned char*>(value), size, sizeof(unsigned char));
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readColorArray(SkColor* colors, size_t size) {
|
| - return readArray(colors, size, sizeof(SkColor));
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readIntArray(int32_t* values, size_t size) {
|
| - return readArray(values, size, sizeof(int32_t));
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readPointArray(SkPoint* points, size_t size) {
|
| - return readArray(points, size, sizeof(SkPoint));
|
| -}
|
| -
|
| -bool SkOrderedReadBuffer::readScalarArray(SkScalar* values, size_t size) {
|
| - return readArray(values, size, sizeof(SkScalar));
|
| -}
|
| -
|
| -uint32_t SkOrderedReadBuffer::getArrayCount() {
|
| - return *(uint32_t*)fReader.peek();
|
| -}
|
| -
|
| -void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) {
|
| - const int width = this->readInt();
|
| - const int height = this->readInt();
|
| - // The writer stored a boolean value to determine whether an SkBitmapHeap was used during
|
| - // writing.
|
| - if (this->readBool()) {
|
| - // An SkBitmapHeap was used for writing. Read the index from the stream and find the
|
| - // corresponding SkBitmap in fBitmapStorage.
|
| - const uint32_t index = fReader.readU32();
|
| - fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::writeBitmap)
|
| - if (fBitmapStorage) {
|
| - *bitmap = *fBitmapStorage->getBitmap(index);
|
| - fBitmapStorage->releaseRef(index);
|
| - return;
|
| - } else {
|
| - // The bitmap was stored in a heap, but there is no way to access it. Set an error and
|
| - // fall through to use a place holder bitmap.
|
| - SkErrorInternals::SetError(kParseError_SkError, "SkOrderedWriteBuffer::writeBitmap "
|
| - "stored the SkBitmap in an SkBitmapHeap, but "
|
| - "SkOrderedReadBuffer has no SkBitmapHeapReader to "
|
| - "retrieve the SkBitmap.");
|
| - }
|
| - } else {
|
| - // The writer stored false, meaning the SkBitmap was not stored in an SkBitmapHeap.
|
| - const size_t length = this->readUInt();
|
| - if (length > 0) {
|
| -#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
|
| - fDecodedBitmapIndex++;
|
| -#endif // DEBUG_NON_DETERMINISTIC_ASSERT
|
| - // A non-zero size means the SkBitmap was encoded. Read the data and pixel
|
| - // offset.
|
| - const void* data = this->skip(length);
|
| - const int32_t xOffset = fReader.readS32();
|
| - const int32_t yOffset = fReader.readS32();
|
| - if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) {
|
| - if (bitmap->width() == width && bitmap->height() == height) {
|
| -#ifdef DEBUG_NON_DETERMINISTIC_ASSERT
|
| - if (0 != xOffset || 0 != yOffset) {
|
| - SkDebugf("SkOrderedReadBuffer::readBitmap: heights match,"
|
| - " but offset is not zero. \nInfo about the bitmap:"
|
| - "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncoded"
|
| - " data size: %d\n\tOffset: (%d, %d)\n",
|
| - fDecodedBitmapIndex, width, height, length, xOffset,
|
| - yOffset);
|
| - }
|
| -#endif // DEBUG_NON_DETERMINISTIC_ASSERT
|
| - // If the width and height match, there should be no offset.
|
| - SkASSERT(0 == xOffset && 0 == yOffset);
|
| - return;
|
| - }
|
| -
|
| - // This case can only be reached if extractSubset was called, so
|
| - // the recorded width and height must be smaller than or equal to
|
| - // the encoded width and height.
|
| - // FIXME (scroggo): This assert assumes that our decoder and the
|
| - // sources encoder agree on the width and height which may not
|
| - // always be the case. Removing until it can be investigated
|
| - // further.
|
| - //SkASSERT(width <= bitmap->width() && height <= bitmap->height());
|
| -
|
| - SkBitmap subsetBm;
|
| - SkIRect subset = SkIRect::MakeXYWH(xOffset, yOffset, width, height);
|
| - if (bitmap->extractSubset(&subsetBm, subset)) {
|
| - bitmap->swap(subsetBm);
|
| - return;
|
| - }
|
| - }
|
| - // This bitmap was encoded when written, but we are unable to decode, possibly due to
|
| - // not having a decoder.
|
| - SkErrorInternals::SetError(kParseError_SkError,
|
| - "Could not decode bitmap. Resulting bitmap will be red.");
|
| - } else {
|
| - // A size of zero means the SkBitmap was simply flattened.
|
| - bitmap->unflatten(*this);
|
| - return;
|
| - }
|
| - }
|
| - // Could not read the SkBitmap. Use a placeholder bitmap.
|
| - bitmap->allocPixels(SkImageInfo::MakeN32Premul(width, height));
|
| - bitmap->eraseColor(SK_ColorRED);
|
| -}
|
| -
|
| -SkTypeface* SkOrderedReadBuffer::readTypeface() {
|
| -
|
| - uint32_t index = fReader.readU32();
|
| - if (0 == index || index > (unsigned)fTFCount) {
|
| - if (index) {
|
| - SkDebugf("====== typeface index %d\n", index);
|
| - }
|
| - return NULL;
|
| - } else {
|
| - SkASSERT(fTFArray);
|
| - return fTFArray[index - 1];
|
| - }
|
| -}
|
| -
|
| -SkFlattenable* SkOrderedReadBuffer::readFlattenable(SkFlattenable::Type ft) {
|
| - //
|
| - // TODO: confirm that ft matches the factory we decide to use
|
| - //
|
| -
|
| - SkFlattenable::Factory factory = NULL;
|
| -
|
| - if (fFactoryCount > 0) {
|
| - int32_t index = fReader.readU32();
|
| - if (0 == index) {
|
| - return NULL; // writer failed to give us the flattenable
|
| - }
|
| - index -= 1; // we stored the index-base-1
|
| - SkASSERT(index < fFactoryCount);
|
| - factory = fFactoryArray[index];
|
| - } else if (fFactoryTDArray) {
|
| - int32_t index = fReader.readU32();
|
| - if (0 == index) {
|
| - return NULL; // writer failed to give us the flattenable
|
| - }
|
| - index -= 1; // we stored the index-base-1
|
| - factory = (*fFactoryTDArray)[index];
|
| - } else {
|
| - factory = (SkFlattenable::Factory)readFunctionPtr();
|
| - if (NULL == factory) {
|
| - return NULL; // writer failed to give us the flattenable
|
| - }
|
| - }
|
| -
|
| - // if we get here, factory may still be null, but if that is the case, the
|
| - // failure was ours, not the writer.
|
| - SkFlattenable* obj = NULL;
|
| - uint32_t sizeRecorded = fReader.readU32();
|
| - if (factory) {
|
| - uint32_t offset = fReader.offset();
|
| - obj = (*factory)(*this);
|
| - // check that we read the amount we expected
|
| - uint32_t sizeRead = fReader.offset() - offset;
|
| - if (sizeRecorded != sizeRead) {
|
| - // we could try to fix up the offset...
|
| - sk_throw();
|
| - }
|
| - } else {
|
| - // we must skip the remaining data
|
| - fReader.skip(sizeRecorded);
|
| - }
|
| - return obj;
|
| -}
|
|
|