| Index: src/record/SkRecordOpts.cpp
|
| diff --git a/src/record/SkRecordOpts.cpp b/src/record/SkRecordOpts.cpp
|
| index 5b648f4215e5bcfae6e2878981b0e8b28b7ed948..d85512491774df27b3b21976f83228437120aae9 100644
|
| --- a/src/record/SkRecordOpts.cpp
|
| +++ b/src/record/SkRecordOpts.cpp
|
| @@ -42,8 +42,21 @@ static bool apply(Pass* pass, SkRecord* record) {
|
| return changed;
|
| }
|
|
|
| +// Turns the logical NoOp Save and Restore in Save-Draw*-Restore patterns into actual NoOps.
|
| +struct SaveOnlyDrawsRestoreNooper {
|
| + typedef Pattern3<Is<Save>,
|
| + Star<Or<Is<NoOp>, IsDraw> >,
|
| + Is<Restore> >
|
| + Pattern;
|
| +
|
| + bool onMatch(SkRecord* record, Pattern* pattern, unsigned begin, unsigned end) {
|
| + record->replace<NoOp>(begin); // Save
|
| + record->replace<NoOp>(end-1); // Restore
|
| + return true;
|
| + }
|
| +};
|
| // Turns logical no-op Save-[non-drawing command]*-Restore patterns into actual no-ops.
|
| -struct SaveRestoreNooper {
|
| +struct SaveNoDrawsRestoreNooper {
|
| // Star matches greedily, so we also have to exclude Save and Restore.
|
| typedef Pattern3<Is<Save>,
|
| Star<Not<Or3<Is<Save>,
|
| @@ -66,8 +79,11 @@ struct SaveRestoreNooper {
|
| }
|
| };
|
| void SkRecordNoopSaveRestores(SkRecord* record) {
|
| - SaveRestoreNooper pass;
|
| - while (apply(&pass, record)); // Run until it stops changing things.
|
| + SaveOnlyDrawsRestoreNooper onlyDraws;
|
| + SaveNoDrawsRestoreNooper noDraws;
|
| +
|
| + // Run until they stop changing things.
|
| + while (apply(&onlyDraws, record) || apply(&noDraws, record));
|
| }
|
|
|
| // For some SaveLayer-[drawing command]-Restore patterns, merge the SaveLayer's alpha into the
|
|
|