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
10struct SkVarAlloc::Block {
11    Block* prev;
12    char* data() { return (char*)(this + 1); }
13
14    static Block* Alloc(Block* prev, size_t size) {
15        SkASSERT(size >= sizeof(Block));
16        Block* b = (Block*)sk_malloc_throw(size);
17        b->prev = prev;
18        return b;
19    }
20};
21
22SkVarAlloc::SkVarAlloc(size_t minLgSize)
23    : fBytesAllocated(0)
24    , fByte(nullptr)
25    , fRemaining(0)
26    , fLgSize(minLgSize)
27    , fBlock(nullptr) {}
28
29SkVarAlloc::SkVarAlloc(size_t minLgSize, char* storage, size_t len)
30    : fBytesAllocated(0)
31    , fByte(storage)
32    , fRemaining(len)
33    , fLgSize(minLgSize)
34    , fBlock(nullptr) {}
35
36SkVarAlloc::~SkVarAlloc() {
37    Block* b = fBlock;
38    while (b) {
39        Block* prev = b->prev;
40        sk_free(b);
41        b = prev;
42    }
43}
44
45void SkVarAlloc::makeSpace(size_t bytes) {
46    SkASSERT(SkIsAlignPtr(bytes));
47
48    size_t alloc = 1<<fLgSize++;
49    while (alloc < bytes + sizeof(Block)) {
50        alloc *= 2;
51    }
52    fBytesAllocated += alloc;
53    fBlock = Block::Alloc(fBlock, alloc);
54    fByte = fBlock->data();
55    fRemaining = alloc - sizeof(Block);
56}
57