blob: daca74c09000a212ce19388fa472ca1271f59e4e [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
9#include "SkOrderedReadBuffer.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000010#include "SkStream.h"
djsollen@google.com2b2ede32012-04-12 13:24:04 +000011#include "SkTypeface.h"
12
djsollen@google.com21830d92012-08-07 19:49:41 +000013SkOrderedReadBuffer::SkOrderedReadBuffer() : INHERITED() {
14 fMemoryPtr = NULL;
djsollen@google.com2b2ede32012-04-12 13:24:04 +000015
djsollen@google.com21830d92012-08-07 19:49:41 +000016 fBitmapStorage = NULL;
17 fTFArray = NULL;
18 fTFCount = 0;
19
20 fFactoryTDArray = NULL;
21 fFactoryArray = NULL;
22 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000023 fBitmapDecoder = NULL;
djsollen@google.com21830d92012-08-07 19:49:41 +000024}
25
26SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERITED() {
djsollen@google.com2b2ede32012-04-12 13:24:04 +000027 fReader.setMemory(data, size);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000028 fMemoryPtr = NULL;
29
djsollen@google.com21830d92012-08-07 19:49:41 +000030 fBitmapStorage = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000031 fTFArray = NULL;
32 fTFCount = 0;
33
34 fFactoryTDArray = NULL;
35 fFactoryArray = NULL;
36 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000037 fBitmapDecoder = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000038}
39
40SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) {
41 const size_t length = stream->getLength();
42 fMemoryPtr = sk_malloc_throw(length);
43 stream->read(fMemoryPtr, length);
44 fReader.setMemory(fMemoryPtr, length);
djsollen@google.com21830d92012-08-07 19:49:41 +000045
46 fBitmapStorage = NULL;
47 fTFArray = NULL;
48 fTFCount = 0;
49
50 fFactoryTDArray = NULL;
51 fFactoryArray = NULL;
52 fFactoryCount = 0;
scroggo@google.com5a7c6be2012-10-04 21:46:08 +000053 fBitmapDecoder = NULL;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000054}
55
56SkOrderedReadBuffer::~SkOrderedReadBuffer() {
57 sk_free(fMemoryPtr);
djsollen@google.com21830d92012-08-07 19:49:41 +000058 SkSafeUnref(fBitmapStorage);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000059}
60
61bool SkOrderedReadBuffer::readBool() {
62 return fReader.readBool();
63}
64
65SkColor SkOrderedReadBuffer::readColor() {
66 return fReader.readInt();
67}
68
69SkFixed SkOrderedReadBuffer::readFixed() {
70 return fReader.readS32();
71}
72
73int32_t SkOrderedReadBuffer::readInt() {
74 return fReader.readInt();
75}
76
77SkScalar SkOrderedReadBuffer::readScalar() {
78 return fReader.readScalar();
79}
80
81uint32_t SkOrderedReadBuffer::readUInt() {
82 return fReader.readU32();
83}
84
85int32_t SkOrderedReadBuffer::read32() {
86 return fReader.readInt();
87}
88
89char* SkOrderedReadBuffer::readString() {
90 const char* string = fReader.readString();
91 const int32_t length = strlen(string);
92 char* value = (char*)sk_malloc_throw(length + 1);
93 strcpy(value, string);
94 return value;
95}
96
97void* SkOrderedReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncoding encoding) {
humper@google.com0e515772013-01-07 19:54:40 +000098 SkDEBUGCODE(int32_t encodingType = ) fReader.readInt();
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000099 SkASSERT(encodingType == encoding);
100 *length = fReader.readInt();
101 void* data = sk_malloc_throw(*length);
102 memcpy(data, fReader.skip(SkAlign4(*length)), *length);
103 return data;
104}
105
106void SkOrderedReadBuffer::readPoint(SkPoint* point) {
107 point->fX = fReader.readScalar();
108 point->fY = fReader.readScalar();
109}
110
111void SkOrderedReadBuffer::readMatrix(SkMatrix* matrix) {
112 fReader.readMatrix(matrix);
113}
114
115void SkOrderedReadBuffer::readIRect(SkIRect* rect) {
116 memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect));
117}
118
119void SkOrderedReadBuffer::readRect(SkRect* rect) {
120 memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect));
121}
122
123void SkOrderedReadBuffer::readRegion(SkRegion* region) {
124 fReader.readRegion(region);
125}
126
127void SkOrderedReadBuffer::readPath(SkPath* path) {
128 fReader.readPath(path);
129}
130
131uint32_t SkOrderedReadBuffer::readByteArray(void* value) {
132 const uint32_t length = fReader.readU32();
133 memcpy(value, fReader.skip(SkAlign4(length)), length);
134 return length;
135}
136
137uint32_t SkOrderedReadBuffer::readColorArray(SkColor* colors) {
138 const uint32_t count = fReader.readU32();
139 const uint32_t byteLength = count * sizeof(SkColor);
140 memcpy(colors, fReader.skip(SkAlign4(byteLength)), byteLength);
141 return count;
142}
143
144uint32_t SkOrderedReadBuffer::readIntArray(int32_t* values) {
145 const uint32_t count = fReader.readU32();
146 const uint32_t byteLength = count * sizeof(int32_t);
147 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
148 return count;
149}
150
151uint32_t SkOrderedReadBuffer::readPointArray(SkPoint* points) {
152 const uint32_t count = fReader.readU32();
153 const uint32_t byteLength = count * sizeof(SkPoint);
154 memcpy(points, fReader.skip(SkAlign4(byteLength)), byteLength);
155 return count;
156}
157
158uint32_t SkOrderedReadBuffer::readScalarArray(SkScalar* values) {
159 const uint32_t count = fReader.readU32();
160 const uint32_t byteLength = count * sizeof(SkScalar);
161 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
162 return count;
163}
164
165uint32_t SkOrderedReadBuffer::getArrayCount() {
166 return *(uint32_t*)fReader.peek();
167}
168
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000169void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) {
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000170 size_t length = this->readUInt();
171 if (length > 0) {
172 // Bitmap was encoded.
173 SkMemoryStream stream(const_cast<void*>(this->skip(length)), length, false);
174 if (fBitmapDecoder != NULL && fBitmapDecoder(&stream, bitmap)) {
175 // Skip the width and height, which were written in case of failure.
176 fReader.skip(2 * sizeof(int));
177 } else {
178 // This bitmap was encoded when written, but we are unable to decode, possibly due to
179 // not having a decoder. Use a placeholder bitmap.
180 SkDebugf("Could not decode bitmap. Resulting bitmap will be red.\n");
181 int width = this->readInt();
182 int height = this->readInt();
183 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
184 bitmap->allocPixels();
185 bitmap->eraseColor(SK_ColorRED);
186 }
djsollen@google.com21830d92012-08-07 19:49:41 +0000187 } else {
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000188 if (fBitmapStorage) {
189 const uint32_t index = fReader.readU32();
junov@chromium.orgce65f382012-10-17 19:36:09 +0000190 fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::writeBitmap)
scroggo@google.com5a7c6be2012-10-04 21:46:08 +0000191 *bitmap = *fBitmapStorage->getBitmap(index);
192 fBitmapStorage->releaseRef(index);
193 } else {
194 bitmap->unflatten(*this);
195 }
djsollen@google.com21830d92012-08-07 19:49:41 +0000196 }
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000197}
198
199SkTypeface* SkOrderedReadBuffer::readTypeface() {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000200
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000201 uint32_t index = fReader.readU32();
202 if (0 == index || index > (unsigned)fTFCount) {
203 if (index) {
204 SkDebugf("====== typeface index %d\n", index);
205 }
206 return NULL;
207 } else {
208 SkASSERT(fTFArray);
209 return fTFArray[index - 1];
210 }
211}
212
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000213SkFlattenable* SkOrderedReadBuffer::readFlattenable() {
214 SkFlattenable::Factory factory = NULL;
215
216 if (fFactoryCount > 0) {
217 int32_t index = fReader.readU32();
218 if (0 == index) {
219 return NULL; // writer failed to give us the flattenable
220 }
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000221 index -= 1; // we stored the index-base-1
222 SkASSERT(index < fFactoryCount);
223 factory = fFactoryArray[index];
224 } else if (fFactoryTDArray) {
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000225 int32_t index = fReader.readU32();
226 if (0 == index) {
227 return NULL; // writer failed to give us the flattenable
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000228 }
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000229 index -= 1; // we stored the index-base-1
230 factory = (*fFactoryTDArray)[index];
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000231 } else {
232 factory = (SkFlattenable::Factory)readFunctionPtr();
233 if (NULL == factory) {
234 return NULL; // writer failed to give us the flattenable
235 }
236 }
237
238 // if we get here, factory may still be null, but if that is the case, the
239 // failure was ours, not the writer.
240 SkFlattenable* obj = NULL;
241 uint32_t sizeRecorded = fReader.readU32();
242 if (factory) {
243 uint32_t offset = fReader.offset();
244 obj = (*factory)(*this);
245 // check that we read the amount we expected
246 uint32_t sizeRead = fReader.offset() - offset;
247 if (sizeRecorded != sizeRead) {
248 // we could try to fix up the offset...
249 sk_throw();
250 }
251 } else {
252 // we must skip the remaining data
253 fReader.skip(sizeRecorded);
254 }
255 return obj;
256}