2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "include/core/SkData.h"
9 #include "include/core/SkStream.h"
11 #ifndef FakeStreams_DEFINED
12 #define FakeStreams_DEFINED
14 // Stream that is not an asset stream (!hasPosition() or !hasLength())
15 class NotAssetMemStream : public SkStream {
17 NotAssetMemStream(sk_sp<SkData> data) : fStream(std::move(data)) {}
19 bool hasPosition() const override {
23 bool hasLength() const override {
27 size_t peek(void* buf, size_t bytes) const override {
28 return fStream.peek(buf, bytes);
30 size_t read(void* buf, size_t bytes) override {
31 return fStream.read(buf, bytes);
33 bool rewind() override {
34 return fStream.rewind();
36 bool isAtEnd() const override {
37 return fStream.isAtEnd();
40 SkMemoryStream fStream;
44 * Represents a stream without all of its data.
46 class HaltingStream : public SkStream {
48 HaltingStream(sk_sp<SkData> data, size_t initialLimit)
49 : fTotalSize(data->size())
50 , fLimit(initialLimit)
51 , fStream(std::move(data))
54 void addNewData(size_t extra) {
55 fLimit = std::min(fTotalSize, fLimit + extra);
58 size_t read(void* buffer, size_t size) override {
59 if (fStream.getPosition() + size > fLimit) {
60 size = fLimit - fStream.getPosition();
63 return fStream.read(buffer, size);
66 bool isAtEnd() const override {
67 return fStream.isAtEnd();
70 bool hasLength() const override { return true; }
71 size_t getLength() const override { return fLimit; }
73 bool hasPosition() const override { return true; }
74 size_t getPosition() const override { return fStream.getPosition(); }
75 bool rewind() override { return fStream.rewind(); }
76 bool move(long offset) override { return fStream.move(offset); }
77 bool seek(size_t position) override { return fStream.seek(position); }
79 bool isAllDataReceived() const { return fLimit == fTotalSize; }
82 const size_t fTotalSize;
84 SkMemoryStream fStream;
86 #endif // FakeStreams_DEFINED