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