1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "tests/Test.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 11cb93a386Sopenharmony_ci#include "src/gpu/tessellate/CullTest.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cinamespace skgpu { 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciconst SkMatrix gMatrices[] = { 16cb93a386Sopenharmony_ci SkMatrix::I(), 17cb93a386Sopenharmony_ci SkMatrix::Translate(25, -1000), 18cb93a386Sopenharmony_ci SkMatrix::Scale(.5f, 1000.1f), 19cb93a386Sopenharmony_ci SkMatrix::MakeAll(1000.1f, .0f, -100, 20cb93a386Sopenharmony_ci 0.0f, .5f, -3000, 21cb93a386Sopenharmony_ci 0.0f, .0f, 1), 22cb93a386Sopenharmony_ci SkMatrix::MakeAll(0, 1, 0, 23cb93a386Sopenharmony_ci 1, 0, 0, 24cb93a386Sopenharmony_ci 0, 0, 1), 25cb93a386Sopenharmony_ci SkMatrix::MakeAll( 2, 7.0f, -100, 26cb93a386Sopenharmony_ci -8000, .5f, 2000, 27cb93a386Sopenharmony_ci 0, .0f, 1), 28cb93a386Sopenharmony_ci}; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciDEF_TEST(CullTestTest, reporter) { 31cb93a386Sopenharmony_ci SkRandom rand; 32cb93a386Sopenharmony_ci float l=10, t=2000, r=100, b=2064; 33cb93a386Sopenharmony_ci SkRect viewportRect{l, t, r, b}; 34cb93a386Sopenharmony_ci float valuesL[4] = {l-20, l-10, l+10, l+20}; 35cb93a386Sopenharmony_ci float valuesT[4] = {t-20, t-10, t+10, t+20}; 36cb93a386Sopenharmony_ci float valuesR[4] = {r+20, r+10, r-10, r-20}; 37cb93a386Sopenharmony_ci float valuesB[4] = {b+20, b+10, b-10, b-20}; 38cb93a386Sopenharmony_ci for (SkMatrix m : gMatrices) { 39cb93a386Sopenharmony_ci CullTest cullTest(viewportRect, m); 40cb93a386Sopenharmony_ci SkMatrix inverse; 41cb93a386Sopenharmony_ci SkAssertResult(m.invert(&inverse)); 42cb93a386Sopenharmony_ci for (const float* y : {valuesT, valuesB}) { 43cb93a386Sopenharmony_ci for (const float* x : {valuesL, valuesR}) { 44cb93a386Sopenharmony_ci for (int i = 0; i < 500; ++i) { 45cb93a386Sopenharmony_ci int mask = rand.nextU(); 46cb93a386Sopenharmony_ci const SkPoint devPts[4] = {{x[(mask >> 0) & 3], y[(mask >> 2) & 3]}, 47cb93a386Sopenharmony_ci {x[(mask >> 4) & 3], y[(mask >> 6) & 3]}, 48cb93a386Sopenharmony_ci {x[(mask >> 8) & 3], y[(mask >> 10) & 3]}, 49cb93a386Sopenharmony_ci {x[(mask >> 12) & 3], y[(mask >> 14) & 3]}}; 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci SkPoint localPts[4]; 52cb93a386Sopenharmony_ci inverse.mapPoints(localPts, devPts, 4); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 55cb93a386Sopenharmony_ci cullTest.isVisible(localPts[0]) == 56cb93a386Sopenharmony_ci viewportRect.contains(devPts[0].fX, devPts[0].fY)); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci { 59cb93a386Sopenharmony_ci SkRect devBounds3; 60cb93a386Sopenharmony_ci devBounds3.setBounds(devPts, 3); 61cb93a386Sopenharmony_ci // Outset devBounds because SkRect::intersects returns false on empty, which is NOT 62cb93a386Sopenharmony_ci // the behavior we want. 63cb93a386Sopenharmony_ci devBounds3.outset(1e-3f, 1e-3f); 64cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 65cb93a386Sopenharmony_ci cullTest.areVisible3(localPts) == viewportRect.intersects(devBounds3)); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci { 69cb93a386Sopenharmony_ci SkRect devBounds4; 70cb93a386Sopenharmony_ci devBounds4.setBounds(devPts, 4); 71cb93a386Sopenharmony_ci // Outset devBounds because SkRect::intersects returns false on empty, which is NOT 72cb93a386Sopenharmony_ci // the behavior we want. 73cb93a386Sopenharmony_ci devBounds4.outset(1e-3f, 1e-3f); 74cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, 75cb93a386Sopenharmony_ci cullTest.areVisible4(localPts) == viewportRect.intersects(devBounds4)); 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci }}} 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci} 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci} // namespace skgpu 82