Coverage Report

Created: 2021-08-22 09:07

/src/skia/src/pathops/SkOpAngle.h
Line
Count
Source (jump to first uncovered line)
1
/*
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 "src/pathops/SkLineParameters.h"
11
#include "src/pathops/SkPathOpsCurve.h"
12
#if DEBUG_ANGLE
13
#include "include/core/SkString.h"
14
#endif
15
16
class SkOpContour;
17
class SkOpPtT;
18
class SkOpSegment;
19
class SkOpSpanBase;
20
class SkOpSpan;
21
22
class SkOpAngle {
23
public:
24
    enum IncludeType {
25
        kUnaryWinding,
26
        kUnaryXor,
27
        kBinarySingle,
28
        kBinaryOpp,
29
    };
30
31
    const SkOpAngle* debugAngle(int id) const;
32
    const SkOpCoincidence* debugCoincidence() const;
33
    SkOpContour* debugContour(int id) const;
34
35
0
    int debugID() const {
36
0
        return SkDEBUGRELEASE(fID, -1);
37
0
    }
38
39
#if DEBUG_SORT
40
    void debugLoop() const;
41
#endif
42
43
#if DEBUG_ANGLE
44
    bool debugCheckCoincidence() const { return fCheckCoincidence; }
45
    void debugCheckNearCoincidence() const;
46
    SkString debugPart() const;
47
#endif
48
    const SkOpPtT* debugPtT(int id) const;
49
    const SkOpSegment* debugSegment(int id) const;
50
    int debugSign() const;
51
    const SkOpSpanBase* debugSpan(int id) const;
52
    void debugValidate() const;
53
    void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
54
    double distEndRatio(double dist) const;
55
    // available to testing only
56
    void dump() const;
57
    void dumpCurves() const;
58
    void dumpLoop() const;
59
    void dumpOne(bool functionHeader) const;
60
    void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
61
    void dumpTest() const;
62
63
62.6M
    SkOpSpanBase* end() const {
64
62.6M
        return fEnd;
65
62.6M
    }
66
67
    bool insert(SkOpAngle* );
68
    SkOpSpanBase* lastMarked() const;
69
    bool loopContains(const SkOpAngle* ) const;
70
    int loopCount() const;
71
72
92.7M
    SkOpAngle* next() const {
73
92.7M
        return fNext;
74
92.7M
    }
75
76
    SkOpAngle* previous() const;
77
    SkOpSegment* segment() const;
78
    void set(SkOpSpanBase* start, SkOpSpanBase* end);
79
80
3.53M
    void setLastMarked(SkOpSpanBase* marked) {
81
3.53M
        fLastMarked = marked;
82
3.53M
    }
83
84
62.6M
    SkOpSpanBase* start() const {
85
62.6M
        return fStart;
86
62.6M
    }
87
88
    SkOpSpan* starter();
89
90
43.7M
    bool tangentsAmbiguous() const {
91
43.7M
        return fTangentsAmbiguous;
92
43.7M
    }
93
94
111M
    bool unorderable() const {
95
111M
        return fUnorderable;
96
111M
    }
97
98
private:
99
    bool after(SkOpAngle* test);
100
    void alignmentSameSide(const SkOpAngle* test, int* order) const;
101
    bool checkCrossesZero() const;
102
    bool checkParallel(SkOpAngle* );
103
    bool computeSector();
104
    int convexHullOverlaps(const SkOpAngle* );
105
    bool endToSide(const SkOpAngle* rh, bool* inside) const;
106
    bool endsIntersect(SkOpAngle* );
107
    int findSector(SkPath::Verb verb, double x, double y) const;
108
    SkOpGlobalState* globalState() const;
109
    int lineOnOneSide(const SkDPoint& origin, const SkDVector& line, const SkOpAngle* test,
110
                      bool useOriginal) const;
111
    int lineOnOneSide(const SkOpAngle* test, bool useOriginal);
112
    int linesOnOriginalSide(const SkOpAngle* test);
113
    bool merge(SkOpAngle* );
114
    double midT() const;
115
    bool midToSide(const SkOpAngle* rh, bool* inside) const;
116
    bool oppositePlanes(const SkOpAngle* rh) const;
117
    int orderable(SkOpAngle* rh);  // false == this < rh ; true == this > rh; -1 == unorderable
118
    void setSector();
119
    void setSpans();
120
    bool tangentsDiverge(const SkOpAngle* rh, double s0xt0);
121
122
    SkDCurve fOriginalCurvePart;  // the curve from start to end
123
    SkDCurveSweep fPart;  // the curve from start to end offset as needed
124
    double fSide;
125
    SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
126
    SkOpAngle* fNext;
127
    SkOpSpanBase* fLastMarked;
128
    SkOpSpanBase* fStart;
129
    SkOpSpanBase* fEnd;
130
    SkOpSpanBase* fComputedEnd;
131
    int fSectorMask;
132
    int8_t fSectorStart;  // in 32nds of a circle
133
    int8_t fSectorEnd;
134
    bool fUnorderable;
135
    bool fComputeSector;
136
    bool fComputedSector;
137
    bool fCheckCoincidence;
138
    bool fTangentsAmbiguous;
139
    SkDEBUGCODE(int fID);
140
141
    friend class PathOpsAngleTester;
142
};
143
144
145
146
#endif