//======================================================================== // // SplashXPathScanner.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) 2013, 2014 Thomas Freitag // Copyright (C) 2018 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 SPLASHXPATHSCANNER_H #define SPLASHXPATHSCANNER_H #include "SplashTypes.h" #include #ifdef USE_BOOST_HEADERS #include #endif #include class SplashXPath; class SplashBitmap; struct SplashIntersect { int y; int x0, x1; // intersection of segment with [y, y+1) int count; // EO/NZWN counter increment }; //------------------------------------------------------------------------ // SplashXPathScanner //------------------------------------------------------------------------ class SplashXPathScanner { public: // Create a new SplashXPathScanner object. must be sorted. SplashXPathScanner(SplashXPath *xPathA, bool eoA, int clipYMin, int clipYMax); ~SplashXPathScanner(); SplashXPathScanner(const SplashXPathScanner&) = delete; SplashXPathScanner& operator=(const SplashXPathScanner&) = delete; // Return the path's bounding box. void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA) { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; } // Return the path's bounding box. void getBBoxAA(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA); // Returns true if at least part of the path was outside the // clipYMin/clipYMax bounds passed to the constructor. bool hasPartialClip() { return partialClip; } // Return the min/max x values for the span at . void getSpanBounds(int y, int *spanXMin, int *spanXMax); // Returns true if (,) is inside the path. bool test(int x, int y); // Returns true if the entire span ([,], ) is inside the // path. bool testSpan(int x0, int x1, int y); // Renders one anti-aliased line into . Returns the min and // max x coordinates with non-zero pixels in and . void renderAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y, bool adjustVertLine = false); // Clips an anti-aliased line by setting pixels to zero. On entry, // all non-zero pixels are between and . This function // will update and . void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y); private: void computeIntersections(); bool addIntersection(double segYMin, double segYMax, int y, int x0, int x1, int count); SplashXPath *xPath; bool eo; int xMin, yMin, xMax, yMax; bool partialClip; #ifdef USE_BOOST_HEADERS typedef boost::container::small_vector IntersectionLine; #else typedef std::vector IntersectionLine; #endif std::vector allIntersections; friend class SplashXPathScanIterator; }; class SplashXPathScanIterator { public: SplashXPathScanIterator(const SplashXPathScanner &scanner, int y); // Returns the next span inside the path at the current y position // Returns false if there are no more spans. bool getNextSpan(int *x0, int *x1); private: #ifdef USE_BOOST_HEADERS typedef boost::container::small_vector IntersectionLine; #else typedef std::vector IntersectionLine; #endif const IntersectionLine &line; size_t interIdx; // current index into int interCount; // current EO/NZWN counter const bool eo; }; #endif