18dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org/*
28dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org * Copyright 2014 Google Inc.
38dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org *
48dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
58dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org * found in the LICENSE file.
68dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org */
78dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
88dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org#include "Test.h"
90a98d870448f66ea0df7c37a47b38cf2d3b734e5commit-bot@chromium.org#include "RecordTestUtils.h"
108dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
118dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org#include "SkRecord.h"
128dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org#include "SkRecordOpts.h"
138dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org#include "SkRecorder.h"
148dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org#include "SkRecords.h"
15f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org#include "SkXfermode.h"
16f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
178dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgstatic const int W = 1920, H = 1080;
188dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
198dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgDEF_TEST(RecordOpts_Culling, r) {
208dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecord record;
21a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
228dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
238dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    recorder.drawRect(SkRect::MakeWH(1000, 10000), SkPaint());
248dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
258dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    recorder.pushCull(SkRect::MakeWH(100, 100));
268dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.drawRect(SkRect::MakeWH(10, 10), SkPaint());
278dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.drawRect(SkRect::MakeWH(30, 30), SkPaint());
288dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.pushCull(SkRect::MakeWH(5, 5));
298dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org            recorder.drawRect(SkRect::MakeWH(1, 1), SkPaint());
308dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.popCull();
318dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    recorder.popCull();
328dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
338dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecordAnnotateCullingPairs(&record);
348dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
357066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    REPORTER_ASSERT(r, 6 == assert_type<SkRecords::PairedPushCull>(r, record, 1)->skip);
367066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    REPORTER_ASSERT(r, 2 == assert_type<SkRecords::PairedPushCull>(r, record, 4)->skip);
378dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org}
388dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
391e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.orgDEF_TEST(RecordOpts_NoopCulls, r) {
401e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    SkRecord record;
41a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
421e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org
431e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    // All should be nooped.
441e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    recorder.pushCull(SkRect::MakeWH(200, 200));
451e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org        recorder.pushCull(SkRect::MakeWH(100, 100));
461e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org        recorder.popCull();
471e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    recorder.popCull();
481e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org
491e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    // Kept for now.  We could peel off a layer of culling.
501e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    recorder.pushCull(SkRect::MakeWH(5, 5));
511e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org        recorder.pushCull(SkRect::MakeWH(5, 5));
521e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org            recorder.drawRect(SkRect::MakeWH(1, 1), SkPaint());
531e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org        recorder.popCull();
541e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    recorder.popCull();
551e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org
561e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    SkRecordNoopCulls(&record);
571e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org
581e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    for (unsigned i = 0; i < 4; i++) {
591e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org        assert_type<SkRecords::NoOp>(r, record, i);
601e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    }
611e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    assert_type<SkRecords::PushCull>(r, record, 4);
621e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    assert_type<SkRecords::PushCull>(r, record, 5);
631e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    assert_type<SkRecords::DrawRect>(r, record, 6);
641e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    assert_type<SkRecords::PopCull>(r, record, 7);
651e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org    assert_type<SkRecords::PopCull>(r, record, 8);
661e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org}
671e44730ade943bba928f289ce9f59430c50c71e5commit-bot@chromium.org
688dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgstatic void draw_pos_text(SkCanvas* canvas, const char* text, bool constantY) {
698dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    const size_t len = strlen(text);
708dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkAutoTMalloc<SkPoint> pos(len);
718dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    for (size_t i = 0; i < len; i++) {
728dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        pos[i].fX = (SkScalar)i;
738dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        pos[i].fY = constantY ? SK_Scalar1 : (SkScalar)i;
748dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    }
758dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    canvas->drawPosText(text, len, pos, SkPaint());
768dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org}
778dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
788dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgDEF_TEST(RecordOpts_StrengthReduction, r) {
798dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecord record;
80a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
818dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
828dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    // We can convert a drawPosText into a drawPosTextH when all the Ys are the same.
838dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    draw_pos_text(&recorder, "This will be reduced to drawPosTextH.", true);
848dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    draw_pos_text(&recorder, "This cannot be reduced to drawPosTextH.", false);
858dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
868dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecordReduceDrawPosTextStrength(&record);
878dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
887066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    assert_type<SkRecords::DrawPosTextH>(r, record, 0);
897066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    assert_type<SkRecords::DrawPosText>(r, record, 1);
908dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org}
918dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
928dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgDEF_TEST(RecordOpts_TextBounding, r) {
938dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecord record;
94a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
958dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
968dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    // First, get a drawPosTextH.  Here's a handy way.  Its text size will be the default (12).
978dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    draw_pos_text(&recorder, "This will be reduced to drawPosTextH.", true);
988dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecordReduceDrawPosTextStrength(&record);
998dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1008dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    const SkRecords::DrawPosTextH* original =
1017066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org        assert_type<SkRecords::DrawPosTextH>(r, record, 0);
1028dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1038dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    // This should wrap the original DrawPosTextH with minY and maxY.
1048dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecordBoundDrawPosTextH(&record);
1058dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1068dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    const SkRecords::BoundedDrawPosTextH* bounded =
1077066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org        assert_type<SkRecords::BoundedDrawPosTextH>(r, record, 0);
1088dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1098dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    const SkPaint defaults;
1108dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    REPORTER_ASSERT(r, bounded->base == original);
1118dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    REPORTER_ASSERT(r, bounded->minY <= SK_Scalar1 - defaults.getTextSize());
1128dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    REPORTER_ASSERT(r, bounded->maxY >= SK_Scalar1 + defaults.getTextSize());
1138dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org}
1148dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
115467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.orgDEF_TEST(RecordOpts_NoopDrawSaveRestore, r) {
116467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    SkRecord record;
117a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
118467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org
119467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    // The save and restore are pointless if there's only draw commands in the middle.
120467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    recorder.save();
121467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org        recorder.drawRect(SkRect::MakeWH(200, 200), SkPaint());
122467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org        recorder.drawRect(SkRect::MakeWH(300, 300), SkPaint());
123467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org        recorder.drawRect(SkRect::MakeWH(100, 100), SkPaint());
124467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    recorder.restore();
125467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org
126467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    record.replace<SkRecords::NoOp>(2);  // NoOps should be allowed.
127467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org
128467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    SkRecordNoopSaveRestores(&record);
129467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org
130467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    assert_type<SkRecords::NoOp>(r, record, 0);
131467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    assert_type<SkRecords::DrawRect>(r, record, 1);
132467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    assert_type<SkRecords::NoOp>(r, record, 2);
133467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    assert_type<SkRecords::DrawRect>(r, record, 3);
134467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org    assert_type<SkRecords::NoOp>(r, record, 4);
135467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org}
136467705adf05ba99bbd9ccdf6a40eb463484a6fbfcommit-bot@chromium.org
1377066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.orgDEF_TEST(RecordOpts_SingleNoopSaveRestore, r) {
1387066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    SkRecord record;
139a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
1407066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org
1417066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    recorder.save();
1427066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org        recorder.clipRect(SkRect::MakeWH(200, 200));
1437066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    recorder.restore();
1447066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org
1457066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    SkRecordNoopSaveRestores(&record);
1467066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    for (unsigned i = 0; i < 3; i++) {
1477066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org        assert_type<SkRecords::NoOp>(r, record, i);
1487066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org    }
1497066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org}
1507066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org
1518dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.orgDEF_TEST(RecordOpts_NoopSaveRestores, r) {
1528dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecord record;
153a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
1548dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1558dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    // The second pass will clean up this pair after the first pass noops all the innards.
1568dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    recorder.save();
1578dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        // A simple pointless pair of save/restore.
1588dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.save();
1598dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.restore();
1608dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1618dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        // As long as we don't draw in there, everything is a noop.
1628dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.save();
1638dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org            recorder.clipRect(SkRect::MakeWH(200, 200));
1648dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org            recorder.clipRect(SkRect::MakeWH(100, 100));
1658dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org        recorder.restore();
1668dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    recorder.restore();
1678dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org
1688dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    SkRecordNoopSaveRestores(&record);
1698dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    for (unsigned index = 0; index < 8; index++) {
1707066bf3fbff7a54d3692414ec11ca419f3fd0ad5commit-bot@chromium.org        assert_type<SkRecords::NoOp>(r, record, index);
1718dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org    }
1728dac8b18eea8a729062440b85285d19fc890bb1acommit-bot@chromium.org}
173f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
174f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.orgstatic void assert_savelayer_restore(skiatest::Reporter* r,
175f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org                                     SkRecord* record,
176f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org                                     unsigned i,
177f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org                                     bool shouldBeNoOped) {
178f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkRecordNoopSaveLayerDrawRestores(record);
179f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    if (shouldBeNoOped) {
180f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        assert_type<SkRecords::NoOp>(r, *record, i);
181f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        assert_type<SkRecords::NoOp>(r, *record, i+2);
182f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    } else {
183f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        assert_type<SkRecords::SaveLayer>(r, *record, i);
184f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        assert_type<SkRecords::Restore>(r, *record, i+2);
185f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    }
186f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org}
187f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
188f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.orgDEF_TEST(RecordOpts_NoopSaveLayerDrawRestore, r) {
189f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkRecord record;
190a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, W, H);
191f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
192f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkRect bounds = SkRect::MakeWH(100, 200);
193f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkRect   draw = SkRect::MakeWH(50, 60);
194f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
195f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkPaint goodLayerPaint, badLayerPaint, worseLayerPaint;
196f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    goodLayerPaint.setColor(0x03000000);  // Only alpha.
197f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    badLayerPaint.setColor( 0x03040506);  // Not only alpha.
198f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    worseLayerPaint.setXfermodeMode(SkXfermode::kDstIn_Mode);  // Any effect will do.
199f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
200f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    SkPaint goodDrawPaint, badDrawPaint;
201f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    goodDrawPaint.setColor(0xFF020202);  // Opaque.
202f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    badDrawPaint.setColor( 0x0F020202);  // Not opaque.
203f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
204f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // No change: optimization can't handle bounds.
205f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(&bounds, NULL);
206f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, goodDrawPaint);
207f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
208f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 0, false);
209f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
210f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // SaveLayer/Restore removed: no bounds + no paint = no point.
211f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(NULL, NULL);
212f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, goodDrawPaint);
213f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
214f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 3, true);
215f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
216f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // TODO(mtklein): test case with null draw paint
217f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
218f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // No change: layer paint isn't alpha-only.
219f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(NULL, &badLayerPaint);
220f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, goodDrawPaint);
221f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
222f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 6, false);
223f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
224f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // No change: layer paint has an effect.
225f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(NULL, &worseLayerPaint);
226f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, goodDrawPaint);
227f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
228f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 9, false);
229f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
230f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // No change: draw paint isn't opaque.
231f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(NULL, &goodLayerPaint);
232f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, badDrawPaint);
233f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
234f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 12, false);
235f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
236f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    // SaveLayer/Restore removed: we can fold in the alpha!
237f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.saveLayer(NULL, &goodLayerPaint);
238f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org        recorder.drawRect(draw, goodDrawPaint);
239f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    recorder.restore();
240f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    assert_savelayer_restore(r, &record, 15, true);
241f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org
242f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    const SkRecords::DrawRect* drawRect = assert_type<SkRecords::DrawRect>(r, record, 16);
243f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    REPORTER_ASSERT(r, drawRect != NULL);
244f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org    REPORTER_ASSERT(r, drawRect->paint.getColor() == 0x03020202);
245f5bf3cf0257dc3d18932bde51f8eae33442e071fcommit-bot@chromium.org}
246