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) { | 97 SkFlatData* SkFlatData::Create(SkFlatController* controller, |
98 fIndex = index; | 98 const void* obj, |
99 fFlatSize = size; | 99 int index, |
100 fChecksum = SkChecksum::Compute(this->data32(), size); | 100 void (*flattenProc)(SkOrderedWriteBuffer&, const
void*)) { |
101 this->setTopBotUnwritten(); | |
102 this->setSentinelAsCandidate(); | |
103 } | |
104 | |
105 SkFlatData* SkFlatData::Create(SkFlatController* controller, const void* obj, | |
106 int index, void (*flattenProc)(SkOrderedWriteBuffer&, const void*)) { | |
107 // a buffer of 256 bytes should be sufficient for most paints, regions, | 101 // a buffer of 256 bytes should be sufficient for most paints, regions, |
108 // and matrices. | 102 // and matrices. |
109 intptr_t storage[256]; | 103 intptr_t storage[256]; |
110 SkOrderedWriteBuffer buffer(256, storage, sizeof(storage)); | 104 SkOrderedWriteBuffer buffer(256, storage, sizeof(storage)); |
111 | 105 |
112 buffer.setBitmapHeap(controller->getBitmapHeap()); | 106 buffer.setBitmapHeap(controller->getBitmapHeap()); |
113 buffer.setTypefaceRecorder(controller->getTypefaceSet()); | 107 buffer.setTypefaceRecorder(controller->getTypefaceSet()); |
114 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); | 108 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); |
115 buffer.setFlags(controller->getWriteBufferFlags()); | 109 buffer.setFlags(controller->getWriteBufferFlags()); |
116 | 110 |
117 flattenProc(buffer, obj); | 111 flattenProc(buffer, obj); |
118 uint32_t size = buffer.size(); | 112 uint32_t size = buffer.size(); |
119 SkASSERT(SkIsAlign4(size)); | 113 SkASSERT(SkIsAlign4(size)); |
120 | 114 |
121 /** | 115 // Allocate enough memory to hold SkFlatData struct and the flat data itself
. |
122 * Allocate enough memory to hold | 116 size_t allocSize = sizeof(SkFlatData) + size; |
123 * 1. SkFlatData struct | |
124 * 2. flattenProc's data (4-byte aligned) | |
125 * 3. 4-byte sentinel | |
126 */ | |
127 size_t allocSize = sizeof(SkFlatData) + size + sizeof(uint32_t); | |
128 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); | 117 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); |
129 | 118 |
130 // put the serialized contents into the data section of the new allocation | 119 // Put the serialized contents into the data section of the new allocation. |
131 buffer.writeToMemory(result->data()); | 120 buffer.writeToMemory(result->data()); |
132 result->stampHeaderAndSentinel(index, size); | 121 // Stamp the index, size and checksum in the header. |
| 122 result->stampHeader(index, size); |
133 return result; | 123 return result; |
134 } | 124 } |
135 | 125 |
136 void SkFlatData::unflatten(void* result, | 126 void SkFlatData::unflatten(void* result, |
137 void (*unflattenProc)(SkOrderedReadBuffer&, void*), | 127 void (*unflattenProc)(SkOrderedReadBuffer&, void*), |
138 SkBitmapHeap* bitmapHeap, | 128 SkBitmapHeap* bitmapHeap, |
139 SkTypefacePlayback* facePlayback) const { | 129 SkTypefacePlayback* facePlayback) const { |
140 | 130 |
141 SkOrderedReadBuffer buffer(this->data(), fFlatSize); | 131 SkOrderedReadBuffer buffer(this->data(), fFlatSize); |
142 | 132 |
143 if (bitmapHeap) { | 133 if (bitmapHeap) { |
144 buffer.setBitmapStorage(bitmapHeap); | 134 buffer.setBitmapStorage(bitmapHeap); |
145 } | 135 } |
146 if (facePlayback) { | 136 if (facePlayback) { |
147 facePlayback->setupBuffer(buffer); | 137 facePlayback->setupBuffer(buffer); |
148 } | 138 } |
149 | 139 |
150 unflattenProc(buffer, result); | 140 unflattenProc(buffer, result); |
151 SkASSERT(fFlatSize == (int32_t)buffer.offset()); | 141 SkASSERT(fFlatSize == (int32_t)buffer.offset()); |
152 } | 142 } |
OLD | NEW |