blob: c8a142a19b99c9988bf9d6fad3bbe19c20e25365 [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.com73ca6242013-01-17 21:02:47 +000010#include <algorithm> // for std::min -- Skia doesn't have a SkMinDouble
11#include "SkTypes.h"
caryclark@google.com235f56a2012-09-14 14:19:30 +000012
caryclark@google.com639df892012-01-10 21:46:10 +000013class Intersections {
14public:
15 Intersections()
16 : fUsed(0)
caryclark@google.com235f56a2012-09-14 14:19:30 +000017 , fUsed2(0)
caryclark@google.coma7e483d2012-08-28 20:44:43 +000018 , fCoincidentUsed(0)
caryclark@google.com73ca6242013-01-17 21:02:47 +000019 , fFlip(false)
20 , fUnsortable(false)
caryclark@google.com639df892012-01-10 21:46:10 +000021 , fSwap(0)
22 {
caryclark@google.coma7e483d2012-08-28 20:44:43 +000023 // OPTIMIZE: don't need to be initialized in release
caryclark@google.com639df892012-01-10 21:46:10 +000024 bzero(fT, sizeof(fT));
caryclark@google.coma7e483d2012-08-28 20:44:43 +000025 bzero(fCoincidentT, sizeof(fCoincidentT));
caryclark@google.com639df892012-01-10 21:46:10 +000026 }
27
28 void add(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000029 for (int index = 0; index < fUsed; ++index) {
30 if (approximately_equal(fT[fSwap][index], one)
31 && approximately_equal(fT[fSwap ^ 1][index], two)) {
32 return;
33 }
caryclark@google.com639df892012-01-10 21:46:10 +000034 }
caryclark@google.com235f56a2012-09-14 14:19:30 +000035 assert(fUsed < 9);
caryclark@google.com639df892012-01-10 21:46:10 +000036 fT[fSwap][fUsed] = one;
37 fT[fSwap ^ 1][fUsed] = two;
38 ++fUsed;
39 }
40
caryclark@google.coma7e483d2012-08-28 20:44:43 +000041 // start if index == 0 : end if index == 1
caryclark@google.com235f56a2012-09-14 14:19:30 +000042 void addCoincident(double one, double two) {
caryclark@google.com32546db2012-08-31 20:55:07 +000043 for (int index = 0; index < fCoincidentUsed; ++index) {
44 if (approximately_equal(fCoincidentT[fSwap][index], one)
45 && approximately_equal(fCoincidentT[fSwap ^ 1][index], two)) {
caryclark@google.com32546db2012-08-31 20:55:07 +000046 return;
47 }
caryclark@google.coma7e483d2012-08-28 20:44:43 +000048 }
caryclark@google.com235f56a2012-09-14 14:19:30 +000049 assert(fCoincidentUsed < 9);
caryclark@google.coma7e483d2012-08-28 20:44:43 +000050 fCoincidentT[fSwap][fCoincidentUsed] = one;
51 fCoincidentT[fSwap ^ 1][fCoincidentUsed] = two;
52 ++fCoincidentUsed;
53 }
54
caryclark@google.com73ca6242013-01-17 21:02:47 +000055 void addCoincident(double s1, double e1, double s2, double e2);
caryclark@google.com235f56a2012-09-14 14:19:30 +000056
57 // FIXME: this is necessary because curve/curve intersections are noisy
58 // remove once curve/curve intersections are improved
59 void cleanUp();
60
caryclark@google.com73ca6242013-01-17 21:02:47 +000061 int coincidentUsed() const{
caryclark@google.com32546db2012-08-31 20:55:07 +000062 return fCoincidentUsed;
63 }
64
caryclark@google.com639df892012-01-10 21:46:10 +000065 void offset(int base, double start, double end) {
66 for (int index = base; index < fUsed; ++index) {
67 double val = fT[fSwap][index];
68 val *= end - start;
69 val += start;
70 fT[fSwap][index] = val;
71 }
72 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000073
caryclark@google.com73ca6242013-01-17 21:02:47 +000074 void insert(double one, double two);
75 void insertOne(double t, int side);
caryclark@google.com639df892012-01-10 21:46:10 +000076
caryclark@google.com235f56a2012-09-14 14:19:30 +000077 bool intersected() const {
caryclark@google.com639df892012-01-10 21:46:10 +000078 return fUsed > 0;
79 }
skia.committer@gmail.com055c7c22012-09-15 02:01:41 +000080
caryclark@google.com235f56a2012-09-14 14:19:30 +000081 bool insertBalanced() const {
82 return fUsed == fUsed2;
83 }
caryclark@google.com639df892012-01-10 21:46:10 +000084
85 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