1 /*
2  * Copyright 2014 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "PathOpsExtendedTest.h"
9 #include "PathOpsTestCommon.h"
10 #include "SkBitmap.h"
11 #include "Test.h"
12 
DEF_TEST(PathOpsBuilder,reporter)13 DEF_TEST(PathOpsBuilder, reporter) {
14     SkOpBuilder builder;
15     SkPath result;
16     REPORTER_ASSERT(reporter, builder.resolve(&result));
17     REPORTER_ASSERT(reporter, result.isEmpty());
18 
19     builder.add(result, kDifference_SkPathOp);
20     REPORTER_ASSERT(reporter, builder.resolve(&result));
21     REPORTER_ASSERT(reporter, result.isEmpty());
22 
23     builder.add(result, kUnion_SkPathOp);
24     REPORTER_ASSERT(reporter, builder.resolve(&result));
25     REPORTER_ASSERT(reporter, result.isEmpty());
26 
27     SkPath rectPath;
28     rectPath.setFillType(SkPath::kEvenOdd_FillType);
29     rectPath.addRect(0, 1, 2, 3, SkPath::kCW_Direction);
30     builder.add(rectPath, kUnion_SkPathOp);
31     REPORTER_ASSERT(reporter, builder.resolve(&result));
32     bool closed;
33     SkPath::Direction dir;
34     REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir));
35     REPORTER_ASSERT(reporter, closed);
36     REPORTER_ASSERT(reporter, dir == SkPath::kCW_Direction);
37     REPORTER_ASSERT(reporter, rectPath == result);
38 
39     rectPath.reset();
40     rectPath.setFillType(SkPath::kEvenOdd_FillType);
41     rectPath.addRect(0, 1, 2, 3, SkPath::kCCW_Direction);
42     builder.add(rectPath, kUnion_SkPathOp);
43     REPORTER_ASSERT(reporter, builder.resolve(&result));
44     REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir));
45     REPORTER_ASSERT(reporter, closed);
46     REPORTER_ASSERT(reporter, dir == SkPath::kCCW_Direction);
47      REPORTER_ASSERT(reporter, rectPath == result);
48 
49     builder.add(rectPath, kDifference_SkPathOp);
50     REPORTER_ASSERT(reporter, builder.resolve(&result));
51     REPORTER_ASSERT(reporter, result.isEmpty());
52 
53     SkPath rect2, rect3;
54     rect2.addRect(2, 1, 4, 3, SkPath::kCW_Direction);
55     rect3.addRect(4, 1, 5, 3, SkPath::kCCW_Direction);
56     builder.add(rectPath, kUnion_SkPathOp);
57     builder.add(rect2, kUnion_SkPathOp);
58     builder.add(rect3, kUnion_SkPathOp);
59     REPORTER_ASSERT(reporter, builder.resolve(&result));
60     REPORTER_ASSERT(reporter, result.isRect(NULL, &closed, &dir));
61     REPORTER_ASSERT(reporter, closed);
62     SkRect expected;
63     expected.set(0, 1, 5, 3);
64     REPORTER_ASSERT(reporter, result.getBounds() == expected);
65 
66     SkPath circle1, circle2, circle3;
67     circle1.addCircle(5, 6, 4, SkPath::kCW_Direction);
68     circle2.addCircle(7, 4, 8, SkPath::kCCW_Direction);
69     circle3.addCircle(6, 5, 6, SkPath::kCW_Direction);
70     SkPath opCompare;
71     Op(circle1, circle2, kUnion_SkPathOp, &opCompare);
72     Op(opCompare, circle3, kDifference_SkPathOp, &opCompare);
73     builder.add(circle1, kUnion_SkPathOp);
74     builder.add(circle2, kUnion_SkPathOp);
75     builder.add(circle3, kDifference_SkPathOp);
76     REPORTER_ASSERT(reporter, builder.resolve(&result));
77     SkBitmap bitmap;
78     int pixelDiff = comparePaths(reporter, __FUNCTION__, opCompare, result, bitmap);
79     REPORTER_ASSERT(reporter, pixelDiff == 0);
80 }
81 
DEF_TEST(Issue3838,reporter)82 DEF_TEST(Issue3838, reporter) {
83     SkPath path;
84     path.moveTo(200, 170);
85     path.lineTo(220, 170);
86     path.lineTo(220, 230);
87     path.lineTo(240, 230);
88     path.lineTo(240, 210);
89     path.lineTo(180, 210);
90     path.lineTo(180, 190);
91     path.lineTo(260, 190);
92     path.lineTo(260, 250);
93     path.lineTo(200, 250);
94     path.lineTo(200, 170);
95     path.close();
96     testSimplify(reporter, path, __FUNCTION__);
97     SkPath path3;
98     Simplify(path, &path3);
99     SkPath path2;
100     SkOpBuilder builder;
101     builder.add(path, kUnion_SkPathOp);
102     builder.resolve(&path2);
103     SkBitmap bitmap;
104     int pixelDiff = comparePaths(reporter, __FUNCTION__, path, path2, bitmap);
105     REPORTER_ASSERT(reporter, pixelDiff == 0);
106 }
107