OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkOrderedWriteBuffer.h" | 9 #include "SkWriteBuffer.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
11 #include "SkData.h" | 11 #include "SkData.h" |
12 #include "SkPixelRef.h" | 12 #include "SkPixelRef.h" |
13 #include "SkPtrRecorder.h" | 13 #include "SkPtrRecorder.h" |
14 #include "SkStream.h" | 14 #include "SkStream.h" |
15 #include "SkTypeface.h" | 15 #include "SkTypeface.h" |
16 | 16 |
17 SkOrderedWriteBuffer::SkOrderedWriteBuffer() | 17 SkWriteBuffer::SkWriteBuffer() |
18 : INHERITED() | 18 : fFlags(0) |
19 , fFactorySet(NULL) | 19 , fFactorySet(NULL) |
20 , fNamedFactorySet(NULL) | 20 , fNamedFactorySet(NULL) |
21 , fBitmapHeap(NULL) | 21 , fBitmapHeap(NULL) |
22 , fTFSet(NULL) | 22 , fTFSet(NULL) |
23 , fBitmapEncoder(NULL) { | 23 , fBitmapEncoder(NULL) { |
24 } | 24 } |
25 | 25 |
26 SkOrderedWriteBuffer::SkOrderedWriteBuffer(void* storage, size_t storageSize) | 26 SkWriteBuffer::SkWriteBuffer(void* storage, size_t storageSize) |
27 : INHERITED() | 27 : fFlags(0) |
28 , fFactorySet(NULL) | 28 , fFactorySet(NULL) |
29 , fNamedFactorySet(NULL) | 29 , fNamedFactorySet(NULL) |
30 , fWriter(storage, storageSize) | 30 , fWriter(storage, storageSize) |
31 , fBitmapHeap(NULL) | 31 , fBitmapHeap(NULL) |
32 , fTFSet(NULL) | 32 , fTFSet(NULL) |
33 , fBitmapEncoder(NULL) { | 33 , fBitmapEncoder(NULL) { |
34 } | 34 } |
35 | 35 |
36 SkOrderedWriteBuffer::~SkOrderedWriteBuffer() { | 36 SkWriteBuffer::~SkWriteBuffer() { |
37 SkSafeUnref(fFactorySet); | 37 SkSafeUnref(fFactorySet); |
38 SkSafeUnref(fNamedFactorySet); | 38 SkSafeUnref(fNamedFactorySet); |
39 SkSafeUnref(fBitmapHeap); | 39 SkSafeUnref(fBitmapHeap); |
40 SkSafeUnref(fTFSet); | 40 SkSafeUnref(fTFSet); |
41 } | 41 } |
42 | 42 |
43 void SkOrderedWriteBuffer::writeByteArray(const void* data, size_t size) { | 43 void SkWriteBuffer::writeByteArray(const void* data, size_t size) { |
44 fWriter.write32(size); | 44 fWriter.write32(size); |
45 fWriter.writePad(data, size); | 45 fWriter.writePad(data, size); |
46 } | 46 } |
47 | 47 |
48 void SkOrderedWriteBuffer::writeBool(bool value) { | 48 void SkWriteBuffer::writeBool(bool value) { |
49 fWriter.writeBool(value); | 49 fWriter.writeBool(value); |
50 } | 50 } |
51 | 51 |
52 void SkOrderedWriteBuffer::writeFixed(SkFixed value) { | 52 void SkWriteBuffer::writeFixed(SkFixed value) { |
53 fWriter.write32(value); | 53 fWriter.write32(value); |
54 } | 54 } |
55 | 55 |
56 void SkOrderedWriteBuffer::writeScalar(SkScalar value) { | 56 void SkWriteBuffer::writeScalar(SkScalar value) { |
57 fWriter.writeScalar(value); | 57 fWriter.writeScalar(value); |
58 } | 58 } |
59 | 59 |
60 void SkOrderedWriteBuffer::writeScalarArray(const SkScalar* value, uint32_t coun
t) { | 60 void SkWriteBuffer::writeScalarArray(const SkScalar* value, uint32_t count) { |
61 fWriter.write32(count); | 61 fWriter.write32(count); |
62 fWriter.write(value, count * sizeof(SkScalar)); | 62 fWriter.write(value, count * sizeof(SkScalar)); |
63 } | 63 } |
64 | 64 |
65 void SkOrderedWriteBuffer::writeInt(int32_t value) { | 65 void SkWriteBuffer::writeInt(int32_t value) { |
66 fWriter.write32(value); | 66 fWriter.write32(value); |
67 } | 67 } |
68 | 68 |
69 void SkOrderedWriteBuffer::writeIntArray(const int32_t* value, uint32_t count) { | 69 void SkWriteBuffer::writeIntArray(const int32_t* value, uint32_t count) { |
70 fWriter.write32(count); | 70 fWriter.write32(count); |
71 fWriter.write(value, count * sizeof(int32_t)); | 71 fWriter.write(value, count * sizeof(int32_t)); |
72 } | 72 } |
73 | 73 |
74 void SkOrderedWriteBuffer::writeUInt(uint32_t value) { | 74 void SkWriteBuffer::writeUInt(uint32_t value) { |
75 fWriter.write32(value); | 75 fWriter.write32(value); |
76 } | 76 } |
77 | 77 |
78 void SkOrderedWriteBuffer::write32(int32_t value) { | 78 void SkWriteBuffer::write32(int32_t value) { |
79 fWriter.write32(value); | 79 fWriter.write32(value); |
80 } | 80 } |
81 | 81 |
82 void SkOrderedWriteBuffer::writeString(const char* value) { | 82 void SkWriteBuffer::writeString(const char* value) { |
83 fWriter.writeString(value); | 83 fWriter.writeString(value); |
84 } | 84 } |
85 | 85 |
86 void SkOrderedWriteBuffer::writeEncodedString(const void* value, size_t byteLeng
th, | 86 void SkWriteBuffer::writeEncodedString(const void* value, size_t byteLength, |
87 SkPaint::TextEncoding encoding) { | 87 SkPaint::TextEncoding encoding) { |
88 fWriter.writeInt(encoding); | 88 fWriter.writeInt(encoding); |
89 fWriter.writeInt(byteLength); | 89 fWriter.writeInt(byteLength); |
90 fWriter.write(value, byteLength); | 90 fWriter.write(value, byteLength); |
91 } | 91 } |
92 | 92 |
93 | 93 |
94 void SkOrderedWriteBuffer::writeColor(const SkColor& color) { | 94 void SkWriteBuffer::writeColor(const SkColor& color) { |
95 fWriter.write32(color); | 95 fWriter.write32(color); |
96 } | 96 } |
97 | 97 |
98 void SkOrderedWriteBuffer::writeColorArray(const SkColor* color, uint32_t count)
{ | 98 void SkWriteBuffer::writeColorArray(const SkColor* color, uint32_t count) { |
99 fWriter.write32(count); | 99 fWriter.write32(count); |
100 fWriter.write(color, count * sizeof(SkColor)); | 100 fWriter.write(color, count * sizeof(SkColor)); |
101 } | 101 } |
102 | 102 |
103 void SkOrderedWriteBuffer::writePoint(const SkPoint& point) { | 103 void SkWriteBuffer::writePoint(const SkPoint& point) { |
104 fWriter.writeScalar(point.fX); | 104 fWriter.writeScalar(point.fX); |
105 fWriter.writeScalar(point.fY); | 105 fWriter.writeScalar(point.fY); |
106 } | 106 } |
107 | 107 |
108 void SkOrderedWriteBuffer::writePointArray(const SkPoint* point, uint32_t count)
{ | 108 void SkWriteBuffer::writePointArray(const SkPoint* point, uint32_t count) { |
109 fWriter.write32(count); | 109 fWriter.write32(count); |
110 fWriter.write(point, count * sizeof(SkPoint)); | 110 fWriter.write(point, count * sizeof(SkPoint)); |
111 } | 111 } |
112 | 112 |
113 void SkOrderedWriteBuffer::writeMatrix(const SkMatrix& matrix) { | 113 void SkWriteBuffer::writeMatrix(const SkMatrix& matrix) { |
114 fWriter.writeMatrix(matrix); | 114 fWriter.writeMatrix(matrix); |
115 } | 115 } |
116 | 116 |
117 void SkOrderedWriteBuffer::writeIRect(const SkIRect& rect) { | 117 void SkWriteBuffer::writeIRect(const SkIRect& rect) { |
118 fWriter.write(&rect, sizeof(SkIRect)); | 118 fWriter.write(&rect, sizeof(SkIRect)); |
119 } | 119 } |
120 | 120 |
121 void SkOrderedWriteBuffer::writeRect(const SkRect& rect) { | 121 void SkWriteBuffer::writeRect(const SkRect& rect) { |
122 fWriter.writeRect(rect); | 122 fWriter.writeRect(rect); |
123 } | 123 } |
124 | 124 |
125 void SkOrderedWriteBuffer::writeRegion(const SkRegion& region) { | 125 void SkWriteBuffer::writeRegion(const SkRegion& region) { |
126 fWriter.writeRegion(region); | 126 fWriter.writeRegion(region); |
127 } | 127 } |
128 | 128 |
129 void SkOrderedWriteBuffer::writePath(const SkPath& path) { | 129 void SkWriteBuffer::writePath(const SkPath& path) { |
130 fWriter.writePath(path); | 130 fWriter.writePath(path); |
131 } | 131 } |
132 | 132 |
133 size_t SkOrderedWriteBuffer::writeStream(SkStream* stream, size_t length) { | 133 size_t SkWriteBuffer::writeStream(SkStream* stream, size_t length) { |
134 fWriter.write32(length); | 134 fWriter.write32(length); |
135 size_t bytesWritten = fWriter.readFromStream(stream, length); | 135 size_t bytesWritten = fWriter.readFromStream(stream, length); |
136 if (bytesWritten < length) { | 136 if (bytesWritten < length) { |
137 fWriter.reservePad(length - bytesWritten); | 137 fWriter.reservePad(length - bytesWritten); |
138 } | 138 } |
139 return bytesWritten; | 139 return bytesWritten; |
140 } | 140 } |
141 | 141 |
142 bool SkOrderedWriteBuffer::writeToStream(SkWStream* stream) { | 142 bool SkWriteBuffer::writeToStream(SkWStream* stream) { |
143 return fWriter.writeToStream(stream); | 143 return fWriter.writeToStream(stream); |
144 } | 144 } |
145 | 145 |
146 static void write_encoded_bitmap(SkOrderedWriteBuffer* buffer, SkData* data, | 146 static void write_encoded_bitmap(SkWriteBuffer* buffer, SkData* data, |
147 const SkIPoint& origin) { | 147 const SkIPoint& origin) { |
148 buffer->writeUInt(SkToU32(data->size())); | 148 buffer->writeUInt(SkToU32(data->size())); |
149 buffer->getWriter32()->writePad(data->data(), data->size()); | 149 buffer->getWriter32()->writePad(data->data(), data->size()); |
150 buffer->write32(origin.fX); | 150 buffer->write32(origin.fX); |
151 buffer->write32(origin.fY); | 151 buffer->write32(origin.fY); |
152 } | 152 } |
153 | 153 |
154 void SkOrderedWriteBuffer::writeBitmap(const SkBitmap& bitmap) { | 154 void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) { |
155 // Record the width and height. This way if readBitmap fails a dummy bitmap
can be drawn at the | 155 // Record the width and height. This way if readBitmap fails a dummy bitmap
can be drawn at the |
156 // right size. | 156 // right size. |
157 this->writeInt(bitmap.width()); | 157 this->writeInt(bitmap.width()); |
158 this->writeInt(bitmap.height()); | 158 this->writeInt(bitmap.height()); |
159 | 159 |
160 // Record information about the bitmap in one of three ways, in order of pri
ority: | 160 // Record information about the bitmap in one of three ways, in order of pri
ority: |
161 // 1. If there is an SkBitmapHeap, store it in the heap. The client can avoi
d serializing the | 161 // 1. If there is an SkBitmapHeap, store it in the heap. The client can avoi
d serializing the |
162 // bitmap entirely or serialize it later as desired. A boolean value of t
rue will be written | 162 // bitmap entirely or serialize it later as desired. A boolean value of t
rue will be written |
163 // to the stream to signify that a heap was used. | 163 // to the stream to signify that a heap was used. |
164 // 2. If there is a function for encoding bitmaps, use it to write an encode
d version of the | 164 // 2. If there is a function for encoding bitmaps, use it to write an encode
d version of the |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 write_encoded_bitmap(this, data, SkIPoint::Make(0, 0)); | 204 write_encoded_bitmap(this, data, SkIPoint::Make(0, 0)); |
205 return; | 205 return; |
206 } | 206 } |
207 } | 207 } |
208 | 208 |
209 // Bitmap was not encoded. Record a zero, implying that the reader need not
decode. | 209 // Bitmap was not encoded. Record a zero, implying that the reader need not
decode. |
210 this->writeUInt(0); | 210 this->writeUInt(0); |
211 bitmap.flatten(*this); | 211 bitmap.flatten(*this); |
212 } | 212 } |
213 | 213 |
214 void SkOrderedWriteBuffer::writeTypeface(SkTypeface* obj) { | 214 void SkWriteBuffer::writeTypeface(SkTypeface* obj) { |
215 if (NULL == obj || NULL == fTFSet) { | 215 if (NULL == obj || NULL == fTFSet) { |
216 fWriter.write32(0); | 216 fWriter.write32(0); |
217 } else { | 217 } else { |
218 fWriter.write32(fTFSet->add(obj)); | 218 fWriter.write32(fTFSet->add(obj)); |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 SkFactorySet* SkOrderedWriteBuffer::setFactoryRecorder(SkFactorySet* rec) { | 222 SkFactorySet* SkWriteBuffer::setFactoryRecorder(SkFactorySet* rec) { |
223 SkRefCnt_SafeAssign(fFactorySet, rec); | 223 SkRefCnt_SafeAssign(fFactorySet, rec); |
224 if (fNamedFactorySet != NULL) { | 224 if (fNamedFactorySet != NULL) { |
225 fNamedFactorySet->unref(); | 225 fNamedFactorySet->unref(); |
226 fNamedFactorySet = NULL; | 226 fNamedFactorySet = NULL; |
227 } | 227 } |
228 return rec; | 228 return rec; |
229 } | 229 } |
230 | 230 |
231 SkNamedFactorySet* SkOrderedWriteBuffer::setNamedFactoryRecorder(SkNamedFactoryS
et* rec) { | 231 SkNamedFactorySet* SkWriteBuffer::setNamedFactoryRecorder(SkNamedFactorySet* rec
) { |
232 SkRefCnt_SafeAssign(fNamedFactorySet, rec); | 232 SkRefCnt_SafeAssign(fNamedFactorySet, rec); |
233 if (fFactorySet != NULL) { | 233 if (fFactorySet != NULL) { |
234 fFactorySet->unref(); | 234 fFactorySet->unref(); |
235 fFactorySet = NULL; | 235 fFactorySet = NULL; |
236 } | 236 } |
237 return rec; | 237 return rec; |
238 } | 238 } |
239 | 239 |
240 SkRefCntSet* SkOrderedWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) { | 240 SkRefCntSet* SkWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) { |
241 SkRefCnt_SafeAssign(fTFSet, rec); | 241 SkRefCnt_SafeAssign(fTFSet, rec); |
242 return rec; | 242 return rec; |
243 } | 243 } |
244 | 244 |
245 void SkOrderedWriteBuffer::setBitmapHeap(SkBitmapHeap* bitmapHeap) { | 245 void SkWriteBuffer::setBitmapHeap(SkBitmapHeap* bitmapHeap) { |
246 SkRefCnt_SafeAssign(fBitmapHeap, bitmapHeap); | 246 SkRefCnt_SafeAssign(fBitmapHeap, bitmapHeap); |
247 if (bitmapHeap != NULL) { | 247 if (bitmapHeap != NULL) { |
248 SkASSERT(NULL == fBitmapEncoder); | 248 SkASSERT(NULL == fBitmapEncoder); |
249 fBitmapEncoder = NULL; | 249 fBitmapEncoder = NULL; |
250 } | 250 } |
251 } | 251 } |
252 | 252 |
253 void SkOrderedWriteBuffer::setBitmapEncoder(SkPicture::EncodeBitmap bitmapEncode
r) { | 253 void SkWriteBuffer::setBitmapEncoder(SkPicture::EncodeBitmap bitmapEncoder) { |
254 fBitmapEncoder = bitmapEncoder; | 254 fBitmapEncoder = bitmapEncoder; |
255 if (bitmapEncoder != NULL) { | 255 if (bitmapEncoder != NULL) { |
256 SkASSERT(NULL == fBitmapHeap); | 256 SkASSERT(NULL == fBitmapHeap); |
257 SkSafeUnref(fBitmapHeap); | 257 SkSafeUnref(fBitmapHeap); |
258 fBitmapHeap = NULL; | 258 fBitmapHeap = NULL; |
259 } | 259 } |
260 } | 260 } |
261 | 261 |
262 void SkOrderedWriteBuffer::writeFlattenable(const SkFlattenable* flattenable) { | 262 void SkWriteBuffer::writeFlattenable(const SkFlattenable* flattenable) { |
263 /* | 263 /* |
264 * If we have a factoryset, then the first 32bits tell us... | 264 * If we have a factoryset, then the first 32bits tell us... |
265 * 0: failure to write the flattenable | 265 * 0: failure to write the flattenable |
266 * >0: (1-based) index into the SkFactorySet or SkNamedFactorySet | 266 * >0: (1-based) index into the SkFactorySet or SkNamedFactorySet |
267 * If we don't have a factoryset, then the first "ptr" is either the | 267 * If we don't have a factoryset, then the first "ptr" is either the |
268 * factory, or null for failure. | 268 * factory, or null for failure. |
269 * | 269 * |
270 * The distinction is important, since 0-index is 32bits (always), but a | 270 * The distinction is important, since 0-index is 32bits (always), but a |
271 * 0-functionptr might be 32 or 64 bits. | 271 * 0-functionptr might be 32 or 64 bits. |
272 */ | 272 */ |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 } | 311 } |
312 } else { | 312 } else { |
313 this->writeFunctionPtr((void*)factory); | 313 this->writeFunctionPtr((void*)factory); |
314 } | 314 } |
315 | 315 |
316 // make room for the size of the flattened object | 316 // make room for the size of the flattened object |
317 (void)fWriter.reserve(sizeof(uint32_t)); | 317 (void)fWriter.reserve(sizeof(uint32_t)); |
318 // record the current size, so we can subtract after the object writes. | 318 // record the current size, so we can subtract after the object writes. |
319 uint32_t offset = fWriter.bytesWritten(); | 319 uint32_t offset = fWriter.bytesWritten(); |
320 // now flatten the object | 320 // now flatten the object |
321 flattenObject(flattenable, *this); | 321 flattenable->flatten(*this); |
322 uint32_t objSize = fWriter.bytesWritten() - offset; | 322 uint32_t objSize = fWriter.bytesWritten() - offset; |
323 // record the obj's size | 323 // record the obj's size |
324 *fWriter.peek32(offset - sizeof(uint32_t)) = objSize; | 324 *fWriter.peek32(offset - sizeof(uint32_t)) = objSize; |
325 } | 325 } |
OLD | NEW |