1404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III/* 2404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III * Copyright 2013 Google Inc. 3404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III * 4404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III * Use of this source code is governed by a BSD-style license that can be 5404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III * found in the LICENSE file. 6404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III */ 7404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III 8404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III#include "SkStream.h" 9404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III#include "SkStreamHelpers.h" 10404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III#include "SkTypes.h" 11404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III 12404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins IIIsize_t CopyStreamToStorage(SkAutoMalloc* storage, SkStream* stream) { 13404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkASSERT(storage != NULL); 14404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkASSERT(stream != NULL); 15404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III 16404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III if (stream->hasLength()) { 17404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III const size_t length = stream->getLength(); 18404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III void* dst = storage->reset(length); 19404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III if (stream->read(dst, length) != length) { 20404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III return 0; 21404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III } 22404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III return length; 23404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III } 24404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III 25404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkDynamicMemoryWStream tempStream; 26404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III // Arbitrary buffer size. 27404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III const size_t bufferSize = 256 * 1024; // 256KB 28404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III char buffer[bufferSize]; 29404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkDEBUGCODE(size_t debugLength = 0;) 30404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III do { 31404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III size_t bytesRead = stream->read(buffer, bufferSize); 32404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III tempStream.write(buffer, bytesRead); 33404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkDEBUGCODE(debugLength += bytesRead); 34404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III SkASSERT(tempStream.bytesWritten() == debugLength); 35404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III } while (!stream->isAtEnd()); 36404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III const size_t length = tempStream.bytesWritten(); 37404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III void* dst = storage->reset(length); 38404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III tempStream.copyTo(dst); 39404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III return length; 40404e5726adadda5aedc12705f662aa471981ec3fLeon Scroggins III} 41