| Index: src/record/SkRecordCulling.cpp | 
| diff --git a/src/record/SkRecordCulling.cpp b/src/record/SkRecordCulling.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..e866bd82cb85ed821ebb1c8e3eca21d842656d6f | 
| --- /dev/null | 
| +++ b/src/record/SkRecordCulling.cpp | 
| @@ -0,0 +1,38 @@ | 
| +#include "SkRecordCulling.h" | 
| + | 
| +#include "SkRecords.h" | 
| +#include "SkTDArray.h" | 
| + | 
| +namespace { | 
| + | 
| +struct Annotator { | 
| +    unsigned index; | 
| +    SkTDArray<SkRecords::PushCull*> pushStack; | 
| + | 
| +    // Do nothing to most record types. | 
| +    template <typename T> void operator()(T*) {} | 
| +}; | 
| + | 
| +template <> void Annotator::operator()(SkRecords::PushCull* push) { | 
| +    // Store the push's index for now.  We'll calculate the offset using this in the paired pop. | 
| +    push->popOffset = index; | 
| +    pushStack.push(push); | 
| +} | 
| + | 
| +template <> void Annotator::operator()(SkRecords::PopCull* pop) { | 
| +    SkRecords::PushCull* push = pushStack.top(); | 
| +    pushStack.pop(); | 
| + | 
| +    SkASSERT(index > push->popOffset);          // push->popOffset holds the index of the push. | 
| +    push->popOffset = index - push->popOffset;  // Now it's the offset between push and pop. | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| +void SkRecordAnnotateCullingPairs(SkRecord* record) { | 
| +    Annotator annotator; | 
| + | 
| +    for (annotator.index = 0; annotator.index < record->count(); annotator.index++) { | 
| +        record->mutate(annotator.index, annotator); | 
| +    } | 
| +} | 
|  |