RecordDrawTest.cpp revision a095041f5148dd1e71f38d0546335ed94199104b
1c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org/* 2c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Copyright 2014 Google Inc. 3c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * 4c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * found in the LICENSE file. 6c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org */ 7c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org 8d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "Test.h" 90a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org#include "RecordTestUtils.h" 10d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 11d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkDebugCanvas.h" 12d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecord.h" 13ad8ce572f69633ffebe2fa486275d82a5e9a71fecommit-bot@chromium.org#include "SkRecordOpts.h" 14d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecordDraw.h" 15d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecorder.h" 16d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org#include "SkRecords.h" 17d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 18d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgstatic const int W = 1920, H = 1080; 19d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 208dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgstatic void draw_pos_text_h(SkCanvas* canvas, const char* text, SkScalar y) { 218dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org const size_t len = strlen(text); 228dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkAutoTMalloc<SkScalar> xpos(len); 238dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org for (size_t i = 0; i < len; i++) { 248dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org xpos[i] = (SkScalar)i; 258dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org } 268dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org canvas->drawPosTextH(text, len, xpos, y, SkPaint()); 278dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org} 288dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 298dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org// Rerecord into another SkRecord using full SkCanvas semantics, 308dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org// tracking clips and allowing SkRecordDraw's quickReject() calls to work. 318dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgstatic void record_clipped(const SkRecord& record, SkRect clip, SkRecord* clipped) { 32a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(clipped, W, H); 338dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org recorder.clipRect(clip); 348dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkRecordDraw(record, &recorder); 358dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org} 368dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 378dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgDEF_TEST(RecordDraw_PosTextHQuickReject, r) { 388dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkRecord record; 39a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, W, H); 408dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 418dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org draw_pos_text_h(&recorder, "This will draw.", 20); 428dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org draw_pos_text_h(&recorder, "This won't.", 5000); 438dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 448dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkRecordBoundDrawPosTextH(&record); 458dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 468dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkRecord clipped; 478dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org record_clipped(record, SkRect::MakeLTRB(20, 20, 200, 200), &clipped); 488dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 498dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org // clipRect and the first drawPosTextH. 508dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org REPORTER_ASSERT(r, 2 == clipped.count()); 518dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org} 528dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org 53d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgDEF_TEST(RecordDraw_Culling, r) { 54d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Record these 7 drawing commands verbatim. 55d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecord record; 56a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder recorder(&record, W, H); 57d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 58d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.pushCull(SkRect::MakeWH(100, 100)); 59d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(10, 10), SkPaint()); 60d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(30, 30), SkPaint()); 61d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.pushCull(SkRect::MakeWH(5, 5)); 62d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.drawRect(SkRect::MakeWH(1, 1), SkPaint()); 63d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.popCull(); 64d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org recorder.popCull(); 65d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 66d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // Take a pass over to match up pushCulls and popCulls. 67d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org SkRecordAnnotateCullingPairs(&record); 68d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 69d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // This clip intersects the outer cull, but allows us to quick reject the inner one. 708dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org SkRecord clipped; 718dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org record_clipped(record, SkRect::MakeLTRB(20, 20, 200, 200), &clipped); 72d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org 73d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // We'll keep the clipRect call from above, and the outer two drawRects, and the push/pop pair. 74d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org // If culling weren't working, we'd see 8 commands recorded here. 758dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org REPORTER_ASSERT(r, 5 == clipped.count()); 76d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org} 770a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org 780a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.orgDEF_TEST(RecordDraw_SetMatrixClobber, r) { 790a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org // Set up an SkRecord that just scales by 2x,3x. 800a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkRecord scaleRecord; 81a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder scaleCanvas(&scaleRecord, W, H); 820a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkMatrix scale; 830a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org scale.setScale(2, 3); 840a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org scaleCanvas.setMatrix(scale); 850a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org 860a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org // Set up an SkRecord with an initial +20, +20 translate. 870a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkRecord translateRecord; 88a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org SkRecorder translateCanvas(&translateRecord, W, H); 890a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkMatrix translate; 900a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org translate.setTranslate(20, 20); 910a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org translateCanvas.setMatrix(translate); 920a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org 930a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkRecordDraw(scaleRecord, &translateCanvas); 940a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org 950a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org // When we look at translateRecord now, it should have its first +20,+20 translate, 960a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org // then a 2x,3x scale that's been concatted with that +20,+20 translate. 970a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org const SkRecords::SetMatrix* setMatrix; 980a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org setMatrix = assert_type<SkRecords::SetMatrix>(r, translateRecord, 0); 990a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org REPORTER_ASSERT(r, setMatrix->matrix == translate); 1000a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org 1010a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org setMatrix = assert_type<SkRecords::SetMatrix>(r, translateRecord, 1); 1020a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org SkMatrix expected = scale; 1030a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org expected.postConcat(translate); 1040a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org REPORTER_ASSERT(r, setMatrix->matrix == expected); 1050a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org} 106