1 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 #include "SkPathHeap.h" 9 #include "SkPath.h" 10 #include "SkStream.h" 11 #include "SkFlattenableBuffers.h" 12 #include <new> 13 14 #define kPathCount 64 15 16 SkPathHeap::SkPathHeap() : fHeap(kPathCount * sizeof(SkPath)) { 17 } 18 19 SkPathHeap::SkPathHeap(SkFlattenableReadBuffer& buffer) 20 : fHeap(kPathCount * sizeof(SkPath)) { 21 const int count = buffer.readInt(); 22 23 fPaths.setCount(count); 24 SkPath** ptr = fPaths.begin(); 25 SkPath* p = (SkPath*)fHeap.allocThrow(count * sizeof(SkPath)); 26 27 for (int i = 0; i < count; i++) { 28 new (p) SkPath; 29 buffer.readPath(p); 30 *ptr++ = p; // record the pointer 31 p++; // move to the next storage location 32 } 33 } 34 35 SkPathHeap::~SkPathHeap() { 36 SkPath** iter = fPaths.begin(); 37 SkPath** stop = fPaths.end(); 38 while (iter < stop) { 39 (*iter)->~SkPath(); 40 iter++; 41 } 42 } 43 44 int SkPathHeap::append(const SkPath& path) { 45 SkPath* p = (SkPath*)fHeap.allocThrow(sizeof(SkPath)); 46 new (p) SkPath(path); 47 *fPaths.append() = p; 48 return fPaths.count(); 49 } 50 51 void SkPathHeap::flatten(SkFlattenableWriteBuffer& buffer) const { 52 int count = fPaths.count(); 53 54 buffer.writeInt(count); 55 SkPath* const* iter = fPaths.begin(); 56 SkPath* const* stop = fPaths.end(); 57 while (iter < stop) { 58 buffer.writePath(**iter); 59 iter++; 60 } 61 } 62