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