blob: f6dae5dc57930776c9193398896b8ea6f67da709 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SkPathHeap.h"
2#include "SkPath.h"
3#include "SkStream.h"
4#include "SkFlattenable.h"
5#include <new>
6
7#define kPathCount 64
8
9SkPathHeap::SkPathHeap() : fHeap(kPathCount * sizeof(SkPath)) {
10}
11
12SkPathHeap::SkPathHeap(SkFlattenableReadBuffer& buffer)
13 : fHeap(kPathCount * sizeof(SkPath)) {
14 int count = buffer.readS32();
15
16 fPaths.setCount(count);
17 SkPath** ptr = fPaths.begin();
18 SkPath* p = (SkPath*)fHeap.allocThrow(count * sizeof(SkPath));
19
20 for (int i = 0; i < count; i++) {
21 new (p) SkPath;
22 p->unflatten(buffer);
23 *ptr++ = p; // record the pointer
24 p++; // move to the next storage location
25 }
26}
27
28SkPathHeap::~SkPathHeap() {
29 SkPath** iter = fPaths.begin();
30 SkPath** stop = fPaths.end();
31 while (iter < stop) {
32 (*iter)->~SkPath();
33 iter++;
34 }
35}
36
37int SkPathHeap::append(const SkPath& path) {
38 SkPath* p = (SkPath*)fHeap.allocThrow(sizeof(SkPath));
39 new (p) SkPath(path);
40 *fPaths.append() = p;
41 return fPaths.count();
42}
43
44void SkPathHeap::flatten(SkFlattenableWriteBuffer& buffer) const {
45 int count = fPaths.count();
46
47 buffer.write32(count);
48 SkPath** iter = fPaths.begin();
49 SkPath** stop = fPaths.end();
50 while (iter < stop) {
51 (*iter)->flatten(buffer);
52 iter++;
53 }
54}
55