OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 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 #include "SkPictureFlat.h" | 8 #include "SkPictureFlat.h" |
9 | 9 |
10 #include "SkChecksum.h" | 10 #include "SkChecksum.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 fTypefacePlayback = playback; | 87 fTypefacePlayback = playback; |
88 } | 88 } |
89 | 89 |
90 SkNamedFactorySet* SkFlatController::setNamedFactorySet(SkNamedFactorySet* set)
{ | 90 SkNamedFactorySet* SkFlatController::setNamedFactorySet(SkNamedFactorySet* set)
{ |
91 SkRefCnt_SafeAssign(fFactorySet, set); | 91 SkRefCnt_SafeAssign(fFactorySet, set); |
92 return set; | 92 return set; |
93 } | 93 } |
94 | 94 |
95 /////////////////////////////////////////////////////////////////////////////// | 95 /////////////////////////////////////////////////////////////////////////////// |
96 | 96 |
| 97 void SkFlatData::stampHeaderAndSentinel(int index, int32_t size) { |
| 98 fIndex = index; |
| 99 fFlatSize = size; |
| 100 fChecksum = SkChecksum::Compute(this->data32(), size); |
| 101 this->setTopBotUnwritten(); |
| 102 this->setSentinelAsCandidate(); |
| 103 } |
| 104 |
97 SkFlatData* SkFlatData::Create(SkFlatController* controller, const void* obj, | 105 SkFlatData* SkFlatData::Create(SkFlatController* controller, const void* obj, |
98 int index, void (*flattenProc)(SkOrderedWriteBuffer&, const void*)) { | 106 int index, void (*flattenProc)(SkOrderedWriteBuffer&, const void*)) { |
99 // a buffer of 256 bytes should be sufficient for most paints, regions, | 107 // a buffer of 256 bytes should be sufficient for most paints, regions, |
100 // and matrices. | 108 // and matrices. |
101 intptr_t storage[256]; | 109 intptr_t storage[256]; |
102 SkOrderedWriteBuffer buffer(256, storage, sizeof(storage)); | 110 SkOrderedWriteBuffer buffer(256, storage, sizeof(storage)); |
103 | 111 |
104 buffer.setBitmapHeap(controller->getBitmapHeap()); | 112 buffer.setBitmapHeap(controller->getBitmapHeap()); |
105 buffer.setTypefaceRecorder(controller->getTypefaceSet()); | 113 buffer.setTypefaceRecorder(controller->getTypefaceSet()); |
106 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); | 114 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); |
107 buffer.setFlags(controller->getWriteBufferFlags()); | 115 buffer.setFlags(controller->getWriteBufferFlags()); |
108 | 116 |
109 flattenProc(buffer, obj); | 117 flattenProc(buffer, obj); |
110 uint32_t size = buffer.size(); | 118 uint32_t size = buffer.size(); |
111 SkASSERT(SkIsAlign4(size)); | 119 SkASSERT(SkIsAlign4(size)); |
112 | 120 |
113 /** | 121 /** |
114 * Allocate enough memory to hold | 122 * Allocate enough memory to hold |
115 * 1. SkFlatData struct | 123 * 1. SkFlatData struct |
116 * 2. flattenProc's data (4-byte aligned) | 124 * 2. flattenProc's data (4-byte aligned) |
117 * 3. 4-byte sentinel | 125 * 3. 4-byte sentinel |
118 */ | 126 */ |
119 size_t allocSize = sizeof(SkFlatData) + size + sizeof(uint32_t); | 127 size_t allocSize = sizeof(SkFlatData) + size + sizeof(uint32_t); |
120 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); | 128 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); |
121 | 129 |
122 result->setIndex(index); | |
123 result->setTopBotUnwritten(); | |
124 result->fFlatSize = size; | |
125 | |
126 // put the serialized contents into the data section of the new allocation | 130 // put the serialized contents into the data section of the new allocation |
127 buffer.writeToMemory(result->data()); | 131 buffer.writeToMemory(result->data()); |
128 result->fChecksum = SkChecksum::Compute(result->data32(), size); | 132 result->stampHeaderAndSentinel(index, size); |
129 result->setSentinelAsCandidate(); | |
130 return result; | 133 return result; |
131 } | 134 } |
132 | 135 |
133 void SkFlatData::unflatten(void* result, | 136 void SkFlatData::unflatten(void* result, |
134 void (*unflattenProc)(SkOrderedReadBuffer&, void*), | 137 void (*unflattenProc)(SkOrderedReadBuffer&, void*), |
135 SkBitmapHeap* bitmapHeap, | 138 SkBitmapHeap* bitmapHeap, |
136 SkTypefacePlayback* facePlayback) const { | 139 SkTypefacePlayback* facePlayback) const { |
137 | 140 |
138 SkOrderedReadBuffer buffer(this->data(), fFlatSize); | 141 SkOrderedReadBuffer buffer(this->data(), fFlatSize); |
139 | 142 |
140 if (bitmapHeap) { | 143 if (bitmapHeap) { |
141 buffer.setBitmapStorage(bitmapHeap); | 144 buffer.setBitmapStorage(bitmapHeap); |
142 } | 145 } |
143 if (facePlayback) { | 146 if (facePlayback) { |
144 facePlayback->setupBuffer(buffer); | 147 facePlayback->setupBuffer(buffer); |
145 } | 148 } |
146 | 149 |
147 unflattenProc(buffer, result); | 150 unflattenProc(buffer, result); |
148 SkASSERT(fFlatSize == (int32_t)buffer.offset()); | 151 SkASSERT(fFlatSize == (int32_t)buffer.offset()); |
149 } | 152 } |
OLD | NEW |