| 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 |