SkStream.h revision fab44db294846ff05d837b9cf0bf97a073891da7
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 2006 The Android Open Source Project 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Use of this source code is governed by a BSD-style license that can be 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * found in the LICENSE file. 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SkStream_DEFINED 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SkStream_DEFINED 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "SkRefCnt.h" 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "SkScalar.h" 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkData; 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkStream; 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkStreamRewindable; 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkStreamSeekable; 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkStreamAsset; 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkStreamMemory; 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SkStream -- abstraction for a source of bytes. Subclasses can be backed by 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * memory, or a file, or something else. 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOTE: 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Classic "streams" APIs are sort of async, in that on a request for N 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * bytes, they may return fewer than N bytes on a given call, in which case 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the caller can "try again" to get more bytes, eventually (modulo an error) 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * receiving their total N bytes. 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Skia streams behave differently. They are effectively synchronous, and will 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * always return all N bytes of the request if possible. If they return fewer 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (the read() call returns the number of bytes read) then that means there is 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * no more data (at EOF or hit an error). The caller should *not* call again 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in hopes of fulfilling more of the request. 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkStream : public SkRefCnt { //TODO: remove SkRefCnt 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Attempts to open the specified file, and return a stream to it (using 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * mmap if available). On success, the caller must call unref() on the 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * returned object. On failure, returns NULL. 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static SkStreamAsset* NewFromFile(const char path[]); 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkStream) 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Reads or skips size number of bytes. 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If buffer == NULL, skip size bytes, return how many were skipped. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If buffer != NULL, copy size bytes into buffer, return how many were copied. 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @param buffer when NULL skip size bytes, otherwise copy size bytes into buffer 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @param size the number of bytes to skip or copy 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @return the number of bytes actually read. 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t read(void* buffer, size_t size) = 0; 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Skip size number of bytes. 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * @return the actual number bytes that could be skipped. 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t skip(size_t size) { 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //return this->read(NULL, size); 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //TODO: remove this old logic after updating existing implementations 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0 == size ? 0 : this->read(NULL, size); 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns true when all the bytes in the stream have been read. 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This may return true early (when there are no more bytes to be read) 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * or late (after the first unsuccessful read). 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * In Progress: do not use until all implementations are updated. 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * TODO: after this is implemented everywhere, make pure virtual. 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool isAtEnd() const { 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkASSERT(false); 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return true; 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int8_t readS8(); 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int16_t readS16(); 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int32_t readS32(); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project uint8_t readU8() { return (uint8_t)this->readS8(); } 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project uint16_t readU16() { return (uint16_t)this->readS16(); } 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project uint32_t readU32() { return (uint32_t)this->readS32(); } 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool readBool() { return this->readU8() != 0; } 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkScalar readScalar(); 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t readPackedUInt(); 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Reconstitute an SkData object that was written to the stream 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * using SkWStream::writeData(). 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkData* readData(); 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//SkStreamRewindable 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Rewinds to the beginning of the stream. Returns true if the stream is known 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to be at the beginning after this call returns. 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool rewind() { return false; } 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Duplicates this stream. If this cannot be done, returns NULL. 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The returned stream will be positioned at the beginning of its data. 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamRewindable* duplicate() const { return NULL; } 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//SkStreamSeekable 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns true if this stream can report it's current position. */ 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool hasPosition() const { return false; } 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns the current position in the stream. If this cannot be done, returns 0. */ 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getPosition() const { return 0; } 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Seeks to an absolute position in the stream. If this cannot be done, returns false. 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If an attempt is made to seek past the end of the stream, the position will be set 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to the end of the stream. 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool seek(size_t position) { return false; } 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Seeks to an relative offset in the stream. If this cannot be done, returns false. 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If an attempt is made to move to a position outside the stream, the position will be set 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to the closest point within the stream (beginning or end). 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool move(long offset) { return false; } 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Duplicates this stream. If this cannot be done, returns NULL. 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The returned stream will be positioned the same as this stream. 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamSeekable* fork() const { return NULL; } 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//SkStreamAsset 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns true if this stream can report it's total length. */ 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool hasLength() const { return false; } 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns the total length of the stream. If this cannot be done, returns 0. */ 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getLength() const { 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //return 0; 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //TODO: remove the following after everyone is updated. 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return ((SkStream*)this)->read(NULL, 0); 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//SkStreamMemory 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns the starting address for the data. If this cannot be done, returns NULL. */ 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //TODO: replace with virtual const SkData* getData() 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual const void* getMemoryBase() { return NULL; } 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkRefCnt INHERITED; 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** SkStreamRewindable is a SkStream for which rewind and duplicate are required. */ 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkStreamRewindable : public SkStream { 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //TODO: remove the following after everyone is updated (ensures new behavior on new classes). 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool isAtEnd() const SK_OVERRIDE = 0; 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project //TODO: remove the following after everyone is updated (ensures new behavior on new classes). 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getLength() const SK_OVERRIDE { return 0; } 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool rewind() SK_OVERRIDE = 0; 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamRewindable* duplicate() const SK_OVERRIDE = 0; 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** SkStreamSeekable is a SkStreamRewindable for which position, seek, move, and fork are required. */ 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkStreamSeekable : public SkStreamRewindable { 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamSeekable* duplicate() const SK_OVERRIDE = 0; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool hasPosition() const SK_OVERRIDE { return true; } 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getPosition() const SK_OVERRIDE = 0; 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool seek(size_t position) SK_OVERRIDE = 0; 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool move(long offset) SK_OVERRIDE = 0; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamSeekable* fork() const SK_OVERRIDE = 0; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** SkStreamAsset is a SkStreamSeekable for which getLength is required. */ 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkStreamAsset : public SkStreamSeekable { 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamAsset* duplicate() const SK_OVERRIDE = 0; 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamAsset* fork() const SK_OVERRIDE = 0; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool hasLength() const SK_OVERRIDE { return true; } 18298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom virtual size_t getLength() const SK_OVERRIDE = 0; 18398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}; 18498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 18598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/** SkStreamMemory is a SkStreamAsset for which getMemoryBase is required. */ 18698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromclass SK_API SkStreamMemory : public SkStreamAsset { 18798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrompublic: 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamMemory* duplicate() const SK_OVERRIDE = 0; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamMemory* fork() const SK_OVERRIDE = 0; 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual const void* getMemoryBase() SK_OVERRIDE = 0; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkWStream : SkNoncopyable { 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT_ROOT(SkWStream) 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual ~SkWStream(); 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Called to write bytes to a SkWStream. Returns true on success 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project @param buffer the address of at least size bytes to be written to the stream 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project @param size The number of bytes in buffer to write to the stream 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project @return true on success 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool write(const void* buffer, size_t size) = 0; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual void newline(); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual void flush(); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // helpers 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool write8(U8CPU); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool write16(U16CPU); 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool write32(uint32_t); 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeText(const char text[]); 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeDecAsText(int32_t); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeBigDecAsText(int64_t, int minDigits = 0); 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeHexAsText(uint32_t, int minDigits = 0); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeScalarAsText(SkScalar); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeBool(bool v) { return this->write8(v); } 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeScalar(SkScalar); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writePackedUInt(size_t); 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeStream(SkStream* input, size_t length); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Append an SkData object to the stream, such that it can be read 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * out of the stream using SkStream::readData(). 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Note that the encoding method used to write the SkData object 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to the stream may change over time. This method DOES NOT 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * just write the raw content of the SkData object to the stream. 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool writeData(const SkData*); 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////// 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "SkString.h" 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct SkFILE; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/** A stream that wraps a C FILE* file stream. */ 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkFILEStream : public SkStreamAsset { 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkFILEStream) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Initialize the stream by calling sk_fopen on the specified path. 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This internal stream will be closed in the destructor. 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project explicit SkFILEStream(const char path[] = NULL); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project enum Ownership { 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project kCallerPasses_Ownership, 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project kCallerRetains_Ownership 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project }; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Initialize the stream with an existing C file stream. 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * While this stream exists, it assumes exclusive access to the C file stream. 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The C file stream will be closed in the destructor unless the caller specifies 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * kCallerRetains_Ownership. 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project explicit SkFILEStream(FILE* file, Ownership ownership = kCallerPasses_Ownership); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual ~SkFILEStream(); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns true if the current path could be opened. */ 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool isValid() const { return fFILE != NULL; } 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Close the current file, and open a new file with the specified path. 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If path is NULL, just close the current file. 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void setPath(const char path[]); 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t read(void* buffer, size_t size) SK_OVERRIDE; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool isAtEnd() const SK_OVERRIDE; 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool rewind() SK_OVERRIDE; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamAsset* duplicate() const SK_OVERRIDE; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getPosition() const SK_OVERRIDE; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool seek(size_t position) SK_OVERRIDE; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool move(long offset) SK_OVERRIDE; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkStreamAsset* fork() const SK_OVERRIDE; 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getLength() const SK_OVERRIDE; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual const void* getMemoryBase() SK_OVERRIDE; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkFILE* fFILE; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkString fName; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Ownership fOwnership; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // fData is lazilly initialized when needed. 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mutable SkAutoTUnref<SkData> fData; 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkStreamAsset INHERITED; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkMemoryStream : public SkStreamMemory { 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkMemoryStream) 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkMemoryStream(); 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** We allocate (and free) the memory. Write to it via getMemoryBase() */ 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkMemoryStream(size_t length); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** If copyData is true, the stream makes a private copy of the data. */ 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkMemoryStream(const void* data, size_t length, bool copyData = false); 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Use the specified data as the memory for this stream. 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The stream will call ref() on the data (assuming it is not NULL). 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkMemoryStream(SkData*); 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual ~SkMemoryStream(); 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Resets the stream to the specified data and length, 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project just like the constructor. 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if copyData is true, the stream makes a private copy of the data 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual void setMemory(const void* data, size_t length, 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool copyData = false); 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Replace any memory buffer with the specified buffer. The caller 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project must have allocated data with sk_malloc or sk_realloc, since it 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project will be freed with sk_free. 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void setMemoryOwned(const void* data, size_t length); 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Return the stream's data in a SkData. 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The caller must call unref() when it is finished using the data. 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkData* copyToData() const; 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Use the specified data as the memory for this stream. 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The stream will call ref() on the data (assuming it is not NULL). 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The function returns the data parameter as a convenience. 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkData* setData(SkData*); 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void skipToAlign4(); 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const void* getAtPos(); 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t peek() const { return fOffset; } 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t read(void* buffer, size_t size) SK_OVERRIDE; 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool isAtEnd() const SK_OVERRIDE; 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool rewind() SK_OVERRIDE; 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkMemoryStream* duplicate() const SK_OVERRIDE; 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getPosition() const SK_OVERRIDE; 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool seek(size_t position) SK_OVERRIDE; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool move(long offset) SK_OVERRIDE; 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual SkMemoryStream* fork() const SK_OVERRIDE; 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual size_t getLength() const SK_OVERRIDE; 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual const void* getMemoryBase() SK_OVERRIDE; 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkData* fData; 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t fOffset; 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkStreamMemory INHERITED; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project///////////////////////////////////////////////////////////////////////////////////////////// 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkFILEWStream : public SkWStream { 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkFILEWStream) 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkFILEWStream(const char path[]); 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual ~SkFILEWStream(); 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Returns true if the current path could be opened. 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool isValid() const { return fFILE != NULL; } 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool write(const void* buffer, size_t size) SK_OVERRIDE; 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual void flush() SK_OVERRIDE; 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkFILE* fFILE; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkWStream INHERITED; 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SkMemoryWStream : public SkWStream { 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkMemoryWStream) 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkMemoryWStream(void* buffer, size_t size); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool write(const void* buffer, size_t size) SK_OVERRIDE; 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t bytesWritten() const { return fBytesWritten; } 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char* fBuffer; 40298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom size_t fMaxLength; 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t fBytesWritten; 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkWStream INHERITED; 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkDynamicMemoryWStream : public SkWStream { 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkDynamicMemoryWStream) 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkDynamicMemoryWStream(); 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual ~SkDynamicMemoryWStream(); 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool write(const void* buffer, size_t size) SK_OVERRIDE; 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // random access write 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // modifies stream and returns true if offset + size is less than or equal to getOffset() 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool write(const void* buffer, size_t offset, size_t size); 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bool read(void* buffer, size_t offset, size_t size); 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t getOffset() const { return fBytesWritten; } 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t bytesWritten() const { return fBytesWritten; } 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // copy what has been written to the stream into dst 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void copyTo(void* dst) const; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Return a copy of the data written so far. This call is responsible for 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * calling unref() when they are finished with the data. 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkData* copyToData() const; 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Reset, returning a reader stream with the current content. */ 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SkStreamAsset* detachAsStream(); 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /** Reset the stream to its original, empty, state. */ 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void reset(); 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void padToAlign4(); 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct Block; 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Block* fHead; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project Block* fTail; 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size_t fBytesWritten; 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mutable SkData* fCopy; // is invalidated if we write after it is created 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project void invalidateCopy(); 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // For access to the Block type. 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project friend class SkBlockMemoryStream; 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project friend class SkBlockMemoryRefCnt; 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkWStream INHERITED; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass SK_API SkDebugWStream : public SkWStream { 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic: 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SK_DECLARE_INST_COUNT(SkDebugWStream) 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project // overrides 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual bool write(const void* buffer, size_t size) SK_OVERRIDE; 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project virtual void newline() SK_OVERRIDE; 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate: 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project typedef SkWStream INHERITED; 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}; 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// for now 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef SkFILEStream SkURLStream; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project