blob: df949074fbc8e5c04b871b8902aab9d871e261b6 [file] [log] [blame]
djsollen@google.com2b2ede32012-04-12 13:24:04 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
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"
10#include "SkTypeface.h"
11
12
robertphillips@google.com4bdfb8c2012-06-12 21:23:49 +000013SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) {
djsollen@google.com2b2ede32012-04-12 13:24:04 +000014 fReader.setMemory(data, size);
15}
16
17SkTypeface* SkOrderedReadBuffer::readTypeface() {
18 uint32_t index = fReader.readU32();
19 if (0 == index || index > (unsigned)fTFCount) {
20 if (index) {
21 SkDebugf("====== typeface index %d\n", index);
22 }
23 return NULL;
24 } else {
25 SkASSERT(fTFArray);
26 return fTFArray[index - 1];
27 }
28}
29
30SkRefCnt* SkOrderedReadBuffer::readRefCnt() {
31 uint32_t index = fReader.readU32();
32 if (0 == index || index > (unsigned)fRCCount) {
33 return NULL;
34 } else {
35 SkASSERT(fRCArray);
36 return fRCArray[index - 1];
37 }
38}
39
40SkFlattenable* SkOrderedReadBuffer::readFlattenable() {
41 SkFlattenable::Factory factory = NULL;
42
43 if (fFactoryCount > 0) {
44 int32_t index = fReader.readU32();
45 if (0 == index) {
46 return NULL; // writer failed to give us the flattenable
47 }
djsollen@google.com2b2ede32012-04-12 13:24:04 +000048 index -= 1; // we stored the index-base-1
49 SkASSERT(index < fFactoryCount);
50 factory = fFactoryArray[index];
51 } else if (fFactoryTDArray) {
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +000052 int32_t index = fReader.readU32();
53 if (0 == index) {
54 return NULL; // writer failed to give us the flattenable
djsollen@google.com2b2ede32012-04-12 13:24:04 +000055 }
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +000056 index -= 1; // we stored the index-base-1
57 factory = (*fFactoryTDArray)[index];
djsollen@google.com2b2ede32012-04-12 13:24:04 +000058 } else {
59 factory = (SkFlattenable::Factory)readFunctionPtr();
60 if (NULL == factory) {
61 return NULL; // writer failed to give us the flattenable
62 }
63 }
64
65 // if we get here, factory may still be null, but if that is the case, the
66 // failure was ours, not the writer.
67 SkFlattenable* obj = NULL;
68 uint32_t sizeRecorded = fReader.readU32();
69 if (factory) {
70 uint32_t offset = fReader.offset();
71 obj = (*factory)(*this);
72 // check that we read the amount we expected
73 uint32_t sizeRead = fReader.offset() - offset;
74 if (sizeRecorded != sizeRead) {
75 // we could try to fix up the offset...
76 sk_throw();
77 }
78 } else {
79 // we must skip the remaining data
80 fReader.skip(sizeRecorded);
81 }
82 return obj;
83}
84
85void* SkOrderedReadBuffer::readFunctionPtr() {
reed@google.com34342f62012-06-25 14:36:28 +000086 SkASSERT(!this->isCrossProcess());
87
djsollen@google.com2b2ede32012-04-12 13:24:04 +000088 void* proc;
89 fReader.read(&proc, sizeof(proc));
90 return proc;
91}