1//========================================================================
2//
3// SplashPath.h
4//
5//========================================================================
6
7//========================================================================
8//
9// Modified under the Poppler project - http://poppler.freedesktop.org
10//
11// All changes made under the Poppler project to this file are licensed
12// under GPL version 2 or later
13//
14// Copyright (C) 2018, 2019, 2021 Albert Astals Cid <aacid@kde.org>
15// Copyright (C) 2018 Stefan BrĂ¼ns <stefan.bruens@rwth-aachen.de>
16//
17// To see a description of the changes please see the Changelog file that
18// came with your tarball or type make ChangeLog if you are building from git
19//
20//========================================================================
21
22#ifndef SPLASHPATH_H
23#define SPLASHPATH_H
24
25#include "SplashTypes.h"
26#include "poppler_private_export.h"
27
28//------------------------------------------------------------------------
29// SplashPathPoint
30//------------------------------------------------------------------------
31
32struct SplashPathPoint
33{
34 SplashCoord x, y;
35};
36
37//------------------------------------------------------------------------
38// SplashPath.flags
39//------------------------------------------------------------------------
40
41// first point on each subpath sets this flag
42#define splashPathFirst 0x01
43
44// last point on each subpath sets this flag
45#define splashPathLast 0x02
46
47// if the subpath is closed, its first and last points must be
48// identical, and must set this flag
49#define splashPathClosed 0x04
50
51// curve control points set this flag
52#define splashPathCurve 0x08
53
54//------------------------------------------------------------------------
55// SplashPathHint
56//------------------------------------------------------------------------
57
58struct SplashPathHint
59{
60 int ctrl0, ctrl1;
61 int firstPt, lastPt;
62};
63
64//------------------------------------------------------------------------
65// SplashPath
66//------------------------------------------------------------------------
67
68class POPPLER_PRIVATE_EXPORT SplashPath
69{
70public:
71 // Create an empty path.
72 SplashPath();
73 ~SplashPath();
74
75 SplashPath(const SplashPath &) = delete;
76 SplashPath &operator=(const SplashPath &) = delete;
77 SplashPath(SplashPath &&path) noexcept;
78
79 // Append <path> to <this>.
80 void append(SplashPath *path);
81
82 // Start a new subpath.
83 SplashError moveTo(SplashCoord x, SplashCoord y);
84
85 // Add a line segment to the last subpath.
86 SplashError lineTo(SplashCoord x, SplashCoord y);
87
88 // Add a third-order (cubic) Bezier curve segment to the last
89 // subpath.
90 SplashError curveTo(SplashCoord x1, SplashCoord y1, SplashCoord x2, SplashCoord y2, SplashCoord x3, SplashCoord y3);
91
92 // Close the last subpath, adding a line segment if necessary. If
93 // <force> is true, this adds a line segment even if the current
94 // point is equal to the first point in the subpath.
95 SplashError close(bool force = false);
96
97 // Add a stroke adjustment hint. The controlling segments are
98 // <ctrl0> and <ctrl1> (where segments are identified by their first
99 // point), and the points to be adjusted are <firstPt> .. <lastPt>.
100 void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt);
101
102 // Add (<dx>, <dy>) to every point on this path.
103 void offset(SplashCoord dx, SplashCoord dy);
104
105 // Get the points on the path.
106 int getLength() { return length; }
107 void getPoint(int i, double *x, double *y, unsigned char *f)
108 {
109 *x = pts[i].x;
110 *y = pts[i].y;
111 *f = flags[i];
112 }
113
114 // Get the current point.
115 bool getCurPt(SplashCoord *x, SplashCoord *y);
116
117 // Reserve space for at least n points
118 void reserve(int n);
119
120protected:
121 void grow(int nPts);
122 bool noCurrentPoint() { return curSubpath == length; }
123 bool onePointSubpath() { return curSubpath == length - 1; }
124 bool openSubpath() { return curSubpath < length - 1; }
125
126 SplashPathPoint *pts; // array of points
127 unsigned char *flags; // array of flags
128 int length, size; // length/size of the pts and flags arrays
129 int curSubpath; // index of first point in last subpath
130
131 SplashPathHint *hints; // list of hints
132 int hintsLength, hintsSize;
133
134 friend class SplashXPath;
135 friend class Splash;
136};
137
138#endif
139

source code of poppler/splash/SplashPath.h