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