blob: d11a1c1ee5c3ff2f6571354fd9b32e7794ac830b [file] [log] [blame]
caryclark@google.com07393ca2013-04-08 11:47:37 +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 */
7#ifndef SkOpAngle_DEFINED
8#define SkOpAngle_DEFINED
9
10#include "SkLineParameters.h"
caryclark1049f122015-04-20 08:31:59 -070011#include "SkPathOpsCurve.h"
caryclark54359292015-03-26 07:52:43 -070012#if DEBUG_ANGLE
13#include "SkString.h"
14#endif
caryclark@google.comcffbcc32013-06-04 17:59:42 +000015
caryclark54359292015-03-26 07:52:43 -070016class SkOpContour;
17class SkOpPtT;
caryclark@google.comcffbcc32013-06-04 17:59:42 +000018class SkOpSegment;
caryclark54359292015-03-26 07:52:43 -070019class SkOpSpanBase;
20class SkOpSpan;
caryclark@google.com07393ca2013-04-08 11:47:37 +000021
caryclark55888e42016-07-18 10:01:36 -070022class SkOpAngle {
23public:
caryclark@google.com570863f2013-09-16 15:55:01 +000024 enum IncludeType {
25 kUnaryWinding,
26 kUnaryXor,
27 kBinarySingle,
28 kBinaryOpp,
29 };
caryclark@google.comd892bd82013-06-17 14:10:36 +000030
caryclark54359292015-03-26 07:52:43 -070031 const SkOpAngle* debugAngle(int id) const;
caryclark55888e42016-07-18 10:01:36 -070032 const SkOpCoincidence* debugCoincidence() const;
caryclark30b9fdd2016-08-31 14:36:29 -070033 SkOpContour* debugContour(int id) const;
caryclark54359292015-03-26 07:52:43 -070034
35 int debugID() const {
caryclark1049f122015-04-20 08:31:59 -070036 return SkDEBUGRELEASE(fID, -1);
caryclark54359292015-03-26 07:52:43 -070037 }
38
caryclark624637c2015-05-11 07:21:27 -070039#if DEBUG_SORT
caryclark54359292015-03-26 07:52:43 -070040 void debugLoop() const;
41#endif
42
43#if DEBUG_ANGLE
Cary Clarkd2eb5812017-01-18 11:00:57 -050044 void debugAfter(const SkOpAngle* lh, const SkOpAngle* rh, SkString* bugOut) const;
caryclark55888e42016-07-18 10:01:36 -070045 bool debugCheckCoincidence() const { return fCheckCoincidence; }
caryclark26ad22a2015-10-16 09:03:38 -070046 void debugCheckNearCoincidence() const;
Cary Clarkd2eb5812017-01-18 11:00:57 -050047#endif
48 SkDPoint* debugFirstPt() { return &fOriginalCurvePart.fLine.fPts[0]; }
49#if DEBUG_ANGLE
caryclark54359292015-03-26 07:52:43 -070050 SkString debugPart() const;
51#endif
52 const SkOpPtT* debugPtT(int id) const;
53 const SkOpSegment* debugSegment(int id) const;
caryclark624637c2015-05-11 07:21:27 -070054 int debugSign() const;
caryclark54359292015-03-26 07:52:43 -070055 const SkOpSpanBase* debugSpan(int id) const;
caryclark55888e42016-07-18 10:01:36 -070056 void debugValidate() const;
caryclark54359292015-03-26 07:52:43 -070057 void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted
58 double distEndRatio(double dist) const;
59 // available to testing only
60 void dump() const;
61 void dumpCurves() const;
62 void dumpLoop() const;
63 void dumpOne(bool functionHeader) const;
64 void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
65 void dumpTest() const;
66
67 SkOpSpanBase* end() const {
caryclark@google.com07393ca2013-04-08 11:47:37 +000068 return fEnd;
69 }
70
caryclarkb36a3cd2016-10-18 07:59:44 -070071 bool insert(SkOpAngle* );
caryclark54359292015-03-26 07:52:43 -070072 SkOpSpanBase* lastMarked() const;
73 bool loopContains(const SkOpAngle* ) const;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +000074 int loopCount() const;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +000075
76 SkOpAngle* next() const {
77 return fNext;
78 }
79
80 SkOpAngle* previous() const;
caryclark54359292015-03-26 07:52:43 -070081 SkOpSegment* segment() const;
caryclark54359292015-03-26 07:52:43 -070082 void set(SkOpSpanBase* start, SkOpSpanBase* end);
caryclark54359292015-03-26 07:52:43 -070083
84 void setLastMarked(SkOpSpanBase* marked) {
caryclark@google.com570863f2013-09-16 15:55:01 +000085 fLastMarked = marked;
86 }
87
caryclark54359292015-03-26 07:52:43 -070088 SkOpSpanBase* start() const {
reed0dc4dd62015-03-24 13:55:33 -070089 return fStart;
90 }
caryclarkccec0f92015-03-24 07:28:17 -070091
caryclark54359292015-03-26 07:52:43 -070092 SkOpSpan* starter();
caryclark54359292015-03-26 07:52:43 -070093
caryclarkb36a3cd2016-10-18 07:59:44 -070094 bool tangentsAmbiguous() const {
95 return fTangentsAmbiguous;
96 }
97
caryclark@google.comcffbcc32013-06-04 17:59:42 +000098 bool unorderable() const {
99 return fUnorderable;
100 }
101
caryclark55888e42016-07-18 10:01:36 -0700102private:
Cary Clarkd2eb5812017-01-18 11:00:57 -0500103 enum class Turn {
104#ifdef SK_DEBUG
105 kDebugUninitialized = -2,
106#endif
107 kCcw = -1,
108 kNone,
109 kCw
110 };
111
caryclark55888e42016-07-18 10:01:36 -0700112 bool after(SkOpAngle* test);
Cary Clarkff114282016-12-14 11:56:16 -0500113 void alignmentSameSide(const SkOpAngle* test, int* order) const;
caryclark55888e42016-07-18 10:01:36 -0700114 int allOnOneSide(const SkOpAngle* test);
Cary Clarkd2eb5812017-01-18 11:00:57 -0500115 Turn ccwOf(const SkOpAngle* rh, bool rhCW, bool thisCCW, bool recursed = false) const;
116 bool checkCrossesZero(int* start, int* end) const;
caryclark55888e42016-07-18 10:01:36 -0700117 bool checkParallel(SkOpAngle* );
118 bool computeSector();
caryclarkb36a3cd2016-10-18 07:59:44 -0700119 int convexHullOverlaps(const SkOpAngle* );
caryclark55888e42016-07-18 10:01:36 -0700120 bool endToSide(const SkOpAngle* rh, bool* inside) const;
121 bool endsIntersect(SkOpAngle* );
122 int findSector(SkPath::Verb verb, double x, double y) const;
123 SkOpGlobalState* globalState() const;
124 bool merge(SkOpAngle* );
125 double midT() const;
126 bool midToSide(const SkOpAngle* rh, bool* inside) const;
127 bool oppositePlanes(const SkOpAngle* rh) const;
128 bool orderable(SkOpAngle* rh); // false == this < rh ; true == this > rh
Cary Clarkd2eb5812017-01-18 11:00:57 -0500129 bool sectorRange(int* start, int* end, bool roundOut) const;
caryclark55888e42016-07-18 10:01:36 -0700130 void setSector();
131 void setSpans();
Cary Clarkd2eb5812017-01-18 11:00:57 -0500132 bool sweepContains(const SkOpAngle* rh) const;
133 bool sweepsCCW() const;
caryclarkb36a3cd2016-10-18 07:59:44 -0700134 bool tangentsDiverge(const SkOpAngle* rh, double s0xt0);
Cary Clarkd2eb5812017-01-18 11:00:57 -0500135 Turn toTurn(bool ccw) const { return ccw ? Turn::kCcw : Turn::kCw; }
caryclark55888e42016-07-18 10:01:36 -0700136
137 SkDCurve fOriginalCurvePart; // the curve from start to end
caryclarkeed356d2016-09-14 07:18:20 -0700138 SkDCurveSweep fPart; // the curve from start to end offset as needed
caryclark@google.com07393ca2013-04-08 11:47:37 +0000139 double fSide;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000140 SkLineParameters fTangentHalf; // used only to sort a pair of lines or line-like sections
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000141 SkOpAngle* fNext;
caryclark54359292015-03-26 07:52:43 -0700142 SkOpSpanBase* fLastMarked;
caryclark54359292015-03-26 07:52:43 -0700143 SkOpSpanBase* fStart;
144 SkOpSpanBase* fEnd;
145 SkOpSpanBase* fComputedEnd;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000146 int fSectorMask;
commit-bot@chromium.org86084632014-04-14 18:33:03 +0000147 int8_t fSectorStart; // in 32nds of a circle
148 int8_t fSectorEnd;
caryclark54359292015-03-26 07:52:43 -0700149 bool fUnorderable;
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000150 bool fComputeSector;
151 bool fComputedSector;
caryclark54359292015-03-26 07:52:43 -0700152 bool fCheckCoincidence;
caryclarkb36a3cd2016-10-18 07:59:44 -0700153 bool fTangentsAmbiguous;
caryclark1049f122015-04-20 08:31:59 -0700154 SkDEBUGCODE(int fID);
commit-bot@chromium.org4431e772014-04-14 17:08:59 +0000155
caryclark55888e42016-07-18 10:01:36 -0700156 friend class PathOpsAngleTester;
caryclark@google.com07393ca2013-04-08 11:47:37 +0000157};
158
caryclark54359292015-03-26 07:52:43 -0700159
caryclarkdac1d172014-06-17 05:15:38 -0700160
caryclark@google.com07393ca2013-04-08 11:47:37 +0000161#endif