• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2008 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkReader32_DEFINED
11 #define SkReader32_DEFINED
12 
13 #include "SkScalar.h"
14 
15 class SkString;
16 
17 class SkReader32 : SkNoncopyable {
18 public:
SkReader32()19     SkReader32() : fCurr(NULL), fStop(NULL), fBase(NULL) {}
SkReader32(const void * data,size_t size)20     SkReader32(const void* data, size_t size)  {
21         this->setMemory(data, size);
22     }
23 
setMemory(const void * data,size_t size)24     void setMemory(const void* data, size_t size) {
25         SkASSERT(ptr_align_4(data));
26         SkASSERT(SkAlign4(size) == size);
27 
28         fBase = fCurr = (const char*)data;
29         fStop = (const char*)data + size;
30     }
31 
size()32     uint32_t size() const { return fStop - fBase; }
offset()33     uint32_t offset() const { return fCurr - fBase; }
eof()34     bool eof() const { return fCurr >= fStop; }
base()35     const void* base() const { return fBase; }
peek()36     const void* peek() const { return fCurr; }
37 
available()38     uint32_t available() const { return fStop - fCurr; }
isAvailable(uint32_t size)39     bool isAvailable(uint32_t size) const { return fCurr + size <= fStop; }
40 
rewind()41     void rewind() { fCurr = fBase; }
42 
setOffset(size_t offset)43     void setOffset(size_t offset) {
44         SkASSERT(SkAlign4(offset) == offset);
45         SkASSERT(offset <= this->size());
46         fCurr = fBase + offset;
47     }
48 
readBool()49     bool readBool() { return this->readInt() != 0; }
50 
readInt()51     int32_t readInt() {
52         SkASSERT(ptr_align_4(fCurr));
53         int32_t value = *(const int32_t*)fCurr;
54         fCurr += sizeof(value);
55         SkASSERT(fCurr <= fStop);
56         return value;
57     }
58 
readScalar()59     SkScalar readScalar() {
60         SkASSERT(ptr_align_4(fCurr));
61         SkScalar value = *(const SkScalar*)fCurr;
62         fCurr += sizeof(value);
63         SkASSERT(fCurr <= fStop);
64         return value;
65     }
66 
skip(size_t size)67     const void* skip(size_t size) {
68         SkASSERT(ptr_align_4(fCurr));
69         const void* addr = fCurr;
70         fCurr += SkAlign4(size);
71         SkASSERT(fCurr <= fStop);
72         return addr;
73     }
74 
skipT()75     template <typename T> const T& skipT() {
76         SkASSERT(SkAlign4(sizeof(T)) == sizeof(T));
77         return *(const T*)this->skip(sizeof(T));
78     }
79 
read(void * dst,size_t size)80     void read(void* dst, size_t size) {
81         SkASSERT(0 == size || dst != NULL);
82         SkASSERT(ptr_align_4(fCurr));
83         memcpy(dst, fCurr, size);
84         fCurr += SkAlign4(size);
85         SkASSERT(fCurr <= fStop);
86     }
87 
readU8()88     uint8_t readU8() { return (uint8_t)this->readInt(); }
readU16()89     uint16_t readU16() { return (uint16_t)this->readInt(); }
readS32()90     int32_t readS32() { return this->readInt(); }
readU32()91     uint32_t readU32() { return this->readInt(); }
92 
93     /**
94      *  Read the length of a string (written by SkWriter32::writeString) into
95      *  len (if len is not NULL) and return the null-ternimated address of the
96      *  string within the reader's buffer.
97      */
98     const char* readString(size_t* len = NULL);
99 
100     /**
101      *  Read the string (written by SkWriter32::writeString) and return it in
102      *  copy (if copy is not null). Return the length of the string.
103      */
104     size_t readIntoString(SkString* copy);
105 
106 private:
107     // these are always 4-byte aligned
108     const char* fCurr;  // current position within buffer
109     const char* fStop;  // end of buffer
110     const char* fBase;  // beginning of buffer
111 
112 #ifdef SK_DEBUG
ptr_align_4(const void * ptr)113     static bool ptr_align_4(const void* ptr) {
114         return (((const char*)ptr - (const char*)NULL) & 3) == 0;
115     }
116 #endif
117 };
118 
119 #endif
120