Path: blob/master/thirdparty/msdfgen/core/edge-segments.h
9912 views
1#pragma once23#include "Vector2.hpp"4#include "SignedDistance.hpp"5#include "EdgeColor.h"67namespace msdfgen {89// Parameters for iterative search of closest point on a cubic Bezier curve. Increase for higher precision.10#define MSDFGEN_CUBIC_SEARCH_STARTS 411#define MSDFGEN_CUBIC_SEARCH_STEPS 41213/// An abstract edge segment.14class EdgeSegment {1516public:17EdgeColor color;1819static EdgeSegment *create(Point2 p0, Point2 p1, EdgeColor edgeColor = WHITE);20static EdgeSegment *create(Point2 p0, Point2 p1, Point2 p2, EdgeColor edgeColor = WHITE);21static EdgeSegment *create(Point2 p0, Point2 p1, Point2 p2, Point2 p3, EdgeColor edgeColor = WHITE);2223EdgeSegment(EdgeColor edgeColor = WHITE) : color(edgeColor) { }24virtual ~EdgeSegment() { }25/// Creates a copy of the edge segment.26virtual EdgeSegment *clone() const = 0;27/// Returns the numeric code of the edge segment's type.28virtual int type() const = 0;29/// Returns the array of control points.30virtual const Point2 *controlPoints() const = 0;31/// Returns the point on the edge specified by the parameter (between 0 and 1).32virtual Point2 point(double param) const = 0;33/// Returns the direction the edge has at the point specified by the parameter.34virtual Vector2 direction(double param) const = 0;35/// Returns the change of direction (second derivative) at the point specified by the parameter.36virtual Vector2 directionChange(double param) const = 0;37/// Returns the minimum signed distance between origin and the edge.38virtual SignedDistance signedDistance(Point2 origin, double ¶m) const = 0;39/// Converts a previously retrieved signed distance from origin to perpendicular distance.40virtual void distanceToPerpendicularDistance(SignedDistance &distance, Point2 origin, double param) const;41/// Outputs a list of (at most three) intersections (their X coordinates) with an infinite horizontal scanline at y and returns how many there are.42virtual int scanlineIntersections(double x[3], int dy[3], double y) const = 0;43/// Adjusts the bounding box to fit the edge segment.44virtual void bound(double &l, double &b, double &r, double &t) const = 0;4546/// Reverses the edge (swaps its start point and end point).47virtual void reverse() = 0;48/// Moves the start point of the edge segment.49virtual void moveStartPoint(Point2 to) = 0;50/// Moves the end point of the edge segment.51virtual void moveEndPoint(Point2 to) = 0;52/// Splits the edge segments into thirds which together represent the original edge.53virtual void splitInThirds(EdgeSegment *&part0, EdgeSegment *&part1, EdgeSegment *&part2) const = 0;5455};5657/// A line segment.58class LinearSegment : public EdgeSegment {5960public:61enum EdgeType {62EDGE_TYPE = 163};6465Point2 p[2];6667LinearSegment(Point2 p0, Point2 p1, EdgeColor edgeColor = WHITE);68LinearSegment *clone() const;69int type() const;70const Point2 *controlPoints() const;71Point2 point(double param) const;72Vector2 direction(double param) const;73Vector2 directionChange(double param) const;74double length() const;75SignedDistance signedDistance(Point2 origin, double ¶m) const;76int scanlineIntersections(double x[3], int dy[3], double y) const;77void bound(double &l, double &b, double &r, double &t) const;7879void reverse();80void moveStartPoint(Point2 to);81void moveEndPoint(Point2 to);82void splitInThirds(EdgeSegment *&part0, EdgeSegment *&part1, EdgeSegment *&part2) const;8384};8586/// A quadratic Bezier curve.87class QuadraticSegment : public EdgeSegment {8889public:90enum EdgeType {91EDGE_TYPE = 292};9394Point2 p[3];9596QuadraticSegment(Point2 p0, Point2 p1, Point2 p2, EdgeColor edgeColor = WHITE);97QuadraticSegment *clone() const;98int type() const;99const Point2 *controlPoints() const;100Point2 point(double param) const;101Vector2 direction(double param) const;102Vector2 directionChange(double param) const;103double length() const;104SignedDistance signedDistance(Point2 origin, double ¶m) const;105int scanlineIntersections(double x[3], int dy[3], double y) const;106void bound(double &l, double &b, double &r, double &t) const;107108void reverse();109void moveStartPoint(Point2 to);110void moveEndPoint(Point2 to);111void splitInThirds(EdgeSegment *&part0, EdgeSegment *&part1, EdgeSegment *&part2) const;112113EdgeSegment *convertToCubic() const;114115};116117/// A cubic Bezier curve.118class CubicSegment : public EdgeSegment {119120public:121enum EdgeType {122EDGE_TYPE = 3123};124125Point2 p[4];126127CubicSegment(Point2 p0, Point2 p1, Point2 p2, Point2 p3, EdgeColor edgeColor = WHITE);128CubicSegment *clone() const;129int type() const;130const Point2 *controlPoints() const;131Point2 point(double param) const;132Vector2 direction(double param) const;133Vector2 directionChange(double param) const;134SignedDistance signedDistance(Point2 origin, double ¶m) const;135int scanlineIntersections(double x[3], int dy[3], double y) const;136void bound(double &l, double &b, double &r, double &t) const;137138void reverse();139void moveStartPoint(Point2 to);140void moveEndPoint(Point2 to);141void splitInThirds(EdgeSegment *&part0, EdgeSegment *&part1, EdgeSegment *&part2) const;142143};144145}146147148