/**************************************************************************\ * * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. * * Abstract: * * Pen API related declarations * * Revision History: * * 12/09/1998 andrewgo * Flesh out pen interfaces. * * 12/08/1998 andrewgo * Created it. * \**************************************************************************/ #ifndef _GDIPLUSPEN_H #define _GDIPLUSPEN_H //-------------------------------------------------------------------------- // class for various pen types //-------------------------------------------------------------------------- class Pen : public GdiplusBase { public: friend class GraphicsPath; friend class Graphics; // abstract Clone() can't be implemented here because it can't // new an object with pure virtual functions // Constructors Pen(IN const Color& color, IN REAL width = 1.0f) { Unit unit = UnitWorld; nativePen = NULL; lastResult = DllExports::GdipCreatePen1(color.GetValue(), width, unit, &nativePen); } Pen(IN const Brush* brush, IN 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(IN REAL width) { return SetStatus(DllExports::GdipSetPenWidth(nativePen, width)); } REAL GetWidth() const { REAL width; SetStatus(DllExports::GdipGetPenWidth(nativePen, &width)); return width; } // Set/get line caps: start, end, and dash // Line cap and join APIs by using LineCap and LineJoin enums. Status SetLineCap(IN LineCap startCap, IN LineCap endCap, IN LineCap dashCap) { return SetStatus(DllExports::GdipSetPenLineCap(nativePen, startCap, endCap, dashCap)); } Status SetStartCap(IN LineCap startCap) { return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap)); } Status SetEndCap(IN LineCap endCap) { return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap)); } Status SetDashCap(IN LineCap dashCap) { return SetStatus(DllExports::GdipSetPenDashCap(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; } LineCap GetDashCap() const { LineCap dashCap; SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap)); return dashCap; } // Set/get line join Status SetLineJoin(IN LineJoin lineJoin) { return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin)); } LineJoin GetLineJoin() const { LineJoin lineJoin; SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin)); return lineJoin; } Status SetCustomStartCap(IN const CustomLineCap* customCap) { GpCustomLineCap* nativeCap = NULL; if(customCap) nativeCap = customCap->nativeCap; return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap)); } Status GetCustomStartCap(OUT CustomLineCap* customCap) const { if(!customCap) return SetStatus(InvalidParameter); return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap))); } Status SetCustomEndCap(IN const CustomLineCap* customCap) { GpCustomLineCap* nativeCap = NULL; if(customCap) nativeCap = customCap->nativeCap; return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap)); } Status GetCustomEndCap(OUT CustomLineCap* customCap) const { if(!customCap) return SetStatus(InvalidParameter); return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap))); } Status SetMiterLimit(IN REAL miterLimit) { return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit)); } REAL GetMiterLimit() const { REAL miterLimit; SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit)); return miterLimit; } // Set/get pen mode Status SetAlignment(IN PenAlignment penAlignment) { return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment)); } PenAlignment GetAlignment() const { PenAlignment penAlignment; SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment)); return penAlignment; } // Set/get pen transform Status SetTransform(IN const Matrix* matrix) { return SetStatus(DllExports::GdipSetPenTransform(nativePen, matrix->nativeMatrix)); } Status GetTransform(OUT Matrix* matrix) const { return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix)); } Status ResetTransform() { return SetStatus(DllExports::GdipResetPenTransform(nativePen)); } Status MultiplyTransform(IN Matrix* matrix, IN MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen, matrix->nativeMatrix, order)); } Status TranslateTransform(IN REAL dx, IN REAL dy, IN MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipTranslatePenTransform(nativePen, dx, dy, order)); } Status ScaleTransform(IN REAL sx, IN REAL sy, IN MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipScalePenTransform(nativePen, sx, sy, order)); } Status RotateTransform(IN REAL angle, IN MatrixOrder order = MatrixOrderPrepend) { return SetStatus(DllExports::GdipRotatePenTransform(nativePen, angle, order)); } PenType GetPenType() const { PenType type; SetStatus(DllExports::GdipGetPenFillType(nativePen, &type)); return type; } Status SetColor(IN const Color& color) { return SetStatus(DllExports::GdipSetPenColor(nativePen, color.GetValue())); } Status SetBrush(IN const Brush* brush) { return SetStatus(DllExports::GdipSetPenBrushFill(nativePen, brush->nativeBrush)); } Status GetColor(OUT Color* color) { if (color == NULL) { 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(IN DashStyle dashStyle) { return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle)); } REAL GetDashOffset() const { REAL dashOffset; SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset)); return dashOffset; } Status SetDashOffset(IN REAL dashOffset) { return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset)); } Status SetDashPattern(IN const REAL* dashArray, IN INT count) { return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray, count)); } INT GetDashPatternCount() const { INT count = 0; SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count)); return count; } Status GetDashPattern(OUT REAL* dashArray, IN INT count) const { if (dashArray == NULL || count <= 0) return SetStatus(InvalidParameter); return SetStatus(DllExports::GdipGetPenDashArray(nativePen, dashArray, count)); } Status SetCompoundArray(IN const REAL* compoundArray, IN INT count) { return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray, count)); } INT GetCompoundArrayCount() const { INT count = 0; SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count)); return count; } Status GetCompoundArray(OUT REAL* compoundArray, IN INT count) const { if (compoundArray == NULL || count <= 0) return SetStatus(InvalidParameter); return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen, compoundArray, count)); } Status GetLastStatus() const { Status lastStatus = lastResult; lastResult = Ok; return lastStatus; } protected: Pen(const Pen& pen) { pen; SetStatus(NotImplemented); SetNativePen(NULL); } Pen& operator=(const Pen& pen) { pen; SetStatus(NotImplemented); return *this; } 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); else return status; } protected: GpPen* nativePen; mutable Status lastResult; }; #endif