blob: 51016c737ffbc705b697809830c0ad0ab9164c5c [file] [log] [blame]
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00001
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.comda300552013-10-14 14:33:11 +000013#include "SkData.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000014#include "SkPaint.h"
15#include "SkPoint.h"
16
17class SkBitmap;
reed@google.com35348222013-10-16 13:05:06 +000018class SkDrawLooper;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000019class SkFlattenable;
20struct SkIRect;
21class SkMatrix;
22class SkOrderedReadBuffer;
23class SkOrderedWriteBuffer;
24class SkPath;
25class SkPixelRef;
26struct SkRect;
27class SkRefCnt;
28class SkRegion;
29class SkStream;
30class SkString;
31class SkTypeface;
reed@google.com35348222013-10-16 13:05:06 +000032class SkUnitMapper;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000033class SkWStream;
34
reed@google.com35348222013-10-16 13:05:06 +000035enum 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.comc73dd5c2012-08-07 15:54:32 +000048class SkFlattenableReadBuffer {
49public:
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.com24ddde92013-09-16 14:04:05 +000065 bool isCrossProcess() const { return SkToBool(fFlags & kCrossProcess_Flag); }
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000066 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.com77687512013-05-21 16:17:14 +000079 virtual void readString(SkString* string) = 0;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000080 virtual void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding) = 0;
81
reed@google.com35348222013-10-16 13:05:06 +000082 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.comc73dd5c2012-08-07 15:54:32 +0000115 // common data structures
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000116 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.comc73dd5c2012-08-07 15:54:32 +0000138
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.comfbc58a32013-10-15 07:02:27 +0000148
reed@google.comda300552013-10-14 14:33:11 +0000149 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.comc73dd5c2012-08-07 15:54:32 +0000155
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000156private:
157 uint32_t fFlags;
158};
159
160///////////////////////////////////////////////////////////////////////////////
161
162class SkFlattenableWriteBuffer {
163public:
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.comc73dd5c2012-08-07 15:54:32 +0000200
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.comc73dd5c2012-08-07 15:54:32 +0000208 };
209
210 uint32_t getFlags() const { return fFlags; }
211 void setFlags(uint32_t flags) { fFlags = flags; }
212
213 bool isCrossProcess() const {
robertphillips@google.com24ddde92013-09-16 14:04:05 +0000214 return SkToBool(fFlags & kCrossProcess_Flag);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000215 }
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000216
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000217 bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; }
218
reed@google.comda300552013-10-14 14:33:11 +0000219 void writeDataAsByteArray(SkData* data) {
220 this->writeByteArray(data->data(), data->size());
221 }
222
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000223protected:
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