1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "tests/Test.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/core/SkRecord.h" 11cb93a386Sopenharmony_ci#include "src/core/SkRecordPattern.h" 12cb93a386Sopenharmony_ci#include "src/core/SkRecorder.h" 13cb93a386Sopenharmony_ci#include "src/core/SkRecords.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciusing namespace SkRecords; 16cb93a386Sopenharmony_citypedef Pattern<Is<Save>, 17cb93a386Sopenharmony_ci Is<ClipRect>, 18cb93a386Sopenharmony_ci Is<Restore>> 19cb93a386Sopenharmony_ci SaveClipRectRestore; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_Simple, r) { 22cb93a386Sopenharmony_ci SaveClipRectRestore pattern; 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci SkRecord record; 25cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, 0)); 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci // Build up a save-clip-restore block. The pattern will match only it's complete. 30cb93a386Sopenharmony_ci recorder.save(); 31cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, 0)); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 34cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, 0)); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci recorder.restore(); 37cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, 0)); 38cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.first<Save>() != nullptr); 39cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.second<ClipRect>() != nullptr); 40cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.third<Restore>() != nullptr); 41cb93a386Sopenharmony_ci} 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_StartingIndex, r) { 44cb93a386Sopenharmony_ci SaveClipRectRestore pattern; 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci SkRecord record; 47cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci // There will be two save-clipRect-restore blocks [0,3) and [3,6). 50cb93a386Sopenharmony_ci for (int i = 0; i < 2; i++) { 51cb93a386Sopenharmony_ci recorder.save(); 52cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 53cb93a386Sopenharmony_ci recorder.restore(); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci // We should match only at 0 and 3. Going over the length should fail gracefully. 57cb93a386Sopenharmony_ci for (int i = 0; i < 8; i++) { 58cb93a386Sopenharmony_ci if (i == 0 || i == 3) { 59cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, i) == i + 3); 60cb93a386Sopenharmony_ci } else { 61cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, i)); 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci } 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_DontMatchSubsequences, r) { 67cb93a386Sopenharmony_ci SaveClipRectRestore pattern; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci SkRecord record; 70cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci recorder.save(); 73cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 74cb93a386Sopenharmony_ci recorder.drawRect(SkRect::MakeWH(600, 300), SkPaint()); 75cb93a386Sopenharmony_ci recorder.restore(); 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, 0)); 78cb93a386Sopenharmony_ci} 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_Greedy, r) { 81cb93a386Sopenharmony_ci Pattern<Is<Save>, Greedy<Is<ClipRect>>, Is<Restore>> pattern; 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci SkRecord record; 84cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 85cb93a386Sopenharmony_ci int index = 0; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci recorder.save(); 88cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 89cb93a386Sopenharmony_ci recorder.restore(); 90cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, index)); 91cb93a386Sopenharmony_ci index += 3; 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci recorder.save(); 94cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 95cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(100, 100)); 96cb93a386Sopenharmony_ci recorder.restore(); 97cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, index)); 98cb93a386Sopenharmony_ci} 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_Complex, r) { 101cb93a386Sopenharmony_ci Pattern<Is<Save>, 102cb93a386Sopenharmony_ci Greedy<Not<Or<Is<Save>, 103cb93a386Sopenharmony_ci Is<Restore>, 104cb93a386Sopenharmony_ci IsDraw>>>, 105cb93a386Sopenharmony_ci Is<Restore>> pattern; 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci SkRecord record; 108cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 109cb93a386Sopenharmony_ci int start, begin, end; 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci start = record.count(); 112cb93a386Sopenharmony_ci recorder.save(); 113cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 114cb93a386Sopenharmony_ci recorder.restore(); 115cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, 0) == record.count()); 116cb93a386Sopenharmony_ci end = start; 117cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.search(&record, &begin, &end)); 118cb93a386Sopenharmony_ci REPORTER_ASSERT(r, begin == start); 119cb93a386Sopenharmony_ci REPORTER_ASSERT(r, end == record.count()); 120cb93a386Sopenharmony_ci 121cb93a386Sopenharmony_ci start = record.count(); 122cb93a386Sopenharmony_ci recorder.save(); 123cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 124cb93a386Sopenharmony_ci recorder.drawRect(SkRect::MakeWH(100, 3000), SkPaint()); 125cb93a386Sopenharmony_ci recorder.restore(); 126cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, start)); 127cb93a386Sopenharmony_ci end = start; 128cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end)); 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci start = record.count(); 131cb93a386Sopenharmony_ci recorder.save(); 132cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(300, 200)); 133cb93a386Sopenharmony_ci recorder.clipRect(SkRect::MakeWH(100, 400)); 134cb93a386Sopenharmony_ci recorder.restore(); 135cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.match(&record, start) == record.count()); 136cb93a386Sopenharmony_ci end = start; 137cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pattern.search(&record, &begin, &end)); 138cb93a386Sopenharmony_ci REPORTER_ASSERT(r, begin == start); 139cb93a386Sopenharmony_ci REPORTER_ASSERT(r, end == record.count()); 140cb93a386Sopenharmony_ci 141cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.search(&record, &begin, &end)); 142cb93a386Sopenharmony_ci} 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ciDEF_TEST(RecordPattern_SaveLayerIsNotADraw, r) { 145cb93a386Sopenharmony_ci Pattern<IsDraw> pattern; 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ci SkRecord record; 148cb93a386Sopenharmony_ci SkRecorder recorder(&record, 1920, 1200); 149cb93a386Sopenharmony_ci recorder.saveLayer(nullptr, nullptr); 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !pattern.match(&record, 0)); 152cb93a386Sopenharmony_ci} 153