diff options
author | 2009-03-30 21:02:14 +0000 | |
---|---|---|
committer | 2009-03-30 21:02:14 +0000 | |
commit | aefd2bc75738963b9b6579897be32bfbc8fb00af (patch) | |
tree | af2a10646259a721b27e84c97e13b75b50882696 /src/core/SkChunkAlloc.cpp | |
parent | f459a4949d4edb179e015cf12635d26c596fd17c (diff) |
Add SkChunkAlloc::unalloc() to undo the last allocation, useful if the caller wants to treat the allocats like temp memory (see PictureRecord)
Call unalloc if a paint (or other cached object) is already in our list for picture recording
Use correct CompareType macro in SkCanvas::quickReject
git-svn-id: http://skia.googlecode.com/svn/trunk@138 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkChunkAlloc.cpp')
-rw-r--r-- | src/core/SkChunkAlloc.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/core/SkChunkAlloc.cpp b/src/core/SkChunkAlloc.cpp index ae37ec0839..83272c58eb 100644 --- a/src/core/SkChunkAlloc.cpp +++ b/src/core/SkChunkAlloc.cpp @@ -23,6 +23,10 @@ struct SkChunkAlloc::Block { char* fFreePtr; // data[] follows + char* startOfData() { + return reinterpret_cast<char*>(this + 1); + } + void freeChain() { // this can be null Block* block = this; while (block) { @@ -89,7 +93,7 @@ SkChunkAlloc::Block* SkChunkAlloc::newBlock(size_t bytes, AllocFailType ftype) { if (block) { // block->fNext = fBlock; block->fFreeSize = size; - block->fFreePtr = (char*)block + sizeof(Block); + block->fFreePtr = block->startOfData(); fTotalCapacity += size; } @@ -118,3 +122,18 @@ void* SkChunkAlloc::alloc(size_t bytes, AllocFailType ftype) { return ptr; } +size_t SkChunkAlloc::unalloc(void* ptr) { + size_t bytes = 0; + Block* block = fBlock; + if (block) { + char* cPtr = reinterpret_cast<char*>(ptr); + char* start = block->startOfData(); + if (start <= cPtr && cPtr < block->fFreePtr) { + bytes = block->fFreePtr - cPtr; + block->fFreeSize += bytes; + block->fFreePtr = cPtr; + } + } + return bytes; +} + |