00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkBuffer_DEFINED
00018 #define SkBuffer_DEFINED
00019
00020 #include "SkScalar.h"
00021
00029 class SkRBuffer : SkNoncopyable {
00030 public:
00031 SkRBuffer() : fData(0), fPos(0), fStop(0) {}
00035 SkRBuffer(const void* data)
00036 {
00037 fData = (const char*)data;
00038 fPos = (const char*)data;
00039 fStop = 0;
00040 }
00043 SkRBuffer(const void* data, size_t size)
00044 {
00045 SkASSERT(data != 0 || size == 0);
00046 fData = (const char*)data;
00047 fPos = (const char*)data;
00048 fStop = (const char*)data + size;
00049 }
00050
00054 size_t pos() const { return fPos - fData; }
00058 size_t size() const { return fStop - fData; }
00063 bool eof() const { return fPos >= fStop; }
00064
00068 void read(void* buffer, size_t size) { if (size) this->readNoSizeCheck(buffer, size); }
00069 const void* skip(size_t size);
00070 size_t skipToAlign4();
00071
00072 void* readPtr() { void* ptr; read(&ptr, sizeof(ptr)); return ptr; }
00073 SkScalar readScalar() { SkScalar x; read(&x, 4); return x; }
00074 uint32_t readU32() { uint32_t x; read(&x, 4); return x; }
00075 int32_t readS32() { int32_t x; read(&x, 4); return x; }
00076 uint16_t readU16() { uint16_t x; read(&x, 2); return x; }
00077 int16_t readS16() { int16_t x; read(&x, 2); return x; }
00078 uint8_t readU8() { uint8_t x; read(&x, 1); return x; }
00079 bool readBool() { return this->readU8() != 0; }
00080
00081 protected:
00082 void readNoSizeCheck(void* buffer, size_t size);
00083
00084 const char* fData;
00085 const char* fPos;
00086 const char* fStop;
00087 };
00088
00097 class SkWBuffer : SkNoncopyable {
00098 public:
00099 SkWBuffer() : fData(0), fPos(0), fStop(0) {}
00100 SkWBuffer(void* data) { reset(data); }
00101 SkWBuffer(void* data, size_t size) { reset(data, size); }
00102
00103 void reset(void* data)
00104 {
00105 fData = (char*)data;
00106 fPos = (char*)data;
00107 fStop = 0;
00108 }
00109 void reset(void* data, size_t size)
00110 {
00111 SkASSERT(data != 0 || size == 0);
00112 fData = (char*)data;
00113 fPos = (char*)data;
00114 fStop = (char*)data + size;
00115 }
00116
00117 void* data() const { return fData; }
00118 size_t pos() const { return fPos - fData; }
00119 size_t size() const { return fStop - fData; }
00120 bool eof() const { return fPos >= fStop; }
00121 void* skip(size_t size);
00122 void write(const void* buffer, size_t size) { if (size) this->writeNoSizeCheck(buffer, size); }
00123 size_t padToAlign4();
00124
00125 void writePtr(const void* x) { this->writeNoSizeCheck(&x, sizeof(x)); }
00126 void writeScalar(SkScalar x) { this->writeNoSizeCheck(&x, 4); }
00127 void write32(int32_t x) { this->writeNoSizeCheck(&x, 4); }
00128 void write16(int16_t x) { this->writeNoSizeCheck(&x, 2); }
00129 void write8(int8_t x) { this->writeNoSizeCheck(&x, 1); }
00130 void writeBool(bool x) { this->write8(x); }
00131
00132 protected:
00133 void writeNoSizeCheck(const void* buffer, size_t size);
00134
00135 char* fData;
00136 char* fPos;
00137 char* fStop;
00138 };
00139
00140 #endif
00141