| Index: skia/images/SkStream.cpp
|
| ===================================================================
|
| --- skia/images/SkStream.cpp (revision 16859)
|
| +++ skia/images/SkStream.cpp (working copy)
|
| @@ -1,856 +0,0 @@
|
| -/* libs/graphics/images/SkStream.cpp
|
| -**
|
| -** Copyright 2006, The Android Open Source Project
|
| -**
|
| -** Licensed under the Apache License, Version 2.0 (the "License");
|
| -** you may not use this file except in compliance with the License.
|
| -** You may obtain a copy of the License at
|
| -**
|
| -** http://www.apache.org/licenses/LICENSE-2.0
|
| -**
|
| -** Unless required by applicable law or agreed to in writing, software
|
| -** distributed under the License is distributed on an "AS IS" BASIS,
|
| -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -** See the License for the specific language governing permissions and
|
| -** limitations under the License.
|
| -*/
|
| -
|
| -#include "SkStream.h"
|
| -#include "SkFixed.h"
|
| -#include "SkString.h"
|
| -#include "SkOSFile.h"
|
| -
|
| -SkStream::~SkStream() {}
|
| -
|
| -const char* SkStream::getFileName()
|
| -{
|
| - // override in subclass if you represent a file
|
| - return NULL;
|
| -}
|
| -
|
| -const void* SkStream::getMemoryBase()
|
| -{
|
| - // override in subclass if you represent a memory block
|
| - return NULL;
|
| -}
|
| -
|
| -size_t SkStream::skip(size_t size)
|
| -{
|
| - /* Check for size == 0, and just return 0. If we passed that
|
| - to read(), it would interpret it as a request for the entire
|
| - size of the stream.
|
| - */
|
| - return size ? this->read(NULL, size) : 0;
|
| -}
|
| -
|
| -int8_t SkStream::readS8() {
|
| - int8_t value;
|
| - size_t len = this->read(&value, 1);
|
| - SkASSERT(1 == len);
|
| - return value;
|
| -}
|
| -
|
| -int16_t SkStream::readS16() {
|
| - int16_t value;
|
| - size_t len = this->read(&value, 2);
|
| - SkASSERT(2 == len);
|
| - return value;
|
| -}
|
| -
|
| -int32_t SkStream::readS32() {
|
| - int32_t value;
|
| - size_t len = this->read(&value, 4);
|
| - SkASSERT(4 == len);
|
| - return value;
|
| -}
|
| -
|
| -SkScalar SkStream::readScalar() {
|
| - SkScalar value;
|
| - size_t len = this->read(&value, sizeof(SkScalar));
|
| - SkASSERT(sizeof(SkScalar) == len);
|
| - return value;
|
| -}
|
| -
|
| -size_t SkStream::readPackedUInt() {
|
| - uint8_t byte;
|
| - if (!this->read(&byte, 1)) {
|
| - return 0;
|
| - }
|
| - if (byte != 0xFF) {
|
| - return byte;
|
| - }
|
| -
|
| - uint16_t word;
|
| - if (!this->read(&word, 2)) {
|
| - return 0;
|
| - }
|
| - if (word != 0xFFFF) {
|
| - return word;
|
| - }
|
| -
|
| - uint32_t quad;
|
| - if (!this->read(&quad, 4)) {
|
| - return 0;
|
| - }
|
| - return quad;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkWStream::~SkWStream()
|
| -{
|
| -}
|
| -
|
| -void SkWStream::newline()
|
| -{
|
| - this->write("\n", 1);
|
| -}
|
| -
|
| -void SkWStream::flush()
|
| -{
|
| -}
|
| -
|
| -bool SkWStream::writeText(const char text[])
|
| -{
|
| - SkASSERT(text);
|
| - return this->write(text, strlen(text));
|
| -}
|
| -
|
| -bool SkWStream::writeDecAsText(int32_t dec)
|
| -{
|
| - SkString tmp;
|
| - tmp.appendS32(dec);
|
| - return this->write(tmp.c_str(), tmp.size());
|
| -}
|
| -
|
| -bool SkWStream::writeHexAsText(uint32_t hex, int digits)
|
| -{
|
| - SkString tmp;
|
| - tmp.appendHex(hex, digits);
|
| - return this->write(tmp.c_str(), tmp.size());
|
| -}
|
| -
|
| -bool SkWStream::writeScalarAsText(SkScalar value)
|
| -{
|
| - SkString tmp;
|
| - tmp.appendScalar(value);
|
| - return this->write(tmp.c_str(), tmp.size());
|
| -}
|
| -
|
| -bool SkWStream::write8(U8CPU value) {
|
| - uint8_t v = SkToU8(value);
|
| - return this->write(&v, 1);
|
| -}
|
| -
|
| -bool SkWStream::write16(U16CPU value) {
|
| - uint16_t v = SkToU16(value);
|
| - return this->write(&v, 2);
|
| -}
|
| -
|
| -bool SkWStream::write32(uint32_t value) {
|
| - return this->write(&value, 4);
|
| -}
|
| -
|
| -bool SkWStream::writeScalar(SkScalar value) {
|
| - return this->write(&value, sizeof(value));
|
| -}
|
| -
|
| -bool SkWStream::writePackedUInt(size_t value) {
|
| - if (value < 0xFF) {
|
| - return this->write8(value);
|
| - } else if (value < 0xFFFF) {
|
| - return this->write8(0xFF) && this->write16(value);
|
| - } else {
|
| - return this->write16(0xFFFF) && this->write32(value);
|
| - }
|
| -}
|
| -
|
| -bool SkWStream::writeStream(SkStream* stream, size_t length) {
|
| - char scratch[1024];
|
| - const size_t MAX = sizeof(scratch);
|
| -
|
| - while (length != 0) {
|
| - size_t n = length;
|
| - if (n > MAX) {
|
| - n = MAX;
|
| - }
|
| - stream->read(scratch, n);
|
| - if (!this->write(scratch, n)) {
|
| - return false;
|
| - }
|
| - length -= n;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkFILEStream::SkFILEStream(const char file[]) : fName(file)
|
| -{
|
| -#ifdef SK_BUILD_FOR_BREW
|
| - if (SkStrEndsWith(fName.c_str(), ".xml"))
|
| - fName.writable_str()[fName.size()-3] = 'b';
|
| -#endif
|
| -
|
| - fFILE = file ? sk_fopen(fName.c_str(), kRead_SkFILE_Flag) : NULL;
|
| -}
|
| -
|
| -SkFILEStream::~SkFILEStream()
|
| -{
|
| - if (fFILE)
|
| - sk_fclose(fFILE);
|
| -}
|
| -
|
| -void SkFILEStream::setPath(const char path[])
|
| -{
|
| - fName.set(path);
|
| -#ifdef SK_BUILD_FOR_BREW
|
| - if (SkStrEndsWith(fName.c_str(), ".xml"))
|
| - fName.writable_str()[fName.size()-3] = 'b';
|
| -#endif
|
| -
|
| - if (fFILE)
|
| - {
|
| - sk_fclose(fFILE);
|
| - fFILE = NULL;
|
| - }
|
| - if (path)
|
| - fFILE = sk_fopen(fName.c_str(), kRead_SkFILE_Flag);
|
| -}
|
| -
|
| -const char* SkFILEStream::getFileName()
|
| -{
|
| - return fName.c_str();
|
| -}
|
| -
|
| -bool SkFILEStream::rewind()
|
| -{
|
| - if (fFILE)
|
| - {
|
| - if (sk_frewind(fFILE))
|
| - return true;
|
| - // we hit an error
|
| - sk_fclose(fFILE);
|
| - fFILE = NULL;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -size_t SkFILEStream::read(void* buffer, size_t size)
|
| -{
|
| - if (fFILE)
|
| - {
|
| - if (buffer == NULL && size == 0) // special signature, they want the total size
|
| - return sk_fgetsize(fFILE);
|
| - else
|
| - return sk_fread(buffer, size, fFILE);
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkMemoryStream::SkMemoryStream()
|
| -{
|
| - fWeOwnTheData = false;
|
| - this->setMemory(NULL, 0);
|
| -}
|
| -
|
| -SkMemoryStream::SkMemoryStream(size_t size) {
|
| - fWeOwnTheData = true;
|
| - fOffset = 0;
|
| - fSize = size;
|
| - fSrc = sk_malloc_throw(size);
|
| -}
|
| -
|
| -SkMemoryStream::SkMemoryStream(const void* src, size_t size, bool copyData)
|
| -{
|
| - fWeOwnTheData = false;
|
| - this->setMemory(src, size, copyData);
|
| -}
|
| -
|
| -SkMemoryStream::~SkMemoryStream()
|
| -{
|
| - if (fWeOwnTheData)
|
| - sk_free((void*)fSrc);
|
| -}
|
| -
|
| -void SkMemoryStream::setMemory(const void* src, size_t size, bool copyData)
|
| -{
|
| - if (fWeOwnTheData)
|
| - sk_free((void*)fSrc);
|
| -
|
| - fSize = size;
|
| - fOffset = 0;
|
| - fWeOwnTheData = copyData;
|
| -
|
| - if (copyData)
|
| - {
|
| - void* copy = sk_malloc_throw(size);
|
| - memcpy(copy, src, size);
|
| - src = copy;
|
| - }
|
| - fSrc = src;
|
| -}
|
| -
|
| -void SkMemoryStream::skipToAlign4()
|
| -{
|
| - // cast to remove unary-minus warning
|
| - fOffset += -(int)fOffset & 0x03;
|
| -}
|
| -
|
| -bool SkMemoryStream::rewind()
|
| -{
|
| - fOffset = 0;
|
| - return true;
|
| -}
|
| -
|
| -size_t SkMemoryStream::read(void* buffer, size_t size)
|
| -{
|
| - if (buffer == NULL && size == 0) // special signature, they want the total size
|
| - return fSize;
|
| -
|
| - // if buffer is NULL, seek ahead by size
|
| -
|
| - if (size == 0)
|
| - return 0;
|
| - if (size > fSize - fOffset)
|
| - size = fSize - fOffset;
|
| - if (buffer) {
|
| - memcpy(buffer, (const char*)fSrc + fOffset, size);
|
| - }
|
| - fOffset += size;
|
| - return size;
|
| -}
|
| -
|
| -const void* SkMemoryStream::getMemoryBase()
|
| -{
|
| - return fSrc;
|
| -}
|
| -
|
| -const void* SkMemoryStream::getAtPos()
|
| -{
|
| - return (const char*)fSrc + fOffset;
|
| -}
|
| -
|
| -size_t SkMemoryStream::seek(size_t offset)
|
| -{
|
| - if (offset > fSize)
|
| - offset = fSize;
|
| - fOffset = offset;
|
| - return offset;
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkBufferStream::SkBufferStream(SkStream* proxy, size_t bufferSize)
|
| - : fProxy(proxy)
|
| -{
|
| - SkASSERT(proxy != NULL);
|
| - proxy->ref();
|
| - this->init(NULL, bufferSize);
|
| -}
|
| -
|
| -SkBufferStream::SkBufferStream(SkStream* proxy, void* buffer, size_t bufferSize)
|
| - : fProxy(proxy)
|
| -{
|
| - SkASSERT(proxy != NULL);
|
| - SkASSERT(buffer == NULL || bufferSize != 0); // init(addr, 0) makes no sense, we must know how big their buffer is
|
| - proxy->ref();
|
| - this->init(buffer, bufferSize);
|
| -}
|
| -
|
| -void SkBufferStream::init(void* buffer, size_t bufferSize)
|
| -{
|
| - if (bufferSize == 0)
|
| - bufferSize = kDefaultBufferSize;
|
| -
|
| - fOrigBufferSize = bufferSize;
|
| - fBufferSize = bufferSize;
|
| - fBufferOffset = bufferSize; // to trigger a reload on the first read()
|
| -
|
| - if (buffer == NULL)
|
| - {
|
| - fBuffer = (char*)sk_malloc_throw(fBufferSize);
|
| - fWeOwnTheBuffer = true;
|
| - }
|
| - else
|
| - {
|
| - fBuffer = (char*)buffer;
|
| - fWeOwnTheBuffer = false;
|
| - }
|
| -}
|
| -
|
| -SkBufferStream::~SkBufferStream()
|
| -{
|
| - fProxy->unref();
|
| - if (fWeOwnTheBuffer)
|
| - sk_free(fBuffer);
|
| -}
|
| -
|
| -bool SkBufferStream::rewind()
|
| -{
|
| - fBufferOffset = fBufferSize = fOrigBufferSize;
|
| - return fProxy->rewind();
|
| -}
|
| -
|
| -const char* SkBufferStream::getFileName()
|
| -{
|
| - return fProxy->getFileName();
|
| -}
|
| -
|
| -#ifdef SK_DEBUG
|
| -// #define SK_TRACE_BUFFERSTREAM
|
| -#endif
|
| -
|
| -size_t SkBufferStream::read(void* buffer, size_t size) {
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf("Request %d", size);
|
| -#endif
|
| -
|
| - if (buffer == NULL && size == 0) {
|
| - return fProxy->read(buffer, size); // requesting total size
|
| - }
|
| -
|
| - if (0 == size) {
|
| - return 0;
|
| - }
|
| -
|
| - // skip size bytes
|
| - if (NULL == buffer) {
|
| - size_t remaining = fBufferSize - fBufferOffset;
|
| - if (remaining >= size) {
|
| - fBufferOffset += size;
|
| - return size;
|
| - }
|
| - // if we get here, we are being asked to skip beyond our current buffer
|
| - // so reset our offset to force a read next time, and skip the diff
|
| - // in our proxy
|
| - fBufferOffset = fOrigBufferSize;
|
| - return remaining + fProxy->read(NULL, size - remaining);
|
| - }
|
| -
|
| - size_t s = size;
|
| - size_t actuallyRead = 0;
|
| -
|
| - // flush what we can from our fBuffer
|
| - if (fBufferOffset < fBufferSize)
|
| - {
|
| - if (s > fBufferSize - fBufferOffset)
|
| - s = fBufferSize - fBufferOffset;
|
| - memcpy(buffer, fBuffer + fBufferOffset, s);
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf(" flush %d", s);
|
| -#endif
|
| - size -= s;
|
| - fBufferOffset += s;
|
| - buffer = (char*)buffer + s;
|
| - actuallyRead = s;
|
| - }
|
| -
|
| - // check if there is more to read
|
| - if (size)
|
| - {
|
| - SkASSERT(fBufferOffset >= fBufferSize); // need to refill our fBuffer
|
| -
|
| - if (size < fBufferSize) // lets try to read more than the request
|
| - {
|
| - s = fProxy->read(fBuffer, fBufferSize);
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf(" read %d into fBuffer", s);
|
| -#endif
|
| - if (size > s) // they asked for too much
|
| - size = s;
|
| - if (size)
|
| - {
|
| - memcpy(buffer, fBuffer, size);
|
| - actuallyRead += size;
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf(" memcpy %d into dst", size);
|
| -#endif
|
| - }
|
| -
|
| - fBufferOffset = size;
|
| - fBufferSize = s; // record the (possibly smaller) size for the buffer
|
| - }
|
| - else // just do a direct read
|
| - {
|
| - actuallyRead += fProxy->read(buffer, size);
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf(" direct read %d", size);
|
| -#endif
|
| - }
|
| - }
|
| -#ifdef SK_TRACE_BUFFERSTREAM
|
| - SkDebugf("\n");
|
| -#endif
|
| - return actuallyRead;
|
| -}
|
| -
|
| -const void* SkBufferStream::getMemoryBase()
|
| -{
|
| - return fProxy->getMemoryBase();
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkFILEWStream::SkFILEWStream(const char path[])
|
| -{
|
| - fFILE = sk_fopen(path, kWrite_SkFILE_Flag);
|
| -}
|
| -
|
| -SkFILEWStream::~SkFILEWStream()
|
| -{
|
| - if (fFILE)
|
| - sk_fclose(fFILE);
|
| -}
|
| -
|
| -bool SkFILEWStream::write(const void* buffer, size_t size)
|
| -{
|
| - if (fFILE == NULL)
|
| - return false;
|
| -
|
| - if (sk_fwrite(buffer, size, fFILE) != size)
|
| - {
|
| - SkDEBUGCODE(SkDebugf("SkFILEWStream failed writing %d bytes\n", size);)
|
| - sk_fclose(fFILE);
|
| - fFILE = NULL;
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void SkFILEWStream::flush()
|
| -{
|
| - if (fFILE)
|
| - sk_fflush(fFILE);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkMemoryWStream::SkMemoryWStream(void* buffer, size_t size)
|
| - : fBuffer((char*)buffer), fMaxLength(size), fBytesWritten(0)
|
| -{
|
| -}
|
| -
|
| -bool SkMemoryWStream::write(const void* buffer, size_t size)
|
| -{
|
| - size = SkMin32(size, fMaxLength - fBytesWritten);
|
| - if (size > 0)
|
| - {
|
| - memcpy(fBuffer + fBytesWritten, buffer, size);
|
| - fBytesWritten += size;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define SkDynamicMemoryWStream_MinBlockSize 256
|
| -
|
| -struct SkDynamicMemoryWStream::Block {
|
| - Block* fNext;
|
| - char* fCurr;
|
| - char* fStop;
|
| -
|
| - const char* start() const { return (const char*)(this + 1); }
|
| - char* start() { return (char*)(this + 1); }
|
| - size_t avail() const { return fStop - fCurr; }
|
| - size_t written() const { return fCurr - this->start(); }
|
| -
|
| - void init(size_t size)
|
| - {
|
| - fNext = NULL;
|
| - fCurr = this->start();
|
| - fStop = this->start() + size;
|
| - }
|
| -
|
| - const void* append(const void* data, size_t size)
|
| - {
|
| - SkASSERT((size_t)(fStop - fCurr) >= size);
|
| - memcpy(fCurr, data, size);
|
| - fCurr += size;
|
| - return (const void*)((const char*)data + size);
|
| - }
|
| -};
|
| -
|
| -SkDynamicMemoryWStream::SkDynamicMemoryWStream() : fHead(NULL), fTail(NULL), fBytesWritten(0), fCopyToCache(NULL)
|
| -{
|
| -}
|
| -
|
| -SkDynamicMemoryWStream::~SkDynamicMemoryWStream()
|
| -{
|
| - reset();
|
| -}
|
| -
|
| -const char* SkDynamicMemoryWStream::detach()
|
| -{
|
| - const char* result = getStream();
|
| - fCopyToCache = NULL;
|
| - return result;
|
| -}
|
| -
|
| -void SkDynamicMemoryWStream::reset()
|
| -{
|
| - sk_free(fCopyToCache);
|
| - Block* block = fHead;
|
| -
|
| - while (block != NULL) {
|
| - Block* next = block->fNext;
|
| - sk_free(block);
|
| - block = next;
|
| - }
|
| - fHead = fTail = NULL;
|
| - fBytesWritten = 0;
|
| - fCopyToCache = NULL;
|
| -}
|
| -
|
| -bool SkDynamicMemoryWStream::write(const void* buffer, size_t count)
|
| -{
|
| - if (count > 0) {
|
| -
|
| - if (fCopyToCache) {
|
| - sk_free(fCopyToCache);
|
| - fCopyToCache = NULL;
|
| - }
|
| - fBytesWritten += count;
|
| -
|
| - size_t size;
|
| -
|
| - if (fTail != NULL && fTail->avail() > 0) {
|
| - size = SkMin32(fTail->avail(), count);
|
| - buffer = fTail->append(buffer, size);
|
| - SkASSERT(count >= size);
|
| - count -= size;
|
| - if (count == 0)
|
| - return true;
|
| - }
|
| -
|
| - size = SkMax32(count, SkDynamicMemoryWStream_MinBlockSize);
|
| - Block* block = (Block*)sk_malloc_throw(sizeof(Block) + size);
|
| - block->init(size);
|
| - block->append(buffer, count);
|
| -
|
| - if (fTail != NULL)
|
| - fTail->fNext = block;
|
| - else
|
| - fHead = fTail = block;
|
| - fTail = block;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool SkDynamicMemoryWStream::write(const void* buffer, size_t offset, size_t count)
|
| -{
|
| - if (offset + count > fBytesWritten)
|
| - return false; // test does not partially modify
|
| - Block* block = fHead;
|
| - while (block != NULL) {
|
| - size_t size = block->written();
|
| - if (offset < size) {
|
| - size_t part = offset + count > size ? size - offset : count;
|
| - memcpy(block->start() + offset, buffer, part);
|
| - if (count <= part)
|
| - return true;
|
| - count -= part;
|
| - buffer = (const void*) ((char* ) buffer + part);
|
| - }
|
| - offset = offset > size ? offset - size : 0;
|
| - block = block->fNext;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool SkDynamicMemoryWStream::read(void* buffer, size_t offset, size_t count)
|
| -{
|
| - if (offset + count > fBytesWritten)
|
| - return false; // test does not partially modify
|
| - Block* block = fHead;
|
| - while (block != NULL) {
|
| - size_t size = block->written();
|
| - if (offset < size) {
|
| - size_t part = offset + count > size ? size - offset : count;
|
| - memcpy(buffer, block->start() + offset, part);
|
| - if (count <= part)
|
| - return true;
|
| - count -= part;
|
| - buffer = (void*) ((char* ) buffer + part);
|
| - }
|
| - offset = offset > size ? offset - size : 0;
|
| - block = block->fNext;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void SkDynamicMemoryWStream::copyTo(void* dst) const
|
| -{
|
| - Block* block = fHead;
|
| -
|
| - while (block != NULL) {
|
| - size_t size = block->written();
|
| - memcpy(dst, block->start(), size);
|
| - dst = (void*)((char*)dst + size);
|
| - block = block->fNext;
|
| - }
|
| -}
|
| -
|
| -const char* SkDynamicMemoryWStream::getStream() const
|
| -{
|
| - if (fCopyToCache == NULL) {
|
| - fCopyToCache = (char*)sk_malloc_throw(fBytesWritten);
|
| - this->copyTo(fCopyToCache);
|
| - }
|
| - return fCopyToCache;
|
| -}
|
| -
|
| -void SkDynamicMemoryWStream::padToAlign4()
|
| -{
|
| - // cast to remove unary-minus warning
|
| - int padBytes = -(int)fBytesWritten & 0x03;
|
| - if (padBytes == 0)
|
| - return;
|
| - int zero = 0;
|
| - write(&zero, padBytes);
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void SkDebugWStream::newline()
|
| -{
|
| -#ifdef SK_DEBUG
|
| - SkDebugf("\n");
|
| -#endif
|
| -}
|
| -
|
| -bool SkDebugWStream::write(const void* buffer, size_t size)
|
| -{
|
| -#ifdef SK_DEBUG
|
| - char* s = new char[size+1];
|
| - memcpy(s, buffer, size);
|
| - s[size] = 0;
|
| - SkDebugf("%s", s);
|
| - delete[] s;
|
| -#endif
|
| - return true;
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#ifdef SK_DEBUG
|
| -
|
| -#include "SkRandom.h"
|
| -
|
| -#ifdef SK_SUPPORT_UNITTEST
|
| -#define MAX_SIZE (256 * 1024)
|
| -
|
| -static void random_fill(SkRandom& rand, void* buffer, size_t size) {
|
| - char* p = (char*)buffer;
|
| - char* stop = p + size;
|
| - while (p < stop) {
|
| - *p++ = (char)(rand.nextU() >> 8);
|
| - }
|
| -}
|
| -
|
| -static void test_buffer() {
|
| - SkRandom rand;
|
| - SkAutoMalloc am(MAX_SIZE * 2);
|
| - char* storage = (char*)am.get();
|
| - char* storage2 = storage + MAX_SIZE;
|
| -
|
| - random_fill(rand, storage, MAX_SIZE);
|
| -
|
| - for (int sizeTimes = 0; sizeTimes < 100; sizeTimes++) {
|
| - int size = rand.nextU() % MAX_SIZE;
|
| - if (size == 0) {
|
| - size = MAX_SIZE;
|
| - }
|
| - for (int times = 0; times < 100; times++) {
|
| - int bufferSize = 1 + (rand.nextU() & 0xFFFF);
|
| - SkMemoryStream mstream(storage, size);
|
| - SkBufferStream bstream(&mstream, bufferSize);
|
| -
|
| - int bytesRead = 0;
|
| - while (bytesRead < size) {
|
| - int s = 17 + (rand.nextU() & 0xFFFF);
|
| - int ss = bstream.read(storage2, s);
|
| - SkASSERT(ss > 0 && ss <= s);
|
| - SkASSERT(bytesRead + ss <= size);
|
| - SkASSERT(memcmp(storage + bytesRead, storage2, ss) == 0);
|
| - bytesRead += ss;
|
| - }
|
| - SkASSERT(bytesRead == size);
|
| - }
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -void SkStream::UnitTest() {
|
| -#ifdef SK_SUPPORT_UNITTEST
|
| - {
|
| - static const char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
| - char copy[sizeof(s)];
|
| - SkRandom rand;
|
| -
|
| - for (int i = 0; i < 65; i++)
|
| - {
|
| - char* copyPtr = copy;
|
| - SkMemoryStream mem(s, sizeof(s));
|
| - SkBufferStream buff(&mem, i);
|
| -
|
| - do {
|
| - copyPtr += buff.read(copyPtr, rand.nextU() & 15);
|
| - } while (copyPtr < copy + sizeof(s));
|
| - SkASSERT(copyPtr == copy + sizeof(s));
|
| - SkASSERT(memcmp(s, copy, sizeof(s)) == 0);
|
| - }
|
| - }
|
| - test_buffer();
|
| -#endif
|
| -}
|
| -
|
| -void SkWStream::UnitTest()
|
| -{
|
| -#ifdef SK_SUPPORT_UNITTEST
|
| - {
|
| - SkDebugWStream s;
|
| -
|
| - s.writeText("testing wstream helpers\n");
|
| - s.writeText("compare: 0 "); s.writeDecAsText(0); s.newline();
|
| - s.writeText("compare: 591 "); s.writeDecAsText(591); s.newline();
|
| - s.writeText("compare: -9125 "); s.writeDecAsText(-9125); s.newline();
|
| - s.writeText("compare: 0 "); s.writeHexAsText(0, 0); s.newline();
|
| - s.writeText("compare: 03FA "); s.writeHexAsText(0x3FA, 4); s.newline();
|
| - s.writeText("compare: DEADBEEF "); s.writeHexAsText(0xDEADBEEF, 4); s.newline();
|
| - s.writeText("compare: 0 "); s.writeScalarAsText(SkIntToScalar(0)); s.newline();
|
| - s.writeText("compare: 27 "); s.writeScalarAsText(SkIntToScalar(27)); s.newline();
|
| - s.writeText("compare: -119 "); s.writeScalarAsText(SkIntToScalar(-119)); s.newline();
|
| - s.writeText("compare: 851.3333 "); s.writeScalarAsText(SkIntToScalar(851) + SK_Scalar1/3); s.newline();
|
| - s.writeText("compare: -0.08 "); s.writeScalarAsText(-SK_Scalar1*8/100); s.newline();
|
| - }
|
| -
|
| - {
|
| - SkDynamicMemoryWStream ds;
|
| - const char s[] = "abcdefghijklmnopqrstuvwxyz";
|
| - int i;
|
| - for (i = 0; i < 100; i++) {
|
| - bool result = ds.write(s, 26);
|
| - SkASSERT(result);
|
| - }
|
| - SkASSERT(ds.getOffset() == 100 * 26);
|
| - char* dst = new char[100 * 26 + 1];
|
| - dst[100*26] = '*';
|
| - ds.copyTo(dst);
|
| - SkASSERT(dst[100*26] == '*');
|
| - // char* p = dst;
|
| - for (i = 0; i < 100; i++)
|
| - SkASSERT(memcmp(&dst[i * 26], s, 26) == 0);
|
| - SkASSERT(memcmp(dst, ds.getStream(), 100*26) == 0);
|
| - delete[] dst;
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -#endif
|
|
|