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