1
2#pragma once
3
4#include <vector>
5
6namespace msdfgen {
7
8/// Fill rule dictates how intersection total is interpreted during rasterization.
9enum FillRule {
10 FILL_NONZERO,
11 FILL_ODD, // "even-odd"
12 FILL_POSITIVE,
13 FILL_NEGATIVE
14};
15
16/// Resolves the number of intersection into a binary fill value based on fill rule.
17bool interpretFillRule(int intersections, FillRule fillRule);
18
19/// Represents a horizontal scanline intersecting a shape.
20class Scanline {
21
22public:
23 /// An intersection with the scanline.
24 struct Intersection {
25 /// X coordinate.
26 double x;
27 /// Normalized Y direction of the oriented edge at the point of intersection.
28 int direction;
29 };
30
31 static double overlap(const Scanline &a, const Scanline &b, double xFrom, double xTo, FillRule fillRule);
32
33 Scanline();
34 /// Populates the intersection list.
35 void setIntersections(const std::vector<Intersection> &intersections);
36#ifdef MSDFGEN_USE_CPP11
37 void setIntersections(std::vector<Intersection> &&intersections);
38#endif
39 /// Returns the number of intersections left of x.
40 int countIntersections(double x) const;
41 /// Returns the total sign of intersections left of x.
42 int sumIntersections(double x) const;
43 /// Decides whether the scanline is filled at x based on fill rule.
44 bool filled(double x, FillRule fillRule) const;
45
46private:
47 std::vector<Intersection> intersections;
48 mutable int lastIndex;
49
50 void preprocess();
51 int moveTo(double x) const;
52
53};
54
55}
56