1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/include/core/SkReader32.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,160 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2008 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#ifndef SkReader32_DEFINED 1.14 +#define SkReader32_DEFINED 1.15 + 1.16 +#include "SkMatrix.h" 1.17 +#include "SkPath.h" 1.18 +#include "SkRegion.h" 1.19 +#include "SkRRect.h" 1.20 +#include "SkScalar.h" 1.21 + 1.22 +class SkString; 1.23 + 1.24 +class SkReader32 : SkNoncopyable { 1.25 +public: 1.26 + SkReader32() : fCurr(NULL), fStop(NULL), fBase(NULL) {} 1.27 + SkReader32(const void* data, size_t size) { 1.28 + this->setMemory(data, size); 1.29 + } 1.30 + 1.31 + void setMemory(const void* data, size_t size) { 1.32 + SkASSERT(ptr_align_4(data)); 1.33 + SkASSERT(SkAlign4(size) == size); 1.34 + 1.35 + fBase = fCurr = (const char*)data; 1.36 + fStop = (const char*)data + size; 1.37 + } 1.38 + 1.39 + uint32_t size() const { return SkToU32(fStop - fBase); } 1.40 + uint32_t offset() const { return SkToU32(fCurr - fBase); } 1.41 + bool eof() const { return fCurr >= fStop; } 1.42 + const void* base() const { return fBase; } 1.43 + const void* peek() const { return fCurr; } 1.44 + 1.45 + uint32_t available() const { return SkToU32(fStop - fCurr); } 1.46 + bool isAvailable(uint32_t size) const { return fCurr + size <= fStop; } 1.47 + 1.48 + void rewind() { fCurr = fBase; } 1.49 + 1.50 + void setOffset(size_t offset) { 1.51 + SkASSERT(SkAlign4(offset) == offset); 1.52 + SkASSERT(offset <= this->size()); 1.53 + fCurr = fBase + offset; 1.54 + } 1.55 + 1.56 + bool readBool() { return this->readInt() != 0; } 1.57 + 1.58 + int32_t readInt() { 1.59 + SkASSERT(ptr_align_4(fCurr)); 1.60 + int32_t value = *(const int32_t*)fCurr; 1.61 + fCurr += sizeof(value); 1.62 + SkASSERT(fCurr <= fStop); 1.63 + return value; 1.64 + } 1.65 + 1.66 + void* readPtr() { 1.67 + void* ptr; 1.68 + // we presume this "if" is resolved at compile-time 1.69 + if (4 == sizeof(void*)) { 1.70 + ptr = *(void**)fCurr; 1.71 + } else { 1.72 + memcpy(&ptr, fCurr, sizeof(void*)); 1.73 + } 1.74 + fCurr += sizeof(void*); 1.75 + return ptr; 1.76 + } 1.77 + 1.78 + SkScalar readScalar() { 1.79 + SkASSERT(ptr_align_4(fCurr)); 1.80 + SkScalar value = *(const SkScalar*)fCurr; 1.81 + fCurr += sizeof(value); 1.82 + SkASSERT(fCurr <= fStop); 1.83 + return value; 1.84 + } 1.85 + 1.86 + const void* skip(size_t size) { 1.87 + SkASSERT(ptr_align_4(fCurr)); 1.88 + const void* addr = fCurr; 1.89 + fCurr += SkAlign4(size); 1.90 + SkASSERT(fCurr <= fStop); 1.91 + return addr; 1.92 + } 1.93 + 1.94 + template <typename T> const T& skipT() { 1.95 + SkASSERT(SkAlign4(sizeof(T)) == sizeof(T)); 1.96 + return *(const T*)this->skip(sizeof(T)); 1.97 + } 1.98 + 1.99 + void read(void* dst, size_t size) { 1.100 + SkASSERT(0 == size || dst != NULL); 1.101 + SkASSERT(ptr_align_4(fCurr)); 1.102 + memcpy(dst, fCurr, size); 1.103 + fCurr += SkAlign4(size); 1.104 + SkASSERT(fCurr <= fStop); 1.105 + } 1.106 + 1.107 + uint8_t readU8() { return (uint8_t)this->readInt(); } 1.108 + uint16_t readU16() { return (uint16_t)this->readInt(); } 1.109 + int32_t readS32() { return this->readInt(); } 1.110 + uint32_t readU32() { return this->readInt(); } 1.111 + 1.112 + bool readPath(SkPath* path) { 1.113 + return readObjectFromMemory(path); 1.114 + } 1.115 + 1.116 + bool readMatrix(SkMatrix* matrix) { 1.117 + return readObjectFromMemory(matrix); 1.118 + } 1.119 + 1.120 + bool readRRect(SkRRect* rrect) { 1.121 + return readObjectFromMemory(rrect); 1.122 + } 1.123 + 1.124 + bool readRegion(SkRegion* rgn) { 1.125 + return readObjectFromMemory(rgn); 1.126 + } 1.127 + 1.128 + /** 1.129 + * Read the length of a string (written by SkWriter32::writeString) into 1.130 + * len (if len is not NULL) and return the null-ternimated address of the 1.131 + * string within the reader's buffer. 1.132 + */ 1.133 + const char* readString(size_t* len = NULL); 1.134 + 1.135 + /** 1.136 + * Read the string (written by SkWriter32::writeString) and return it in 1.137 + * copy (if copy is not null). Return the length of the string. 1.138 + */ 1.139 + size_t readIntoString(SkString* copy); 1.140 + 1.141 +private: 1.142 + template <typename T> bool readObjectFromMemory(T* obj) { 1.143 + size_t size = obj->readFromMemory(this->peek(), this->available()); 1.144 + // If readFromMemory() fails (which means that available() was too small), it returns 0 1.145 + bool success = (size > 0) && (size <= this->available()) && (SkAlign4(size) == size); 1.146 + // In case of failure, we want to skip to the end 1.147 + (void)this->skip(success ? size : this->available()); 1.148 + return success; 1.149 + } 1.150 + 1.151 + // these are always 4-byte aligned 1.152 + const char* fCurr; // current position within buffer 1.153 + const char* fStop; // end of buffer 1.154 + const char* fBase; // beginning of buffer 1.155 + 1.156 +#ifdef SK_DEBUG 1.157 + static bool ptr_align_4(const void* ptr) { 1.158 + return (((const char*)ptr - (const char*)NULL) & 3) == 0; 1.159 + } 1.160 +#endif 1.161 +}; 1.162 + 1.163 +#endif