1dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com/* 2dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com * Copyright 2013 Google Inc. 3dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com * 4dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com * Use of this source code is governed by a BSD-style license that can be 5dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com * found in the LICENSE file. 6dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com */ 7dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com 899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski#include "SkData.h" 9dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com#include "SkStream.h" 10dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com#include "SkStreamHelpers.h" 11dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com#include "SkTypes.h" 12dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com 13dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.comsize_t CopyStreamToStorage(SkAutoMalloc* storage, SkStream* stream) { 14dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkASSERT(storage != NULL); 15dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkASSERT(stream != NULL); 16dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com 17dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com if (stream->hasLength()) { 18dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com const size_t length = stream->getLength(); 19dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com void* dst = storage->reset(length); 20dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com if (stream->read(dst, length) != length) { 21dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com return 0; 22dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com } 23dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com return length; 24dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com } 25dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com 26dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkDynamicMemoryWStream tempStream; 27dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com // Arbitrary buffer size. 28dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com const size_t bufferSize = 256 * 1024; // 256KB 29dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com char buffer[bufferSize]; 30dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkDEBUGCODE(size_t debugLength = 0;) 31dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com do { 32dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com size_t bytesRead = stream->read(buffer, bufferSize); 33dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com tempStream.write(buffer, bytesRead); 34dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkDEBUGCODE(debugLength += bytesRead); 35dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com SkASSERT(tempStream.bytesWritten() == debugLength); 36dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com } while (!stream->isAtEnd()); 37dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com const size_t length = tempStream.bytesWritten(); 38dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com void* dst = storage->reset(length); 39dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com tempStream.copyTo(dst); 40dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com return length; 41dbf9f884c3996587ec9a9fd0f091357cf998c267scroggo@google.com} 4299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 4399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevskiSkData *CopyStreamToData(SkStream* stream) { 4499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkASSERT(stream != NULL); 4599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 4699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski if (stream->hasLength()) { 4799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski const size_t length = stream->getLength(); 4899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski void* dst = sk_malloc_throw(length); 4999ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski if (stream->read(dst, length) != length) { 5099ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski return 0; 5199ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski } 5299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski return SkData::NewFromMalloc(dst, length); 5399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski } 5499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski 5599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkDynamicMemoryWStream tempStream; 5699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski // Arbitrary buffer size. 5799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski const size_t bufferSize = 256 * 1024; // 256KB 5899ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski char buffer[bufferSize]; 5999ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkDEBUGCODE(size_t debugLength = 0;) 6099ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski do { 6199ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski size_t bytesRead = stream->read(buffer, bufferSize); 6299ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski tempStream.write(buffer, bytesRead); 6399ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkDEBUGCODE(debugLength += bytesRead); 6499ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski SkASSERT(tempStream.bytesWritten() == debugLength); 6599ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski } while (!stream->isAtEnd()); 6699ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski return tempStream.copyToData(); 6799ffe24200d8940ceba20f6fbf8c460f994d3cd1krajcevski} 68