| Index: src/core/SkRWBuffer.h
|
| diff --git a/src/core/SkRWBuffer.h b/src/core/SkRWBuffer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..89cb425a7f31532c0e179690de1d41ee9ae09e47
|
| --- /dev/null
|
| +++ b/src/core/SkRWBuffer.h
|
| @@ -0,0 +1,97 @@
|
| +/*
|
| + * Copyright 2015 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef SkRWBuffer_DEFINED
|
| +#define SkRWBuffer_DEFINED
|
| +
|
| +#include "SkRefCnt.h"
|
| +
|
| +struct SkBufferBlock;
|
| +struct SkBufferHead;
|
| +class SkRWBuffer;
|
| +class SkStreamAsset;
|
| +
|
| +/**
|
| + * Contains a read-only, thread-sharable block of memory. To access the memory, the caller must
|
| + * instantiate a local iterator, as the memory is stored in 1 or more contiguous blocks.
|
| + */
|
| +class SkROBuffer : public SkRefCnt {
|
| +public:
|
| + /**
|
| + * Return the logical length of the data owned/shared by this buffer. It may be stored in
|
| + * multiple contiguous blocks, accessible via the iterator.
|
| + */
|
| + size_t size() const { return fUsed; }
|
| +
|
| + class Iter {
|
| + public:
|
| + Iter(const SkROBuffer*);
|
| +
|
| + void reset(const SkROBuffer*);
|
| +
|
| + /**
|
| + * Return the current continuous block of memory, or NULL if the iterator is exhausted
|
| + */
|
| + const void* data() const;
|
| +
|
| + /**
|
| + * Returns the number of bytes in the current continguous block of memory, or 0 if the
|
| + * iterator is exhausted.
|
| + */
|
| + size_t size() const;
|
| +
|
| + /**
|
| + * Advance to the next contiguous block of memory, returning true if there is another
|
| + * block, or false if the iterator is exhausted.
|
| + */
|
| + bool next();
|
| +
|
| + private:
|
| + const SkBufferBlock* fBlock;
|
| + size_t fRemaining;
|
| + };
|
| +
|
| +private:
|
| + SkROBuffer(const SkBufferHead* head, size_t used);
|
| + virtual ~SkROBuffer();
|
| +
|
| + const SkBufferHead* fHead;
|
| + const size_t fUsed;
|
| +
|
| + friend class SkRWBuffer;
|
| +};
|
| +
|
| +/**
|
| + * Accumulates bytes of memory that are "appended" to it, growing internal storage as needed.
|
| + * The growth is done such that at any time, a RBuffer or StreamAsset can be snapped off, which
|
| + * can see the previously stored bytes, but which will be unaware of any future writes.
|
| + */
|
| +class SkRWBuffer {
|
| +public:
|
| + SkRWBuffer(size_t initialCapacity = 0);
|
| + ~SkRWBuffer();
|
| +
|
| + size_t size() const { return fTotalUsed; }
|
| + void append(const void* buffer, size_t length);
|
| + void* append(size_t length);
|
| +
|
| + SkROBuffer* newRBufferSnapshot() const;
|
| + SkStreamAsset* newStreamSnapshot() const;
|
| +
|
| +#ifdef SK_DEBUG
|
| + void validate() const;
|
| +#else
|
| + void validate() const {}
|
| +#endif
|
| +
|
| +private:
|
| + SkBufferHead* fHead;
|
| + SkBufferBlock* fTail;
|
| + size_t fTotalUsed;
|
| +};
|
| +
|
| +#endif
|
|
|