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 #ifndef SkPictureFlat_DEFINED | 8 #ifndef SkPictureFlat_DEFINED |
9 #define SkPictureFlat_DEFINED | 9 #define SkPictureFlat_DEFINED |
10 | 10 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 template <typename Traits, typename T> | 258 template <typename Traits, typename T> |
259 static SkFlatData* Create(SkFlatController* controller, const T& obj, int in
dex) { | 259 static SkFlatData* Create(SkFlatController* controller, const T& obj, int in
dex) { |
260 // A buffer of 256 bytes should fit most paints, regions, and matrices. | 260 // A buffer of 256 bytes should fit most paints, regions, and matrices. |
261 uint32_t storage[64]; | 261 uint32_t storage[64]; |
262 SkWriteBuffer buffer(storage, sizeof(storage), controller->getWriteBuffe
rFlags()); | 262 SkWriteBuffer buffer(storage, sizeof(storage), controller->getWriteBuffe
rFlags()); |
263 | 263 |
264 buffer.setBitmapHeap(controller->getBitmapHeap()); | 264 buffer.setBitmapHeap(controller->getBitmapHeap()); |
265 buffer.setTypefaceRecorder(controller->getTypefaceSet()); | 265 buffer.setTypefaceRecorder(controller->getTypefaceSet()); |
266 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); | 266 buffer.setNamedFactoryRecorder(controller->getNamedFactorySet()); |
267 | 267 |
268 Traits::flatten(buffer, obj); | 268 Traits::Flatten(buffer, obj); |
269 size_t size = buffer.bytesWritten(); | 269 size_t size = buffer.bytesWritten(); |
270 SkASSERT(SkIsAlign4(size)); | 270 SkASSERT(SkIsAlign4(size)); |
271 | 271 |
272 // Allocate enough memory to hold SkFlatData struct and the flat data it
self. | 272 // Allocate enough memory to hold SkFlatData struct and the flat data it
self. |
273 size_t allocSize = sizeof(SkFlatData) + size; | 273 size_t allocSize = sizeof(SkFlatData) + size; |
274 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); | 274 SkFlatData* result = (SkFlatData*) controller->allocThrow(allocSize); |
275 | 275 |
276 // Put the serialized contents into the data section of the new allocati
on. | 276 // Put the serialized contents into the data section of the new allocati
on. |
277 buffer.writeToMemory(result->data()); | 277 buffer.writeToMemory(result->data()); |
278 // Stamp the index, size and checksum in the header. | 278 // Stamp the index, size and checksum in the header. |
279 result->stampHeader(index, SkToS32(size)); | 279 result->stampHeader(index, SkToS32(size)); |
280 return result; | 280 return result; |
281 } | 281 } |
282 | 282 |
283 // Unflatten this into result, using bitmapHeap and facePlayback for bitmaps
and fonts if given | 283 // Unflatten this into result, using bitmapHeap and facePlayback for bitmaps
and fonts if given |
284 template <typename Traits, typename T> | 284 template <typename Traits, typename T> |
285 void unflatten(T* result, | 285 void unflatten(T* result, |
286 SkBitmapHeap* bitmapHeap = NULL, | 286 SkBitmapHeap* bitmapHeap = NULL, |
287 SkTypefacePlayback* facePlayback = NULL) const { | 287 SkTypefacePlayback* facePlayback = NULL) const { |
288 SkReadBuffer buffer(this->data(), fFlatSize); | 288 SkReadBuffer buffer(this->data(), fFlatSize); |
289 | 289 |
290 if (bitmapHeap) { | 290 if (bitmapHeap) { |
291 buffer.setBitmapStorage(bitmapHeap); | 291 buffer.setBitmapStorage(bitmapHeap); |
292 } | 292 } |
293 if (facePlayback) { | 293 if (facePlayback) { |
294 facePlayback->setupBuffer(buffer); | 294 facePlayback->setupBuffer(buffer); |
295 } | 295 } |
296 | 296 |
297 Traits::unflatten(buffer, result); | 297 Traits::Unflatten(buffer, result); |
298 SkASSERT(fFlatSize == (int32_t)buffer.offset()); | 298 SkASSERT(fFlatSize == (int32_t)buffer.offset()); |
299 } | 299 } |
300 | 300 |
301 // Do these contain the same data? Ignores index() and topBot(). | 301 // Do these contain the same data? Ignores index() and topBot(). |
302 bool operator==(const SkFlatData& that) const { | 302 bool operator==(const SkFlatData& that) const { |
303 if (this->checksum() != that.checksum() || this->flatSize() != that.flat
Size()) { | 303 if (this->checksum() != that.checksum() || this->flatSize() != that.flat
Size()) { |
304 return false; | 304 return false; |
305 } | 305 } |
306 return memcmp(this->data(), that.data(), this->flatSize()) == 0; | 306 return memcmp(this->data(), that.data(), this->flatSize()) == 0; |
307 } | 307 } |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 return detached; | 509 return detached; |
510 } | 510 } |
511 | 511 |
512 // This reference is valid only until the next call to resetScratch() or det
achScratch(). | 512 // This reference is valid only until the next call to resetScratch() or det
achScratch(). |
513 const SkFlatData& resetScratch(const T& element, int index) { | 513 const SkFlatData& resetScratch(const T& element, int index) { |
514 this->lazyInit(); | 514 this->lazyInit(); |
515 | 515 |
516 // Layout of fScratch: [ SkFlatData header, 20 bytes ] [ data ..., 4-byt
e aligned ] | 516 // Layout of fScratch: [ SkFlatData header, 20 bytes ] [ data ..., 4-byt
e aligned ] |
517 fScratch.reset(); | 517 fScratch.reset(); |
518 fScratch.reserve(sizeof(SkFlatData)); | 518 fScratch.reserve(sizeof(SkFlatData)); |
519 Traits::flatten(fScratch, element); | 519 Traits::Flatten(fScratch, element); |
520 const size_t dataSize = fScratch.bytesWritten() - sizeof(SkFlatData); | 520 const size_t dataSize = fScratch.bytesWritten() - sizeof(SkFlatData); |
521 | 521 |
522 // Reinterpret data in fScratch as an SkFlatData. | 522 // Reinterpret data in fScratch as an SkFlatData. |
523 SkFlatData* scratch = (SkFlatData*)fScratch.getWriter32()->contiguousArr
ay(); | 523 SkFlatData* scratch = (SkFlatData*)fScratch.getWriter32()->contiguousArr
ay(); |
524 SkASSERT(scratch != NULL); | 524 SkASSERT(scratch != NULL); |
525 scratch->stampHeader(index, dataSize); | 525 scratch->stampHeader(index, dataSize); |
526 return *scratch; | 526 return *scratch; |
527 } | 527 } |
528 | 528 |
529 // This result is owned by fController and lives as long as it does (unless
unalloc'd). | 529 // This result is owned by fController and lives as long as it does (unless
unalloc'd). |
(...skipping 25 matching lines...) Expand all Loading... |
555 | 555 |
556 // For index -> SkFlatData. 0-based, while all indices in the API are 1-bas
ed. Careful! | 556 // For index -> SkFlatData. 0-based, while all indices in the API are 1-bas
ed. Careful! |
557 SkTDArray<const SkFlatData*> fIndexedData; | 557 SkTDArray<const SkFlatData*> fIndexedData; |
558 | 558 |
559 // For SkFlatData -> cached SkFlatData, which has index(). | 559 // For SkFlatData -> cached SkFlatData, which has index(). |
560 SkTDynamicHash<SkFlatData, SkFlatData, | 560 SkTDynamicHash<SkFlatData, SkFlatData, |
561 SkFlatData::Identity, SkFlatData::Hash, SkFlatData::Equal> fH
ash; | 561 SkFlatData::Identity, SkFlatData::Hash, SkFlatData::Equal> fH
ash; |
562 }; | 562 }; |
563 | 563 |
564 struct SkPaintTraits { | 564 struct SkPaintTraits { |
565 static void flatten(SkWriteBuffer& buffer, const SkPaint& paint) { | 565 static void Flatten(SkWriteBuffer& buffer, const SkPaint& paint) { |
566 paint.flatten(buffer); | 566 paint.flatten(buffer); |
567 } | 567 } |
568 static void unflatten(SkReadBuffer& buffer, SkPaint* paint) { | 568 static void Unflatten(SkReadBuffer& buffer, SkPaint* paint) { |
569 paint->unflatten(buffer); | 569 paint->unflatten(buffer); |
570 } | 570 } |
571 }; | 571 }; |
572 typedef SkFlatDictionary<SkPaint, SkPaintTraits> SkPaintDictionary; | 572 typedef SkFlatDictionary<SkPaint, SkPaintTraits> SkPaintDictionary; |
573 | 573 |
574 class SkChunkFlatController : public SkFlatController { | 574 class SkChunkFlatController : public SkFlatController { |
575 public: | 575 public: |
576 SkChunkFlatController(size_t minSize) | 576 SkChunkFlatController(size_t minSize) |
577 : fHeap(minSize) | 577 : fHeap(minSize) |
578 , fTypefaceSet(SkNEW(SkRefCntSet)) | 578 , fTypefaceSet(SkNEW(SkRefCntSet)) |
(...skipping 22 matching lines...) Expand all Loading... |
601 } | 601 } |
602 | 602 |
603 private: | 603 private: |
604 SkChunkAlloc fHeap; | 604 SkChunkAlloc fHeap; |
605 SkAutoTUnref<SkRefCntSet> fTypefaceSet; | 605 SkAutoTUnref<SkRefCntSet> fTypefaceSet; |
606 void* fLastAllocated; | 606 void* fLastAllocated; |
607 mutable SkTypefacePlayback fTypefacePlayback; | 607 mutable SkTypefacePlayback fTypefacePlayback; |
608 }; | 608 }; |
609 | 609 |
610 #endif | 610 #endif |
OLD | NEW |