|  | /** | 
|  | * This file has no copyright assigned and is placed in the Public Domain. | 
|  | * This file is part of the w64 mingw-runtime package. | 
|  | * No warranty is given; refer to the file DISCLAIMER within this package. | 
|  | */ | 
|  | #ifndef _GDIPLUSPEN_H | 
|  | #define _GDIPLUSPEN_H | 
|  |  | 
|  | class Pen : public GdiplusBase { | 
|  | public: | 
|  | friend class GraphicsPath; | 
|  | friend class Graphics; | 
|  | Pen(const Color &color,REAL width = 1.0f) { | 
|  | Unit unit = UnitWorld; | 
|  | nativePen = NULL; | 
|  | lastResult = DllExports::GdipCreatePen1(color.GetValue(),width,unit,&nativePen); | 
|  | } | 
|  | Pen(const Brush *brush,REAL width = 1.0f) { | 
|  | Unit unit = UnitWorld; | 
|  | nativePen = NULL; | 
|  | lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,width,unit,&nativePen); | 
|  | } | 
|  | ~Pen() { DllExports::GdipDeletePen(nativePen); } | 
|  | Pen *Clone() const { | 
|  | GpPen *clonePen = NULL; | 
|  | lastResult = DllExports::GdipClonePen(nativePen,&clonePen); | 
|  | return new Pen(clonePen,lastResult); | 
|  | } | 
|  | Status SetWidth(REAL width) { return SetStatus(DllExports::GdipSetPenWidth(nativePen,width)); } | 
|  | REAL GetWidth() const { | 
|  | REAL width; | 
|  | SetStatus(DllExports::GdipGetPenWidth(nativePen,&width)); | 
|  | return width; | 
|  | } | 
|  | Status SetLineCap(LineCap startCap,LineCap endCap,DashCap dashCap) { return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,startCap,endCap,dashCap)); } | 
|  | Status SetStartCap(LineCap startCap) { return SetStatus(DllExports::GdipSetPenStartCap(nativePen,startCap)); } | 
|  | Status SetEndCap(LineCap endCap) { return SetStatus(DllExports::GdipSetPenEndCap(nativePen,endCap)); } | 
|  | Status SetDashCap(DashCap dashCap) { return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,dashCap)); } | 
|  | LineCap GetStartCap() const { | 
|  | LineCap startCap; | 
|  | SetStatus(DllExports::GdipGetPenStartCap(nativePen,&startCap)); | 
|  | return startCap; | 
|  | } | 
|  | LineCap GetEndCap() const { | 
|  | LineCap endCap; | 
|  | SetStatus(DllExports::GdipGetPenEndCap(nativePen,&endCap)); | 
|  | return endCap; | 
|  | } | 
|  | DashCap GetDashCap() const { | 
|  | DashCap dashCap; | 
|  | SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,&dashCap)); | 
|  | return dashCap; | 
|  | } | 
|  | Status SetLineJoin(LineJoin lineJoin) { return SetStatus(DllExports::GdipSetPenLineJoin(nativePen,lineJoin)); } | 
|  | LineJoin GetLineJoin() const { | 
|  | LineJoin lineJoin; | 
|  | SetStatus(DllExports::GdipGetPenLineJoin(nativePen,&lineJoin)); | 
|  | return lineJoin; | 
|  | } | 
|  | Status SetCustomStartCap(const CustomLineCap *customCap) { | 
|  | GpCustomLineCap *nativeCap = NULL; | 
|  | if(customCap) nativeCap = customCap->nativeCap; | 
|  | return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen,nativeCap)); | 
|  | } | 
|  | Status GetCustomStartCap(CustomLineCap *customCap) const { | 
|  | if(!customCap) return SetStatus(InvalidParameter); | 
|  | return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen,&(customCap->nativeCap))); | 
|  | } | 
|  | Status SetCustomEndCap(const CustomLineCap *customCap) { | 
|  | GpCustomLineCap *nativeCap = NULL; | 
|  | if(customCap) nativeCap = customCap->nativeCap; | 
|  | return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen,nativeCap)); | 
|  | } | 
|  | Status GetCustomEndCap(CustomLineCap *customCap) const { | 
|  | if(!customCap) return SetStatus(InvalidParameter); | 
|  | return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen,&(customCap->nativeCap))); | 
|  | } | 
|  | Status SetMiterLimit(REAL miterLimit) { return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen,miterLimit)); } | 
|  | REAL GetMiterLimit() const { | 
|  | REAL miterLimit; | 
|  | SetStatus(DllExports::GdipGetPenMiterLimit(nativePen,&miterLimit)); | 
|  | return miterLimit; | 
|  | } | 
|  | Status SetAlignment(PenAlignment penAlignment) { return SetStatus(DllExports::GdipSetPenMode(nativePen,penAlignment)); } | 
|  | PenAlignment GetAlignment() const { | 
|  | PenAlignment penAlignment; | 
|  | SetStatus(DllExports::GdipGetPenMode(nativePen,&penAlignment)); | 
|  | return penAlignment; | 
|  | } | 
|  | Status SetTransform(const Matrix *matrix) { return SetStatus(DllExports::GdipSetPenTransform(nativePen,matrix->nativeMatrix)); } | 
|  | Status GetTransform(Matrix *matrix) const { return SetStatus(DllExports::GdipGetPenTransform(nativePen,matrix->nativeMatrix)); } | 
|  | Status ResetTransform() { return SetStatus(DllExports::GdipResetPenTransform(nativePen)); } | 
|  | Status MultiplyTransform(const Matrix *matrix,MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,matrix->nativeMatrix,order)); } | 
|  | Status TranslateTransform(REAL dx,REAL dy,MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,dx,dy,order)); } | 
|  | Status ScaleTransform(REAL sx,REAL sy,MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipScalePenTransform(nativePen,sx,sy,order)); } | 
|  | Status RotateTransform(REAL angle,MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipRotatePenTransform(nativePen,angle,order)); } | 
|  | PenType GetPenType() const { | 
|  | PenType type; | 
|  | SetStatus(DllExports::GdipGetPenFillType(nativePen,&type)); | 
|  | return type; | 
|  | } | 
|  | Status SetColor(const Color &color) { return SetStatus(DllExports::GdipSetPenColor(nativePen,color.GetValue())); } | 
|  | Status SetBrush(const Brush *brush) { return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,brush->nativeBrush)); } | 
|  | Status GetColor(Color *color) const { | 
|  | if(!color) return SetStatus(InvalidParameter); | 
|  | PenType type = GetPenType(); | 
|  | if(type!=PenTypeSolidColor) return WrongState; | 
|  | ARGB argb; | 
|  | SetStatus(DllExports::GdipGetPenColor(nativePen,&argb)); | 
|  | if(lastResult==Ok) color->SetValue(argb); | 
|  | return lastResult; | 
|  | } | 
|  | Brush *GetBrush() const { | 
|  | PenType type = GetPenType(); | 
|  | Brush *brush = NULL; | 
|  | switch(type) { | 
|  | case PenTypeSolidColor: | 
|  | brush = new SolidBrush(); | 
|  | break; | 
|  | case PenTypeHatchFill: | 
|  | brush = new HatchBrush(); | 
|  | break; | 
|  | case PenTypeTextureFill: | 
|  | brush = new TextureBrush(); | 
|  | break; | 
|  | case PenTypePathGradient: | 
|  | brush = new Brush(); | 
|  | break; | 
|  | case PenTypeLinearGradient: | 
|  | brush = new LinearGradientBrush(); | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | if(brush) { | 
|  | GpBrush *nativeBrush; | 
|  | SetStatus(DllExports::GdipGetPenBrushFill(nativePen,&nativeBrush)); | 
|  | brush->SetNativeBrush(nativeBrush); | 
|  | } | 
|  | return brush; | 
|  | } | 
|  | DashStyle GetDashStyle() const { | 
|  | DashStyle dashStyle; | 
|  | SetStatus(DllExports::GdipGetPenDashStyle(nativePen,&dashStyle)); | 
|  | return dashStyle; | 
|  | } | 
|  | Status SetDashStyle(DashStyle dashStyle) { return SetStatus(DllExports::GdipSetPenDashStyle(nativePen,dashStyle)); } | 
|  | REAL GetDashOffset() const { | 
|  | REAL dashOffset; | 
|  | SetStatus(DllExports::GdipGetPenDashOffset(nativePen,&dashOffset)); | 
|  | return dashOffset; | 
|  | } | 
|  | Status SetDashOffset(REAL dashOffset) { return SetStatus(DllExports::GdipSetPenDashOffset(nativePen,dashOffset)); } | 
|  | Status SetDashPattern(const REAL *dashArray,INT count) { return SetStatus(DllExports::GdipSetPenDashArray(nativePen,dashArray,count)); } | 
|  | INT GetDashPatternCount() const { | 
|  | INT count = 0; | 
|  | SetStatus(DllExports::GdipGetPenDashCount(nativePen,&count)); | 
|  | return count; | 
|  | } | 
|  | Status GetDashPattern(REAL *dashArray,INT count) const { | 
|  | if(!dashArray || count <= 0) return SetStatus(InvalidParameter); | 
|  | return SetStatus(DllExports::GdipGetPenDashArray(nativePen,dashArray,count)); | 
|  | } | 
|  | Status SetCompoundArray(const REAL *compoundArray,INT count) { return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen,compoundArray,count)); } | 
|  | INT GetCompoundArrayCount() const { | 
|  | INT count = 0; | 
|  | SetStatus(DllExports::GdipGetPenCompoundCount(nativePen,&count)); | 
|  | return count; | 
|  | } | 
|  | Status GetCompoundArray(REAL *compoundArray,INT count) const { | 
|  | if(!compoundArray || count <= 0) return SetStatus(InvalidParameter); | 
|  | return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,compoundArray,count)); | 
|  | } | 
|  | Status GetLastStatus() const { | 
|  | Status lastStatus = lastResult; | 
|  | lastResult = Ok; | 
|  | return lastStatus; | 
|  | } | 
|  | private: | 
|  | Pen(const Pen &); | 
|  | Pen &operator=(const Pen &); | 
|  | protected: | 
|  | Pen(GpPen *nativePen,Status status) { | 
|  | lastResult = status; | 
|  | SetNativePen(nativePen); | 
|  | } | 
|  | VOID SetNativePen(GpPen *nativePen) { this->nativePen = nativePen; } | 
|  | Status SetStatus(Status status) const { | 
|  | if(status!=Ok) return (lastResult = status); | 
|  | return status; | 
|  | } | 
|  | protected: | 
|  | GpPen *nativePen; | 
|  | mutable Status lastResult; | 
|  | }; | 
|  |  | 
|  | #endif |