1 /*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkVarAlloc.h"
9
10 #include "SkMalloc.h"
11
12 struct SkVarAlloc::Block {
13 Block* prev;
dataSkVarAlloc::Block14 char* data() { return (char*)(this + 1); }
15
AllocSkVarAlloc::Block16 static Block* Alloc(Block* prev, size_t size) {
17 SkASSERT(size >= sizeof(Block));
18 Block* b = (Block*)sk_malloc_throw(size);
19 b->prev = prev;
20 return b;
21 }
22 };
23
SkVarAlloc(size_t minLgSize)24 SkVarAlloc::SkVarAlloc(size_t minLgSize)
25 : fBytesAllocated(0)
26 , fByte(nullptr)
27 , fRemaining(0)
28 , fLgSize(minLgSize)
29 , fBlock(nullptr) {}
30
SkVarAlloc(size_t minLgSize,char * storage,size_t len)31 SkVarAlloc::SkVarAlloc(size_t minLgSize, char* storage, size_t len)
32 : fBytesAllocated(0)
33 , fByte(storage)
34 , fRemaining(len)
35 , fLgSize(minLgSize)
36 , fBlock(nullptr) {}
37
~SkVarAlloc()38 SkVarAlloc::~SkVarAlloc() {
39 Block* b = fBlock;
40 while (b) {
41 Block* prev = b->prev;
42 sk_free(b);
43 b = prev;
44 }
45 }
46
makeSpace(size_t bytes)47 void SkVarAlloc::makeSpace(size_t bytes) {
48 SkASSERT(SkIsAlignPtr(bytes));
49
50 size_t alloc = static_cast<size_t>(1)<<fLgSize++;
51 while (alloc < bytes + sizeof(Block)) {
52 alloc *= 2;
53 }
54 fBytesAllocated += alloc;
55 fBlock = Block::Alloc(fBlock, alloc);
56 fByte = fBlock->data();
57 fRemaining = alloc - sizeof(Block);
58 }
59