/**************************************************************************\ * * Copyright (c) 1999 Microsoft Corporation * * Module Name: * * mesh.hxx * * Abstract: * * Spline mesh declarations * * Revision History: * * 01/18/1999 davidx * Created it. * \**************************************************************************/ #ifndef _MESH_HXX #define _MESH_HXX // // Represent a double-precision point // class PointX { public: double x; double y; static VOID convertToPOINT(const PointX* srcPts, POINT* dstPts, INT count) { for ( ; count--; srcPts++, dstPts++) { dstPts->x = ROUND2INT(srcPts->x); dstPts->y = ROUND2INT(srcPts->y); } } static double getSquareDist(const PointX& p1, const PointX& p2) { return (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y); } }; // // Represent a mesh configuration // class Mesh { friend class MeshIterator; public: Mesh(INT gridRows, INT gridCols); ~Mesh(); VOID initMesh(); INT getGridRows() { return gridRows; } INT getGridColumns() { return gridCols; } VOID setDstSize(INT width, INT height) { dstSize.cx = width; dstSize.cy = height; } POINT* getMeshRowBeziers( INT row, INT* pointCount ); POINT* getMeshColumnBeziers( INT col, INT* pointCount ); POINT* getMeshRowPoints( INT row, INT* pointCount ); VOID getMeshPoint( INT row, INT col, POINT* point ); BOOL setMeshPoint( INT row, INT col, INT x, INT y ); MeshIterator* getYIterator( INT srcWidth, INT dstWidth, INT ySteps ); MeshIterator* getXIterator( INT srcHeight, INT dstHeight, INT xSteps ); private: INT gridRows; // number of rows INT gridCols; // number of columns PointX* mesh; // mesh control points (in 0-1 logical space) SIZE dstSize; // current destination size // temporary working memory POINT* ptTemp; PointX* ptxTemp1; PointX* ptxTemp2; INT indexOf(INT row, INT col = 0) { return row*gridCols + col; } VOID allocTempPoints(); static VOID spline2Bezier(const PointX* srcPts, PointX* dstPts, INT count); BOOL verifyRow(INT row); BOOL verifyColumn(INT col); static BOOL verifyBezierX(PointX* pts); static BOOL verifyBezierY(PointX* pts); PointX* getMeshRowBeziers( INT row, INT* pointCount, double sx, double sy ); PointX* getMeshColumnBeziers( INT col, INT* pointCount, double sx, double sy ); }; // // Represent a flattened spline curve // class FlatCurve { public: FlatCurve(const PointX* pts, INT count); ~FlatCurve(); double getPos(double x); private: INT capacity; INT elementCount; INT allocIncr; PointX* pointArray; INT lastIndex; VOID addBezierFlatten(const PointX* pts); VOID addLine(const PointX& p1, const PointX& p2); }; // // Helper class to calculate the intersection of // vertical meshes with each scanline, or the intersection // of horizontal meshes with each pixel column. // class MeshIterator { public: MeshIterator(INT srcLen, INT dstLen, INT steps, INT maxCurves); ~MeshIterator(); VOID getOutPos(INT index, double* outpos); VOID addCurve(const PointX* pts, INT count); private: enum { MAXCURVES = 32 }; INT srcLen; INT dstLen; INT steps; INT maxCurves; INT curveCount; FlatCurve* curves[MAXCURVES]; double stops[MAXCURVES]; }; #endif // !_MESH_HXX