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