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