1c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein/* 2c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein * Copyright 2015 Google Inc. 3c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein * 4c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein * Use of this source code is governed by a BSD-style license that can be 5c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein * found in the LICENSE file. 6c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein */ 7c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein 873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org#include "Test.h" 973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 1073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org#include "SkRecord.h" 1173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org#include "SkRecordPattern.h" 1273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org#include "SkRecorder.h" 1373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org#include "SkRecords.h" 1473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 1573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.orgusing namespace SkRecords; 1624e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtkleintypedef Pattern<Is<Save>, 1724e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Is<ClipRect>, 1824e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Is<Restore>> 1973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SaveClipRectRestore; 2073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 2173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.orgDEF_TEST(RecordPattern_Simple, r) { 2273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SaveClipRectRestore pattern; 2373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 2473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SkRecord record; 2573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, 0)); 2673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 27a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 2873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 2973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org // Build up a save-clip-restore block. The pattern will match only it's complete. 3073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 3173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, 0)); 3273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 3373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 3473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, 0)); 3573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 3673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 3773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, pattern.match(&record, 0)); 3896fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(r, pattern.first<Save>() != nullptr); 3996fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(r, pattern.second<ClipRect>() != nullptr); 4096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(r, pattern.third<Restore>() != nullptr); 4173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org} 4273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 4373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.orgDEF_TEST(RecordPattern_StartingIndex, r) { 4473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SaveClipRectRestore pattern; 4573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 4673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SkRecord record; 47a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 4873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 4973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org // There will be two save-clipRect-restore blocks [0,3) and [3,6). 5073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org for (int i = 0; i < 2; i++) { 5173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 5273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 5373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 5473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org } 5573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 5673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org // We should match only at 0 and 3. Going over the length should fail gracefully. 57c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein for (int i = 0; i < 8; i++) { 5873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org if (i == 0 || i == 3) { 5973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, pattern.match(&record, i) == i + 3); 6073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org } else { 6173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, i)); 6273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org } 6373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org } 6473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org} 6573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 6673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.orgDEF_TEST(RecordPattern_DontMatchSubsequences, r) { 6773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SaveClipRectRestore pattern; 6873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 6973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SkRecord record; 70a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 7173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 7273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 7373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 7473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(600, 300), SkPaint()); 7573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 7673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 7773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, 0)); 7873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org} 7973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 8024e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtkleinDEF_TEST(RecordPattern_Greedy, r) { 8124e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Pattern<Is<Save>, Greedy<Is<ClipRect>>, Is<Restore>> pattern; 8273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 8373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SkRecord record; 84a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 852ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed int index = 0; 8673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 8773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 8873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 8973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 902ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, pattern.match(&record, index)); 912ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed index += 3; 9273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 9373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 9473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 9573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(100, 100)); 9673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 972ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, pattern.match(&record, index)); 9873fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org} 9973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 10073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.orgDEF_TEST(RecordPattern_Complex, r) { 10124e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Pattern<Is<Save>, 10224e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Greedy<Not<Or<Is<Save>, 10373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org Is<Restore>, 10424e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein IsDraw>>>, 10524e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Is<Restore>> pattern; 10673fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 10773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org SkRecord record; 108a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 109c6ad06acefa096716f8dabed5342f9b89dc43dfemtklein int start, begin, end; 11073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 1112ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed start = record.count(); 11273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 11373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 11473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 1152ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, pattern.match(&record, 0) == record.count()); 1162ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed end = start; 1172ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, pattern.search(&record, &begin, &end)); 1182ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, begin == start); 1192ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, end == record.count()); 12073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 1212ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed start = record.count(); 12273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 12373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 12473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(100, 3000), SkPaint()); 12573fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 1262ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, !pattern.match(&record, start)); 1272ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed end = start; 1282ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end)); 12973fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 1302ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed start = record.count(); 13173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.save(); 13273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(300, 200)); 13373fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.clipRect(SkRect::MakeWH(100, 400)); 13473fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org recorder.restore(); 1352ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, pattern.match(&record, start) == record.count()); 1362ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed end = start; 13773fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, pattern.search(&record, &begin, &end)); 1382ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, begin == start); 1392ff1fcede1e9525285c5de1f35fb2dcb0fab32bdreed REPORTER_ASSERT(r, end == record.count()); 14073fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org 14173fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end)); 14273fffeb83aab56bc8c2c5ce143ee9d132d64ac37commit-bot@chromium.org} 1431b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org 1441b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.orgDEF_TEST(RecordPattern_SaveLayerIsNotADraw, r) { 14524e7db8b2ea663f8fe4d7bbfa1d686fd643990bbmtklein Pattern<IsDraw> pattern; 1461b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org 1471b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org SkRecord record; 148a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, 1920, 1200); 14996fcdcc219d2a0d3579719b84b28bede76efba64halcanary recorder.saveLayer(nullptr, nullptr); 1501b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org 1511b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org REPORTER_ASSERT(r, !pattern.match(&record, 0)); 1521b546462bb91e93cf2f033eb2dab53ec492b64abcommit-bot@chromium.org} 153