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