xref: /aosp_15_r20/external/skia/tests/FakeStreams.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2016 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 "include/core/SkData.h"
9 #include "include/core/SkStream.h"
10 
11 #ifndef FakeStreams_DEFINED
12 #define FakeStreams_DEFINED
13 
14 // Stream that is not an asset stream (!hasPosition() or !hasLength())
15 class NotAssetMemStream : public SkStream {
16 public:
NotAssetMemStream(sk_sp<SkData> data)17     NotAssetMemStream(sk_sp<SkData> data) : fStream(std::move(data)) {}
18 
hasPosition()19     bool hasPosition() const override {
20         return false;
21     }
22 
hasLength()23     bool hasLength() const override {
24         return false;
25     }
26 
peek(void * buf,size_t bytes)27     size_t peek(void* buf, size_t bytes) const override {
28         return fStream.peek(buf, bytes);
29     }
read(void * buf,size_t bytes)30     size_t read(void* buf, size_t bytes) override {
31         return fStream.read(buf, bytes);
32     }
rewind()33     bool rewind() override {
34         return fStream.rewind();
35     }
isAtEnd()36     bool isAtEnd() const override {
37         return fStream.isAtEnd();
38     }
39 private:
40     SkMemoryStream fStream;
41 };
42 
43 class NonseekableStream : public NotAssetMemStream {
44 public:
NonseekableStream(sk_sp<SkData> data)45     NonseekableStream(sk_sp<SkData> data) : INHERITED(std::move(data)) {}
46 
rewind()47     bool rewind() override {
48         return false;
49     }
50 
seek(size_t)51     bool seek(size_t /* position */) override {
52         return false;
53     }
54 private:
55     using INHERITED = NotAssetMemStream;
56 };
57 
58 /*
59  *  Represents a stream without all of its data.
60  */
61 class HaltingStream : public SkStream {
62 public:
HaltingStream(sk_sp<SkData> data,size_t initialLimit)63     HaltingStream(sk_sp<SkData> data, size_t initialLimit)
64         : fTotalSize(data->size())
65         , fLimit(initialLimit)
66         , fStream(std::move(data))
67     {}
68 
addNewData(size_t extra)69     void addNewData(size_t extra) {
70         fLimit = std::min(fTotalSize, fLimit + extra);
71     }
72 
read(void * buffer,size_t size)73     size_t read(void* buffer, size_t size) override {
74         if (fStream.getPosition() + size > fLimit) {
75             size = fLimit - fStream.getPosition();
76         }
77 
78         return fStream.read(buffer, size);
79     }
80 
isAtEnd()81     bool isAtEnd() const override {
82         return fStream.isAtEnd();
83     }
84 
hasLength()85     bool hasLength() const override { return true; }
getLength()86     size_t getLength() const override { return fLimit; }
87 
hasPosition()88     bool hasPosition() const override { return true; }
getPosition()89     size_t getPosition() const override { return fStream.getPosition(); }
rewind()90     bool rewind() override { return fStream.rewind(); }
move(long offset)91     bool move(long offset) override { return fStream.move(offset); }
seek(size_t position)92     bool seek(size_t position) override { return fStream.seek(position); }
93 
isAllDataReceived()94     bool isAllDataReceived() const { return fLimit == fTotalSize; }
95 
96 private:
97     const size_t    fTotalSize;
98     size_t          fLimit;
99     SkMemoryStream  fStream;
100 };
101 #endif // FakeStreams_DEFINED
102