| /* |
| * gdipluspen.h |
| * |
| * GDI+ Pen class |
| * |
| * This file is part of the w32api package. |
| * |
| * Contributors: |
| * Created by Markus Koenig <markus@stber-koenig.de> |
| * |
| * THIS SOFTWARE IS NOT COPYRIGHTED |
| * |
| * This source code is offered for use in the public domain. You may |
| * use, modify or distribute it freely. |
| * |
| * This code is distributed in the hope that it will be useful but |
| * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY |
| * DISCLAIMED. This includes but is not limited to warranties of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * |
| */ |
| |
| #ifndef __GDIPLUS_PEN_H |
| #define __GDIPLUS_PEN_H |
| #if __GNUC__ >=3 |
| #pragma GCC system_header |
| #endif |
| |
| #ifndef __cplusplus |
| #error "A C++ compiler is required to include gdipluspen.h." |
| #endif |
| |
| class Pen: public GdiplusBase |
| { |
| friend class Graphics; |
| friend class GraphicsPath; |
| |
| public: |
| Pen(const Color& color, REAL width = 1.0f): |
| nativePen(NULL), lastStatus(Ok) |
| { |
| lastStatus = DllExports::GdipCreatePen1( |
| color.GetValue(), width, UnitWorld, |
| &nativePen); |
| } |
| Pen(const Brush *brush, REAL width = 1.0f): |
| nativePen(NULL), lastStatus(Ok) |
| { |
| lastStatus = DllExports::GdipCreatePen2( |
| brush ? brush->nativeBrush : NULL, |
| width, UnitWorld, &nativePen); |
| } |
| ~Pen() |
| { |
| DllExports::GdipDeletePen(nativePen); |
| } |
| Pen* Clone() const |
| { |
| GpPen *clonePen = NULL; |
| Status status = updateStatus(DllExports::GdipClonePen( |
| nativePen, &clonePen)); |
| if (status == Ok) { |
| Pen *result = new Pen(clonePen, lastStatus); |
| if (!result) { |
| DllExports::GdipDeletePen(clonePen); |
| lastStatus = OutOfMemory; |
| } |
| return result; |
| } else { |
| return NULL; |
| } |
| } |
| |
| PenAlignment GetAlignment() const |
| { |
| PenAlignment result = PenAlignmentCenter; |
| updateStatus(DllExports::GdipGetPenMode(nativePen, &result)); |
| return result; |
| } |
| // TODO: implement Pen::GetBrush() |
| //Brush *GetBrush() const |
| //{ |
| // // where is the pen brush allocated (static,member,new,other)? |
| // // GdipGetPenBrushFill just returns a GpBrush* |
| // updateStatus(NotImplemented); |
| // return NULL; |
| //} |
| Status GetColor(Color *color) const |
| { |
| return updateStatus(DllExports::GdipGetPenColor( |
| nativePen, color ? &color->Value : NULL)); |
| } |
| Status GetCompoundArray(REAL *compoundArray, INT count) const |
| { |
| return updateStatus(DllExports::GdipGetPenCompoundArray( |
| nativePen, compoundArray, count)); |
| } |
| INT GetCompoundArrayCount() const |
| { |
| INT result = 0; |
| updateStatus(DllExports::GdipGetPenCompoundCount( |
| nativePen, &result)); |
| return result; |
| } |
| Status GetCustomEndCap(CustomLineCap *customCap) const |
| { |
| if (!customCap) return lastStatus = InvalidParameter; |
| // FIXME: do we need to call GdipDeleteCustomLineCap first? |
| return updateStatus(DllExports::GdipGetPenCustomEndCap( |
| nativePen, &customCap->nativeCustomLineCap)); |
| } |
| Status GetCustomStartCap(CustomLineCap *customCap) const |
| { |
| if (!customCap) return lastStatus = InvalidParameter; |
| // FIXME: do we need to call GdipDeleteCustomLineCap first? |
| return updateStatus(DllExports::GdipGetPenCustomStartCap( |
| nativePen, &customCap->nativeCustomLineCap)); |
| } |
| DashCap GetDashCap() const |
| { |
| DashCap result = DashCapFlat; |
| updateStatus(DllExports::GdipGetPenDashCap197819( |
| nativePen, &result)); |
| return result; |
| } |
| REAL GetDashOffset() const |
| { |
| REAL result = 0.0f; |
| updateStatus(DllExports::GdipGetPenDashOffset( |
| nativePen, &result)); |
| return result; |
| } |
| Status GetDashPattern(REAL *dashArray, INT count) const |
| { |
| return updateStatus(DllExports::GdipGetPenDashArray( |
| nativePen, dashArray, count)); |
| } |
| INT GetDashPatternCount() const |
| { |
| INT result = 0; |
| updateStatus(DllExports::GdipGetPenDashCount( |
| nativePen, &result)); |
| return result; |
| } |
| DashStyle GetDashStyle() const |
| { |
| DashStyle result = DashStyleSolid; |
| updateStatus(DllExports::GdipGetPenDashStyle( |
| nativePen, &result)); |
| return result; |
| } |
| LineCap GetEndCap() const |
| { |
| LineCap result = LineCapFlat; |
| updateStatus(DllExports::GdipGetPenEndCap(nativePen, &result)); |
| return result; |
| } |
| Status GetLastStatus() const |
| { |
| Status result = lastStatus; |
| lastStatus = Ok; |
| return result; |
| } |
| LineJoin GetLineJoin() const |
| { |
| LineJoin result = LineJoinMiter; |
| updateStatus(DllExports::GdipGetPenLineJoin( |
| nativePen, &result)); |
| return result; |
| } |
| REAL GetMiterLimit() const |
| { |
| REAL result = 10.0f; |
| updateStatus(DllExports::GdipGetPenMiterLimit( |
| nativePen, &result)); |
| return result; |
| } |
| PenType GetPenType() const |
| { |
| PenType result = PenTypeUnknown; |
| updateStatus(DllExports::GdipGetPenFillType( |
| nativePen, &result)); |
| return result; |
| } |
| LineCap GetStartCap() const |
| { |
| LineCap result = LineCapFlat; |
| updateStatus(DllExports::GdipGetPenStartCap( |
| nativePen, &result)); |
| return result; |
| } |
| Status GetTransform(Matrix *matrix) const |
| { |
| return updateStatus(DllExports::GdipGetPenTransform( |
| nativePen, |
| matrix ? matrix->nativeMatrix : NULL)); |
| } |
| REAL GetWidth() const |
| { |
| REAL result = 1.0f; |
| updateStatus(DllExports::GdipGetPenWidth(nativePen, &result)); |
| return result; |
| } |
| Status MultiplyTransform(const Matrix *matrix, |
| MatrixOrder order = MatrixOrderPrepend) |
| { |
| return updateStatus(DllExports::GdipMultiplyPenTransform( |
| nativePen, |
| matrix ? matrix->nativeMatrix : NULL, order)); |
| } |
| Status ResetTransform() |
| { |
| return updateStatus(DllExports::GdipResetPenTransform( |
| nativePen)); |
| } |
| Status RotateTransform(REAL angle, |
| MatrixOrder order = MatrixOrderPrepend) |
| { |
| return updateStatus(DllExports::GdipRotatePenTransform( |
| nativePen, angle, order)); |
| } |
| Status ScaleTransform(REAL sx, REAL sy, |
| MatrixOrder order = MatrixOrderPrepend) |
| { |
| return updateStatus(DllExports::GdipScalePenTransform( |
| nativePen, sx, sy, order)); |
| } |
| Status SetAlignment(PenAlignment penAlignment) |
| { |
| return updateStatus(DllExports::GdipSetPenMode( |
| nativePen, penAlignment)); |
| } |
| Status SetBrush(const Brush *brush) |
| { |
| return updateStatus(DllExports::GdipSetPenBrushFill( |
| nativePen, brush ? brush->nativeBrush : NULL)); |
| } |
| Status SetColor(const Color& color) |
| { |
| return updateStatus(DllExports::GdipSetPenColor( |
| nativePen, color.GetValue())); |
| } |
| Status SetCompoundArray(const REAL *compoundArray, INT count) |
| { |
| return updateStatus(DllExports::GdipSetPenCompoundArray( |
| nativePen, compoundArray, count)); |
| } |
| Status SetCustomEndCap(const CustomLineCap *customCap) |
| { |
| return updateStatus(DllExports::GdipSetPenCustomEndCap( |
| nativePen, |
| customCap ? customCap->nativeCustomLineCap : NULL)); |
| } |
| Status SetCustomStartCap(const CustomLineCap *customCap) |
| { |
| return updateStatus(DllExports::GdipSetPenCustomStartCap( |
| nativePen, |
| customCap ? customCap->nativeCustomLineCap : NULL)); |
| } |
| Status SetDashCap(DashCap dashCap) |
| { |
| return updateStatus(DllExports::GdipSetPenDashCap197819( |
| nativePen, dashCap)); |
| } |
| Status SetDashOffset(REAL dashOffset) |
| { |
| return updateStatus(DllExports::GdipSetPenDashOffset( |
| nativePen, dashOffset)); |
| } |
| Status SetDashPattern(const REAL *dashArray, INT count) |
| { |
| return updateStatus(DllExports::GdipSetPenDashArray( |
| nativePen, dashArray, count)); |
| } |
| Status SetDashStyle(DashStyle dashStyle) |
| { |
| return updateStatus(DllExports::GdipSetPenDashStyle( |
| nativePen, dashStyle)); |
| } |
| Status SetEndCap(LineCap endCap) |
| { |
| return updateStatus(DllExports::GdipSetPenEndCap( |
| nativePen, endCap)); |
| } |
| Status SetLineCap(LineCap startCap, LineCap endCap, DashCap dashCap) |
| { |
| return updateStatus(DllExports::GdipSetPenLineCap197819( |
| nativePen, startCap, endCap, dashCap)); |
| } |
| Status SetLineJoin(LineJoin lineJoin) |
| { |
| return updateStatus(DllExports::GdipSetPenLineJoin( |
| nativePen, lineJoin)); |
| } |
| Status SetMiterLimit(REAL miterLimit) |
| { |
| return updateStatus(DllExports::GdipSetPenMiterLimit( |
| nativePen, miterLimit)); |
| } |
| Status SetStartCap(LineCap startCap) |
| { |
| return updateStatus(DllExports::GdipSetPenStartCap( |
| nativePen, startCap)); |
| } |
| Status SetTransform(const Matrix *matrix) |
| { |
| return updateStatus(DllExports::GdipSetPenTransform( |
| nativePen, |
| matrix ? matrix->nativeMatrix : NULL)); |
| } |
| Status SetWidth(REAL width) |
| { |
| return updateStatus(DllExports::GdipSetPenWidth( |
| nativePen, width)); |
| } |
| Status TranslateTransform(REAL dx, REAL dy, |
| MatrixOrder order = MatrixOrderPrepend) |
| { |
| return updateStatus(DllExports::GdipTranslatePenTransform( |
| nativePen, dx, dy, order)); |
| } |
| |
| private: |
| Pen(GpPen *pen, Status status): nativePen(pen), lastStatus(status) {} |
| Pen(const Pen& pen); |
| Pen& operator=(const Pen&); |
| |
| Status updateStatus(Status newStatus) const |
| { |
| if (newStatus != Ok) lastStatus = newStatus; |
| return newStatus; |
| } |
| |
| GpPen *nativePen; |
| mutable Status lastStatus; |
| }; |
| |
| #endif /* __GDIPLUS_PEN_H */ |