1fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 2fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org/* 3fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org * Copyright 2006 The Android Open Source Project 4fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org * 5fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 6fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org * found in the LICENSE file. 7fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 8fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 9fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 10fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org#ifndef SkBuffer_DEFINED 11fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org#define SkBuffer_DEFINED 12fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 13fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org#include "SkScalar.h" 14fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 15fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org/** \class SkRBuffer 16fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 17fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org Light weight class for reading data from a memory block. 18fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org The RBuffer is given the buffer to read from, with either a specified size 19fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org or no size (in which case no range checking is performed). It is iillegal 20935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com to attempt to read a value from an empty RBuffer (data == null). 21fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org*/ 22fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.orgclass SkRBuffer : SkNoncopyable { 23fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.orgpublic: 24fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkRBuffer() : fData(0), fPos(0), fStop(0) {} 25fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Initialize RBuffer with a data pointer, but no specified length. 26fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org This signals the RBuffer to not perform range checks during reading. 27fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 28fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkRBuffer(const void* data) { 29fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fData = (const char*)data; 30fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fPos = (const char*)data; 31fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fStop = 0; // no bounds checking 32fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 33fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Initialize RBuffer with a data point and length. 34fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 35fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkRBuffer(const void* data, size_t size) { 36fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkASSERT(data != 0 || size == 0); 37fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fData = (const char*)data; 38fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fPos = (const char*)data; 39fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fStop = (const char*)data + size; 40fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 41935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 42fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Return the number of bytes that have been read from the beginning 43fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org of the data pointer. 44fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 45fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org size_t pos() const { return fPos - fData; } 46fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Return the total size of the data pointer. Only defined if the length was 47fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org specified in the constructor or in a call to reset(). 48fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 49fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org size_t size() const { return fStop - fData; } 50fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Return true if the buffer has read to the end of the data pointer. 51fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org Only defined if the length was specified in the constructor or in a call 52fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org to reset(). Always returns true if the length was not specified. 53fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 54fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org bool eof() const { return fPos >= fStop; } 55fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 56fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org /** Read the specified number of bytes from the data pointer. If buffer is not 57fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org null, copy those bytes into buffer. 58fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org */ 59fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void read(void* buffer, size_t size) { 60fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org if (size) { 61fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org this->readNoSizeCheck(buffer, size); 62fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 63fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 64fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 65fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org const void* skip(size_t size); // return start of skipped data 66fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org size_t skipToAlign4(); 67fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 68fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void* readPtr() { void* ptr; read(&ptr, sizeof(ptr)); return ptr; } 69fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkScalar readScalar() { SkScalar x; read(&x, 4); return x; } 70fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org uint32_t readU32() { uint32_t x; read(&x, 4); return x; } 71fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org int32_t readS32() { int32_t x; read(&x, 4); return x; } 72fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org uint16_t readU16() { uint16_t x; read(&x, 2); return x; } 73fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org int16_t readS16() { int16_t x; read(&x, 2); return x; } 74fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org uint8_t readU8() { uint8_t x; read(&x, 1); return x; } 75fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org bool readBool() { return this->readU8() != 0; } 76fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 7797e7f972fba347b0fb07131d299fe57bc02b5b63reed@google.comprivate: 78fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void readNoSizeCheck(void* buffer, size_t size); 79fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 80fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org const char* fData; 81fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org const char* fPos; 82fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org const char* fStop; 83fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org}; 84fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 85fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org/** \class SkWBuffer 86fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 87fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org Light weight class for writing data to a memory block. 88fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org The WBuffer is given the buffer to write into, with either a specified size 89fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org or no size, in which case no range checking is performed. An empty WBuffer 90fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org is legal, in which case no data is ever written, but the relative pos() 91fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org is updated. 92fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org*/ 93fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.orgclass SkWBuffer : SkNoncopyable { 94fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.orgpublic: 95fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkWBuffer() : fData(0), fPos(0), fStop(0) {} 96fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkWBuffer(void* data) { reset(data); } 97fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkWBuffer(void* data, size_t size) { reset(data, size); } 98fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 99fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void reset(void* data) { 100fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fData = (char*)data; 101fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fPos = (char*)data; 102fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fStop = 0; // no bounds checking 103fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 104fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 105fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void reset(void* data, size_t size) { 106fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org SkASSERT(data != 0 || size == 0); 107fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fData = (char*)data; 108fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fPos = (char*)data; 109fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org fStop = (char*)data + size; 110fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 111935e9f4fafdfc64130e6be9ea2bb30e3bafd852armistry@google.com 112fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org size_t pos() const { return fPos - fData; } 113fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void* skip(size_t size); // return start of skipped data 114fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 115fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void write(const void* buffer, size_t size) { 116fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org if (size) { 117fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org this->writeNoSizeCheck(buffer, size); 118fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 119fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org } 120fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 121fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org size_t padToAlign4(); 122fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 123fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void writePtr(const void* x) { this->writeNoSizeCheck(&x, sizeof(x)); } 124fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void writeScalar(SkScalar x) { this->writeNoSizeCheck(&x, 4); } 125fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void write32(int32_t x) { this->writeNoSizeCheck(&x, 4); } 126fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void write16(int16_t x) { this->writeNoSizeCheck(&x, 2); } 127fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void write8(int8_t x) { this->writeNoSizeCheck(&x, 1); } 128fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void writeBool(bool x) { this->write8(x); } 129fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 13097e7f972fba347b0fb07131d299fe57bc02b5b63reed@google.comprivate: 131fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org void writeNoSizeCheck(const void* buffer, size_t size); 132fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 133fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org char* fData; 134fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org char* fPos; 135fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org char* fStop; 136fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org}; 137fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org 138fa04363c4b49e271d6c791892f0e3934369b9633mike@reedtribe.org#endif 139