WindowsXP-SP1/windows/advcore/gdiplus/test/warpdemo/mesh.hxx
2020-09-30 16:53:49 +02:00

219 lines
4.0 KiB
C++

/**************************************************************************\
*
* 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