summaryrefslogtreecommitdiffstats
path: root/skia/include/SkWriter32.h
diff options
context:
space:
mode:
Diffstat (limited to 'skia/include/SkWriter32.h')
-rw-r--r--skia/include/SkWriter32.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/skia/include/SkWriter32.h b/skia/include/SkWriter32.h
new file mode 100644
index 0000000..66910d1
--- /dev/null
+++ b/skia/include/SkWriter32.h
@@ -0,0 +1,96 @@
+#ifndef SkWriter32_DEFINED
+#define SkWriter32_DEFINED
+
+#include "SkTypes.h"
+
+#include "SkScalar.h"
+#include "SkPoint.h"
+#include "SkRect.h"
+
+class SkStream;
+class SkWStream;
+
+class SkWriter32 : SkNoncopyable {
+public:
+ SkWriter32(size_t minSize) {
+ fMinSize = minSize;
+ fSize = 0;
+ fHead = fTail = NULL;
+ }
+ ~SkWriter32();
+
+ bool writeBool(bool value) {
+ this->writeInt(value);
+ return value;
+ }
+
+ void writeInt(int32_t value) {
+ *(int32_t*)this->reserve(sizeof(value)) = value;
+ }
+
+ void write8(int32_t value) {
+ *(int32_t*)this->reserve(sizeof(value)) = value & 0xFF;
+ }
+
+ void write16(int32_t value) {
+ *(int32_t*)this->reserve(sizeof(value)) = value & 0xFFFF;
+ }
+
+ void write32(int32_t value) {
+ *(int32_t*)this->reserve(sizeof(value)) = value;
+ }
+
+ void writeScalar(SkScalar value) {
+ *(SkScalar*)this->reserve(sizeof(value)) = value;
+ }
+
+ void writePoint(const SkPoint& pt) {
+ *(SkPoint*)this->reserve(sizeof(pt)) = pt;
+ }
+
+ void writeRect(const SkRect& rect) {
+ *(SkRect*)this->reserve(sizeof(rect)) = rect;
+ }
+
+ // write count bytes (must be a multiple of 4)
+ void writeMul4(const void* values, size_t size) {
+ SkASSERT(SkAlign4(size) == size);
+ // if we could query how much is avail in the current block, we might
+ // copy that much, and then alloc the rest. That would reduce the waste
+ // in the current block
+ memcpy(this->reserve(size), values, size);
+ }
+
+ void writePad(const void* src, size_t size);
+
+ // return the current offset (will always be a multiple of 4)
+ uint32_t size() const { return fSize; }
+ void reset();
+ uint32_t* reserve(size_t size); // size MUST be multiple of 4
+
+ // return the address of the 4byte int at the specified offset (which must
+ // be a multiple of 4. This does not allocate any new space, so the returned
+ // address is only valid for 1 int.
+ uint32_t* peek32(size_t offset);
+
+ // copy into a single buffer (allocated by caller). Must be at least size()
+ void flatten(void* dst) const;
+
+ // read from the stream, and write up to length bytes. Return the actual
+ // number of bytes written.
+ size_t readFromStream(SkStream*, size_t length);
+
+ bool writeToStream(SkWStream*);
+
+private:
+ size_t fMinSize;
+ uint32_t fSize;
+
+ struct Block;
+ Block* fHead;
+ Block* fTail;
+
+ Block* newBlock(size_t bytes);
+};
+
+#endif