00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkWriter32_DEFINED
00018 #define SkWriter32_DEFINED
00019
00020 #include "SkTypes.h"
00021
00022 #include "SkScalar.h"
00023 #include "SkPoint.h"
00024 #include "SkRect.h"
00025
00026 class SkStream;
00027 class SkWStream;
00028
00029 class SkWriter32 : SkNoncopyable {
00030 public:
00031 SkWriter32(size_t minSize) {
00032 fMinSize = minSize;
00033 fSize = 0;
00034 fHead = fTail = NULL;
00035 }
00036 ~SkWriter32();
00037
00038 bool writeBool(bool value) {
00039 this->writeInt(value);
00040 return value;
00041 }
00042
00043 void writeInt(int32_t value) {
00044 *(int32_t*)this->reserve(sizeof(value)) = value;
00045 }
00046
00047 void write8(int32_t value) {
00048 *(int32_t*)this->reserve(sizeof(value)) = value & 0xFF;
00049 }
00050
00051 void write16(int32_t value) {
00052 *(int32_t*)this->reserve(sizeof(value)) = value & 0xFFFF;
00053 }
00054
00055 void write32(int32_t value) {
00056 *(int32_t*)this->reserve(sizeof(value)) = value;
00057 }
00058
00059 void writeScalar(SkScalar value) {
00060 *(SkScalar*)this->reserve(sizeof(value)) = value;
00061 }
00062
00063 void writePoint(const SkPoint& pt) {
00064 *(SkPoint*)this->reserve(sizeof(pt)) = pt;
00065 }
00066
00067 void writeRect(const SkRect& rect) {
00068 *(SkRect*)this->reserve(sizeof(rect)) = rect;
00069 }
00070
00071
00072 void writeMul4(const void* values, size_t size) {
00073 SkASSERT(SkAlign4(size) == size);
00074
00075
00076
00077 memcpy(this->reserve(size), values, size);
00078 }
00079
00080 void writePad(const void* src, size_t size);
00081
00082
00083 uint32_t size() const { return fSize; }
00084 void reset();
00085 uint32_t* reserve(size_t size);
00086
00087
00088
00089
00090 uint32_t* peek32(size_t offset);
00091
00092
00093 void flatten(void* dst) const;
00094
00095
00096
00097 size_t readFromStream(SkStream*, size_t length);
00098
00099 bool writeToStream(SkWStream*);
00100
00101 private:
00102 size_t fMinSize;
00103 uint32_t fSize;
00104
00105 struct Block;
00106 Block* fHead;
00107 Block* fTail;
00108
00109 Block* newBlock(size_t bytes);
00110 };
00111
00112 #endif