blob: aed47bd61bd10e87faf37599b7c61385fb1729ab [file] [log] [blame]
caryclark@google.com9e49fb62012-08-27 14:11:33 +00001/*
2 * Copyright 2012 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 */
caryclark@google.coma5764232012-03-28 16:20:21 +00007#ifndef Intersections_DEFINE
8#define Intersections_DEFINE
9
caryclark@google.com639df892012-01-10 21:46:10 +000010class Intersections {
11public:
skia.committer@gmail.com9f876ed2013-01-20 07:05:51 +000012 Intersections()
caryclark@google.com05c4bad2013-01-19 13:22:39 +000013 : fFlip(0)
caryclark@google.com639df892012-01-10 21:46:10 +000014 , fSwap(0)
caryclark@google.comf9502d72013-02-04 14:06:49 +000015#if SK_DEBUG
16 , fDepth(0)
17#endif
caryclark@google.com639df892012-01-10 21:46:10 +000018 {
caryclark@google.coma7e483d2012-08-28 20:44:43 +000019 // OPTIMIZE: don't need to be initialized in release
caryclark@google.com639df892012-01-10 21:46:10 +000020 bzero(fT, sizeof(fT));
caryclark@google.coma7e483d2012-08-28 20:44:43 +000021 bzero(fCoincidentT, sizeof(fCoincidentT));
caryclark@google.com05c4bad2013-01-19 13:22:39 +000022 reset();
caryclark@google.com639df892012-01-10 21:46:10 +000023 }
24
25 void add(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000026 for (int index = 0; index < fUsed; ++index) {
27 if (approximately_equal(fT[fSwap][index], one)
28 && approximately_equal(fT[fSwap ^ 1][index], two)) {
29 return;
30 }
caryclark@google.com639df892012-01-10 21:46:10 +000031 }
caryclark@google.comaa358312013-01-29 20:28:49 +000032 SkASSERT(fUsed < 9);
caryclark@google.com639df892012-01-10 21:46:10 +000033 fT[fSwap][fUsed] = one;
34 fT[fSwap ^ 1][fUsed] = two;
35 ++fUsed;
36 }
37
caryclark@google.coma7e483d2012-08-28 20:44:43 +000038 // start if index == 0 : end if index == 1
caryclark@google.com235f56a2012-09-14 14:19:30 +000039 void addCoincident(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000040 for (int index = 0; index < fCoincidentUsed; ++index) {
41 if (approximately_equal(fCoincidentT[fSwap][index], one)
42 && approximately_equal(fCoincidentT[fSwap ^ 1][index], two)) {
caryclark@google.com32546db2012-08-31 20:55:07 +000043 return;
44 }
caryclark@google.coma7e483d2012-08-28 20:44:43 +000045 }
caryclark@google.comaa358312013-01-29 20:28:49 +000046 SkASSERT(fCoincidentUsed < 9);
caryclark@google.coma7e483d2012-08-28 20:44:43 +000047 fCoincidentT[fSwap][fCoincidentUsed] = one;
48 fCoincidentT[fSwap ^ 1][fCoincidentUsed] = two;
49 ++fCoincidentUsed;
50 }
51
caryclark@google.com73ca6242013-01-17 21:02:47 +000052 void addCoincident(double s1, double e1, double s2, double e2);
caryclark@google.com235f56a2012-09-14 14:19:30 +000053
54 // FIXME: this is necessary because curve/curve intersections are noisy
55 // remove once curve/curve intersections are improved
56 void cleanUp();
57
caryclark@google.comf9502d72013-02-04 14:06:49 +000058 int coincidentUsed() const {
caryclark@google.com32546db2012-08-31 20:55:07 +000059 return fCoincidentUsed;
60 }
skia.committer@gmail.com0c38ed32013-02-05 07:02:01 +000061
caryclark@google.comf9502d72013-02-04 14:06:49 +000062#if SK_DEBUG
63 int depth() const {
64 return fDepth;
65 }
66#endif
caryclark@google.com32546db2012-08-31 20:55:07 +000067
caryclark@google.com639df892012-01-10 21:46:10 +000068 void offset(int base, double start, double end) {
69 for (int index = base; index < fUsed; ++index) {
70 double val = fT[fSwap][index];
71 val *= end - start;
72 val += start;
73 fT[fSwap][index] = val;
74 }
75 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000076
caryclark@google.com73ca6242013-01-17 21:02:47 +000077 void insert(double one, double two);
78 void insertOne(double t, int side);
caryclark@google.com639df892012-01-10 21:46:10 +000079
caryclark@google.com235f56a2012-09-14 14:19:30 +000080 bool intersected() const {
caryclark@google.com639df892012-01-10 21:46:10 +000081 return fUsed > 0;
82 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000083
caryclark@google.com235f56a2012-09-14 14:19:30 +000084 bool insertBalanced() const {
85 return fUsed == fUsed2;
86 }
caryclark@google.com639df892012-01-10 21:46:10 +000087
caryclark@google.com05c4bad2013-01-19 13:22:39 +000088 // leaves flip, swap alone
89 void reset() {
90 fUsed = fUsed2 = fCoincidentUsed = 0;
91 fUnsortable = false;
92 }
93
caryclark@google.com639df892012-01-10 21:46:10 +000094 void swap() {
caryclark@google.com73ca6242013-01-17 21:02:47 +000095 fSwap ^= true;
96 }
skia.committer@gmail.com15dd3002013-01-18 07:07:28 +000097
caryclark@google.com73ca6242013-01-17 21:02:47 +000098 void swapPts() {
99 int index;
100 for (index = 0; index < fUsed; ++index) {
101 SkTSwap(fT[0][index], fT[1][index]);
102 }
caryclark@google.com639df892012-01-10 21:46:10 +0000103 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000104
caryclark@google.com73ca6242013-01-17 21:02:47 +0000105 bool swapped() const {
caryclark@google.com639df892012-01-10 21:46:10 +0000106 return fSwap;
107 }
108
caryclark@google.com73ca6242013-01-17 21:02:47 +0000109 bool unsortable() const {
110 return fUnsortable;
111 }
112
113 int used() const {
caryclark@google.com639df892012-01-10 21:46:10 +0000114 return fUsed;
115 }
116
caryclark@google.comf9502d72013-02-04 14:06:49 +0000117 void downDepth() {
118 SkASSERT(--fDepth >= 0);
119 }
120
121 void upDepth() {
122 SkASSERT(++fDepth < 16);
123 }
124
caryclark@google.com639df892012-01-10 21:46:10 +0000125 double fT[2][9];
caryclark@google.coma7e483d2012-08-28 20:44:43 +0000126 double fCoincidentT[2][9];
caryclark@google.com639df892012-01-10 21:46:10 +0000127 int fUsed;
caryclark@google.com235f56a2012-09-14 14:19:30 +0000128 int fUsed2;
caryclark@google.coma7e483d2012-08-28 20:44:43 +0000129 int fCoincidentUsed;
caryclark@google.com73ca6242013-01-17 21:02:47 +0000130 bool fFlip;
131 bool fUnsortable;
caryclark@google.comf9502d72013-02-04 14:06:49 +0000132#if SK_DEBUG
133 int fDepth;
134#endif
caryclark@google.coma5764232012-03-28 16:20:21 +0000135private:
caryclark@google.com639df892012-01-10 21:46:10 +0000136 int fSwap;
137};
caryclark@google.coma5764232012-03-28 16:20:21 +0000138
139#endif