Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: src/core/SkReadBuffer.cpp

Issue 134163010: Refactor read and write buffers. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: original write flags were fine Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkErrorInternals.h" 10 #include "SkErrorInternals.h"
11 #include "SkOrderedReadBuffer.h" 11 #include "SkReadBuffer.h"
12 #include "SkStream.h" 12 #include "SkStream.h"
13 #include "SkTypeface.h" 13 #include "SkTypeface.h"
14 14
15 SkOrderedReadBuffer::SkOrderedReadBuffer() : INHERITED() { 15 static uint32_t default_flags() {
16 uint32_t flags = 0;
17 #ifdef SK_SCALAR_IS_FLOAT
18 flags |= SkReadBuffer::kScalarIsFloat_Flag;
19 #endif
20 if (8 == sizeof(void*)) {
21 flags |= SkReadBuffer::kPtrIs64Bit_Flag;
22 }
23 return flags;
24 }
25
26 SkReadBuffer::SkReadBuffer() {
27 fFlags = default_flags();
16 fMemoryPtr = NULL; 28 fMemoryPtr = NULL;
17 29
18 fBitmapStorage = NULL; 30 fBitmapStorage = NULL;
19 fTFArray = NULL; 31 fTFArray = NULL;
20 fTFCount = 0; 32 fTFCount = 0;
21 33
22 fFactoryTDArray = NULL; 34 fFactoryTDArray = NULL;
23 fFactoryArray = NULL; 35 fFactoryArray = NULL;
24 fFactoryCount = 0; 36 fFactoryCount = 0;
25 fBitmapDecoder = NULL; 37 fBitmapDecoder = NULL;
26 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT 38 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT
27 fDecodedBitmapIndex = -1; 39 fDecodedBitmapIndex = -1;
28 #endif // DEBUG_NON_DETERMINISTIC_ASSERT 40 #endif // DEBUG_NON_DETERMINISTIC_ASSERT
29 } 41 }
30 42
31 SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERI TED() { 43 SkReadBuffer::SkReadBuffer(const void* data, size_t size) {
44 fFlags = default_flags();
32 fReader.setMemory(data, size); 45 fReader.setMemory(data, size);
33 fMemoryPtr = NULL; 46 fMemoryPtr = NULL;
34 47
35 fBitmapStorage = NULL; 48 fBitmapStorage = NULL;
36 fTFArray = NULL; 49 fTFArray = NULL;
37 fTFCount = 0; 50 fTFCount = 0;
38 51
39 fFactoryTDArray = NULL; 52 fFactoryTDArray = NULL;
40 fFactoryArray = NULL; 53 fFactoryArray = NULL;
41 fFactoryCount = 0; 54 fFactoryCount = 0;
42 fBitmapDecoder = NULL; 55 fBitmapDecoder = NULL;
43 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT 56 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT
44 fDecodedBitmapIndex = -1; 57 fDecodedBitmapIndex = -1;
45 #endif // DEBUG_NON_DETERMINISTIC_ASSERT 58 #endif // DEBUG_NON_DETERMINISTIC_ASSERT
46 } 59 }
47 60
48 SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) { 61 SkReadBuffer::SkReadBuffer(SkStream* stream) {
62 fFlags = default_flags();
49 const size_t length = stream->getLength(); 63 const size_t length = stream->getLength();
50 fMemoryPtr = sk_malloc_throw(length); 64 fMemoryPtr = sk_malloc_throw(length);
51 stream->read(fMemoryPtr, length); 65 stream->read(fMemoryPtr, length);
52 fReader.setMemory(fMemoryPtr, length); 66 fReader.setMemory(fMemoryPtr, length);
53 67
54 fBitmapStorage = NULL; 68 fBitmapStorage = NULL;
55 fTFArray = NULL; 69 fTFArray = NULL;
56 fTFCount = 0; 70 fTFCount = 0;
57 71
58 fFactoryTDArray = NULL; 72 fFactoryTDArray = NULL;
59 fFactoryArray = NULL; 73 fFactoryArray = NULL;
60 fFactoryCount = 0; 74 fFactoryCount = 0;
61 fBitmapDecoder = NULL; 75 fBitmapDecoder = NULL;
62 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT 76 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT
63 fDecodedBitmapIndex = -1; 77 fDecodedBitmapIndex = -1;
64 #endif // DEBUG_NON_DETERMINISTIC_ASSERT 78 #endif // DEBUG_NON_DETERMINISTIC_ASSERT
65 } 79 }
66 80
67 SkOrderedReadBuffer::~SkOrderedReadBuffer() { 81 SkReadBuffer::~SkReadBuffer() {
68 sk_free(fMemoryPtr); 82 sk_free(fMemoryPtr);
69 SkSafeUnref(fBitmapStorage); 83 SkSafeUnref(fBitmapStorage);
70 } 84 }
71 85
72 bool SkOrderedReadBuffer::readBool() { 86 bool SkReadBuffer::readBool() {
73 return fReader.readBool(); 87 return fReader.readBool();
74 } 88 }
75 89
76 SkColor SkOrderedReadBuffer::readColor() { 90 SkColor SkReadBuffer::readColor() {
77 return fReader.readInt(); 91 return fReader.readInt();
78 } 92 }
79 93
80 SkFixed SkOrderedReadBuffer::readFixed() { 94 SkFixed SkReadBuffer::readFixed() {
81 return fReader.readS32(); 95 return fReader.readS32();
82 } 96 }
83 97
84 int32_t SkOrderedReadBuffer::readInt() { 98 int32_t SkReadBuffer::readInt() {
85 return fReader.readInt(); 99 return fReader.readInt();
86 } 100 }
87 101
88 SkScalar SkOrderedReadBuffer::readScalar() { 102 SkScalar SkReadBuffer::readScalar() {
89 return fReader.readScalar(); 103 return fReader.readScalar();
90 } 104 }
91 105
92 uint32_t SkOrderedReadBuffer::readUInt() { 106 uint32_t SkReadBuffer::readUInt() {
93 return fReader.readU32(); 107 return fReader.readU32();
94 } 108 }
95 109
96 int32_t SkOrderedReadBuffer::read32() { 110 int32_t SkReadBuffer::read32() {
97 return fReader.readInt(); 111 return fReader.readInt();
98 } 112 }
99 113
100 void SkOrderedReadBuffer::readString(SkString* string) { 114 void SkReadBuffer::readString(SkString* string) {
101 size_t len; 115 size_t len;
102 const char* strContents = fReader.readString(&len); 116 const char* strContents = fReader.readString(&len);
103 string->set(strContents, len); 117 string->set(strContents, len);
104 } 118 }
105 119
106 void* SkOrderedReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncodi ng encoding) { 120 void* SkReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncoding enco ding) {
107 SkDEBUGCODE(int32_t encodingType = ) fReader.readInt(); 121 SkDEBUGCODE(int32_t encodingType = ) fReader.readInt();
108 SkASSERT(encodingType == encoding); 122 SkASSERT(encodingType == encoding);
109 *length = fReader.readInt(); 123 *length = fReader.readInt();
110 void* data = sk_malloc_throw(*length); 124 void* data = sk_malloc_throw(*length);
111 memcpy(data, fReader.skip(SkAlign4(*length)), *length); 125 memcpy(data, fReader.skip(SkAlign4(*length)), *length);
112 return data; 126 return data;
113 } 127 }
114 128
115 void SkOrderedReadBuffer::readPoint(SkPoint* point) { 129 void SkReadBuffer::readPoint(SkPoint* point) {
116 point->fX = fReader.readScalar(); 130 point->fX = fReader.readScalar();
117 point->fY = fReader.readScalar(); 131 point->fY = fReader.readScalar();
118 } 132 }
119 133
120 void SkOrderedReadBuffer::readMatrix(SkMatrix* matrix) { 134 void SkReadBuffer::readMatrix(SkMatrix* matrix) {
121 fReader.readMatrix(matrix); 135 fReader.readMatrix(matrix);
122 } 136 }
123 137
124 void SkOrderedReadBuffer::readIRect(SkIRect* rect) { 138 void SkReadBuffer::readIRect(SkIRect* rect) {
125 memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect)); 139 memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect));
126 } 140 }
127 141
128 void SkOrderedReadBuffer::readRect(SkRect* rect) { 142 void SkReadBuffer::readRect(SkRect* rect) {
129 memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect)); 143 memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect));
130 } 144 }
131 145
132 void SkOrderedReadBuffer::readRegion(SkRegion* region) { 146 void SkReadBuffer::readRegion(SkRegion* region) {
133 fReader.readRegion(region); 147 fReader.readRegion(region);
134 } 148 }
135 149
136 void SkOrderedReadBuffer::readPath(SkPath* path) { 150 void SkReadBuffer::readPath(SkPath* path) {
137 fReader.readPath(path); 151 fReader.readPath(path);
138 } 152 }
139 153
140 bool SkOrderedReadBuffer::readArray(void* value, size_t size, size_t elementSize ) { 154 bool SkReadBuffer::readArray(void* value, size_t size, size_t elementSize) {
141 const size_t count = this->getArrayCount(); 155 const size_t count = this->getArrayCount();
142 if (count == size) { 156 if (count == size) {
143 (void)fReader.skip(sizeof(uint32_t)); // Skip array count 157 (void)fReader.skip(sizeof(uint32_t)); // Skip array count
144 const size_t byteLength = count * elementSize; 158 const size_t byteLength = count * elementSize;
145 memcpy(value, fReader.skip(SkAlign4(byteLength)), byteLength); 159 memcpy(value, fReader.skip(SkAlign4(byteLength)), byteLength);
146 return true; 160 return true;
147 } 161 }
148 SkASSERT(false); 162 SkASSERT(false);
149 fReader.skip(fReader.available()); 163 fReader.skip(fReader.available());
150 return false; 164 return false;
151 } 165 }
152 166
153 bool SkOrderedReadBuffer::readByteArray(void* value, size_t size) { 167 bool SkReadBuffer::readByteArray(void* value, size_t size) {
154 return readArray(static_cast<unsigned char*>(value), size, sizeof(unsigned c har)); 168 return readArray(static_cast<unsigned char*>(value), size, sizeof(unsigned c har));
155 } 169 }
156 170
157 bool SkOrderedReadBuffer::readColorArray(SkColor* colors, size_t size) { 171 bool SkReadBuffer::readColorArray(SkColor* colors, size_t size) {
158 return readArray(colors, size, sizeof(SkColor)); 172 return readArray(colors, size, sizeof(SkColor));
159 } 173 }
160 174
161 bool SkOrderedReadBuffer::readIntArray(int32_t* values, size_t size) { 175 bool SkReadBuffer::readIntArray(int32_t* values, size_t size) {
162 return readArray(values, size, sizeof(int32_t)); 176 return readArray(values, size, sizeof(int32_t));
163 } 177 }
164 178
165 bool SkOrderedReadBuffer::readPointArray(SkPoint* points, size_t size) { 179 bool SkReadBuffer::readPointArray(SkPoint* points, size_t size) {
166 return readArray(points, size, sizeof(SkPoint)); 180 return readArray(points, size, sizeof(SkPoint));
167 } 181 }
168 182
169 bool SkOrderedReadBuffer::readScalarArray(SkScalar* values, size_t size) { 183 bool SkReadBuffer::readScalarArray(SkScalar* values, size_t size) {
170 return readArray(values, size, sizeof(SkScalar)); 184 return readArray(values, size, sizeof(SkScalar));
171 } 185 }
172 186
173 uint32_t SkOrderedReadBuffer::getArrayCount() { 187 uint32_t SkReadBuffer::getArrayCount() {
174 return *(uint32_t*)fReader.peek(); 188 return *(uint32_t*)fReader.peek();
175 } 189 }
176 190
177 void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) { 191 void SkReadBuffer::readBitmap(SkBitmap* bitmap) {
178 const int width = this->readInt(); 192 const int width = this->readInt();
179 const int height = this->readInt(); 193 const int height = this->readInt();
180 // The writer stored a boolean value to determine whether an SkBitmapHeap wa s used during 194 // The writer stored a boolean value to determine whether an SkBitmapHeap wa s used during
181 // writing. 195 // writing.
182 if (this->readBool()) { 196 if (this->readBool()) {
183 // An SkBitmapHeap was used for writing. Read the index from the stream and find the 197 // An SkBitmapHeap was used for writing. Read the index from the stream and find the
184 // corresponding SkBitmap in fBitmapStorage. 198 // corresponding SkBitmap in fBitmapStorage.
185 const uint32_t index = fReader.readU32(); 199 const uint32_t index = fReader.readU32();
186 fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::wr iteBitmap) 200 fReader.readU32(); // bitmap generation ID (see SkWriteBuffer::writeBitm ap)
187 if (fBitmapStorage) { 201 if (fBitmapStorage) {
188 *bitmap = *fBitmapStorage->getBitmap(index); 202 *bitmap = *fBitmapStorage->getBitmap(index);
189 fBitmapStorage->releaseRef(index); 203 fBitmapStorage->releaseRef(index);
190 return; 204 return;
191 } else { 205 } else {
192 // The bitmap was stored in a heap, but there is no way to access it . Set an error and 206 // The bitmap was stored in a heap, but there is no way to access it . Set an error and
193 // fall through to use a place holder bitmap. 207 // fall through to use a place holder bitmap.
194 SkErrorInternals::SetError(kParseError_SkError, "SkOrderedWriteBuffe r::writeBitmap " 208 SkErrorInternals::SetError(kParseError_SkError, "SkWriteBuffer::writ eBitmap "
195 "stored the SkBitmap in an SkBitmapHeap, but " 209 "stored the SkBitmap in an SkBitmapHeap, but "
196 "SkOrderedReadBuffer has no SkBitmapHeapR eader to " 210 "SkReadBuffer has no SkBitmapHeapReader t o "
197 "retrieve the SkBitmap."); 211 "retrieve the SkBitmap.");
198 } 212 }
199 } else { 213 } else {
200 // The writer stored false, meaning the SkBitmap was not stored in an Sk BitmapHeap. 214 // The writer stored false, meaning the SkBitmap was not stored in an Sk BitmapHeap.
201 const size_t length = this->readUInt(); 215 const size_t length = this->readUInt();
202 if (length > 0) { 216 if (length > 0) {
203 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT 217 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT
204 fDecodedBitmapIndex++; 218 fDecodedBitmapIndex++;
205 #endif // DEBUG_NON_DETERMINISTIC_ASSERT 219 #endif // DEBUG_NON_DETERMINISTIC_ASSERT
206 // A non-zero size means the SkBitmap was encoded. Read the data and pixel 220 // A non-zero size means the SkBitmap was encoded. Read the data and pixel
207 // offset. 221 // offset.
208 const void* data = this->skip(length); 222 const void* data = this->skip(length);
209 const int32_t xOffset = fReader.readS32(); 223 const int32_t xOffset = fReader.readS32();
210 const int32_t yOffset = fReader.readS32(); 224 const int32_t yOffset = fReader.readS32();
211 if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) { 225 if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) {
212 if (bitmap->width() == width && bitmap->height() == height) { 226 if (bitmap->width() == width && bitmap->height() == height) {
213 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT 227 #ifdef DEBUG_NON_DETERMINISTIC_ASSERT
214 if (0 != xOffset || 0 != yOffset) { 228 if (0 != xOffset || 0 != yOffset) {
215 SkDebugf("SkOrderedReadBuffer::readBitmap: heights match ," 229 SkDebugf("SkReadBuffer::readBitmap: heights match,"
216 " but offset is not zero. \nInfo about the bitm ap:" 230 " but offset is not zero. \nInfo about the bitm ap:"
217 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncode d" 231 "\n\tIndex: %d\n\tDimensions: [%d %d]\n\tEncode d"
218 " data size: %d\n\tOffset: (%d, %d)\n", 232 " data size: %d\n\tOffset: (%d, %d)\n",
219 fDecodedBitmapIndex, width, height, length, xOf fset, 233 fDecodedBitmapIndex, width, height, length, xOf fset,
220 yOffset); 234 yOffset);
221 } 235 }
222 #endif // DEBUG_NON_DETERMINISTIC_ASSERT 236 #endif // DEBUG_NON_DETERMINISTIC_ASSERT
223 // If the width and height match, there should be no offset. 237 // If the width and height match, there should be no offset.
224 SkASSERT(0 == xOffset && 0 == yOffset); 238 SkASSERT(0 == xOffset && 0 == yOffset);
225 return; 239 return;
(...skipping 23 matching lines...) Expand all
249 // A size of zero means the SkBitmap was simply flattened. 263 // A size of zero means the SkBitmap was simply flattened.
250 bitmap->unflatten(*this); 264 bitmap->unflatten(*this);
251 return; 265 return;
252 } 266 }
253 } 267 }
254 // Could not read the SkBitmap. Use a placeholder bitmap. 268 // Could not read the SkBitmap. Use a placeholder bitmap.
255 bitmap->allocPixels(SkImageInfo::MakeN32Premul(width, height)); 269 bitmap->allocPixels(SkImageInfo::MakeN32Premul(width, height));
256 bitmap->eraseColor(SK_ColorRED); 270 bitmap->eraseColor(SK_ColorRED);
257 } 271 }
258 272
259 SkTypeface* SkOrderedReadBuffer::readTypeface() { 273 SkTypeface* SkReadBuffer::readTypeface() {
260 274
261 uint32_t index = fReader.readU32(); 275 uint32_t index = fReader.readU32();
262 if (0 == index || index > (unsigned)fTFCount) { 276 if (0 == index || index > (unsigned)fTFCount) {
263 if (index) { 277 if (index) {
264 SkDebugf("====== typeface index %d\n", index); 278 SkDebugf("====== typeface index %d\n", index);
265 } 279 }
266 return NULL; 280 return NULL;
267 } else { 281 } else {
268 SkASSERT(fTFArray); 282 SkASSERT(fTFArray);
269 return fTFArray[index - 1]; 283 return fTFArray[index - 1];
270 } 284 }
271 } 285 }
272 286
273 SkFlattenable* SkOrderedReadBuffer::readFlattenable(SkFlattenable::Type ft) { 287 SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) {
274 // 288 //
275 // TODO: confirm that ft matches the factory we decide to use 289 // TODO: confirm that ft matches the factory we decide to use
276 // 290 //
277 291
278 SkFlattenable::Factory factory = NULL; 292 SkFlattenable::Factory factory = NULL;
279 293
280 if (fFactoryCount > 0) { 294 if (fFactoryCount > 0) {
281 int32_t index = fReader.readU32(); 295 int32_t index = fReader.readU32();
282 if (0 == index) { 296 if (0 == index) {
283 return NULL; // writer failed to give us the flattenable 297 return NULL; // writer failed to give us the flattenable
(...skipping 27 matching lines...) Expand all
311 if (sizeRecorded != sizeRead) { 325 if (sizeRecorded != sizeRead) {
312 // we could try to fix up the offset... 326 // we could try to fix up the offset...
313 sk_throw(); 327 sk_throw();
314 } 328 }
315 } else { 329 } else {
316 // we must skip the remaining data 330 // we must skip the remaining data
317 fReader.skip(sizeRecorded); 331 fReader.skip(sizeRecorded);
318 } 332 }
319 return obj; 333 return obj;
320 } 334 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698