/**************************************************************************\ | |
* | |
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. | |
* | |
* Module Name: | |
* | |
* GdiplusPath.h | |
* | |
* Abstract: | |
* | |
* Path related declarations | |
* | |
\**************************************************************************/ | |
#ifndef _GDIPLUSPATH_H | |
#define _GDIPLUSPATH_H | |
class GraphicsPath : public GdiplusBase | |
{ | |
public: | |
friend class Graphics; | |
friend class Region; | |
friend class PathGradientBrush; | |
friend class GraphicsPathIterator; | |
friend class CustomLineCap; | |
// Path constructors | |
GraphicsPath(IN FillMode fillMode = FillModeAlternate) | |
{ | |
nativePath = NULL; | |
lastResult = DllExports::GdipCreatePath(fillMode, &nativePath); | |
} | |
GraphicsPath(IN const PointF* points, | |
IN const BYTE* types, | |
IN INT count, | |
IN FillMode fillMode = FillModeAlternate) | |
{ | |
nativePath = NULL; | |
lastResult = DllExports::GdipCreatePath2(points, | |
types, | |
count, | |
fillMode, | |
&nativePath); | |
} | |
GraphicsPath(IN const Point* points, | |
IN const BYTE* types, | |
IN INT count, | |
IN FillMode fillMode = FillModeAlternate) | |
{ | |
nativePath = NULL; | |
lastResult = DllExports::GdipCreatePath2I(points, | |
types, | |
count, | |
fillMode, | |
&nativePath); | |
} | |
~GraphicsPath() | |
{ | |
DllExports::GdipDeletePath(nativePath); | |
} | |
/** | |
* Make a copy of the current path object | |
*/ | |
GraphicsPath* Clone() const | |
{ | |
GpPath *clonepath = NULL; | |
SetStatus(DllExports::GdipClonePath(nativePath, &clonepath)); | |
return new GraphicsPath(clonepath); | |
} | |
/** | |
* Reset the path object to empty (and fill mode to FillModeAlternate) | |
*/ | |
Status Reset() | |
{ | |
return SetStatus(DllExports::GdipResetPath(nativePath)); | |
} | |
/** | |
* Get path fill mode information | |
*/ | |
FillMode GetFillMode() const | |
{ | |
FillMode fillmode = FillModeAlternate; | |
SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode)); | |
return fillmode; | |
} | |
/** | |
* Set path fill mode information | |
*/ | |
Status SetFillMode(IN FillMode fillmode) | |
{ | |
return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode)); | |
} | |
/** | |
* Set/get path data | |
*/ | |
Status GetPathData(OUT PathData* pathData) const | |
{ | |
if (pathData == NULL) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
INT count = GetPointCount(); | |
if ((count <= 0) || (pathData->Count>0 && pathData->Count<count)) | |
{ | |
pathData->Count = 0; | |
if (pathData->Points) | |
{ | |
delete pathData->Points; | |
pathData->Points = NULL; | |
} | |
if (pathData->Types) | |
{ | |
delete pathData->Types; | |
pathData->Types = NULL; | |
} | |
if (count <= 0) | |
{ | |
return lastResult; | |
} | |
} | |
if (pathData->Count == 0) | |
{ | |
pathData->Points = new PointF[count]; | |
if (pathData->Points == NULL) | |
{ | |
return SetStatus(OutOfMemory); | |
} | |
pathData->Types = new byte[count]; | |
if (pathData->Types == NULL) | |
{ | |
delete pathData->Points; | |
pathData->Points = NULL; | |
return SetStatus(OutOfMemory); | |
} | |
pathData->Count = count; | |
} | |
return SetStatus(DllExports::GdipGetPathData(nativePath, pathData)); | |
} | |
/** | |
* Start/end a subpath | |
*/ | |
Status StartFigure() | |
{ | |
return SetStatus(DllExports::GdipStartPathFigure(nativePath)); | |
} | |
Status CloseFigure() | |
{ | |
return SetStatus(DllExports::GdipClosePathFigure(nativePath)); | |
} | |
Status CloseAllFigures() | |
{ | |
return SetStatus(DllExports::GdipClosePathFigures(nativePath)); | |
} | |
Status SetMarker() | |
{ | |
return SetStatus(DllExports::GdipSetPathMarker(nativePath)); | |
} | |
Status ClearMarkers() | |
{ | |
return SetStatus(DllExports::GdipClearPathMarkers(nativePath)); | |
} | |
Status Reverse() | |
{ | |
return SetStatus(DllExports::GdipReversePath(nativePath)); | |
} | |
Status GetLastPoint(OUT PointF* lastPoint) const | |
{ | |
return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint)); | |
} | |
/** | |
* Add lines to the path object | |
*/ | |
// float version | |
Status AddLine(IN const PointF& pt1, | |
IN const PointF& pt2) | |
{ | |
return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y); | |
} | |
Status AddLine(IN REAL x1, | |
IN REAL y1, | |
IN REAL x2, | |
IN REAL y2) | |
{ | |
return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2)); | |
} | |
Status AddLines(IN const PointF* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count)); | |
} | |
// integer version | |
Status AddLine(IN const Point& pt1, | |
IN const Point& pt2) | |
{ | |
return AddLine(pt1.X, | |
pt1.Y, | |
pt2.X, | |
pt2.Y); | |
} | |
Status AddLine(IN INT x1, | |
IN INT y1, | |
IN INT x2, | |
IN INT y2) | |
{ | |
return SetStatus(DllExports::GdipAddPathLineI(nativePath, | |
x1, | |
y1, | |
x2, | |
y2)); | |
} | |
Status AddLines(IN const Point* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathLine2I(nativePath, | |
points, | |
count)); | |
} | |
/** | |
* Add an arc to the path object | |
*/ | |
// float version | |
Status AddArc(IN const RectF& rect, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return AddArc(rect.X, rect.Y, rect.Width, rect.Height, | |
startAngle, sweepAngle); | |
} | |
Status AddArc(IN REAL x, | |
IN REAL y, | |
IN REAL width, | |
IN REAL height, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height, | |
startAngle, sweepAngle)); | |
} | |
// integer version | |
Status AddArc(IN const Rect& rect, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return AddArc(rect.X, rect.Y, rect.Width, rect.Height, | |
startAngle, sweepAngle); | |
} | |
Status AddArc(IN INT x, | |
IN INT y, | |
IN INT width, | |
IN INT height, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return SetStatus(DllExports::GdipAddPathArcI(nativePath, | |
x, | |
y, | |
width, | |
height, | |
startAngle, | |
sweepAngle)); | |
} | |
/** | |
* Add Bezier curves to the path object | |
*/ | |
// float version | |
Status AddBezier(IN const PointF& pt1, | |
IN const PointF& pt2, | |
IN const PointF& pt3, | |
IN const PointF& pt4) | |
{ | |
return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, | |
pt4.Y); | |
} | |
Status AddBezier(IN REAL x1, | |
IN REAL y1, | |
IN REAL x2, | |
IN REAL y2, | |
IN REAL x3, | |
IN REAL y3, | |
IN REAL x4, | |
IN REAL y4) | |
{ | |
return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2, | |
x3, y3, x4, y4)); | |
} | |
Status AddBeziers(IN const PointF* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count)); | |
} | |
// integer version | |
Status AddBezier(IN const Point& pt1, | |
IN const Point& pt2, | |
IN const Point& pt3, | |
IN const Point& pt4) | |
{ | |
return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, | |
pt4.Y); | |
} | |
Status AddBezier(IN INT x1, | |
IN INT y1, | |
IN INT x2, | |
IN INT y2, | |
IN INT x3, | |
IN INT y3, | |
IN INT x4, | |
IN INT y4) | |
{ | |
return SetStatus(DllExports::GdipAddPathBezierI(nativePath, | |
x1, | |
y1, | |
x2, | |
y2, | |
x3, | |
y3, | |
x4, | |
y4)); | |
} | |
Status AddBeziers(IN const Point* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathBeziersI(nativePath, | |
points, | |
count)); | |
} | |
// float version | |
Status AddCurve(IN const PointF* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurve(nativePath, | |
points, | |
count)); | |
} | |
Status AddCurve(IN const PointF* points, | |
IN INT count, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurve2(nativePath, | |
points, | |
count, | |
tension)); | |
} | |
Status AddCurve(IN const PointF* points, | |
IN INT count, | |
IN INT offset, | |
IN INT numberOfSegments, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurve3(nativePath, | |
points, | |
count, | |
offset, | |
numberOfSegments, | |
tension)); | |
} | |
// integer version | |
Status AddCurve(IN const Point* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurveI(nativePath, | |
points, | |
count)); | |
} | |
Status AddCurve(IN const Point* points, | |
IN INT count, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurve2I(nativePath, | |
points, | |
count, | |
tension)); | |
} | |
Status AddCurve(IN const Point* points, | |
IN INT count, | |
IN INT offset, | |
IN INT numberOfSegments, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathCurve3I(nativePath, | |
points, | |
count, | |
offset, | |
numberOfSegments, | |
tension)); | |
} | |
// float version | |
Status AddClosedCurve(IN const PointF* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath, | |
points, | |
count)); | |
} | |
Status AddClosedCurve(IN const PointF* points, | |
IN INT count, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath, | |
points, | |
count, | |
tension)); | |
} | |
// integer version | |
Status AddClosedCurve(IN const Point* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath, | |
points, | |
count)); | |
} | |
Status AddClosedCurve(IN const Point* points, | |
IN INT count, | |
IN REAL tension) | |
{ | |
return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath, | |
points, | |
count, | |
tension)); | |
} | |
/** | |
* Add closed shapes to the path object | |
*/ | |
// float version | |
Status AddRectangle(IN const RectF& rect) | |
{ | |
return SetStatus(DllExports::GdipAddPathRectangle(nativePath, | |
rect.X, | |
rect.Y, | |
rect.Width, | |
rect.Height)); | |
} | |
Status AddRectangles(IN const RectF* rects, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathRectangles(nativePath, | |
rects, | |
count)); | |
} | |
// integer version | |
Status AddRectangle(IN const Rect& rect) | |
{ | |
return SetStatus(DllExports::GdipAddPathRectangleI(nativePath, | |
rect.X, | |
rect.Y, | |
rect.Width, | |
rect.Height)); | |
} | |
Status AddRectangles(IN const Rect* rects, INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath, | |
rects, | |
count)); | |
} | |
// float version | |
Status AddEllipse(IN const RectF& rect) | |
{ | |
return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height); | |
} | |
Status AddEllipse(IN REAL x, | |
IN REAL y, | |
IN REAL width, | |
IN REAL height) | |
{ | |
return SetStatus(DllExports::GdipAddPathEllipse(nativePath, | |
x, | |
y, | |
width, | |
height)); | |
} | |
// integer version | |
Status AddEllipse(IN const Rect& rect) | |
{ | |
return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height); | |
} | |
Status AddEllipse(IN INT x, | |
IN INT y, | |
IN INT width, | |
IN INT height) | |
{ | |
return SetStatus(DllExports::GdipAddPathEllipseI(nativePath, | |
x, | |
y, | |
width, | |
height)); | |
} | |
// float version | |
Status AddPie(IN const RectF& rect, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle, | |
sweepAngle); | |
} | |
Status AddPie(IN REAL x, | |
IN REAL y, | |
IN REAL width, | |
IN REAL height, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height, | |
startAngle, sweepAngle)); | |
} | |
// integer version | |
Status AddPie(IN const Rect& rect, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return AddPie(rect.X, | |
rect.Y, | |
rect.Width, | |
rect.Height, | |
startAngle, | |
sweepAngle); | |
} | |
Status AddPie(IN INT x, | |
IN INT y, | |
IN INT width, | |
IN INT height, | |
IN REAL startAngle, | |
IN REAL sweepAngle) | |
{ | |
return SetStatus(DllExports::GdipAddPathPieI(nativePath, | |
x, | |
y, | |
width, | |
height, | |
startAngle, | |
sweepAngle)); | |
} | |
// float version | |
Status AddPolygon(IN const PointF* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count)); | |
} | |
// integer version | |
Status AddPolygon(IN const Point* points, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count)); | |
} | |
Status AddPath(IN const GraphicsPath* addingPath, | |
IN BOOL connect) | |
{ | |
GpPath* nativePath2 = NULL; | |
if(addingPath) | |
nativePath2 = addingPath->nativePath; | |
return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect)); | |
} | |
// AddString point version | |
Status AddString( | |
IN const WCHAR *string, | |
IN INT length, | |
IN const FontFamily *family, | |
IN INT style, | |
IN REAL emSize, // In world units | |
IN const PointF &origin, | |
IN const StringFormat *format | |
) | |
{ | |
RectF rect(origin.X, origin.Y, 0.0f, 0.0f); | |
return SetStatus(DllExports::GdipAddPathString( | |
nativePath, | |
string, | |
length, | |
family ? family->nativeFamily : NULL, | |
style, | |
emSize, | |
&rect, | |
format ? format->nativeFormat : NULL | |
)); | |
} | |
// AddString rectangle version | |
Status AddString( | |
IN const WCHAR *string, | |
IN INT length, | |
IN const FontFamily *family, | |
IN INT style, | |
IN REAL emSize, // In world units | |
IN const RectF &layoutRect, | |
IN const StringFormat *format | |
) | |
{ | |
return SetStatus(DllExports::GdipAddPathString( | |
nativePath, | |
string, | |
length, | |
family ? family->nativeFamily : NULL, | |
style, | |
emSize, | |
&layoutRect, | |
format ? format->nativeFormat : NULL | |
)); | |
} | |
Status AddString( | |
IN const WCHAR *string, | |
IN INT length, | |
IN const FontFamily *family, | |
IN INT style, | |
IN REAL emSize, // In world units | |
IN const Point &origin, | |
IN const StringFormat *format | |
) | |
{ | |
Rect rect(origin.X, origin.Y, 0, 0); | |
return SetStatus(DllExports::GdipAddPathStringI( | |
nativePath, | |
string, | |
length, | |
family ? family->nativeFamily : NULL, | |
style, | |
emSize, | |
&rect, | |
format ? format->nativeFormat : NULL | |
)); | |
} | |
// AddString rectangle version | |
Status AddString( | |
IN const WCHAR *string, | |
IN INT length, | |
IN const FontFamily *family, | |
IN INT style, | |
IN REAL emSize, // In world units | |
IN const Rect &layoutRect, | |
IN const StringFormat *format | |
) | |
{ | |
return SetStatus(DllExports::GdipAddPathStringI( | |
nativePath, | |
string, | |
length, | |
family ? family->nativeFamily : NULL, | |
style, | |
emSize, | |
&layoutRect, | |
format ? format->nativeFormat : NULL | |
)); | |
} | |
/** | |
* Transforms the path object | |
*/ | |
Status Transform(IN const Matrix* matrix) | |
{ | |
if(matrix) | |
return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix)); | |
else | |
return Ok; // No need to transform. | |
} | |
/** | |
* Get the bounds of the path object with the given transform. | |
* This is not always the tightest bounds. | |
* | |
* Defined in GdiplusGraphics.h. | |
*/ | |
Status GetBounds(OUT RectF* bounds, | |
IN const Matrix* matrix = NULL, | |
IN const Pen* pen = NULL) const; | |
// integer version (defined in GdiplusGraphics.h) | |
Status GetBounds(OUT Rect* bounds, | |
IN const Matrix* matrix = NULL, | |
IN const Pen* pen = NULL) const; | |
/** | |
* Flatten the path object | |
* Once this is called, the resultant path is made of line segments and | |
* the original path information is lost. | |
* When matrix = NULL, the identity matrix is assumed. | |
*/ | |
Status Flatten(IN const Matrix* matrix = NULL, | |
IN REAL flatness = FlatnessDefault) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
{ | |
nativeMatrix = matrix->nativeMatrix; | |
} | |
return SetStatus(DllExports::GdipFlattenPath( | |
nativePath, | |
nativeMatrix, | |
flatness | |
)); | |
} | |
#ifdef DCR_USE_NEW_202903 | |
Status Widen( | |
IN const Pen* pen, | |
IN const Matrix* matrix = NULL, | |
IN REAL flatness = FlatnessDefault | |
) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
nativeMatrix = matrix->nativeMatrix; | |
return SetStatus(DllExports::GdipWidenPath( | |
nativePath, | |
pen->nativePen, | |
nativeMatrix, | |
flatness | |
)); | |
} | |
#else | |
/** | |
* Widen the path object | |
* When removeSelfIntersects is TRUE, this returns the widened path | |
* without self intersections. | |
* When it is FALSE, it returns the widened path with selfintersections. | |
* The latter is faster and is usually safficient for filling. | |
*/ | |
Status Widen(IN const Pen* pen, | |
IN const Matrix* matrix = NULL, | |
IN BOOL removeSelfIntersects = TRUE) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
nativeMatrix = matrix->nativeMatrix; | |
return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen, | |
0, 0, nativeMatrix, removeSelfIntersects)); | |
} | |
/** | |
* Widen the path object | |
* This is equivalent to Widen() method except that | |
* The widths of the widened path are larger than the given | |
* minimum resolutions in x and y coordinates after the transform. | |
* This is usefull when widening a path with the limited device resolutions. | |
*/ | |
Status Widen(IN const Pen* pen, | |
IN REAL minXres, | |
IN REAL minYres, | |
IN const Matrix* matrix = NULL, | |
IN BOOL removeSelfIntersects = TRUE) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
nativeMatrix = matrix->nativeMatrix; | |
return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen, | |
minXres, minYres, nativeMatrix, removeSelfIntersects)); | |
} | |
#endif // DCR_USE_NEW_202903 | |
Status Outline( | |
IN const Matrix *matrix = NULL, | |
IN REAL flatness = FlatnessDefault | |
) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
{ | |
nativeMatrix = matrix->nativeMatrix; | |
} | |
return SetStatus(DllExports::GdipWindingModeOutline( | |
nativePath, nativeMatrix, flatness | |
)); | |
} | |
/** | |
* Warp the path object | |
* Once this is called, the resultant path is made of line segments and | |
* the original path information is lost. | |
* When matrix = NULL, the identity matrix is assumed. | |
*/ | |
Status Warp(IN const PointF* destPoints, | |
IN INT count, | |
IN const RectF& srcRect, | |
IN const Matrix* matrix = NULL, | |
IN WarpMode warpMode = WarpModePerspective, | |
IN REAL flatness = FlatnessDefault) | |
{ | |
GpMatrix* nativeMatrix = NULL; | |
if(matrix) | |
nativeMatrix = matrix->nativeMatrix; | |
return SetStatus(DllExports::GdipWarpPath( | |
nativePath, | |
nativeMatrix, | |
destPoints, | |
count, | |
srcRect.X, | |
srcRect.Y, | |
srcRect.Width, | |
srcRect.Height, | |
warpMode, | |
flatness)); | |
} | |
/** | |
* Return the number of points in the current path | |
*/ | |
INT GetPointCount() const | |
{ | |
INT count = 0; | |
SetStatus(DllExports::GdipGetPointCount(nativePath, &count)); | |
return count; | |
} | |
/** | |
* Return the path point type information | |
*/ | |
Status GetPathTypes(OUT BYTE* types, | |
IN INT count) const | |
{ | |
return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count)); | |
} | |
/** | |
* Return the path point coordinate information | |
* @notes Should there be PathData that contains types[] and points[] | |
* for get & set purposes. | |
*/ | |
Status GetPathPoints(OUT PointF* points, | |
IN INT count) const | |
{ | |
return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count)); | |
} | |
// integer version | |
Status GetPathPoints(OUT Point* points, | |
IN INT count) const | |
{ | |
return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count)); | |
} | |
Status GetLastStatus() const | |
{ | |
Status lastStatus = lastResult; | |
lastResult = Ok; | |
return lastStatus; | |
} | |
/** | |
* Hit testing operations | |
* | |
* inline implementation is in gdiplusgraphics.h. | |
*/ | |
BOOL IsVisible(IN const PointF& point, | |
IN const Graphics* g = NULL) const | |
{ | |
return IsVisible(point.X, point.Y, g); | |
} | |
BOOL IsVisible(IN REAL x, | |
IN REAL y, | |
IN const Graphics* g = NULL) const; | |
BOOL IsVisible(IN const Point& point, | |
IN const Graphics* g = NULL) const | |
{ | |
return IsVisible(point.X, point.Y, g); | |
} | |
BOOL IsVisible(IN INT x, | |
IN INT y, | |
IN const Graphics* g = NULL) const; | |
BOOL IsOutlineVisible(IN const PointF& point, | |
IN const Pen* pen, | |
IN const Graphics* g = NULL) const | |
{ | |
return IsOutlineVisible(point.X, point.Y, pen, g); | |
} | |
BOOL IsOutlineVisible(IN REAL x, | |
IN REAL y, | |
IN const Pen* pen, | |
IN const Graphics* g = NULL) const; | |
BOOL IsOutlineVisible(IN const Point& point, | |
IN const Pen* pen, | |
IN const Graphics* g = NULL) const | |
{ | |
return IsOutlineVisible(point.X, point.Y, pen, g); | |
} | |
BOOL IsOutlineVisible(IN INT x, | |
IN INT y, | |
IN const Pen* pen, | |
IN const Graphics* g = NULL) const; | |
protected: | |
GraphicsPath(const GraphicsPath& path) | |
{ | |
GpPath *clonepath = NULL; | |
SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath)); | |
SetNativePath(clonepath); | |
} | |
#ifdef DCR_USE_NEW_250932 | |
private: | |
GraphicsPath& operator=(const GraphicsPath &); | |
protected: | |
#else | |
GraphicsPath& operator=(const GraphicsPath& path) | |
{ | |
path; | |
SetStatus(NotImplemented); | |
return *this; | |
} | |
#endif | |
GraphicsPath(GpPath* nativePath) | |
{ | |
lastResult = Ok; | |
SetNativePath(nativePath); | |
} | |
VOID SetNativePath(GpPath *nativePath) | |
{ | |
this->nativePath = nativePath; | |
} | |
Status SetStatus(Status status) const | |
{ | |
if (status != Ok) | |
return (lastResult = status); | |
else | |
return status; | |
} | |
protected: | |
GpPath* nativePath; | |
mutable Status lastResult; | |
}; | |
//-------------------------------------------------------------------------- | |
// GraphisPathIterator class | |
//-------------------------------------------------------------------------- | |
class GraphicsPathIterator : public GdiplusBase | |
{ | |
public: | |
GraphicsPathIterator(IN const GraphicsPath* path) | |
{ | |
GpPath* nativePath = NULL; | |
if(path) | |
nativePath = path->nativePath; | |
GpPathIterator *iter = NULL; | |
lastResult = DllExports::GdipCreatePathIter(&iter, nativePath); | |
SetNativeIterator(iter); | |
} | |
~GraphicsPathIterator() | |
{ | |
DllExports::GdipDeletePathIter(nativeIterator); | |
} | |
INT NextSubpath(OUT INT* startIndex, | |
OUT INT* endIndex, | |
OUT BOOL* isClosed) | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator, | |
&resultCount, startIndex, endIndex, isClosed)); | |
return resultCount; | |
} | |
INT NextSubpath(IN const GraphicsPath* path, | |
OUT BOOL* isClosed) | |
{ | |
GpPath* nativePath = NULL; | |
INT resultCount; | |
if(path) | |
nativePath= path->nativePath; | |
SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator, | |
&resultCount, nativePath, isClosed)); | |
return resultCount; | |
} | |
INT NextPathType(OUT BYTE* pathType, | |
OUT INT* startIndex, | |
OUT INT* endIndex) | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator, | |
&resultCount, pathType, startIndex, endIndex)); | |
return resultCount; | |
} | |
INT NextMarker(OUT INT* startIndex, | |
OUT INT* endIndex) | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator, | |
&resultCount, startIndex, endIndex)); | |
return resultCount; | |
} | |
INT NextMarker(IN const GraphicsPath* path) | |
{ | |
GpPath* nativePath = NULL; | |
INT resultCount; | |
if(path) | |
nativePath= path->nativePath; | |
SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator, | |
&resultCount, nativePath)); | |
return resultCount; | |
} | |
INT GetCount() const | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount)); | |
return resultCount; | |
} | |
INT GetSubpathCount() const | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount)); | |
return resultCount; | |
} | |
BOOL HasCurve() const | |
{ | |
BOOL hasCurve; | |
SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve)); | |
return hasCurve; | |
} | |
VOID Rewind() | |
{ | |
SetStatus(DllExports::GdipPathIterRewind(nativeIterator)); | |
} | |
INT Enumerate(OUT PointF *points, | |
OUT BYTE *types, | |
IN INT count) | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator, | |
&resultCount, points, types, count)); | |
return resultCount; | |
} | |
INT CopyData(OUT PointF* points, | |
OUT BYTE* types, | |
IN INT startIndex, | |
IN INT endIndex) | |
{ | |
INT resultCount; | |
SetStatus(DllExports::GdipPathIterCopyData(nativeIterator, | |
&resultCount, points, types, startIndex, endIndex)); | |
return resultCount; | |
} | |
Status GetLastStatus() const | |
{ | |
Status lastStatus = lastResult; | |
lastResult = Ok; | |
return lastStatus; | |
} | |
#ifdef DCR_USE_NEW_250932 | |
private: | |
GraphicsPathIterator(const GraphicsPathIterator &); | |
GraphicsPathIterator& operator=(const GraphicsPathIterator &); | |
#endif | |
protected: | |
VOID SetNativeIterator(GpPathIterator *nativeIterator) | |
{ | |
this->nativeIterator = nativeIterator; | |
} | |
Status SetStatus(Status status) const | |
{ | |
if (status != Ok) | |
return (lastResult = status); | |
else | |
return status; | |
} | |
protected: | |
GpPathIterator* nativeIterator; | |
mutable Status lastResult; | |
}; | |
//-------------------------------------------------------------------------- | |
// Represent polygon gradient brush object | |
//-------------------------------------------------------------------------- | |
class PathGradientBrush : public Brush | |
{ | |
public: | |
friend class Pen; | |
PathGradientBrush( | |
IN const PointF* points, | |
IN INT count, | |
IN WrapMode wrapMode = WrapModeClamp) | |
{ | |
GpPathGradient *brush = NULL; | |
lastResult = DllExports::GdipCreatePathGradient( | |
points, count, | |
wrapMode, &brush); | |
SetNativeBrush(brush); | |
} | |
PathGradientBrush( | |
IN const Point* points, | |
IN INT count, | |
IN WrapMode wrapMode = WrapModeClamp) | |
{ | |
GpPathGradient *brush = NULL; | |
lastResult = DllExports::GdipCreatePathGradientI( | |
points, count, | |
wrapMode, &brush); | |
SetNativeBrush(brush); | |
} | |
PathGradientBrush( | |
IN const GraphicsPath* path | |
) | |
{ | |
GpPathGradient *brush = NULL; | |
lastResult = DllExports::GdipCreatePathGradientFromPath( | |
path->nativePath, &brush); | |
SetNativeBrush(brush); | |
} | |
// Get/set colors | |
Status GetCenterColor(OUT Color* color) const | |
{ | |
ARGB argb; | |
if (color == NULL) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
SetStatus(DllExports::GdipGetPathGradientCenterColor( | |
(GpPathGradient*) nativeBrush, &argb)); | |
color->SetValue(argb); | |
return lastResult; | |
} | |
Status SetCenterColor(IN const Color& color) | |
{ | |
SetStatus(DllExports::GdipSetPathGradientCenterColor( | |
(GpPathGradient*) nativeBrush, | |
color.GetValue())); | |
return lastResult; | |
} | |
INT GetPointCount() const | |
{ | |
INT count; | |
SetStatus(DllExports::GdipGetPathGradientPointCount( | |
(GpPathGradient*) nativeBrush, &count)); | |
return count; | |
} | |
INT GetSurroundColorCount() const | |
{ | |
INT count; | |
SetStatus(DllExports::GdipGetPathGradientSurroundColorCount( | |
(GpPathGradient*) nativeBrush, &count)); | |
return count; | |
} | |
Status GetSurroundColors(OUT Color* colors, | |
IN OUT INT* count) const | |
{ | |
if(colors == NULL || count == NULL) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
INT count1; | |
SetStatus(DllExports::GdipGetPathGradientSurroundColorCount( | |
(GpPathGradient*) nativeBrush, &count1)); | |
if(lastResult != Ok) | |
return lastResult; | |
if((*count < count1) || (count1 <= 0)) | |
return SetStatus(InsufficientBuffer); | |
ARGB* argbs = (ARGB*) new ARGB[count1]; | |
if(argbs == NULL) | |
return SetStatus(OutOfMemory); | |
SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount( | |
(GpPathGradient*)nativeBrush, argbs, &count1)); | |
if(lastResult == Ok) | |
{ | |
for(INT i = 0; i < count1; i++) | |
{ | |
colors[i].SetValue(argbs[i]); | |
} | |
*count = count1; | |
} | |
delete [] argbs; | |
return lastResult; | |
} | |
Status SetSurroundColors(IN const Color* colors, | |
IN OUT INT* count) | |
{ | |
if(colors == NULL || count == NULL) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
INT count1 = GetPointCount(); | |
if((*count > count1) || (count1 <= 0)) | |
return SetStatus(InvalidParameter); | |
count1 = *count; | |
ARGB* argbs = (ARGB*) new ARGB[count1]; | |
if(argbs == NULL) | |
return SetStatus(OutOfMemory); | |
for(INT i = 0; i < count1; i++) | |
{ | |
argbs[i] = colors[i].GetValue(); | |
} | |
SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount( | |
(GpPathGradient*)nativeBrush, argbs, &count1)); | |
if(lastResult == Ok) | |
*count = count1; | |
delete [] argbs; | |
return lastResult; | |
} | |
Status GetGraphicsPath(OUT GraphicsPath* path) const | |
{ | |
if(path == NULL) | |
return SetStatus(InvalidParameter); | |
return SetStatus(DllExports::GdipGetPathGradientPath( | |
(GpPathGradient*)nativeBrush, path->nativePath)); | |
} | |
Status SetGraphicsPath(IN const GraphicsPath* path) | |
{ | |
if(path == NULL) | |
return SetStatus(InvalidParameter); | |
return SetStatus(DllExports::GdipSetPathGradientPath( | |
(GpPathGradient*)nativeBrush, path->nativePath)); | |
} | |
Status GetCenterPoint(OUT PointF* point) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientCenterPoint( | |
(GpPathGradient*)nativeBrush, | |
point)); | |
} | |
Status GetCenterPoint(OUT Point* point) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientCenterPointI( | |
(GpPathGradient*)nativeBrush, | |
point)); | |
} | |
Status SetCenterPoint(IN const PointF& point) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientCenterPoint( | |
(GpPathGradient*)nativeBrush, | |
&point)); | |
} | |
Status SetCenterPoint(IN const Point& point) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientCenterPointI( | |
(GpPathGradient*)nativeBrush, | |
&point)); | |
} | |
Status GetRectangle(OUT RectF* rect) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientRect( | |
(GpPathGradient*)nativeBrush, rect)); | |
} | |
Status GetRectangle(OUT Rect* rect) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientRectI( | |
(GpPathGradient*)nativeBrush, rect)); | |
} | |
// Gamma correction. | |
Status SetGammaCorrection(IN BOOL useGammaCorrection) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientGammaCorrection( | |
(GpPathGradient*)nativeBrush, useGammaCorrection)); | |
} | |
BOOL GetGammaCorrection() const | |
{ | |
BOOL useGammaCorrection; | |
SetStatus(DllExports::GdipGetPathGradientGammaCorrection( | |
(GpPathGradient*)nativeBrush, &useGammaCorrection)); | |
return useGammaCorrection; | |
} | |
INT GetBlendCount() const | |
{ | |
INT count = 0; | |
SetStatus(DllExports::GdipGetPathGradientBlendCount( | |
(GpPathGradient*) nativeBrush, &count)); | |
return count; | |
} | |
Status GetBlend(OUT REAL* blendFactors, | |
OUT REAL* blendPositions, | |
IN INT count) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientBlend( | |
(GpPathGradient*)nativeBrush, | |
blendFactors, blendPositions, count)); | |
} | |
Status SetBlend(IN const REAL* blendFactors, | |
IN const REAL* blendPositions, | |
IN INT count) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientBlend( | |
(GpPathGradient*)nativeBrush, | |
blendFactors, blendPositions, count)); | |
} | |
INT GetInterpolationColorCount() const | |
{ | |
INT count = 0; | |
SetStatus(DllExports::GdipGetPathGradientPresetBlendCount( | |
(GpPathGradient*) nativeBrush, &count)); | |
return count; | |
} | |
Status SetInterpolationColors(IN const Color* presetColors, | |
IN const REAL* blendPositions, | |
IN INT count) | |
{ | |
if ((count <= 0) || !presetColors) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
ARGB* argbs = (ARGB*) new ARGB[count]; | |
if(argbs) | |
{ | |
for(INT i = 0; i < count; i++) | |
{ | |
argbs[i] = presetColors[i].GetValue(); | |
} | |
Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend( | |
(GpPathGradient*) nativeBrush, | |
argbs, | |
blendPositions, | |
count)); | |
delete[] argbs; | |
return status; | |
} | |
else | |
{ | |
return SetStatus(OutOfMemory); | |
} | |
} | |
Status GetInterpolationColors(OUT Color* presetColors, | |
OUT REAL* blendPositions, | |
IN INT count) const | |
{ | |
if ((count <= 0) || !presetColors) | |
{ | |
return SetStatus(InvalidParameter); | |
} | |
ARGB* argbs = (ARGB*) new ARGB[count]; | |
if (!argbs) | |
{ | |
return SetStatus(OutOfMemory); | |
} | |
GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend( | |
(GpPathGradient*)nativeBrush, | |
argbs, | |
blendPositions, | |
count)); | |
for(INT i = 0; i < count; i++) | |
{ | |
presetColors[i] = Color(argbs[i]); | |
} | |
delete [] argbs; | |
return status; | |
} | |
Status SetBlendBellShape(IN REAL focus, | |
IN REAL scale = 1.0) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientSigmaBlend( | |
(GpPathGradient*)nativeBrush, focus, scale)); | |
} | |
#ifdef DCR_USE_NEW_145135 | |
Status SetBlendTriangularShape( | |
IN REAL focus, | |
IN REAL scale = 1.0 | |
) | |
#else | |
Status SetBlendTrianglarShape(IN REAL focus, | |
IN REAL scale = 1.0) | |
#endif | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientLinearBlend( | |
(GpPathGradient*)nativeBrush, focus, scale)); | |
} | |
/** | |
* Get/set brush transform | |
*/ | |
Status GetTransform(OUT Matrix *matrix) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientTransform( | |
(GpPathGradient*) nativeBrush, matrix->nativeMatrix)); | |
} | |
Status SetTransform(IN const Matrix* matrix) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientTransform( | |
(GpPathGradient*) nativeBrush, matrix->nativeMatrix)); | |
} | |
Status ResetTransform() | |
{ | |
return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush)); | |
} | |
Status MultiplyTransform(IN const Matrix* matrix, | |
IN MatrixOrder order = MatrixOrderPrepend) | |
{ | |
return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush, | |
matrix->nativeMatrix, | |
order)); | |
} | |
Status TranslateTransform(IN REAL dx, | |
IN REAL dy, | |
IN MatrixOrder order = MatrixOrderPrepend) | |
{ | |
return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush, | |
dx, dy, order)); | |
} | |
Status ScaleTransform(IN REAL sx, | |
IN REAL sy, | |
IN MatrixOrder order = MatrixOrderPrepend) | |
{ | |
return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush, | |
sx, sy, order)); | |
} | |
Status RotateTransform(IN REAL angle, | |
IN MatrixOrder order = MatrixOrderPrepend) | |
{ | |
return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush, | |
angle, order)); | |
} | |
/** | |
* Get/set brush focus scales | |
*/ | |
Status GetFocusScales(OUT REAL* xScale, | |
OUT REAL* yScale) const | |
{ | |
return SetStatus(DllExports::GdipGetPathGradientFocusScales( | |
(GpPathGradient*) nativeBrush, xScale, yScale)); | |
} | |
Status SetFocusScales(IN REAL xScale, | |
IN REAL yScale) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientFocusScales( | |
(GpPathGradient*) nativeBrush, xScale, yScale)); | |
} | |
/** | |
* Get/set brush wrapping mode | |
*/ | |
WrapMode GetWrapMode() const | |
{ | |
WrapMode wrapMode; | |
SetStatus(DllExports::GdipGetPathGradientWrapMode( | |
(GpPathGradient*) nativeBrush, &wrapMode)); | |
return wrapMode; | |
} | |
Status SetWrapMode(IN WrapMode wrapMode) | |
{ | |
return SetStatus(DllExports::GdipSetPathGradientWrapMode( | |
(GpPathGradient*) nativeBrush, wrapMode)); | |
} | |
#ifdef DCR_USE_NEW_250932 | |
private: | |
PathGradientBrush(const PathGradientBrush &); | |
PathGradientBrush& operator=(const PathGradientBrush &); | |
#endif | |
protected: | |
PathGradientBrush() | |
{ | |
} | |
}; | |
#endif // !_GRAPHICSPATH_HPP |