diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-08 14:48:44 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-08 14:48:44 +0000 |
commit | ee18f2a3c92f3df3998cc93ffc438a9453281c6b (patch) | |
tree | baa9f94223b1789bafe1a99f7ddcbd66035060db /src/utils | |
parent | 8fec4099d897e87df8152c2a090c22dc6c45cd6c (diff) |
extract some common code from PictureRenderer
R=borenet@google.com
Author: epoger@google.com
Review URL: https://codereview.chromium.org/273703006
git-svn-id: http://skia.googlecode.com/svn/trunk@14638 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkDataUtils.cpp | 28 | ||||
-rw-r--r-- | src/utils/SkDataUtils.h | 63 |
2 files changed, 91 insertions, 0 deletions
diff --git a/src/utils/SkDataUtils.cpp b/src/utils/SkDataUtils.cpp new file mode 100644 index 0000000000..c5544f71ba --- /dev/null +++ b/src/utils/SkDataUtils.cpp @@ -0,0 +1,28 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkData.h" +#include "SkDataUtils.h" +#include "SkStream.h" + +/*static*/ SkData* SkDataUtils::ReadIntoSkData(SkStream &stream, size_t maxBytes) { + if (0 == maxBytes) { + return SkData::NewEmpty(); + } + char* bufStart = reinterpret_cast<char *>(sk_malloc_throw(maxBytes)); + char* bufPtr = bufStart; + size_t bytesRemaining = maxBytes; + while (bytesRemaining > 0) { + size_t bytesReadThisTime = stream.read(bufPtr, bytesRemaining); + if (0 == bytesReadThisTime) { + break; + } + bytesRemaining -= bytesReadThisTime; + bufPtr += bytesReadThisTime; + } + return SkData::NewFromMalloc(bufStart, maxBytes - bytesRemaining); +} diff --git a/src/utils/SkDataUtils.h b/src/utils/SkDataUtils.h new file mode 100644 index 0000000000..fc237f7b1a --- /dev/null +++ b/src/utils/SkDataUtils.h @@ -0,0 +1,63 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkDataUtils_DEFINED +#define SkDataUtils_DEFINED + +#include "SkData.h" +#include "SkStream.h" + +/** + * Static class that performs various operations on SkData objects. + * + * EPOGER: Before committing, add unittests for these methods. + * + * TODO(epoger): Move these methods into SkStream.[cpp|h], as attempted in + * https://codereview.appspot.com/7300071 ? + */ +class SkDataUtils { +public: + /** + * Read as many bytes as possible (up to maxBytes) from the stream into + * an SkData object. + * + * If the returned SkData contains fewer than maxBytes, then EOF has been + * reached and no more data would be available from subsequent calls. + * (If EOF has already been reached, then this call will return an empty + * SkData object immediately.) + * + * If there are fewer than maxBytes bytes available to read from the + * stream, but the stream has not been closed yet, this call will block + * until there are enough bytes to read or the stream has been closed. + * + * It is up to the caller to call unref() on the returned SkData object + * once the data is no longer needed, so that the underlying buffer will + * be freed. For example: + * + * { + * size_t maxBytes = 256; + * SkAutoDataUnref dataRef(readIntoSkData(stream, maxBytes)); + * if (NULL != dataRef.get()) { + * size_t bytesActuallyRead = dataRef.get()->size(); + * // use the data... + * } + * } + * // underlying buffer has been freed, thanks to auto unref + */ + static SkData* ReadIntoSkData(SkStream &stream, size_t maxBytes); + + /** + * Wrapper around ReadIntoSkData for files: reads the entire file into + * an SkData object. + */ + static SkData* ReadFileIntoSkData(SkFILEStream &stream) { + return ReadIntoSkData(stream, stream.getLength()); + } + +}; + +#endif |