//======================================================================== // // SplashXPathScanner.h // //======================================================================== #ifndef SPLASHXPATHSCANNER_H #define SPLASHXPATHSCANNER_H #include #ifdef USE_GCC_PRAGMAS #pragma interface #endif #include "SplashTypes.h" class SplashXPath; class SplashBitmap; struct SplashIntersect; //------------------------------------------------------------------------ // SplashXPathScanner //------------------------------------------------------------------------ class SplashXPathScanner { public: // Create a new SplashXPathScanner object. must be sorted. SplashXPathScanner(SplashXPath *xPathA, GBool eoA, int clipYMin, int clipYMax); ~SplashXPathScanner(); // 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. GBool 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. GBool test(int x, int y); // Returns true if the entire span ([,], ) is inside the // path. GBool testSpan(int x0, int x1, int y); // Returns the next span inside the path at . If is // different than the previous call to getNextSpan, this returns the // first span at ; otherwise it returns the next span (relative // to the previous call to getNextSpan). Returns false if there are // no more spans at . GBool getNextSpan(int y, int *x0, int *x1); // 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); // 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(); void addIntersection(double segYMin, double segYMax, Guint segFlags, int y, int x0, int x1); SplashXPath *xPath; GBool eo; int xMin, yMin, xMax, yMax; GBool partialClip; SplashIntersect *allInter; // array of intersections int allInterLen; // number of intersections in int allInterSize; // size of the array int *inter; // indexes into for each y value int interY; // current y value - used by getNextSpan int interIdx; // current index into - used by // getNextSpan int interCount; // current EO/NZWN counter - used by // getNextSpan }; #endif