1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/geometry/GrQuad.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/geometry/GrQuadUtils.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker #define ASSERT(cond) REPORTER_ASSERT(r, cond)
19*c8dee2aaSAndroid Build Coastguard Worker #define ASSERTF(cond, ...) REPORTER_ASSERT(r, cond, __VA_ARGS__)
20*c8dee2aaSAndroid Build Coastguard Worker #define TEST(name) DEF_TEST(GrQuadCrop##name, r)
21*c8dee2aaSAndroid Build Coastguard Worker #define ASSERT_NEARLY_EQUAL(expected, actual) \
22*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(SkScalarNearlyEqual(expected, actual), "expected: %f, actual: %f", \
23*c8dee2aaSAndroid Build Coastguard Worker expected, actual)
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker // Make the base rect contain the origin and have unique edge values so that each transform
26*c8dee2aaSAndroid Build Coastguard Worker // produces a different axis-aligned rectangle.
27*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kDrawRect = SkRect::MakeLTRB(-5.f, -6.f, 10.f, 11.f);
28*c8dee2aaSAndroid Build Coastguard Worker
run_crop_axis_aligned_test(skiatest::Reporter * r,const SkRect & clipRect,GrAA clipAA,const SkMatrix & viewMatrix,const SkMatrix * localMatrix)29*c8dee2aaSAndroid Build Coastguard Worker static void run_crop_axis_aligned_test(skiatest::Reporter* r, const SkRect& clipRect, GrAA clipAA,
30*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, const SkMatrix* localMatrix) {
31*c8dee2aaSAndroid Build Coastguard Worker // Should use run_crop_fully_covers_test for non-rect matrices
32*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(viewMatrix.rectStaysRect());
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad = {GrQuad::MakeFromRect(kDrawRect, viewMatrix),
35*c8dee2aaSAndroid Build Coastguard Worker GrQuad::MakeFromRect(kDrawRect, localMatrix ? *localMatrix : SkMatrix::I()),
36*c8dee2aaSAndroid Build Coastguard Worker clipAA == GrAA::kYes ? GrQuadAAFlags::kNone : GrQuadAAFlags::kAll};
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker bool exact = GrQuadUtils::CropToRect(clipRect, clipAA, &quad, /* calc. locals */ !!localMatrix);
39*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(exact, "Expected exact crop");
40*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fDevice.quadType() == GrQuad::Type::kAxisAligned,
41*c8dee2aaSAndroid Build Coastguard Worker "Expected quad to remain axis-aligned");
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker // Since we remained a rectangle, the bounds will exactly match the coordinates
44*c8dee2aaSAndroid Build Coastguard Worker SkRect expectedBounds = viewMatrix.mapRect(kDrawRect);
45*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(expectedBounds.intersect(clipRect));
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker SkRect actualBounds = quad.fDevice.bounds();
48*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedBounds.fLeft, actualBounds.fLeft);
49*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedBounds.fTop, actualBounds.fTop);
50*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedBounds.fRight, actualBounds.fRight);
51*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedBounds.fBottom, actualBounds.fBottom);
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker // Confirm that local coordinates match up with clipped edges and the transform
54*c8dee2aaSAndroid Build Coastguard Worker SkMatrix invViewMatrix;
55*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(viewMatrix.invert(&invViewMatrix));
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker if (localMatrix) {
58*c8dee2aaSAndroid Build Coastguard Worker SkMatrix toLocal = SkMatrix::Concat(*localMatrix, invViewMatrix);
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker for (int p = 0; p < 4; ++p) {
61*c8dee2aaSAndroid Build Coastguard Worker SkPoint expectedPoint = quad.fDevice.point(p);
62*c8dee2aaSAndroid Build Coastguard Worker toLocal.mapPoints(&expectedPoint, 1);
63*c8dee2aaSAndroid Build Coastguard Worker SkPoint actualPoint = quad.fLocal.point(p);
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedPoint.fX, actualPoint.fX);
66*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(expectedPoint.fY, actualPoint.fY);
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker // Confirm that the edge flags match, by mapping clip rect to drawRect space and
71*c8dee2aaSAndroid Build Coastguard Worker // comparing to the original draw rect edges
72*c8dee2aaSAndroid Build Coastguard Worker SkRect drawClip = invViewMatrix.mapRect(clipRect);
73*c8dee2aaSAndroid Build Coastguard Worker if (drawClip.fLeft > kDrawRect.fLeft) {
74*c8dee2aaSAndroid Build Coastguard Worker if (clipAA == GrAA::kYes) {
75*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fEdgeFlags & GrQuadAAFlags::kLeft, "Expected left edge AA set");
76*c8dee2aaSAndroid Build Coastguard Worker } else {
77*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!(quad.fEdgeFlags & GrQuadAAFlags::kLeft), "Expected left edge AA unset");
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker }
80*c8dee2aaSAndroid Build Coastguard Worker if (drawClip.fRight < kDrawRect.fRight) {
81*c8dee2aaSAndroid Build Coastguard Worker if (clipAA == GrAA::kYes) {
82*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fEdgeFlags & GrQuadAAFlags::kRight, "Expected right edge AA set");
83*c8dee2aaSAndroid Build Coastguard Worker } else {
84*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!(quad.fEdgeFlags & GrQuadAAFlags::kRight), "Expected right edge AA unset");
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker if (drawClip.fTop > kDrawRect.fTop) {
88*c8dee2aaSAndroid Build Coastguard Worker if (clipAA == GrAA::kYes) {
89*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fEdgeFlags & GrQuadAAFlags::kTop, "Expected top edge AA set");
90*c8dee2aaSAndroid Build Coastguard Worker } else {
91*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!(quad.fEdgeFlags & GrQuadAAFlags::kTop), "Expected top edge AA unset");
92*c8dee2aaSAndroid Build Coastguard Worker }
93*c8dee2aaSAndroid Build Coastguard Worker }
94*c8dee2aaSAndroid Build Coastguard Worker if (drawClip.fBottom < kDrawRect.fBottom) {
95*c8dee2aaSAndroid Build Coastguard Worker if (clipAA == GrAA::kYes) {
96*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fEdgeFlags & GrQuadAAFlags::kBottom, "Expected bottom edge AA set");
97*c8dee2aaSAndroid Build Coastguard Worker } else {
98*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!(quad.fEdgeFlags & GrQuadAAFlags::kBottom), "Expected bottom edge AA unset");
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker }
101*c8dee2aaSAndroid Build Coastguard Worker }
102*c8dee2aaSAndroid Build Coastguard Worker
run_crop_fully_covered_test(skiatest::Reporter * r,GrAA clipAA,const SkMatrix & viewMatrix,const SkMatrix * localMatrix)103*c8dee2aaSAndroid Build Coastguard Worker static void run_crop_fully_covered_test(skiatest::Reporter* r, GrAA clipAA,
104*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& viewMatrix, const SkMatrix* localMatrix) {
105*c8dee2aaSAndroid Build Coastguard Worker // Should use run_crop_axis_aligned for rect transforms since that verifies more behavior
106*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(!viewMatrix.rectStaysRect());
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker // Test what happens when the geometry fully covers the crop rect. Given a fixed crop,
109*c8dee2aaSAndroid Build Coastguard Worker // use the provided view matrix to derive the "input" geometry that we know covers the crop.
110*c8dee2aaSAndroid Build Coastguard Worker SkMatrix invViewMatrix;
111*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(viewMatrix.invert(&invViewMatrix));
112*c8dee2aaSAndroid Build Coastguard Worker
113*c8dee2aaSAndroid Build Coastguard Worker SkRect containsCrop = kDrawRect; // Use kDrawRect as the crop rect for this test
114*c8dee2aaSAndroid Build Coastguard Worker containsCrop.outset(10.f, 10.f);
115*c8dee2aaSAndroid Build Coastguard Worker SkRect drawRect = invViewMatrix.mapRect(containsCrop);
116*c8dee2aaSAndroid Build Coastguard Worker
117*c8dee2aaSAndroid Build Coastguard Worker DrawQuad quad = {GrQuad::MakeFromRect(drawRect, viewMatrix),
118*c8dee2aaSAndroid Build Coastguard Worker GrQuad::MakeFromRect(drawRect, localMatrix ? *localMatrix : SkMatrix::I()),
119*c8dee2aaSAndroid Build Coastguard Worker clipAA == GrAA::kYes ? GrQuadAAFlags::kNone : GrQuadAAFlags::kAll};
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker if (localMatrix) {
122*c8dee2aaSAndroid Build Coastguard Worker DrawQuad originalQuad = quad;
123*c8dee2aaSAndroid Build Coastguard Worker
124*c8dee2aaSAndroid Build Coastguard Worker bool exact = GrQuadUtils::CropToRect(kDrawRect, clipAA, &quad);
125*c8dee2aaSAndroid Build Coastguard Worker // Currently non-rect matrices don't know how to update local coordinates, so the crop
126*c8dee2aaSAndroid Build Coastguard Worker // doesn't know how to restrict itself and should leave the inputs unmodified
127*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!exact, "Expected crop to be not exact");
128*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fEdgeFlags == originalQuad.fEdgeFlags,
129*c8dee2aaSAndroid Build Coastguard Worker "Expected edge flags not to be modified");
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
132*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fDevice.x(i), quad.fDevice.x(i));
133*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fDevice.y(i), quad.fDevice.y(i));
134*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fDevice.w(i), quad.fDevice.w(i));
135*c8dee2aaSAndroid Build Coastguard Worker
136*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fLocal.x(i), quad.fLocal.x(i));
137*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fLocal.y(i), quad.fLocal.y(i));
138*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(originalQuad.fLocal.w(i), quad.fLocal.w(i));
139*c8dee2aaSAndroid Build Coastguard Worker }
140*c8dee2aaSAndroid Build Coastguard Worker } else {
141*c8dee2aaSAndroid Build Coastguard Worker // Since no local coordinates were provided, and the input draw geometry is known to
142*c8dee2aaSAndroid Build Coastguard Worker // fully cover the crop rect, the quad should be updated to match cropRect exactly,
143*c8dee2aaSAndroid Build Coastguard Worker // unless it's perspective in which case we don't do anything since the code isn't
144*c8dee2aaSAndroid Build Coastguard Worker // numerically robust enough.
145*c8dee2aaSAndroid Build Coastguard Worker DrawQuad originalQuad = quad;
146*c8dee2aaSAndroid Build Coastguard Worker bool exact = GrQuadUtils::CropToRect(kDrawRect, clipAA, &quad, /* calc. local */ false);
147*c8dee2aaSAndroid Build Coastguard Worker if (originalQuad.fDevice.quadType() == GrQuad::Type::kPerspective) {
148*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(!exact, "Expected no change for perspective");
149*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
150*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(originalQuad.fDevice.x(i) == quad.fDevice.x(i));
151*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(originalQuad.fDevice.y(i) == quad.fDevice.y(i));
152*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(originalQuad.fDevice.w(i) == quad.fDevice.w(i));
153*c8dee2aaSAndroid Build Coastguard Worker }
154*c8dee2aaSAndroid Build Coastguard Worker return;
155*c8dee2aaSAndroid Build Coastguard Worker }
156*c8dee2aaSAndroid Build Coastguard Worker
157*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(exact, "Expected crop to be exact");
158*c8dee2aaSAndroid Build Coastguard Worker GrQuadAAFlags expectedFlags = clipAA == GrAA::kYes ? GrQuadAAFlags::kAll
159*c8dee2aaSAndroid Build Coastguard Worker : GrQuadAAFlags::kNone;
160*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(expectedFlags == quad.fEdgeFlags,
161*c8dee2aaSAndroid Build Coastguard Worker "Expected edge flags do not match clip AA setting");
162*c8dee2aaSAndroid Build Coastguard Worker ASSERTF(quad.fDevice.quadType() == GrQuad::Type::kAxisAligned, "Unexpected quad type");
163*c8dee2aaSAndroid Build Coastguard Worker
164*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fLeft, quad.fDevice.x(0));
165*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fTop, quad.fDevice.y(0));
166*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(1.f, quad.fDevice.w(0));
167*c8dee2aaSAndroid Build Coastguard Worker
168*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fLeft, quad.fDevice.x(1));
169*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fBottom, quad.fDevice.y(1));
170*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(1.f, quad.fDevice.w(1));
171*c8dee2aaSAndroid Build Coastguard Worker
172*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fRight, quad.fDevice.x(2));
173*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fTop, quad.fDevice.y(2));
174*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(1.f, quad.fDevice.w(2));
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fRight, quad.fDevice.x(3));
177*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(kDrawRect.fBottom, quad.fDevice.y(3));
178*c8dee2aaSAndroid Build Coastguard Worker ASSERT_NEARLY_EQUAL(1.f, quad.fDevice.w(3));
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker }
181*c8dee2aaSAndroid Build Coastguard Worker
test_axis_aligned_all_clips(skiatest::Reporter * r,const SkMatrix & viewMatrix,const SkMatrix * localMatrix)182*c8dee2aaSAndroid Build Coastguard Worker static void test_axis_aligned_all_clips(skiatest::Reporter* r, const SkMatrix& viewMatrix,
183*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix* localMatrix) {
184*c8dee2aaSAndroid Build Coastguard Worker static const float kInsideEdge = SkScalarAbs(kDrawRect.fLeft) - 1.f;
185*c8dee2aaSAndroid Build Coastguard Worker static const float kOutsideEdge = SkScalarAbs(kDrawRect.fBottom) + 1.f;
186*c8dee2aaSAndroid Build Coastguard Worker static const float kIntersectEdge = SkScalarAbs(kDrawRect.fTop) + 1.f;
187*c8dee2aaSAndroid Build Coastguard Worker
188*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kInsideClipRect = SkRect::MakeLTRB(-kInsideEdge, -kInsideEdge,
189*c8dee2aaSAndroid Build Coastguard Worker kInsideEdge, kInsideEdge);
190*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kContainsClipRect = SkRect::MakeLTRB(-kOutsideEdge, -kOutsideEdge,
191*c8dee2aaSAndroid Build Coastguard Worker kOutsideEdge, kOutsideEdge);
192*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kXYAxesClipRect = SkRect::MakeLTRB(-kIntersectEdge, -kIntersectEdge,
193*c8dee2aaSAndroid Build Coastguard Worker kIntersectEdge, kIntersectEdge);
194*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kXAxisClipRect = SkRect::MakeLTRB(-kIntersectEdge, -kOutsideEdge,
195*c8dee2aaSAndroid Build Coastguard Worker kIntersectEdge, kOutsideEdge);
196*c8dee2aaSAndroid Build Coastguard Worker static const SkRect kYAxisClipRect = SkRect::MakeLTRB(-kOutsideEdge, -kIntersectEdge,
197*c8dee2aaSAndroid Build Coastguard Worker kOutsideEdge, kIntersectEdge);
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kInsideClipRect, GrAA::kNo, viewMatrix, localMatrix);
200*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kContainsClipRect, GrAA::kNo, viewMatrix, localMatrix);
201*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kXYAxesClipRect, GrAA::kNo, viewMatrix, localMatrix);
202*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kXAxisClipRect, GrAA::kNo, viewMatrix, localMatrix);
203*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kYAxisClipRect, GrAA::kNo, viewMatrix, localMatrix);
204*c8dee2aaSAndroid Build Coastguard Worker
205*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kInsideClipRect, GrAA::kYes, viewMatrix, localMatrix);
206*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kContainsClipRect, GrAA::kYes, viewMatrix, localMatrix);
207*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kXYAxesClipRect, GrAA::kYes, viewMatrix, localMatrix);
208*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kXAxisClipRect, GrAA::kYes, viewMatrix, localMatrix);
209*c8dee2aaSAndroid Build Coastguard Worker run_crop_axis_aligned_test(r, kYAxisClipRect, GrAA::kYes, viewMatrix, localMatrix);
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker
test_axis_aligned(skiatest::Reporter * r,const SkMatrix & viewMatrix)212*c8dee2aaSAndroid Build Coastguard Worker static void test_axis_aligned(skiatest::Reporter* r, const SkMatrix& viewMatrix) {
213*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned_all_clips(r, viewMatrix, nullptr);
214*c8dee2aaSAndroid Build Coastguard Worker
215*c8dee2aaSAndroid Build Coastguard Worker SkMatrix normalized = SkMatrix::RectToRect(kDrawRect, SkRect::MakeWH(1.f, 1.f));
216*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned_all_clips(r, viewMatrix, &normalized);
217*c8dee2aaSAndroid Build Coastguard Worker
218*c8dee2aaSAndroid Build Coastguard Worker SkMatrix rotated;
219*c8dee2aaSAndroid Build Coastguard Worker rotated.setRotate(45.f);
220*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned_all_clips(r, viewMatrix, &rotated);
221*c8dee2aaSAndroid Build Coastguard Worker
222*c8dee2aaSAndroid Build Coastguard Worker SkMatrix perspective;
223*c8dee2aaSAndroid Build Coastguard Worker perspective.setPerspY(0.001f);
224*c8dee2aaSAndroid Build Coastguard Worker perspective.setSkewX(8.f / 25.f);
225*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned_all_clips(r, viewMatrix, &perspective);
226*c8dee2aaSAndroid Build Coastguard Worker }
227*c8dee2aaSAndroid Build Coastguard Worker
test_crop_fully_covered(skiatest::Reporter * r,const SkMatrix & viewMatrix)228*c8dee2aaSAndroid Build Coastguard Worker static void test_crop_fully_covered(skiatest::Reporter* r, const SkMatrix& viewMatrix) {
229*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kNo, viewMatrix, nullptr);
230*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kYes, viewMatrix, nullptr);
231*c8dee2aaSAndroid Build Coastguard Worker
232*c8dee2aaSAndroid Build Coastguard Worker SkMatrix normalized = SkMatrix::RectToRect(kDrawRect, SkRect::MakeWH(1.f, 1.f));
233*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kNo, viewMatrix, &normalized);
234*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kYes, viewMatrix, &normalized);
235*c8dee2aaSAndroid Build Coastguard Worker
236*c8dee2aaSAndroid Build Coastguard Worker SkMatrix rotated;
237*c8dee2aaSAndroid Build Coastguard Worker rotated.setRotate(45.f);
238*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kNo, viewMatrix, &rotated);
239*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kYes, viewMatrix, &rotated);
240*c8dee2aaSAndroid Build Coastguard Worker
241*c8dee2aaSAndroid Build Coastguard Worker SkMatrix perspective;
242*c8dee2aaSAndroid Build Coastguard Worker perspective.setPerspY(0.001f);
243*c8dee2aaSAndroid Build Coastguard Worker perspective.setSkewX(8.f / 25.f);
244*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kNo, viewMatrix, &perspective);
245*c8dee2aaSAndroid Build Coastguard Worker run_crop_fully_covered_test(r, GrAA::kYes, viewMatrix, &perspective);
246*c8dee2aaSAndroid Build Coastguard Worker }
247*c8dee2aaSAndroid Build Coastguard Worker
TEST(AxisAligned)248*c8dee2aaSAndroid Build Coastguard Worker TEST(AxisAligned) {
249*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, SkMatrix::I());
250*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, SkMatrix::Scale(-1.f, 1.f));
251*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, SkMatrix::Scale(1.f, -1.f));
252*c8dee2aaSAndroid Build Coastguard Worker
253*c8dee2aaSAndroid Build Coastguard Worker SkMatrix rotation;
254*c8dee2aaSAndroid Build Coastguard Worker rotation.setRotate(90.f);
255*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, rotation);
256*c8dee2aaSAndroid Build Coastguard Worker rotation.setRotate(180.f);
257*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, rotation);
258*c8dee2aaSAndroid Build Coastguard Worker rotation.setRotate(270.f);
259*c8dee2aaSAndroid Build Coastguard Worker test_axis_aligned(r, rotation);
260*c8dee2aaSAndroid Build Coastguard Worker }
261*c8dee2aaSAndroid Build Coastguard Worker
TEST(FullyCovered)262*c8dee2aaSAndroid Build Coastguard Worker TEST(FullyCovered) {
263*c8dee2aaSAndroid Build Coastguard Worker SkMatrix rotation;
264*c8dee2aaSAndroid Build Coastguard Worker rotation.setRotate(34.f);
265*c8dee2aaSAndroid Build Coastguard Worker test_crop_fully_covered(r, rotation);
266*c8dee2aaSAndroid Build Coastguard Worker
267*c8dee2aaSAndroid Build Coastguard Worker SkMatrix skew;
268*c8dee2aaSAndroid Build Coastguard Worker skew.setSkewX(0.3f);
269*c8dee2aaSAndroid Build Coastguard Worker skew.setSkewY(0.04f);
270*c8dee2aaSAndroid Build Coastguard Worker test_crop_fully_covered(r, skew);
271*c8dee2aaSAndroid Build Coastguard Worker
272*c8dee2aaSAndroid Build Coastguard Worker SkMatrix perspective;
273*c8dee2aaSAndroid Build Coastguard Worker perspective.setPerspX(0.001f);
274*c8dee2aaSAndroid Build Coastguard Worker perspective.setSkewY(8.f / 25.f);
275*c8dee2aaSAndroid Build Coastguard Worker test_crop_fully_covered(r, perspective);
276*c8dee2aaSAndroid Build Coastguard Worker }
277