/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkStreamPriv_DEFINED #define SkStreamPriv_DEFINED #include "include/core/SkRefCnt.h" #include "include/core/SkStream.h" #include "src/base/SkEndian.h" #include class SkData; /** * Copy the provided stream to an SkData variable. * * Note: Assumes the stream is at the beginning. If it has a length, * but is not at the beginning, this call will fail (return NULL). * * @param stream SkStream to be copied into data. * @return The resulting SkData after the copy, nullptr on failure. */ sk_sp SkCopyStreamToData(SkStream* stream); /** * Copies the input stream from the current position to the end. * Does not rewind the input stream. */ bool SkStreamCopy(SkWStream* out, SkStream* input); /** A SkWStream that writes all output to SkDebugf, for debugging purposes. */ class SkDebugfStream final : public SkWStream { public: bool write(const void* buffer, size_t size) override; size_t bytesWritten() const override; private: size_t fBytesWritten = 0; }; /** * Helper functions to write big-endian values to a stream. */ inline bool SkWStreamWriteU16BE(SkWStream* s, uint16_t value) { value = SkEndian_SwapBE16(value); return s->write(&value, sizeof(value)); } inline bool SkWStreamWriteU32BE(SkWStream* s, uint32_t value) { value = SkEndian_SwapBE32(value); return s->write(&value, sizeof(value)); } inline bool SkWStreamWriteS32BE(SkWStream* s, int32_t value) { value = SkEndian_SwapBE32(value); return s->write(&value, sizeof(value)); } // If the stream supports identifying the current position and total length, this returns // true if there are not enough bytes in the stream to fulfill a read of the given length. // Otherwise, it returns false. // False does *not* mean a read will succeed of the given length, but true means we are // certain it will fail. bool StreamRemainingLengthIsBelow(SkStream* stream, size_t len); #endif // SkStreamPriv_DEFINED