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