| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkRecord.h" | 8 #include "SkRecord.h" |
| 9 #include <algorithm> |
| 9 | 10 |
| 10 SkRecord::~SkRecord() { | 11 SkRecord::~SkRecord() { |
| 11 Destroyer destroyer; | 12 Destroyer destroyer; |
| 12 for (int i = 0; i < this->count(); i++) { | 13 for (int i = 0; i < this->count(); i++) { |
| 13 this->mutate<void>(i, destroyer); | 14 this->mutate<void>(i, destroyer); |
| 14 } | 15 } |
| 15 } | 16 } |
| 16 | 17 |
| 17 void SkRecord::grow() { | 18 void SkRecord::grow() { |
| 18 SkASSERT(fCount == fReserved); | 19 SkASSERT(fCount == fReserved); |
| 19 SkASSERT(fReserved > 0); | 20 SkASSERT(fReserved > 0); |
| 20 fReserved *= 2; | 21 fReserved *= 2; |
| 21 fRecords.realloc(fReserved); | 22 fRecords.realloc(fReserved); |
| 22 } | 23 } |
| 23 | 24 |
| 24 size_t SkRecord::bytesUsed() const { | 25 size_t SkRecord::bytesUsed() const { |
| 25 size_t bytes = fAlloc.approxBytesAllocated() + sizeof(SkRecord); | 26 size_t bytes = fAlloc.approxBytesAllocated() + sizeof(SkRecord); |
| 26 // If fReserved <= kInlineRecords, we've already accounted for fRecords with
sizeof(SkRecord). | 27 // If fReserved <= kInlineRecords, we've already accounted for fRecords with
sizeof(SkRecord). |
| 27 // When we go over that limit, they're allocated on the heap (and the inline
space is wasted). | 28 // When we go over that limit, they're allocated on the heap (and the inline
space is wasted). |
| 28 if (fReserved > kInlineRecords) { | 29 if (fReserved > kInlineRecords) { |
| 29 bytes += fReserved * sizeof(Record); | 30 bytes += fReserved * sizeof(Record); |
| 30 } | 31 } |
| 31 return bytes; | 32 return bytes; |
| 32 } | 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 } |
| OLD | NEW |