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 "SkRecord.h" 9 #include <algorithm> 10 11 SkRecord::~SkRecord() { 12 Destroyer destroyer; 13 for (int i = 0; i < this->count(); i++) { 14 this->mutate<void>(i, destroyer); 15 } 16 } 17 18 void SkRecord::grow() { 19 SkASSERT(fCount == fReserved); 20 SkASSERT(fReserved > 0); 21 fReserved *= 2; 22 fRecords.realloc(fReserved); 23 } 24 25 size_t SkRecord::bytesUsed() const { 26 size_t bytes = fAlloc.approxBytesAllocated() + sizeof(SkRecord); 27 // If fReserved <= kInlineRecords, we've already accounted for fRecords with sizeof(SkRecord). 28 // When we go over that limit, they're allocated on the heap (and the inline space is wasted). 29 if (fReserved > kInlineRecords) { 30 bytes += fReserved * sizeof(Record); 31 } 32 return bytes; 33 } 34 35 void SkRecord::defrag() { 36 // Remove all the NoOps, preserving the order of other ops, e.g. 37 // Save, ClipRect, NoOp, DrawRect, NoOp, NoOp, Restore 38 // -> Save, ClipRect, DrawRect, Restore 39 Record* noops = std::remove_if(fRecords.get(), fRecords.get() + fCount, 40 [](Record op) { return op.type() == SkRecords::NoOp_Type; }); 41 fCount = noops - fRecords.get(); 42 } 43