blob: a502c5d99a4775d42a694fc6e4874ecac8d050f9 [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
13
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000014SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) {
djsollen@google.com2b2ede32012-04-12 13:24:04 +000015 fReader.setMemory(data, size);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000016 fMemoryPtr = NULL;
17
18 fRCArray = NULL;
19 fRCCount = 0;
20
21 fTFArray = NULL;
22 fTFCount = 0;
23
24 fFactoryTDArray = NULL;
25 fFactoryArray = NULL;
26 fFactoryCount = 0;
27}
28
29SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) {
30 const size_t length = stream->getLength();
31 fMemoryPtr = sk_malloc_throw(length);
32 stream->read(fMemoryPtr, length);
33 fReader.setMemory(fMemoryPtr, length);
34}
35
36SkOrderedReadBuffer::~SkOrderedReadBuffer() {
37 sk_free(fMemoryPtr);
38}
39
40bool SkOrderedReadBuffer::readBool() {
41 return fReader.readBool();
42}
43
44SkColor SkOrderedReadBuffer::readColor() {
45 return fReader.readInt();
46}
47
48SkFixed SkOrderedReadBuffer::readFixed() {
49 return fReader.readS32();
50}
51
52int32_t SkOrderedReadBuffer::readInt() {
53 return fReader.readInt();
54}
55
56SkScalar SkOrderedReadBuffer::readScalar() {
57 return fReader.readScalar();
58}
59
60uint32_t SkOrderedReadBuffer::readUInt() {
61 return fReader.readU32();
62}
63
64int32_t SkOrderedReadBuffer::read32() {
65 return fReader.readInt();
66}
67
68char* SkOrderedReadBuffer::readString() {
69 const char* string = fReader.readString();
70 const int32_t length = strlen(string);
71 char* value = (char*)sk_malloc_throw(length + 1);
72 strcpy(value, string);
73 return value;
74}
75
76void* SkOrderedReadBuffer::readEncodedString(size_t* length, SkPaint::TextEncoding encoding) {
77 int32_t encodingType = fReader.readInt();
78 SkASSERT(encodingType == encoding);
79 *length = fReader.readInt();
80 void* data = sk_malloc_throw(*length);
81 memcpy(data, fReader.skip(SkAlign4(*length)), *length);
82 return data;
83}
84
85void SkOrderedReadBuffer::readPoint(SkPoint* point) {
86 point->fX = fReader.readScalar();
87 point->fY = fReader.readScalar();
88}
89
90void SkOrderedReadBuffer::readMatrix(SkMatrix* matrix) {
91 fReader.readMatrix(matrix);
92}
93
94void SkOrderedReadBuffer::readIRect(SkIRect* rect) {
95 memcpy(rect, fReader.skip(sizeof(SkIRect)), sizeof(SkIRect));
96}
97
98void SkOrderedReadBuffer::readRect(SkRect* rect) {
99 memcpy(rect, fReader.skip(sizeof(SkRect)), sizeof(SkRect));
100}
101
102void SkOrderedReadBuffer::readRegion(SkRegion* region) {
103 fReader.readRegion(region);
104}
105
106void SkOrderedReadBuffer::readPath(SkPath* path) {
107 fReader.readPath(path);
108}
109
110uint32_t SkOrderedReadBuffer::readByteArray(void* value) {
111 const uint32_t length = fReader.readU32();
112 memcpy(value, fReader.skip(SkAlign4(length)), length);
113 return length;
114}
115
116uint32_t SkOrderedReadBuffer::readColorArray(SkColor* colors) {
117 const uint32_t count = fReader.readU32();
118 const uint32_t byteLength = count * sizeof(SkColor);
119 memcpy(colors, fReader.skip(SkAlign4(byteLength)), byteLength);
120 return count;
121}
122
123uint32_t SkOrderedReadBuffer::readIntArray(int32_t* values) {
124 const uint32_t count = fReader.readU32();
125 const uint32_t byteLength = count * sizeof(int32_t);
126 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
127 return count;
128}
129
130uint32_t SkOrderedReadBuffer::readPointArray(SkPoint* points) {
131 const uint32_t count = fReader.readU32();
132 const uint32_t byteLength = count * sizeof(SkPoint);
133 memcpy(points, fReader.skip(SkAlign4(byteLength)), byteLength);
134 return count;
135}
136
137uint32_t SkOrderedReadBuffer::readScalarArray(SkScalar* values) {
138 const uint32_t count = fReader.readU32();
139 const uint32_t byteLength = count * sizeof(SkScalar);
140 memcpy(values, fReader.skip(SkAlign4(byteLength)), byteLength);
141 return count;
142}
143
144uint32_t SkOrderedReadBuffer::getArrayCount() {
145 return *(uint32_t*)fReader.peek();
146}
147
148SkRefCnt* SkOrderedReadBuffer::readRefCntPtr() {
149 if (fRCArray) {
150 const uint32_t index = fReader.readU32();
151 SkASSERT(index <= (unsigned)fRCCount);
152 return fRCArray[index - 1];
153 } else {
154 return INHERITED::readRefCntPtr();
155 }
156}
157
158void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) {
159 bitmap->unflatten(*this);
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000160}
161
162SkTypeface* SkOrderedReadBuffer::readTypeface() {
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000163
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000164 uint32_t index = fReader.readU32();
165 if (0 == index || index > (unsigned)fTFCount) {
166 if (index) {
167 SkDebugf("====== typeface index %d\n", index);
168 }
169 return NULL;
170 } else {
171 SkASSERT(fTFArray);
172 return fTFArray[index - 1];
173 }
174}
175
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000176SkFlattenable* SkOrderedReadBuffer::readFlattenable() {
177 SkFlattenable::Factory factory = NULL;
178
179 if (fFactoryCount > 0) {
180 int32_t index = fReader.readU32();
181 if (0 == index) {
182 return NULL; // writer failed to give us the flattenable
183 }
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000184 index -= 1; // we stored the index-base-1
185 SkASSERT(index < fFactoryCount);
186 factory = fFactoryArray[index];
187 } else if (fFactoryTDArray) {
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000188 int32_t index = fReader.readU32();
189 if (0 == index) {
190 return NULL; // writer failed to give us the flattenable
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000191 }
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +0000192 index -= 1; // we stored the index-base-1
193 factory = (*fFactoryTDArray)[index];
djsollen@google.com2b2ede32012-04-12 13:24:04 +0000194 } else {
195 factory = (SkFlattenable::Factory)readFunctionPtr();
196 if (NULL == factory) {
197 return NULL; // writer failed to give us the flattenable
198 }
199 }
200
201 // if we get here, factory may still be null, but if that is the case, the
202 // failure was ours, not the writer.
203 SkFlattenable* obj = NULL;
204 uint32_t sizeRecorded = fReader.readU32();
205 if (factory) {
206 uint32_t offset = fReader.offset();
207 obj = (*factory)(*this);
208 // check that we read the amount we expected
209 uint32_t sizeRead = fReader.offset() - offset;
210 if (sizeRecorded != sizeRead) {
211 // we could try to fix up the offset...
212 sk_throw();
213 }
214 } else {
215 // we must skip the remaining data
216 fReader.skip(sizeRecorded);
217 }
218 return obj;
219}