blob: 779ff33b3f2a3e85d05185100f098f34e4e3b78c [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)
15 {
caryclark@google.coma7e483d2012-08-28 20:44:43 +000016 // OPTIMIZE: don't need to be initialized in release
caryclark@google.com639df892012-01-10 21:46:10 +000017 bzero(fT, sizeof(fT));
caryclark@google.coma7e483d2012-08-28 20:44:43 +000018 bzero(fCoincidentT, sizeof(fCoincidentT));
caryclark@google.com05c4bad2013-01-19 13:22:39 +000019 reset();
caryclark@google.com639df892012-01-10 21:46:10 +000020 }
21
22 void add(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000023 for (int index = 0; index < fUsed; ++index) {
24 if (approximately_equal(fT[fSwap][index], one)
25 && approximately_equal(fT[fSwap ^ 1][index], two)) {
26 return;
27 }
caryclark@google.com639df892012-01-10 21:46:10 +000028 }
caryclark@google.comaa358312013-01-29 20:28:49 +000029 SkASSERT(fUsed < 9);
caryclark@google.com639df892012-01-10 21:46:10 +000030 fT[fSwap][fUsed] = one;
31 fT[fSwap ^ 1][fUsed] = two;
32 ++fUsed;
33 }
34
caryclark@google.coma7e483d2012-08-28 20:44:43 +000035 // start if index == 0 : end if index == 1
caryclark@google.com235f56a2012-09-14 14:19:30 +000036 void addCoincident(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000037 for (int index = 0; index < fCoincidentUsed; ++index) {
38 if (approximately_equal(fCoincidentT[fSwap][index], one)
39 && approximately_equal(fCoincidentT[fSwap ^ 1][index], two)) {
caryclark@google.com32546db2012-08-31 20:55:07 +000040 return;
41 }
caryclark@google.coma7e483d2012-08-28 20:44:43 +000042 }
caryclark@google.comaa358312013-01-29 20:28:49 +000043 SkASSERT(fCoincidentUsed < 9);
caryclark@google.coma7e483d2012-08-28 20:44:43 +000044 fCoincidentT[fSwap][fCoincidentUsed] = one;
45 fCoincidentT[fSwap ^ 1][fCoincidentUsed] = two;
46 ++fCoincidentUsed;
47 }
48
caryclark@google.com73ca6242013-01-17 21:02:47 +000049 void addCoincident(double s1, double e1, double s2, double e2);
caryclark@google.com235f56a2012-09-14 14:19:30 +000050
51 // FIXME: this is necessary because curve/curve intersections are noisy
52 // remove once curve/curve intersections are improved
53 void cleanUp();
54
caryclark@google.com73ca6242013-01-17 21:02:47 +000055 int coincidentUsed() const{
caryclark@google.com32546db2012-08-31 20:55:07 +000056 return fCoincidentUsed;
57 }
58
caryclark@google.com639df892012-01-10 21:46:10 +000059 void offset(int base, double start, double end) {
60 for (int index = base; index < fUsed; ++index) {
61 double val = fT[fSwap][index];
62 val *= end - start;
63 val += start;
64 fT[fSwap][index] = val;
65 }
66 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000067
caryclark@google.com73ca6242013-01-17 21:02:47 +000068 void insert(double one, double two);
69 void insertOne(double t, int side);
caryclark@google.com639df892012-01-10 21:46:10 +000070
caryclark@google.com235f56a2012-09-14 14:19:30 +000071 bool intersected() const {
caryclark@google.com639df892012-01-10 21:46:10 +000072 return fUsed > 0;
73 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000074
caryclark@google.com235f56a2012-09-14 14:19:30 +000075 bool insertBalanced() const {
76 return fUsed == fUsed2;
77 }
caryclark@google.com639df892012-01-10 21:46:10 +000078
caryclark@google.com05c4bad2013-01-19 13:22:39 +000079 // leaves flip, swap alone
80 void reset() {
81 fUsed = fUsed2 = fCoincidentUsed = 0;
82 fUnsortable = false;
83 }
84
caryclark@google.com639df892012-01-10 21:46:10 +000085 void swap() {
caryclark@google.com73ca6242013-01-17 21:02:47 +000086 fSwap ^= true;
87 }
skia.committer@gmail.com15dd3002013-01-18 07:07:28 +000088
caryclark@google.com73ca6242013-01-17 21:02:47 +000089 void swapPts() {
90 int index;
91 for (index = 0; index < fUsed; ++index) {
92 SkTSwap(fT[0][index], fT[1][index]);
93 }
caryclark@google.com639df892012-01-10 21:46:10 +000094 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000095
caryclark@google.com73ca6242013-01-17 21:02:47 +000096 bool swapped() const {
caryclark@google.com639df892012-01-10 21:46:10 +000097 return fSwap;
98 }
99
caryclark@google.com73ca6242013-01-17 21:02:47 +0000100 bool unsortable() const {
101 return fUnsortable;
102 }
103
104 int used() const {
caryclark@google.com639df892012-01-10 21:46:10 +0000105 return fUsed;
106 }
107
108 double fT[2][9];
caryclark@google.coma7e483d2012-08-28 20:44:43 +0000109 double fCoincidentT[2][9];
caryclark@google.com639df892012-01-10 21:46:10 +0000110 int fUsed;
caryclark@google.com235f56a2012-09-14 14:19:30 +0000111 int fUsed2;
caryclark@google.coma7e483d2012-08-28 20:44:43 +0000112 int fCoincidentUsed;
caryclark@google.com73ca6242013-01-17 21:02:47 +0000113 bool fFlip;
114 bool fUnsortable;
caryclark@google.coma5764232012-03-28 16:20:21 +0000115private:
caryclark@google.com639df892012-01-10 21:46:10 +0000116 int fSwap;
117};
caryclark@google.coma5764232012-03-28 16:20:21 +0000118
119#endif