/**************************************************************************\ * * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. * * Module Name: * * path.hpp * * Abstract: * * Path related declarations * * Revision History: * * 12/06/1998 davidx * Created it. * \**************************************************************************/ #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->CountCount = 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 = 0.25f) { GpMatrix* nativeMatrix = NULL; if(matrix) nativeMatrix = matrix->nativeMatrix; return SetStatus(DllExports::GdipFlattenPath(nativePath, nativeMatrix, flatness)); } /** * 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)); } /** * 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 = 0.25f) { 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) { path; SetStatus(NotImplemented); SetNativePath(NULL); } GraphicsPath& operator=(const GraphicsPath& path) { path; SetStatus(NotImplemented); return *this; } 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; } 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 REAL* blendFactors, IN 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 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 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)); } protected: PathGradientBrush() { } }; #endif // !_GRAPHICSPATH_HPP