|
1 /* |
|
2 * Copyright 2013 Google Inc. |
|
3 * |
|
4 * Use of this source code is governed by a BSD-style license that can be |
|
5 * found in the LICENSE file. |
|
6 */ |
|
7 |
|
8 #include "SkStream.h" |
|
9 #include "SkStreamHelpers.h" |
|
10 #include "SkTypes.h" |
|
11 |
|
12 size_t CopyStreamToStorage(SkAutoMalloc* storage, SkStream* stream) { |
|
13 SkASSERT(storage != NULL); |
|
14 SkASSERT(stream != NULL); |
|
15 |
|
16 if (stream->hasLength()) { |
|
17 const size_t length = stream->getLength(); |
|
18 void* dst = storage->reset(length); |
|
19 if (stream->read(dst, length) != length) { |
|
20 return 0; |
|
21 } |
|
22 return length; |
|
23 } |
|
24 |
|
25 SkDynamicMemoryWStream tempStream; |
|
26 // Arbitrary buffer size. |
|
27 const size_t bufferSize = 256 * 1024; // 256KB |
|
28 char buffer[bufferSize]; |
|
29 SkDEBUGCODE(size_t debugLength = 0;) |
|
30 do { |
|
31 size_t bytesRead = stream->read(buffer, bufferSize); |
|
32 tempStream.write(buffer, bytesRead); |
|
33 SkDEBUGCODE(debugLength += bytesRead); |
|
34 SkASSERT(tempStream.bytesWritten() == debugLength); |
|
35 } while (!stream->isAtEnd()); |
|
36 const size_t length = tempStream.bytesWritten(); |
|
37 void* dst = storage->reset(length); |
|
38 tempStream.copyTo(dst); |
|
39 return length; |
|
40 } |