/*
* 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 */