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 |