xref: /aosp_15_r20/external/skia/modules/bentleyottmann/include/EventQueue.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker 
4*c8dee2aaSAndroid Build Coastguard Worker #ifndef EventQueue_DEFINED
5*c8dee2aaSAndroid Build Coastguard Worker #define EventQueue_DEFINED
6*c8dee2aaSAndroid Build Coastguard Worker 
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/EventQueueInterface.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/Point.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/Segment.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include <optional>
13*c8dee2aaSAndroid Build Coastguard Worker #include <set>
14*c8dee2aaSAndroid Build Coastguard Worker #include <tuple>
15*c8dee2aaSAndroid Build Coastguard Worker #include <variant>
16*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker namespace bentleyottmann {
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker struct Lower {
21*c8dee2aaSAndroid Build Coastguard Worker     // All Lowers are equal.
22*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator< (const Lower&, const Lower&) {
23*c8dee2aaSAndroid Build Coastguard Worker         return false;
24*c8dee2aaSAndroid Build Coastguard Worker     }
25*c8dee2aaSAndroid Build Coastguard Worker };
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker struct Upper {
28*c8dee2aaSAndroid Build Coastguard Worker     Segment s;
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     // Arbitrary comparison for queue uniqueness.
31*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator< (const Upper& u0, const Upper& u1) {
32*c8dee2aaSAndroid Build Coastguard Worker         return std::tie(u0.s.p0, u0.s.p1) < std::tie(u1.s.p0, u1.s.p1);
33*c8dee2aaSAndroid Build Coastguard Worker     }
34*c8dee2aaSAndroid Build Coastguard Worker };
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker struct Cross {
37*c8dee2aaSAndroid Build Coastguard Worker     Segment s0;
38*c8dee2aaSAndroid Build Coastguard Worker     Segment s1;
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     // Arbitrary comparison for queue uniqueness.
41*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator< (const Cross& c0, const Cross& c1) {
42*c8dee2aaSAndroid Build Coastguard Worker         return std::tie(c0.s0.p0, c0.s0.p1, c0.s1.p0, c0.s1.p1) <
43*c8dee2aaSAndroid Build Coastguard Worker                     std::tie(c1.s0.p0, c1.s0.p1, c1.s1.p0, c1.s1.p1);
44*c8dee2aaSAndroid Build Coastguard Worker     }
45*c8dee2aaSAndroid Build Coastguard Worker };
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker using EventType = std::variant<Lower, Cross, Upper>;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker struct Event {
50*c8dee2aaSAndroid Build Coastguard Worker     Point where;
51*c8dee2aaSAndroid Build Coastguard Worker     EventType type;
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     friend bool operator< (const Event& e0, const Event& e1) {
54*c8dee2aaSAndroid Build Coastguard Worker         return std::tie(e0.where, e0.type) < std::tie(e1.where, e1.type);
55*c8dee2aaSAndroid Build Coastguard Worker     }
56*c8dee2aaSAndroid Build Coastguard Worker };
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker class EventQueue : public EventQueueInterface {
59*c8dee2aaSAndroid Build Coastguard Worker public:
60*c8dee2aaSAndroid Build Coastguard Worker     // Queue ordered by Event where the point is the most important followed by type and then
61*c8dee2aaSAndroid Build Coastguard Worker     // contents of the event. The ordering of the contents of the event is arbitrary but need to
62*c8dee2aaSAndroid Build Coastguard Worker     // enforce uniqueness of the events in the queue.
63*c8dee2aaSAndroid Build Coastguard Worker     using Queue = std::set<Event>;
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker     static std::optional<EventQueue> Make(SkSpan<const Segment> segments);
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     EventQueue(Queue&& queue);
68*c8dee2aaSAndroid Build Coastguard Worker     EventQueue() = default;
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker     void addCrossing(Point crossingPoint, const Segment& s0, const Segment& s1) override;
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker     bool hasMoreEvents() const;
73*c8dee2aaSAndroid Build Coastguard Worker     void handleNextEventPoint(SweepLineInterface* handler);
74*c8dee2aaSAndroid Build Coastguard Worker     std::vector<Crossing> crossings();
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker private:
77*c8dee2aaSAndroid Build Coastguard Worker     friend class EventQueueTestingPeer;
78*c8dee2aaSAndroid Build Coastguard Worker     Point fLastEventPoint = Point::Smallest();
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     void add(const Event& e);
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     DeletionSegmentSet fDeletionSet;
83*c8dee2aaSAndroid Build Coastguard Worker     InsertionSegmentSet fInsertionSet;
84*c8dee2aaSAndroid Build Coastguard Worker     Queue fQueue;
85*c8dee2aaSAndroid Build Coastguard Worker     std::vector<Crossing> fCrossings;
86*c8dee2aaSAndroid Build Coastguard Worker };
87*c8dee2aaSAndroid Build Coastguard Worker }  // namespace bentleyottmann
88*c8dee2aaSAndroid Build Coastguard Worker #endif  // EventQueue_DEFINED
89