RecordDrawTest.cpp revision d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3
1d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "Test.h" 2d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 3d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkDebugCanvas.h" 4d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecord.h" 5d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecordCulling.h" 6d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecordDraw.h" 7d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecorder.h" 8d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecords.h" 9d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 10d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgstatic const int W = 1920, H = 1080; 11d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 12d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgDEF_TEST(RecordDraw_Culling, r) { 13d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Record these 7 drawing commands verbatim. 14d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecord record; 15d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, W, H); 16d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 17d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.pushCull(SkRect::MakeWH(100, 100)); 18d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(10, 10), SkPaint()); 19d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(30, 30), SkPaint()); 20d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.pushCull(SkRect::MakeWH(5, 5)); 21d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(1, 1), SkPaint()); 22d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.popCull(); 23d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.popCull(); 24d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 25d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Take a pass over to match up pushCulls and popCulls. 26d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecordAnnotateCullingPairs(&record); 27d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 28d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Rerecord into another SkRecord using full SkCanvas semantics, 29d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // tracking clips and allowing SkRecordDraw's quickReject() calls to work. 30d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecord rerecord; 31d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecorder rerecorder(SkRecorder::kReadWrite_Mode, &rerecord, W, H); 32d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // This clip intersects the outer cull, but allows us to quick reject the inner one. 33d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org rerecorder.clipRect(SkRect::MakeLTRB(20, 20, 200, 200)); 34d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 35d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecordDraw(record, &rerecorder); 36d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 37d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // We'll keep the clipRect call from above, and the outer two drawRects, and the push/pop pair. 38d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // If culling weren't working, we'd see 8 commands recorded here. 39d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org REPORTER_ASSERT(r, 5 == rerecord.count()); 40d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org} 41d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 42d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgDEF_TEST(RecordDraw_Clipping, r) { 43d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecord record; 44d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record, W, H); 45d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 46d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // 8 draw commands. 47d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // The inner clipRect makes the clip empty, so the inner drawRect does nothing. 48d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.save(); 49d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.clipRect(SkRect::MakeLTRB(0, 0, 100, 100)); 50d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeLTRB(20, 20, 40, 40), SkPaint()); 51d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.save(); 52d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.clipRect(SkRect::MakeLTRB(200, 200, 300, 300)); 53d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeLTRB(220, 220, 240, 240), SkPaint()); 54d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.restore(); 55d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.restore(); 56d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 57d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Same deal as above: we need full SkCanvas semantics for clip skipping to work. 58d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecord rerecord; 59d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecorder rerecorder(SkRecorder::kReadWrite_Mode, &rerecord, W, H); 60d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecordDraw(record, &rerecorder); 61d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 62d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // All commands except the drawRect will be preserved. 63d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org REPORTER_ASSERT(r, 7 == rerecord.count()); 64d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org} 65