//======================================================================== // // SplashPath.h // //======================================================================== //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2018, 2019 Albert Astals Cid // Copyright (C) 2018 Stefan BrĂ¼ns // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #ifndef SPLASHPATH_H #define SPLASHPATH_H #include "SplashTypes.h" //------------------------------------------------------------------------ // SplashPathPoint //------------------------------------------------------------------------ struct SplashPathPoint { SplashCoord x, y; }; //------------------------------------------------------------------------ // SplashPath.flags //------------------------------------------------------------------------ // first point on each subpath sets this flag #define splashPathFirst 0x01 // last point on each subpath sets this flag #define splashPathLast 0x02 // if the subpath is closed, its first and last points must be // identical, and must set this flag #define splashPathClosed 0x04 // curve control points set this flag #define splashPathCurve 0x08 //------------------------------------------------------------------------ // SplashPathHint //------------------------------------------------------------------------ struct SplashPathHint { int ctrl0, ctrl1; int firstPt, lastPt; }; //------------------------------------------------------------------------ // SplashPath //------------------------------------------------------------------------ class SplashPath { public: // Create an empty path. SplashPath(); // Copy a path. SplashPath *copy() { return new SplashPath(this); } ~SplashPath(); SplashPath(const SplashPath &) = delete; SplashPath &operator=(const SplashPath &) = delete; SplashPath(SplashPath &&path) noexcept; // Append to . void append(SplashPath *path); // Start a new subpath. SplashError moveTo(SplashCoord x, SplashCoord y); // Add a line segment to the last subpath. SplashError lineTo(SplashCoord x, SplashCoord y); // Add a third-order (cubic) Bezier curve segment to the last // subpath. SplashError curveTo(SplashCoord x1, SplashCoord y1, SplashCoord x2, SplashCoord y2, SplashCoord x3, SplashCoord y3); // Close the last subpath, adding a line segment if necessary. If // is true, this adds a line segment even if the current // point is equal to the first point in the subpath. SplashError close(bool force = false); // Add a stroke adjustment hint. The controlling segments are // and (where segments are identified by their first // point), and the points to be adjusted are .. . void addStrokeAdjustHint(int ctrl0, int ctrl1, int firstPt, int lastPt); // Add (, ) to every point on this path. void offset(SplashCoord dx, SplashCoord dy); // Get the points on the path. int getLength() { return length; } void getPoint(int i, double *x, double *y, unsigned char *f) { *x = pts[i].x; *y = pts[i].y; *f = flags[i]; } // Get the current point. bool getCurPt(SplashCoord *x, SplashCoord *y); // Reserve space for at least n points void reserve(int n); protected: SplashPath(SplashPath *path); void grow(int nPts); bool noCurrentPoint() { return curSubpath == length; } bool onePointSubpath() { return curSubpath == length - 1; } bool openSubpath() { return curSubpath < length - 1; } SplashPathPoint *pts; // array of points unsigned char *flags; // array of flags int length, size; // length/size of the pts and flags arrays int curSubpath; // index of first point in last subpath SplashPathHint *hints; // list of hints int hintsLength, hintsSize; friend class SplashXPath; friend class Splash; }; #endif