1 /*
2  * Copyright 2013 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 SkOpCoincidence_DEFINED
8 #define SkOpCoincidence_DEFINED
9 
10 #include "SkOpTAllocator.h"
11 #include "SkOpSpan.h"
12 
13 class SkOpPtT;
14 
15 struct SkCoincidentSpans {
16     SkCoincidentSpans* fNext;
17     SkOpPtT* fCoinPtTStart;
18     SkOpPtT* fCoinPtTEnd;
19     SkOpPtT* fOppPtTStart;
20     SkOpPtT* fOppPtTEnd;
21     bool fFlipped;
22 
23     void dump() const;
24 };
25 
26 class SkOpCoincidence {
27 public:
SkOpCoincidence()28     SkOpCoincidence()
29         : fHead(NULL) {
30     }
31 
32     void add(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart,
33              SkOpPtT* oppPtTEnd, SkChunkAlloc* allocator);
34     bool addMissing(SkChunkAlloc* allocator);
35     void addMissing(SkCoincidentSpans* check, SkChunkAlloc* allocator);
36     bool apply();
37     bool contains(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart,
38                   SkOpPtT* oppPtTEnd, bool flipped);
39     void debugShowCoincidence() const;
40     void detach(SkCoincidentSpans* );
41     void dump() const;
42     void expand();
43     bool extend(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart,
44         SkOpPtT* oppPtTEnd);
45     void fixUp(SkOpPtT* deleted, SkOpPtT* kept);
46     void mark();
47 
48 private:
49     bool addIfMissing(const SkOpPtT* over1s, const SkOpPtT* over1e,
50                       const SkOpPtT* over2s, const SkOpPtT* over2e, double tStart, double tEnd,
51                       SkOpPtT* coinPtTStart, const SkOpPtT* coinPtTEnd,
52                       SkOpPtT* oppPtTStart, const SkOpPtT* oppPtTEnd,
53                       SkChunkAlloc* allocator);
54     bool overlap(const SkOpPtT* coinStart1, const SkOpPtT* coinEnd1,
55                  const SkOpPtT* coinStart2, const SkOpPtT* coinEnd2,
56                  double* overS, double* overE) const;
57 
58     SkCoincidentSpans* fHead;
59 };
60 
61 #endif
62