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