| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkData.h" |
| #include "include/core/SkStream.h" |
| |
| #ifndef FakeStreams_DEFINED |
| #define FakeStreams_DEFINED |
| |
| // Stream that is not an asset stream (!hasPosition() or !hasLength()) |
| class NotAssetMemStream : public SkStream { |
| public: |
| NotAssetMemStream(sk_sp<SkData> data) : fStream(std::move(data)) {} |
| |
| bool hasPosition() const override { |
| return false; |
| } |
| |
| bool hasLength() const override { |
| return false; |
| } |
| |
| size_t peek(void* buf, size_t bytes) const override { |
| return fStream.peek(buf, bytes); |
| } |
| size_t read(void* buf, size_t bytes) override { |
| return fStream.read(buf, bytes); |
| } |
| bool rewind() override { |
| return fStream.rewind(); |
| } |
| bool isAtEnd() const override { |
| return fStream.isAtEnd(); |
| } |
| private: |
| SkMemoryStream fStream; |
| }; |
| |
| class NonseekableStream : public NotAssetMemStream { |
| public: |
| NonseekableStream(sk_sp<SkData> data) : INHERITED(std::move(data)) {} |
| |
| bool rewind() override { |
| return false; |
| } |
| |
| bool seek(size_t /* position */) override { |
| return false; |
| } |
| private: |
| using INHERITED = NotAssetMemStream; |
| }; |
| |
| /* |
| * Represents a stream without all of its data. |
| */ |
| class HaltingStream : public SkStream { |
| public: |
| HaltingStream(sk_sp<SkData> data, size_t initialLimit) |
| : fTotalSize(data->size()) |
| , fLimit(initialLimit) |
| , fStream(std::move(data)) |
| {} |
| |
| void addNewData(size_t extra) { |
| fLimit = std::min(fTotalSize, fLimit + extra); |
| } |
| |
| size_t read(void* buffer, size_t size) override { |
| if (fStream.getPosition() + size > fLimit) { |
| size = fLimit - fStream.getPosition(); |
| } |
| |
| return fStream.read(buffer, size); |
| } |
| |
| bool isAtEnd() const override { |
| return fStream.isAtEnd(); |
| } |
| |
| bool hasLength() const override { return true; } |
| size_t getLength() const override { return fLimit; } |
| |
| bool hasPosition() const override { return true; } |
| size_t getPosition() const override { return fStream.getPosition(); } |
| bool rewind() override { return fStream.rewind(); } |
| bool move(long offset) override { return fStream.move(offset); } |
| bool seek(size_t position) override { return fStream.seek(position); } |
| |
| bool isAllDataReceived() const { return fLimit == fTotalSize; } |
| |
| private: |
| const size_t fTotalSize; |
| size_t fLimit; |
| SkMemoryStream fStream; |
| }; |
| #endif // FakeStreams_DEFINED |