• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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