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