blob: 1fbd382c1948d5728462fc02af6b0350886d08de [file] [log] [blame]
mtklein29b1afc2015-04-09 07:46:41 -07001/*
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
mtklein8113dd12014-11-12 15:15:28 -08008#include "SkVarAlloc.h"
mtklein8113dd12014-11-12 15:15:28 -08009
mtklein8113dd12014-11-12 15:15:28 -080010struct SkVarAlloc::Block {
11 Block* prev;
12 char* data() { return (char*)(this + 1); }
13
mtklein5a744b72015-09-14 11:11:17 -070014 static Block* Alloc(Block* prev, size_t size) {
mtklein8113dd12014-11-12 15:15:28 -080015 SkASSERT(size >= sizeof(Block));
mtklein5a744b72015-09-14 11:11:17 -070016 Block* b = (Block*)sk_malloc_throw(size);
mtklein8113dd12014-11-12 15:15:28 -080017 b->prev = prev;
18 return b;
19 }
20};
21
mtklein59dba142014-12-12 08:41:23 -080022SkVarAlloc::SkVarAlloc(size_t minLgSize)
mtklein98b84852015-04-21 15:23:59 -070023 : fBytesAllocated(0)
halcanary96fcdcc2015-08-27 07:41:13 -070024 , fByte(nullptr)
mtkleinf2950b12014-11-13 12:41:14 -080025 , fRemaining(0)
mtklein59dba142014-12-12 08:41:23 -080026 , fLgSize(minLgSize)
halcanary96fcdcc2015-08-27 07:41:13 -070027 , fBlock(nullptr) {}
mtklein8113dd12014-11-12 15:15:28 -080028
mtklein29b1afc2015-04-09 07:46:41 -070029SkVarAlloc::SkVarAlloc(size_t minLgSize, char* storage, size_t len)
mtklein98b84852015-04-21 15:23:59 -070030 : fBytesAllocated(0)
31 , fByte(storage)
mtklein29b1afc2015-04-09 07:46:41 -070032 , fRemaining(len)
33 , fLgSize(minLgSize)
halcanary96fcdcc2015-08-27 07:41:13 -070034 , fBlock(nullptr) {}
mtklein29b1afc2015-04-09 07:46:41 -070035
mtklein8113dd12014-11-12 15:15:28 -080036SkVarAlloc::~SkVarAlloc() {
37 Block* b = fBlock;
38 while (b) {
39 Block* prev = b->prev;
40 sk_free(b);
41 b = prev;
42 }
43}
44
mtklein5a744b72015-09-14 11:11:17 -070045void SkVarAlloc::makeSpace(size_t bytes) {
mtklein8113dd12014-11-12 15:15:28 -080046 SkASSERT(SkIsAlignPtr(bytes));
47
mtklein59dba142014-12-12 08:41:23 -080048 size_t alloc = 1<<fLgSize++;
mtklein8113dd12014-11-12 15:15:28 -080049 while (alloc < bytes + sizeof(Block)) {
50 alloc *= 2;
51 }
mtklein98b84852015-04-21 15:23:59 -070052 fBytesAllocated += alloc;
mtklein5a744b72015-09-14 11:11:17 -070053 fBlock = Block::Alloc(fBlock, alloc);
mtklein8113dd12014-11-12 15:15:28 -080054 fByte = fBlock->data();
mtkleinf2950b12014-11-13 12:41:14 -080055 fRemaining = alloc - sizeof(Block);
mtklein8113dd12014-11-12 15:15:28 -080056}