djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
| 3 | * Copyright 2012 Google Inc. |
| 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 | #ifndef SkFlattenableBuffers_DEFINED |
| 10 | #define SkFlattenableBuffers_DEFINED |
| 11 | |
| 12 | #include "SkColor.h" |
reed@google.com | da30055 | 2013-10-14 14:33:11 +0000 | [diff] [blame] | 13 | #include "SkData.h" |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 14 | #include "SkPaint.h" |
| 15 | #include "SkPoint.h" |
| 16 | |
| 17 | class SkBitmap; |
reed@google.com | 3534822 | 2013-10-16 13:05:06 +0000 | [diff] [blame^] | 18 | class SkDrawLooper; |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 19 | class SkFlattenable; |
| 20 | struct SkIRect; |
| 21 | class SkMatrix; |
| 22 | class SkOrderedReadBuffer; |
| 23 | class SkOrderedWriteBuffer; |
| 24 | class SkPath; |
| 25 | class SkPixelRef; |
| 26 | struct SkRect; |
| 27 | class SkRefCnt; |
| 28 | class SkRegion; |
| 29 | class SkStream; |
| 30 | class SkString; |
| 31 | class SkTypeface; |
reed@google.com | 3534822 | 2013-10-16 13:05:06 +0000 | [diff] [blame^] | 32 | class SkUnitMapper; |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 33 | class SkWStream; |
| 34 | |
reed@google.com | 3534822 | 2013-10-16 13:05:06 +0000 | [diff] [blame^] | 35 | enum SkEffectType { |
| 36 | kColorFilter_SkEffectType, |
| 37 | kDrawLooper_SkEffectType, |
| 38 | kImageFilter_SkEffectType, |
| 39 | kMaskFilter_SkEffectType, |
| 40 | kPathEffect_SkEffectType, |
| 41 | kPixelRef_SkEffectType, |
| 42 | kRasterizer_SkEffectType, |
| 43 | kShader_SkEffectType, |
| 44 | kUnitMapper_SkEffectType, |
| 45 | kXfermode_SkEffectType, |
| 46 | }; |
| 47 | |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 48 | class SkFlattenableReadBuffer { |
| 49 | public: |
| 50 | SkFlattenableReadBuffer(); |
| 51 | virtual ~SkFlattenableReadBuffer(); |
| 52 | |
| 53 | bool isOrderedBinaryBuffer() { return NULL != getOrderedBinaryBuffer(); } |
| 54 | virtual SkOrderedReadBuffer* getOrderedBinaryBuffer() { return NULL; } |
| 55 | |
| 56 | enum Flags { |
| 57 | kCrossProcess_Flag = 1 << 0, |
| 58 | kScalarIsFloat_Flag = 1 << 1, |
| 59 | kPtrIs64Bit_Flag = 1 << 2, |
| 60 | }; |
| 61 | |
| 62 | void setFlags(uint32_t flags) { fFlags = flags; } |
| 63 | uint32_t getFlags() const { return fFlags; } |
| 64 | |
robertphillips@google.com | 24ddde9 | 2013-09-16 14:04:05 +0000 | [diff] [blame] | 65 | bool isCrossProcess() const { return SkToBool(fFlags & kCrossProcess_Flag); } |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 66 | bool isScalarFloat() const { return SkToBool(fFlags & kScalarIsFloat_Flag); } |
| 67 | bool isPtr64Bit() const { return SkToBool(fFlags & kPtrIs64Bit_Flag); } |
| 68 | |
| 69 | // primitives |
| 70 | virtual bool readBool() = 0; |
| 71 | virtual SkColor readColor() = 0; |
| 72 | virtual SkFixed readFixed() = 0; |
| 73 | virtual int32_t readInt() = 0; |
| 74 | virtual SkScalar readScalar() = 0; |
| 75 | virtual uint32_t readUInt() = 0; |
| 76 | virtual int32_t read32() = 0; |
| 77 | |
| 78 | // strings -- the caller is responsible for freeing the string contents |
djsollen@google.com | 7768751 | 2013-05-21 16:17:14 +0000 | [diff] [blame] | 79 | virtual void readString(SkString* string) = 0; |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 80 | virtual void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding) = 0; |
| 81 | |
reed@google.com | 3534822 | 2013-10-16 13:05:06 +0000 | [diff] [blame^] | 82 | virtual SkFlattenable* readFlattenable(SkEffectType) = 0; |
| 83 | |
| 84 | SkColorFilter* readColorFilter() { |
| 85 | return (SkColorFilter*)this->readFlattenable(kColorFilter_SkEffectType); |
| 86 | } |
| 87 | SkDrawLooper* readDrawLooper() { |
| 88 | return (SkDrawLooper*)this->readFlattenable(kDrawLooper_SkEffectType); |
| 89 | } |
| 90 | SkImageFilter* readImageFilter() { |
| 91 | return (SkImageFilter*)this->readFlattenable(kImageFilter_SkEffectType); |
| 92 | } |
| 93 | SkMaskFilter* readMaskFilter() { |
| 94 | return (SkMaskFilter*)this->readFlattenable(kMaskFilter_SkEffectType); |
| 95 | } |
| 96 | SkPathEffect* readPathEffect() { |
| 97 | return (SkPathEffect*)this->readFlattenable(kPathEffect_SkEffectType); |
| 98 | } |
| 99 | SkPixelRef* readPixelRef() { |
| 100 | return (SkPixelRef*)this->readFlattenable(kPixelRef_SkEffectType); |
| 101 | } |
| 102 | SkRasterizer* readRasterizer() { |
| 103 | return (SkRasterizer*)this->readFlattenable(kRasterizer_SkEffectType); |
| 104 | } |
| 105 | SkShader* readShader() { |
| 106 | return (SkShader*)this->readFlattenable(kShader_SkEffectType); |
| 107 | } |
| 108 | SkUnitMapper* readUnitMapper() { |
| 109 | return (SkUnitMapper*)this->readFlattenable(kUnitMapper_SkEffectType); |
| 110 | } |
| 111 | SkXfermode* readXfermode() { |
| 112 | return (SkXfermode*)this->readFlattenable(kXfermode_SkEffectType); |
| 113 | } |
| 114 | |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 115 | // common data structures |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 116 | virtual void readPoint(SkPoint* point) = 0; |
| 117 | virtual void readMatrix(SkMatrix* matrix) = 0; |
| 118 | virtual void readIRect(SkIRect* rect) = 0; |
| 119 | virtual void readRect(SkRect* rect) = 0; |
| 120 | virtual void readRegion(SkRegion* region) = 0; |
| 121 | virtual void readPath(SkPath* path) = 0; |
| 122 | |
| 123 | // binary data and arrays |
| 124 | virtual uint32_t readByteArray(void* value) = 0; |
| 125 | virtual uint32_t readColorArray(SkColor* colors) = 0; |
| 126 | virtual uint32_t readIntArray(int32_t* values) = 0; |
| 127 | virtual uint32_t readPointArray(SkPoint* points) = 0; |
| 128 | virtual uint32_t readScalarArray(SkScalar* values) = 0; |
| 129 | |
| 130 | /** This helper peeks into the buffer and reports back the length of the next array in |
| 131 | * the buffer but does not change the state of the buffer. |
| 132 | */ |
| 133 | virtual uint32_t getArrayCount() = 0; |
| 134 | |
| 135 | // helper functions |
| 136 | virtual void* readFunctionPtr(); |
| 137 | virtual void readPaint(SkPaint* paint); |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 138 | |
| 139 | virtual void readBitmap(SkBitmap* bitmap) = 0; |
| 140 | virtual SkTypeface* readTypeface() = 0; |
| 141 | |
| 142 | // helper function for classes with const SkPoint members |
| 143 | SkPoint readPoint() { |
| 144 | SkPoint point; |
| 145 | this->readPoint(&point); |
| 146 | return point; |
| 147 | } |
skia.committer@gmail.com | fbc58a3 | 2013-10-15 07:02:27 +0000 | [diff] [blame] | 148 | |
reed@google.com | da30055 | 2013-10-14 14:33:11 +0000 | [diff] [blame] | 149 | SkData* readByteArrayAsData() { |
| 150 | size_t len = this->getArrayCount(); |
| 151 | void* buffer = sk_malloc_throw(len); |
| 152 | (void)this->readByteArray(buffer); |
| 153 | return SkData::NewFromMalloc(buffer, len); |
| 154 | } |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 155 | |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 156 | private: |
| 157 | uint32_t fFlags; |
| 158 | }; |
| 159 | |
| 160 | /////////////////////////////////////////////////////////////////////////////// |
| 161 | |
| 162 | class SkFlattenableWriteBuffer { |
| 163 | public: |
| 164 | SkFlattenableWriteBuffer(); |
| 165 | virtual ~SkFlattenableWriteBuffer(); |
| 166 | |
| 167 | virtual bool isOrderedBinaryBuffer() { return false; } |
| 168 | virtual SkOrderedWriteBuffer* getOrderedBinaryBuffer() { sk_throw(); return NULL; } |
| 169 | |
| 170 | // primitives |
| 171 | virtual void writeByteArray(const void* data, size_t size) = 0; |
| 172 | virtual void writeBool(bool value) = 0; |
| 173 | virtual void writeFixed(SkFixed value) = 0; |
| 174 | virtual void writeScalar(SkScalar value) = 0; |
| 175 | virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0; |
| 176 | virtual void writeInt(int32_t value) = 0; |
| 177 | virtual void writeIntArray(const int32_t* value, uint32_t count) = 0; |
| 178 | virtual void writeUInt(uint32_t value) = 0; |
| 179 | virtual void write32(int32_t value) = 0; // printf in hex |
| 180 | virtual void writeString(const char* value) = 0; |
| 181 | virtual void writeEncodedString(const void* value, size_t byteLength, |
| 182 | SkPaint::TextEncoding encoding) = 0; |
| 183 | |
| 184 | // common data structures |
| 185 | virtual void writeFlattenable(SkFlattenable* flattenable) = 0; |
| 186 | virtual void writeColor(const SkColor& color) = 0; |
| 187 | virtual void writeColorArray(const SkColor* color, uint32_t count) = 0; |
| 188 | virtual void writePoint(const SkPoint& point) = 0; |
| 189 | virtual void writePointArray(const SkPoint* points, uint32_t count) = 0; |
| 190 | virtual void writeMatrix(const SkMatrix& matrix) = 0; |
| 191 | virtual void writeIRect(const SkIRect& rect) = 0; |
| 192 | virtual void writeRect(const SkRect& rect) = 0; |
| 193 | virtual void writeRegion(const SkRegion& region) = 0; |
| 194 | virtual void writePath(const SkPath& path) = 0; |
| 195 | virtual size_t writeStream(SkStream* stream, size_t length) = 0; |
| 196 | |
| 197 | // helper functions |
| 198 | virtual void writeFunctionPtr(void* ptr); |
| 199 | virtual void writePaint(const SkPaint& paint); |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 200 | |
| 201 | virtual void writeBitmap(const SkBitmap& bitmap) = 0; |
| 202 | virtual void writeTypeface(SkTypeface* typeface) = 0; |
| 203 | |
| 204 | virtual bool writeToStream(SkWStream*) = 0; |
| 205 | |
| 206 | enum Flags { |
| 207 | kCrossProcess_Flag = 0x01, |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 208 | }; |
| 209 | |
| 210 | uint32_t getFlags() const { return fFlags; } |
| 211 | void setFlags(uint32_t flags) { fFlags = flags; } |
| 212 | |
| 213 | bool isCrossProcess() const { |
robertphillips@google.com | 24ddde9 | 2013-09-16 14:04:05 +0000 | [diff] [blame] | 214 | return SkToBool(fFlags & kCrossProcess_Flag); |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 215 | } |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 216 | |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 217 | bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; } |
| 218 | |
reed@google.com | da30055 | 2013-10-14 14:33:11 +0000 | [diff] [blame] | 219 | void writeDataAsByteArray(SkData* data) { |
| 220 | this->writeByteArray(data->data(), data->size()); |
| 221 | } |
| 222 | |
djsollen@google.com | c73dd5c | 2012-08-07 15:54:32 +0000 | [diff] [blame] | 223 | protected: |
| 224 | // A helper function so that each subclass does not have to be a friend of SkFlattenable |
| 225 | void flattenObject(SkFlattenable* obj, SkFlattenableWriteBuffer& buffer); |
| 226 | |
| 227 | uint32_t fFlags; |
| 228 | }; |
| 229 | |
| 230 | #endif |