blob: 85491c5607545b04f8c48652399a611b3524cd21 [file] [log] [blame]
djsollen@google.com2b2ede32012-04-12 13:24:04 +00001
2/*
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00003 * Copyright 2012 Google Inc.
djsollen@google.com2b2ede32012-04-12 13:24:04 +00004 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
scroggo@google.comf8d7d272013-02-22 21:38:35 +00009#include "SkBitmap.h"
scroggo@google.com49ce11b2013-04-25 18:29:32 +000010#include "SkErrorInternals.h"
djsollen@google.com2b2ede32012-04-12 13:24:04 +000011#include "SkOrderedReadBuffer.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000012#include "SkStream.h"
djsollen@google.com2b2ede32012-04-12 13:24:04 +000013#include "SkTypeface.h"
14
djsollen@google.com21830d92012-08-07 19:49:41 +000015SkOrderedReadBuffer::SkOrderedReadBuffer() : INHERITED() {
16 fMemoryPtr = NULL;
djsollen@google.com2b2ede32012-04-12 13:24:04 +000017
djsollen@google.com21830d92012-08-07 19:49:41 +000018 fBitmapStorage = NULL;
19 fTFArray = NULL;
20 fTFCount = 0;
21
22 fFactoryTDArray = NULL;
23 fFactoryArray = NULL;
24 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000025 fBitmapDecoder = NULL;
djsollen@google.com21830d92012-08-07 19:49:41 +000026}
27
28SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERITED() {
djsollen@google.com2b2ede32012-04-12 13:24:04 +000029 fReader.setMemory(data, size);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000030 fMemoryPtr = NULL;
31
djsollen@google.com21830d92012-08-07 19:49:41 +000032 fBitmapStorage = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000033 fTFArray = NULL;
34 fTFCount = 0;
35
36 fFactoryTDArray = NULL;
37 fFactoryArray = NULL;
38 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000039 fBitmapDecoder = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000040}
41
42SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) {
43 const size_t length = stream->getLength();
44 fMemoryPtr = sk_malloc_throw(length);
45 stream->read(fMemoryPtr, length);
46 fReader.setMemory(fMemoryPtr, length);
djsollen@google.com21830d92012-08-07 19:49:41 +000047
48 fBitmapStorage = NULL;
49 fTFArray = NULL;
50 fTFCount = 0;
51
52 fFactoryTDArray = NULL;
53 fFactoryArray = NULL;
54 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000055 fBitmapDecoder = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000056}
57
58SkOrderedReadBuffer::~SkOrderedReadBuffer() {
59 sk_free(fMemoryPtr);
djsollen@google.com21830d92012-08-07 19:49:41 +000060 SkSafeUnref(fBitmapStorage);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000061}
62
63bool SkOrderedReadBuffer::readBool() {
64 return fReader.readBool();
65}
66
67SkColor SkOrderedReadBuffer::readColor() {
68 return fReader.readInt();
69}
70
71SkFixed SkOrderedReadBuffer::readFixed() {
72 return fReader.readS32();
73}
74
75int32_t SkOrderedReadBuffer::readInt() {
76 return fReader.readInt();
77}
78
79SkScalar SkOrderedReadBuffer::readScalar() {
80 return fReader.readScalar();
81}
82
83uint32_t SkOrderedReadBuffer::readUInt() {
84 return fReader.readU32();
85}
86
87int32_t SkOrderedReadBuffer::read32() {
88 return fReader.readInt();
89}
90
91char* SkOrderedReadBuffer::readString() {
92 const char* string = fReader.readString();
scroggo@google.come5f48242013-02-25 21:47:41 +000093 const size_t length = strlen(string);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000094 char* value = (char*)sk_malloc_throw(length + 1);
95 strcpy(value, string);
96 return value;
97}
98
99void* SkOrderedReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncoding encoding) {
humper@google.com0e515772013-01-07 19:54:40 +0000100 SkDEBUGCODE(int32_t encodingType = ) fReader.readInt();
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000101 SkASSERT(encodingType == encoding);
102 *length = fReader.readInt();
103 void* data = sk_malloc_throw(*length);
104 memcpy(data, fReader.skip(SkAlign4(*length)), *length);
105 return data;
106}
107
108void SkOrderedReadBuffer::readPoint(SkPoint* point) {
109 point->fX = fReader.readScalar();
110 point->fY = fReader.readScalar();
111}
112
113void SkOrderedReadBuffer::readMatrix(SkMatrix* matrix) {
114 fReader.readMatrix(matrix);
115}
116
117void SkOrderedReadBuffer::readIRect(SkIRect* rect) {
118 memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect));
119}
120
121void SkOrderedReadBuffer::readRect(SkRect* rect) {
122 memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect));
123}
124
125void SkOrderedReadBuffer::readRegion(SkRegion* region) {
126 fReader.readRegion(region);
127}
128
129void SkOrderedReadBuffer::readPath(SkPath* path) {
130 fReader.readPath(path);
131}
132
133uint32_t SkOrderedReadBuffer::readByteArray(void* value) {
134 const uint32_t length = fReader.readU32();
135 memcpy(value, fReader.skip(SkAlign4(length)), length);
136 return length;
137}
138
139uint32_t SkOrderedReadBuffer::readColorArray(SkColor* colors) {
140 const uint32_t count = fReader.readU32();
141 const uint32_t byteLength = count * sizeof(SkColor);
142 memcpy(colors, fReader.skip(SkAlign4(byteLength)), byteLength);
143 return count;
144}
145
146uint32_t SkOrderedReadBuffer::readIntArray(int32_t* values) {
147 const uint32_t count = fReader.readU32();
148 const uint32_t byteLength = count * sizeof(int32_t);
149 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
150 return count;
151}
152
153uint32_t SkOrderedReadBuffer::readPointArray(SkPoint* points) {
154 const uint32_t count = fReader.readU32();
155 const uint32_t byteLength = count * sizeof(SkPoint);
156 memcpy(points, fReader.skip(SkAlign4(byteLength)), byteLength);
157 return count;
158}
159
160uint32_t SkOrderedReadBuffer::readScalarArray(SkScalar* values) {
161 const uint32_t count = fReader.readU32();
162 const uint32_t byteLength = count * sizeof(SkScalar);
163 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
164 return count;
165}
166
167uint32_t SkOrderedReadBuffer::getArrayCount() {
168 return *(uint32_t*)fReader.peek();
169}
170
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000171void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) {
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000172 const int width = this->readInt();
173 const int height = this->readInt();
174 // The writer stored a boolean value to determine whether an SkBitmapHeap was used during
175 // writing.
176 if (this->readBool()) {
177 // An SkBitmapHeap was used for writing. Read the index from the stream and find the
178 // corresponding SkBitmap in fBitmapStorage.
179 const uint32_t index = fReader.readU32();
180 fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::writeBitmap)
181 if (fBitmapStorage) {
182 *bitmap = *fBitmapStorage->getBitmap(index);
183 fBitmapStorage->releaseRef(index);
184 return;
scroggo@google.com0cb7df92013-04-30 02:37:56 +0000185 } else {
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000186 // The bitmap was stored in a heap, but there is no way to access it. Set an error and
187 // fall through to use a place holder bitmap.
188 SkErrorInternals::SetError(kParseError_SkError, "SkOrderedWriteBuffer::writeBitmap "
189 "stored the SkBitmap in an SkBitmapHeap, but "
190 "SkOrderedReadBuffer has no SkBitmapHeapReader to "
191 "retrieve the SkBitmap.");
scroggo@google.com0cb7df92013-04-30 02:37:56 +0000192 }
193 } else {
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000194 // The writer stored false, meaning the SkBitmap was not stored in an SkBitmapHeap.
195 const size_t length = this->readUInt();
196 if (length > 0) {
197 // A non-zero size means the SkBitmap was encoded.
198 const void* data = this->skip(length);
199 if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) {
200 SkASSERT(bitmap->width() == width && bitmap->height() == height);
scroggo@google.com0cb7df92013-04-30 02:37:56 +0000201 return;
scroggo@google.com0cb7df92013-04-30 02:37:56 +0000202 }
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000203 // This bitmap was encoded when written, but we are unable to decode, possibly due to
204 // not having a decoder.
205 SkErrorInternals::SetError(kParseError_SkError,
206 "Could not decode bitmap. Resulting bitmap will be red.");
scroggo@google.com0cb7df92013-04-30 02:37:56 +0000207 } else {
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000208 // A size of zero means the SkBitmap was simply flattened.
209 bitmap->unflatten(*this);
210 return;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000211 }
djsollen@google.com21830d92012-08-07 19:49:41 +0000212 }
scroggo@google.com2983ddd2013-05-07 14:45:40 +0000213 // Could not read the SkBitmap. Use a placeholder bitmap.
214 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
215 bitmap->allocPixels();
216 bitmap->eraseColor(SK_ColorRED);
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000217}
218
219SkTypeface* SkOrderedReadBuffer::readTypeface() {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000220
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000221 uint32_t index = fReader.readU32();
222 if (0 == index || index > (unsigned)fTFCount) {
223 if (index) {
224 SkDebugf("====== typeface index %d\n", index);
225 }
226 return NULL;
227 } else {
228 SkASSERT(fTFArray);
229 return fTFArray[index - 1];
230 }
231}
232
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000233SkFlattenable* SkOrderedReadBuffer::readFlattenable() {
234 SkFlattenable::Factory factory = NULL;
235
236 if (fFactoryCount > 0) {
237 int32_t index = fReader.readU32();
238 if (0 == index) {
239 return NULL; // writer failed to give us the flattenable
240 }
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000241 index -= 1; // we stored the index-base-1
242 SkASSERT(index < fFactoryCount);
243 factory = fFactoryArray[index];
244 } else if (fFactoryTDArray) {
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000245 int32_t index = fReader.readU32();
246 if (0 == index) {
247 return NULL; // writer failed to give us the flattenable
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000248 }
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000249 index -= 1; // we stored the index-base-1
250 factory = (*fFactoryTDArray)[index];
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000251 } else {
252 factory = (SkFlattenable::Factory)readFunctionPtr();
253 if (NULL == factory) {
254 return NULL; // writer failed to give us the flattenable
255 }
256 }
257
258 // if we get here, factory may still be null, but if that is the case, the
259 // failure was ours, not the writer.
260 SkFlattenable* obj = NULL;
261 uint32_t sizeRecorded = fReader.readU32();
262 if (factory) {
263 uint32_t offset = fReader.offset();
264 obj = (*factory)(*this);
265 // check that we read the amount we expected
266 uint32_t sizeRead = fReader.offset() - offset;
267 if (sizeRecorded != sizeRead) {
268 // we could try to fix up the offset...
269 sk_throw();
270 }
271 } else {
272 // we must skip the remaining data
273 fReader.skip(sizeRecorded);
274 }
275 return obj;
276}