Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2642 lines
90 KiB

/**************************************************************************\
*
* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
*
* Module Name:
*
* Graphics.hpp
*
* Abstract:
*
* Declarations for Graphics class
*
* Revision History:
*
* 12/04/1998 davidx
* Created it.
*
\**************************************************************************/
#ifndef _GDIPLUSGRAPHICS_H
#define _GDIPLUSGRAPHICS_H
/**
* Represent a graphics context
*/
class Graphics : public GdiplusBase
{
public:
friend class Region;
friend class GraphicsPath;
friend class Image;
friend class Bitmap;
friend class Metafile;
friend class Font;
friend class FontFamily;
friend class FontCollection;
friend class CachedBitmap;
// Get a graphics context from an existing Win32 HDC or HWND
static Graphics* FromHDC(IN HDC hdc)
{
return new Graphics(hdc);
}
static Graphics* FromHDC(IN HDC hdc,
IN HANDLE hdevice)
{
return new Graphics(hdc, hdevice);
}
static Graphics* FromHWND(IN HWND hwnd,
IN BOOL icm = FALSE)
{
return new Graphics(hwnd, icm);
}
static Graphics* FromImage(IN Image *image)
{
return new Graphics(image);
}
Graphics(IN HDC hdc)
{
GpGraphics *graphics = NULL;
lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
SetNativeGraphics(graphics);
}
Graphics(IN HDC hdc,
IN HANDLE hdevice)
{
GpGraphics *graphics = NULL;
lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
SetNativeGraphics(graphics);
}
Graphics(IN HWND hwnd,
IN BOOL icm = FALSE)
{
GpGraphics *graphics = NULL;
if (icm)
{
lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
}
else
{
lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
}
SetNativeGraphics(graphics);
}
Graphics(IN Image* image)
{
GpGraphics *graphics = NULL;
if (image != NULL)
{
lastResult = DllExports::GdipGetImageGraphicsContext(
image->nativeImage, &graphics);
}
SetNativeGraphics(graphics);
}
~Graphics()
{
DllExports::GdipDeleteGraphics(nativeGraphics);
}
VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
{
DllExports::GdipFlush(nativeGraphics, intention);
}
//------------------------------------------------------------------------
// Interop methods
//------------------------------------------------------------------------
// Locks the graphics until ReleaseDC is called
HDC GetHDC()
{
HDC hdc = NULL;
SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
return hdc;
}
VOID ReleaseHDC(IN HDC hdc)
{
SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
}
//------------------------------------------------------------------------
// Rendering modes
//------------------------------------------------------------------------
Status SetRenderingOrigin(IN INT x, IN INT y)
{
return SetStatus(
DllExports::GdipSetRenderingOrigin(
nativeGraphics, x, y
)
);
}
Status GetRenderingOrigin(OUT INT *x, OUT INT *y)
{
return SetStatus(
DllExports::GdipGetRenderingOrigin(
nativeGraphics, x, y
)
);
}
Status SetCompositingMode(IN CompositingMode compositingMode)
{
return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
compositingMode));
}
CompositingMode GetCompositingMode() const
{
CompositingMode mode;
SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
&mode));
return mode;
}
Status SetCompositingQuality(IN CompositingQuality compositingQuality)
{
return SetStatus(DllExports::GdipSetCompositingQuality(
nativeGraphics,
compositingQuality));
}
CompositingQuality GetCompositingQuality() const
{
CompositingQuality quality;
SetStatus(DllExports::GdipGetCompositingQuality(
nativeGraphics,
&quality));
return quality;
}
Status SetTextRenderingHint(IN TextRenderingHint newMode)
{
return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
newMode));
}
TextRenderingHint GetTextRenderingHint() const
{
TextRenderingHint hint;
SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
&hint));
return hint;
}
Status SetTextGammaValue(IN UINT gammaValue)
{
return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
gammaValue));
}
UINT GetTextGammaValue() const
{
UINT gammaValue;
SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
&gammaValue));
return gammaValue;
}
InterpolationMode GetInterpolationMode() const
{
InterpolationMode mode = InterpolationModeInvalid;
SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
&mode));
return mode;
}
Status SetInterpolationMode(IN InterpolationMode interpolationMode)
{
return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
interpolationMode));
}
SmoothingMode GetSmoothingMode() const
{
SmoothingMode smoothingMode = SmoothingModeInvalid;
SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
&smoothingMode));
return smoothingMode;
}
Status SetSmoothingMode(IN SmoothingMode smoothingMode)
{
return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
smoothingMode));
}
PixelOffsetMode GetPixelOffsetMode() const
{
PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
&pixelOffsetMode));
return pixelOffsetMode;
}
Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
{
return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
pixelOffsetMode));
}
//------------------------------------------------------------------------
// Manipulate the current world transform
//------------------------------------------------------------------------
Status SetTransform(IN const Matrix* matrix)
{
return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
matrix->nativeMatrix));
}
Status ResetTransform()
{
return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
}
Status MultiplyTransform(IN Matrix* matrix,
IN MatrixOrder order = MatrixOrderPrepend)
{
return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
matrix->nativeMatrix,
order));
}
Status TranslateTransform(IN REAL dx,
IN REAL dy,
IN MatrixOrder order = MatrixOrderPrepend)
{
return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
dx, dy, order));
}
Status ScaleTransform(IN REAL sx,
IN REAL sy,
IN MatrixOrder order = MatrixOrderPrepend)
{
return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
sx, sy, order));
}
Status RotateTransform(IN REAL angle,
IN MatrixOrder order = MatrixOrderPrepend)
{
return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
angle, order));
}
/**
* Return the current world transform
*/
Status GetTransform(OUT Matrix* matrix) const
{
return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
matrix->nativeMatrix));
}
/**
* Manipulate the current page transform
*/
Status SetPageUnit(IN Unit unit)
{
return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
unit));
}
Status SetPageScale(IN REAL scale)
{
return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
scale));
}
/**
* Retrieve the current page transform information
* notes @ these are atomic
*/
Unit GetPageUnit() const
{
Unit unit;
SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
return unit;
}
REAL GetPageScale() const
{
REAL scale;
SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
return scale;
}
REAL GetDpiX() const
{
REAL dpi;
SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
return dpi;
}
REAL GetDpiY() const
{
REAL dpi;
SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
return dpi;
}
/**
* Transform points in the current graphics context
*/
// float version
Status TransformPoints(IN CoordinateSpace destSpace,
IN CoordinateSpace srcSpace,
IN OUT PointF* pts,
IN INT count) const
{
return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
destSpace,
srcSpace,
pts,
count));
}
// integer version
Status TransformPoints(IN CoordinateSpace destSpace,
IN CoordinateSpace srcSpace,
IN OUT Point* pts,
IN INT count) const
{
return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
destSpace,
srcSpace,
pts,
count));
}
//------------------------------------------------------------------------
// GetNearestColor (for <= 8bpp surfaces)
// Note: alpha is ignored
//------------------------------------------------------------------------
Status GetNearestColor(IN OUT Color* color) const
{
if (color == NULL)
{
return SetStatus(InvalidParameter);
}
ARGB argb = color->GetValue();
Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
color->SetValue(argb);
return status;
}
/**
* Vector drawing methods
*
* @notes Do we need a set of methods that take
* integer coordinate parameters?
*/
// float version
Status DrawLine(IN const Pen* pen,
IN REAL x1,
IN REAL y1,
IN REAL x2,
IN REAL y2)
{
return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
pen->nativePen, x1, y1, x2,
y2));
}
Status DrawLine(IN const Pen* pen,
IN const PointF& pt1,
IN const PointF& pt2)
{
return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
}
Status DrawLines(IN const Pen* pen,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
pen->nativePen,
points, count));
}
// int version
Status DrawLine(IN const Pen* pen,
IN INT x1,
IN INT y1,
IN INT x2,
IN INT y2)
{
return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
pen->nativePen,
x1,
y1,
x2,
y2));
}
Status DrawLine(IN const Pen* pen,
IN const Point& pt1,
IN const Point& pt2)
{
return DrawLine(pen,
pt1.X,
pt1.Y,
pt2.X,
pt2.Y);
}
Status DrawLines(IN const Pen* pen,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
pen->nativePen,
points,
count));
}
// float version
Status DrawArc(IN const Pen* pen,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
pen->nativePen,
x,
y,
width,
height,
startAngle,
sweepAngle));
}
Status DrawArc(IN const Pen* pen,
IN const RectF& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
startAngle, sweepAngle);
}
// int version
Status DrawArc(IN const Pen* pen,
IN INT x,
IN INT y,
IN INT width,
IN INT height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
pen->nativePen,
x,
y,
width,
height,
startAngle,
sweepAngle));
}
Status DrawArc(IN const Pen* pen,
IN const Rect& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return DrawArc(pen,
rect.X,
rect.Y,
rect.Width,
rect.Height,
startAngle,
sweepAngle);
}
// float version
Status DrawBezier(IN const Pen* pen,
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::GdipDrawBezier(nativeGraphics,
pen->nativePen, x1, y1,
x2, y2, x3, y3, x4, y4));
}
Status DrawBezier(IN const Pen* pen,
IN const PointF& pt1,
IN const PointF& pt2,
IN const PointF& pt3,
IN const PointF& pt4)
{
return DrawBezier(pen,
pt1.X,
pt1.Y,
pt2.X,
pt2.Y,
pt3.X,
pt3.Y,
pt4.X,
pt4.Y);
}
Status DrawBeziers(IN const Pen* pen,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
pen->nativePen,
points,
count));
}
// int version
Status DrawBezier(IN const Pen* pen,
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::GdipDrawBezierI(nativeGraphics,
pen->nativePen,
x1,
y1,
x2,
y2,
x3,
y3,
x4,
y4));
}
Status DrawBezier(IN const Pen* pen,
IN const Point& pt1,
IN const Point& pt2,
IN const Point& pt3,
IN const Point& pt4)
{
return DrawBezier(pen,
pt1.X,
pt1.Y,
pt2.X,
pt2.Y,
pt3.X,
pt3.Y,
pt4.X,
pt4.Y);
}
Status DrawBeziers(IN const Pen* pen,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
pen->nativePen,
points,
count));
}
// float version
Status DrawRectangle(IN const Pen* pen,
IN const RectF& rect)
{
return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
}
Status DrawRectangle(IN const Pen* pen,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height)
{
return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
pen->nativePen, x, y,
width, height));
}
Status DrawRectangles(IN const Pen* pen,
IN const RectF* rects,
IN INT count)
{
return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
pen->nativePen,
rects, count));
}
// integer version
Status DrawRectangle(IN const Pen* pen,
IN const Rect& rect)
{
return DrawRectangle(pen,
rect.X,
rect.Y,
rect.Width,
rect.Height);
}
Status DrawRectangle(IN const Pen* pen,
IN INT x,
IN INT y,
IN INT width,
IN INT height)
{
return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
pen->nativePen,
x,
y,
width,
height));
}
Status DrawRectangles(IN const Pen* pen,
IN const Rect* rects,
IN INT count)
{
return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
pen->nativePen,
rects,
count));
}
// float version
Status DrawEllipse(IN const Pen* pen,
IN const RectF& rect)
{
return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
}
Status DrawEllipse(IN const Pen* pen,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height)
{
return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
pen->nativePen,
x,
y,
width,
height));
}
// integer version
Status DrawEllipse(IN const Pen* pen,
IN const Rect& rect)
{
return DrawEllipse(pen,
rect.X,
rect.Y,
rect.Width,
rect.Height);
}
Status DrawEllipse(IN const Pen* pen,
IN INT x,
IN INT y,
IN INT width,
IN INT height)
{
return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
pen->nativePen,
x,
y,
width,
height));
}
// floating point version
Status DrawPie(IN const Pen* pen,
IN const RectF& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return DrawPie(pen,
rect.X,
rect.Y,
rect.Width,
rect.Height,
startAngle,
sweepAngle);
}
Status DrawPie(IN const Pen* pen,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
pen->nativePen,
x,
y,
width,
height,
startAngle,
sweepAngle));
}
// integer point version
Status DrawPie(IN const Pen* pen,
IN const Rect& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return DrawPie(pen,
rect.X,
rect.Y,
rect.Width,
rect.Height,
startAngle,
sweepAngle);
}
Status DrawPie(IN const Pen* pen,
IN INT x,
IN INT y,
IN INT width,
IN INT height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
pen->nativePen,
x,
y,
width,
height,
startAngle,
sweepAngle));
}
// float version
Status DrawPolygon(IN const Pen* pen,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
pen->nativePen,
points,
count));
}
// integer version
Status DrawPolygon(IN const Pen* pen,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
pen->nativePen,
points,
count));
}
// float version
Status DrawPath(IN const Pen* pen,
IN const GraphicsPath* path)
{
return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
pen->nativePen,
path->nativePath));
}
// float version
Status DrawCurve(IN const Pen* pen,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
pen->nativePen, points,
count));
}
Status DrawCurve(IN const Pen* pen,
IN const PointF* points,
IN INT count,
IN REAL tension)
{
return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
pen->nativePen, points,
count, tension));
}
Status DrawCurve(IN const Pen* pen,
IN const PointF* points,
IN INT count,
IN INT offset,
IN INT numberOfSegments,
IN REAL tension = 0.5f)
{
return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
pen->nativePen, points,
count, offset,
numberOfSegments, tension));
}
// integer version
Status DrawCurve(IN const Pen* pen,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
pen->nativePen,
points,
count));
}
Status DrawCurve(IN const Pen* pen,
IN const Point* points,
IN INT count,
IN REAL tension)
{
return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
pen->nativePen,
points,
count,
tension));
}
Status DrawCurve(IN const Pen* pen,
IN const Point* points,
IN INT count,
IN INT offset,
IN INT numberOfSegments,
IN REAL tension = 0.5f)
{
return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
pen->nativePen,
points,
count,
offset,
numberOfSegments,
tension));
}
// float version
Status DrawClosedCurve(IN const Pen* pen,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
pen->nativePen,
points, count));
}
Status DrawClosedCurve(IN const Pen *pen,
IN const PointF* points,
IN INT count,
IN REAL tension)
{
return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
pen->nativePen,
points, count,
tension));
}
// integer version
Status DrawClosedCurve(IN const Pen* pen,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
pen->nativePen,
points,
count));
}
Status DrawClosedCurve(IN const Pen *pen,
IN const Point* points,
IN INT count,
IN REAL tension)
{
return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
pen->nativePen,
points,
count,
tension));
}
Status Clear(IN const Color &color)
{
return SetStatus(DllExports::GdipGraphicsClear(
nativeGraphics,
color.GetValue()));
}
// float version
Status FillRectangle(IN const Brush* brush,
IN const RectF& rect)
{
return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
}
Status FillRectangle(IN const Brush* brush,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height)
{
return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
brush->nativeBrush, x, y,
width, height));
}
Status FillRectangles(IN const Brush* brush,
IN const RectF* rects,
IN INT count)
{
return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
brush->nativeBrush,
rects, count));
}
// integer version
Status FillRectangle(IN const Brush* brush,
IN const Rect& rect)
{
return FillRectangle(brush,
rect.X,
rect.Y,
rect.Width,
rect.Height);
}
Status FillRectangle(IN const Brush* brush,
IN INT x,
IN INT y,
IN INT width,
IN INT height)
{
return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
brush->nativeBrush,
x,
y,
width,
height));
}
Status FillRectangles(IN const Brush* brush,
IN const Rect* rects,
IN INT count)
{
return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
brush->nativeBrush,
rects,
count));
}
// float version
Status FillPolygon(IN const Brush* brush,
IN const PointF* points,
IN INT count)
{
return FillPolygon(brush, points, count, FillModeAlternate);
}
Status FillPolygon(IN const Brush* brush,
IN const PointF* points,
IN INT count,
IN FillMode fillMode)
{
return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
brush->nativeBrush,
points, count, fillMode));
}
// integer version
Status FillPolygon(IN const Brush* brush,
IN const Point* points,
IN INT count)
{
return FillPolygon(brush, points, count, FillModeAlternate);
}
Status FillPolygon(IN const Brush* brush,
IN const Point* points,
IN INT count,
IN FillMode fillMode)
{
return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
brush->nativeBrush,
points, count,
fillMode));
}
// float version
Status FillEllipse(IN const Brush* brush,
IN const RectF& rect)
{
return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
}
Status FillEllipse(IN const Brush* brush,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height)
{
return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
brush->nativeBrush, x, y,
width, height));
}
// integer version
Status FillEllipse(IN const Brush* brush,
IN const Rect& rect)
{
return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
}
Status FillEllipse(IN const Brush* brush,
IN INT x,
IN INT y,
IN INT width,
IN INT height)
{
return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
brush->nativeBrush,
x,
y,
width,
height));
}
// float version
Status FillPie(IN const Brush* brush,
IN const RectF& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
startAngle, sweepAngle);
}
Status FillPie(IN const Brush* brush,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipFillPie(nativeGraphics,
brush->nativeBrush, x, y,
width, height, startAngle,
sweepAngle));
}
// integer version
Status FillPie(IN const Brush* brush,
IN const Rect& rect,
IN REAL startAngle,
IN REAL sweepAngle)
{
return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
startAngle, sweepAngle);
}
Status FillPie(IN const Brush* brush,
IN INT x,
IN INT y,
IN INT width,
IN INT height,
IN REAL startAngle,
IN REAL sweepAngle)
{
return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
brush->nativeBrush,
x,
y,
width,
height,
startAngle,
sweepAngle));
}
Status FillPath(IN const Brush* brush,
IN const GraphicsPath* path)
{
return SetStatus(DllExports::GdipFillPath(nativeGraphics,
brush->nativeBrush,
path->nativePath));
}
// float version
Status FillClosedCurve(IN const Brush* brush,
IN const PointF* points,
IN INT count)
{
return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
brush->nativeBrush,
points, count));
}
Status FillClosedCurve(IN const Brush* brush,
IN const PointF* points,
IN INT count,
IN FillMode fillMode,
IN REAL tension = 0.5f)
{
return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
brush->nativeBrush,
points, count,
tension, fillMode));
}
// integer version
Status FillClosedCurve(IN const Brush* brush,
IN const Point* points,
IN INT count)
{
return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
brush->nativeBrush,
points,
count));
}
Status FillClosedCurve(IN const Brush* brush,
IN const Point* points,
IN INT count,
IN FillMode fillMode,
IN REAL tension = 0.5f)
{
return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
brush->nativeBrush,
points, count,
tension, fillMode));
}
// float version
Status FillRegion(IN const Brush* brush,
IN const Region* region)
{
return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
brush->nativeBrush,
region->nativeRegion));
}
// DrawString and MeasureString
Status
DrawString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const RectF &layoutRect,
IN const StringFormat *stringFormat,
IN const Brush *brush
)
{
return SetStatus(DllExports::GdipDrawString(
nativeGraphics,
string,
length,
font->nativeFont,
&layoutRect,
stringFormat ? stringFormat->nativeFormat : NULL,
brush->nativeBrush
));
}
Status
DrawString(
const WCHAR *string,
INT length,
const Font *font,
const PointF &origin,
const Brush *brush
)
{
RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
return SetStatus(DllExports::GdipDrawString(
nativeGraphics,
string,
length,
font->nativeFont,
&rect,
NULL,
brush->nativeBrush
));
}
Status
DrawString(
const WCHAR *string,
INT length,
const Font *font,
const PointF &origin,
const StringFormat *stringFormat,
const Brush *brush
)
{
RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
return SetStatus(DllExports::GdipDrawString(
nativeGraphics,
string,
length,
font->nativeFont,
&rect,
stringFormat ? stringFormat->nativeFormat : NULL,
brush->nativeBrush
));
}
Status
MeasureString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const RectF &layoutRect,
IN const StringFormat *stringFormat,
OUT RectF *boundingBox,
OUT INT *codepointsFitted = 0,
OUT INT *linesFilled = 0
) const
{
return SetStatus(DllExports::GdipMeasureString(
nativeGraphics,
string,
length,
font->nativeFont,
&layoutRect,
stringFormat ? stringFormat->nativeFormat : NULL,
boundingBox,
codepointsFitted,
linesFilled
));
}
Status
MeasureString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const SizeF &layoutRectSize,
IN const StringFormat *stringFormat,
OUT SizeF *size,
OUT INT *codepointsFitted = 0,
OUT INT *linesFilled = 0
) const
{
RectF layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
RectF boundingBox;
Status status;
if (size == NULL)
{
return SetStatus(InvalidParameter);
}
status = SetStatus(DllExports::GdipMeasureString(
nativeGraphics,
string,
length,
font->nativeFont,
&layoutRect,
stringFormat ? stringFormat->nativeFormat : NULL,
size ? &boundingBox : NULL,
codepointsFitted,
linesFilled
));
if (size && status == Ok)
{
size->Width = boundingBox.Width;
size->Height = boundingBox.Height;
}
return status;
}
Status
MeasureString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const PointF &origin,
IN const StringFormat *stringFormat,
OUT RectF *boundingBox
) const
{
RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
return SetStatus(DllExports::GdipMeasureString(
nativeGraphics,
string,
length,
font->nativeFont,
&rect,
stringFormat ? stringFormat->nativeFormat : NULL,
boundingBox,
NULL,
NULL
));
}
Status
MeasureString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const RectF &layoutRect,
OUT RectF *boundingBox
) const
{
return SetStatus(DllExports::GdipMeasureString(
nativeGraphics,
string,
length,
font->nativeFont,
&layoutRect,
NULL,
boundingBox,
NULL,
NULL
));
}
Status
MeasureString(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const PointF &origin,
OUT RectF *boundingBox
) const
{
RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
return SetStatus(DllExports::GdipMeasureString(
nativeGraphics,
string,
length,
font->nativeFont,
&rect,
NULL,
boundingBox,
NULL,
NULL
));
}
Status
MeasureStringRegion(
IN const WCHAR *string,
IN INT length,
IN const Font *font,
IN const RectF &layoutRect,
IN const StringFormat *stringFormat,
IN INT firstCharacterIndex,
IN INT characterCount,
OUT Region *region
) const
{
if (region == NULL)
{
return SetStatus(InvalidParameter);
}
return (SetStatus(DllExports::GdipMeasureStringRegion(
nativeGraphics,
string,
length,
font->nativeFont,
layoutRect,
stringFormat ? stringFormat->nativeFormat : NULL,
firstCharacterIndex,
characterCount,
region->nativeRegion)));
}
Status DrawDriverString(
IN const UINT16 *text,
IN INT length,
IN const Font *font,
IN const Brush *brush,
IN const PointF *positions,
IN INT flags,
IN Matrix *matrix
)
{
return SetStatus(DllExports::GdipDrawDriverString(
nativeGraphics,
text,
length,
font ? font->nativeFont : NULL,
brush ? brush->nativeBrush : NULL,
positions,
flags,
matrix ? matrix->nativeMatrix : NULL
));
}
Status MeasureDriverString(
IN const UINT16 *text,
IN INT length,
IN const Font *font,
IN const PointF *positions,
IN INT flags,
IN Matrix *matrix,
OUT RectF *boundingBox
) const
{
return SetStatus(DllExports::GdipMeasureDriverString(
nativeGraphics,
text,
length,
font ? font->nativeFont : NULL,
positions,
flags,
matrix ? matrix->nativeMatrix : NULL,
boundingBox
));
}
Status DriverStringPointToCodepoint(
IN const UINT16 *text,
IN INT length,
IN const Font *font,
IN const PointF *positions,
IN INT flags,
IN Matrix *matrix,
IN const PointF &hit,
OUT INT *index,
OUT BOOL *rightEdge,
OUT REAL *distance
)
{
return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
nativeGraphics,
text,
length,
font ? font->nativeFont : NULL,
positions,
flags,
matrix ? matrix->nativeMatrix : NULL,
&hit,
index,
rightEdge,
distance
));
}
// Draw a cached bitmap on this graphics destination offset by
// x, y. Note this will fail with WrongState if the CachedBitmap
// native format differs from this Graphics.
Status DrawCachedBitmap(IN CachedBitmap *cb,
IN INT x,
IN INT y)
{
return SetStatus(DllExports::GdipDrawCachedBitmap(
nativeGraphics,
cb->nativeCachedBitmap,
x, y
));
}
/**
* Draw images (both bitmap and vector)
*/
// float version
Status DrawImage(IN Image* image,
IN const PointF& point)
{
return DrawImage(image, point.X, point.Y);
}
Status DrawImage(IN Image* image,
IN REAL x,
IN REAL y)
{
return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
image ? image->nativeImage
: NULL,
x,
y));
}
Status DrawImage(IN Image* image,
IN RectF& rect)
{
return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
}
Status DrawImage(IN Image* image,
IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height)
{
return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
image ? image->nativeImage
: NULL,
x,
y,
width,
height));
}
// integer version
Status DrawImage(IN Image* image,
IN const Point& point)
{
return DrawImage(image, point.X, point.Y);
}
Status DrawImage(IN Image* image,
IN INT x,
IN INT y)
{
return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
image ? image->nativeImage
: NULL,
x,
y));
}
Status DrawImage(IN Image* image,
IN const Rect& rect)
{
return DrawImage(image,
rect.X,
rect.Y,
rect.Width,
rect.Height);
}
Status DrawImage(IN Image* image,
IN INT x,
IN INT y,
IN INT width,
IN INT height) {
return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
image ? image->nativeImage
: NULL,
x,
y,
width,
height));
}
/**
* Affine or perspective blt
* destPoints.length = 3: rect => parallelogram
* destPoints[0] <=> top-left corner of the source rectangle
* destPoints[1] <=> top-right corner
* destPoints[2] <=> bottom-left corner
* destPoints.length = 4: rect => quad
* destPoints[3] <=> bottom-right corner
*
* @notes Perspective blt only works for bitmap images.
*/
Status DrawImage(IN Image* image,
IN const PointF* destPoints,
IN INT count)
{
if (count != 3 && count != 4)
return SetStatus(InvalidParameter);
return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
image ? image->nativeImage
: NULL,
destPoints, count));
}
Status DrawImage(IN Image* image,
IN const Point* destPoints,
IN INT count)
{
if (count != 3 && count != 4)
return SetStatus(InvalidParameter);
return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
image ? image->nativeImage
: NULL,
destPoints,
count));
}
/**
* We need another set of methods similar to the ones above
* that take an additional Rect parameter to specify the
* portion of the source image to be drawn.
*/
// float version
Status DrawImage(IN Image* image,
IN REAL x,
IN REAL y,
IN REAL srcx,
IN REAL srcy,
IN REAL srcwidth,
IN REAL srcheight,
IN Unit srcUnit)
{
return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
image ? image->nativeImage
: NULL,
x, y,
srcx, srcy,
srcwidth, srcheight, srcUnit));
}
Status DrawImage(IN Image* image,
IN const RectF& destRect,
IN REAL srcx,
IN REAL srcy,
IN REAL srcwidth,
IN REAL srcheight,
IN Unit srcUnit,
IN ImageAttributes* imageAttributes = NULL,
IN DrawImageAbort callback = NULL,
IN VOID* callbackData = NULL)
{
return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
image ? image->nativeImage
: NULL,
destRect.X,
destRect.Y,
destRect.Width,
destRect.Height,
srcx, srcy,
srcwidth, srcheight,
srcUnit,
imageAttributes
? imageAttributes->nativeImageAttr
: NULL,
callback,
callbackData));
}
Status DrawImage(IN Image* image,
IN const PointF* destPoints,
IN INT count,
IN REAL srcx,
IN REAL srcy,
IN REAL srcwidth,
IN REAL srcheight,
IN Unit srcUnit,
IN ImageAttributes* imageAttributes = NULL,
IN DrawImageAbort callback = NULL,
IN VOID* callbackData = NULL)
{
return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
image ? image->nativeImage
: NULL,
destPoints, count,
srcx, srcy,
srcwidth,
srcheight,
srcUnit,
imageAttributes
? imageAttributes->nativeImageAttr
: NULL,
callback,
callbackData));
}
// integer version
Status DrawImage(IN Image* image,
IN INT x,
IN INT y,
IN INT srcx,
IN INT srcy,
IN INT srcwidth,
IN INT srcheight,
IN Unit srcUnit)
{
return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
image ? image->nativeImage
: NULL,
x,
y,
srcx,
srcy,
srcwidth,
srcheight,
srcUnit));
}
Status DrawImage(IN Image* image,
IN const Rect& destRect,
IN INT srcx,
IN INT srcy,
IN INT srcwidth,
IN INT srcheight,
IN Unit srcUnit,
IN ImageAttributes* imageAttributes = NULL,
IN DrawImageAbort callback = NULL,
IN VOID* callbackData = NULL)
{
return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
image ? image->nativeImage
: NULL,
destRect.X,
destRect.Y,
destRect.Width,
destRect.Height,
srcx,
srcy,
srcwidth,
srcheight,
srcUnit,
imageAttributes
? imageAttributes->nativeImageAttr
: NULL,
callback,
callbackData));
}
Status DrawImage(IN Image* image,
IN const Point* destPoints,
IN INT count,
IN INT srcx,
IN INT srcy,
IN INT srcwidth,
IN INT srcheight,
IN Unit srcUnit,
IN ImageAttributes* imageAttributes = NULL,
IN DrawImageAbort callback = NULL,
IN VOID* callbackData = NULL)
{
return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
image ? image->nativeImage
: NULL,
destPoints,
count,
srcx,
srcy,
srcwidth,
srcheight,
srcUnit,
imageAttributes
? imageAttributes->nativeImageAttr
: NULL,
callback,
callbackData));
}
// The following methods are for playing an EMF+ to a graphics
// via the enumeration interface. Each record of the EMF+ is
// sent to the callback (along with the callbackData). Then
// the callback can invoke the Metafile::PlayRecord method
// to play the particular record.
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const PointF & destPoint,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoint,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Point & destPoint,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoint,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const RectF & destRect,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destRect,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Rect & destRect,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destRect,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const PointF * destPoints,
IN INT count,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoints,
count,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Point * destPoints,
IN INT count,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoints,
count,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const PointF & destPoint,
IN const RectF & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoint,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Point & destPoint,
IN const Rect & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoint,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const RectF & destRect,
IN const RectF & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destRect,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Rect & destRect,
IN const Rect & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destRect,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const PointF * destPoints,
IN INT count,
IN const RectF & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoints,
count,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
Status
EnumerateMetafile(
IN const Metafile * metafile,
IN const Point * destPoints,
IN INT count,
IN const Rect & srcRect,
IN Unit srcUnit,
IN EnumerateMetafileProc callback,
IN VOID * callbackData = NULL,
IN ImageAttributes * imageAttributes = NULL
)
{
return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
nativeGraphics,
(const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
destPoints,
count,
srcRect,
srcUnit,
callback,
callbackData,
imageAttributes ? imageAttributes->nativeImageAttr : NULL));
}
/**
* Clipping region operations
*
* @notes Simply incredible redundancy here.
*/
Status SetClip(IN const Graphics* g,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
g->nativeGraphics,
combineMode));
}
Status SetClip(IN const RectF& rect,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
combineMode));
}
Status SetClip(IN const Rect& rect,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
combineMode));
}
Status SetClip(IN const GraphicsPath* path,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
path->nativePath,
combineMode));
}
Status SetClip(IN const Region* region,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
region->nativeRegion,
combineMode));
}
// This is different than the other SetClip methods because it assumes
// that the HRGN is already in device units, so it doesn't transform
// the coordinates in the HRGN.
Status SetClip(IN HRGN hRgn,
IN CombineMode combineMode = CombineModeReplace)
{
return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
combineMode));
}
Status IntersectClip(IN const RectF& rect)
{
return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
CombineModeIntersect));
}
Status IntersectClip(IN const Rect& rect)
{
return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
CombineModeIntersect));
}
Status IntersectClip(IN const Region* region)
{
return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
region->nativeRegion,
CombineModeIntersect));
}
Status ExcludeClip(IN const RectF& rect)
{
return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
CombineModeExclude));
}
Status ExcludeClip(IN const Rect& rect)
{
return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
rect.X, rect.Y,
rect.Width, rect.Height,
CombineModeExclude));
}
Status ExcludeClip(IN const Region* region)
{
return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
region->nativeRegion,
CombineModeExclude));
}
Status ResetClip()
{
return SetStatus(DllExports::GdipResetClip(nativeGraphics));
}
Status TranslateClip(IN REAL dx,
IN REAL dy)
{
return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
}
Status TranslateClip(IN INT dx,
IN INT dy)
{
return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
dx, dy));
}
/**
* GetClip region from graphics context
*/
Status GetClip(OUT Region* region) const
{
return SetStatus(DllExports::GdipGetClip(nativeGraphics,
region->nativeRegion));
}
/**
* Hit testing operations
*/
Status GetClipBounds(OUT RectF* rect) const
{
return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
}
Status GetClipBounds(OUT Rect* rect) const
{
return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
}
BOOL IsClipEmpty() const
{
BOOL booln = FALSE;
SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
return booln;
}
Status GetVisibleClipBounds(OUT RectF *rect) const
{
return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
rect));
}
Status GetVisibleClipBounds(OUT Rect *rect) const
{
return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
rect));
}
BOOL IsVisibleClipEmpty() const
{
BOOL booln = FALSE;
SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
return booln;
}
BOOL IsVisible(IN INT x,
IN INT y) const
{
return IsVisible(Point(x,y));
}
BOOL IsVisible(IN const Point& point) const
{
BOOL booln = FALSE;
SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
point.X,
point.Y,
&booln));
return booln;
}
BOOL IsVisible(IN INT x,
IN INT y,
IN INT width,
IN INT height) const
{
return IsVisible(Rect(x, y, width, height));
}
BOOL IsVisible(IN const Rect& rect) const
{
BOOL booln = TRUE;
SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
rect.X,
rect.Y,
rect.Width,
rect.Height,
&booln));
return booln;
}
BOOL IsVisible(IN REAL x,
IN REAL y) const
{
return IsVisible(PointF(x, y));
}
BOOL IsVisible(IN const PointF& point) const
{
BOOL booln = FALSE;
SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
point.X,
point.Y,
&booln));
return booln;
}
BOOL IsVisible(IN REAL x,
IN REAL y,
IN REAL width,
IN REAL height) const
{
return IsVisible(RectF(x, y, width, height));
}
BOOL IsVisible(IN const RectF& rect) const
{
BOOL booln = TRUE;
SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
rect.X,
rect.Y,
rect.Width,
rect.Height,
&booln));
return booln;
}
/**
* Save/restore graphics state
*/
GraphicsState Save() const
{
GraphicsState gstate;
SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
return gstate;
}
Status Restore(IN GraphicsState gstate)
{
return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
gstate));
}
/**
* Begin and end container drawing
*/
GraphicsContainer BeginContainer(IN const RectF &dstrect,
IN const RectF &srcrect,
IN Unit unit)
{
GraphicsContainer state;
SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
&srcrect, unit, &state));
return state;
}
/**
* Begin and end container drawing
*/
GraphicsContainer BeginContainer(IN const Rect &dstrect,
IN const Rect &srcrect,
IN Unit unit)
{
GraphicsContainer state;
SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
&srcrect, unit, &state));
return state;
}
GraphicsContainer BeginContainer()
{
GraphicsContainer state;
SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
return state;
}
Status EndContainer(IN GraphicsContainer state)
{
return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
}
// only valid when recording metafiles
Status AddMetafileComment(IN const BYTE * data,
IN UINT sizeData)
{
return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
}
/**
* Get/SetLayout
* Support for Middle East localization (right-to-left mirroring)
*/
GraphicsLayout GetLayout() const
{
GraphicsLayout layout;
SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
return layout;
}
Status SetLayout(IN const GraphicsLayout layout)
{
SetStatus(DllExports::GdipSetGraphicsLayout(nativeGraphics, layout));
}
static HPALETTE GetHalftonePalette()
{
return DllExports::GdipCreateHalftonePalette();
}
Status GetLastStatus() const
{
Status lastStatus = lastResult;
lastResult = Ok;
return lastStatus;
}
protected:
Graphics(const Graphics& graphics)
{
graphics;
SetStatus(NotImplemented);
}
Graphics& operator=(const Graphics& graphics)
{
graphics;
SetStatus(NotImplemented);
return *this;
}
Graphics(GpGraphics* graphics)
{
lastResult = Ok;
SetNativeGraphics(graphics);
}
VOID SetNativeGraphics(GpGraphics *graphics)
{
this->nativeGraphics = graphics;
}
Status SetStatus(Status status) const
{
if (status != Ok)
return (lastResult = status);
else
return status;
}
// Methods necessary to subclass Graphics for extension test.
GpGraphics* GetNativeGraphics()
{
return this->nativeGraphics;
}
GpPen* GetNativePen(const Pen* pen)
{
return pen->nativePen;
}
protected:
GpGraphics* nativeGraphics;
mutable Status lastResult;
};
//----------------------------------------------------------------------------
// Extra implementation of GraphicsPath methods that use Graphics
//----------------------------------------------------------------------------
/**
* Get the bounds of the path object with the given transform.
* This is not always the tightest bounds.
*/
inline Status
GraphicsPath::GetBounds(
OUT RectF* bounds,
IN const Matrix* matrix,
IN const Pen* pen) const
{
GpMatrix* nativeMatrix = NULL;
GpPen* nativePen = NULL;
if (matrix)
nativeMatrix = matrix->nativeMatrix;
if (pen)
nativePen = pen->nativePen;
return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
nativeMatrix, nativePen));
}
// integer version
inline Status
GraphicsPath::GetBounds(
OUT Rect* bounds,
IN const Matrix* matrix,
IN const Pen* pen
) const
{
GpMatrix* nativeMatrix = NULL;
GpPen* nativePen = NULL;
if (matrix)
nativeMatrix = matrix->nativeMatrix;
if (pen)
nativePen = pen->nativePen;
return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
nativeMatrix, nativePen));
}
//----------------------------------------------------------------------------
// Hit testing operations
//----------------------------------------------------------------------------
inline BOOL
GraphicsPath::IsVisible(
IN REAL x,
IN REAL y,
IN const Graphics* g) const
{
BOOL booln = FALSE;
GpGraphics* nativeGraphics = NULL;
if (g)
nativeGraphics = g->nativeGraphics;
SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
x, y, nativeGraphics,
&booln));
return booln;
}
inline BOOL
GraphicsPath::IsVisible(
IN INT x,
IN INT y,
IN const Graphics* g) const
{
BOOL booln = FALSE;
GpGraphics* nativeGraphics = NULL;
if (g)
nativeGraphics = g->nativeGraphics;
SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
x, y, nativeGraphics,
&booln));
return booln;
}
inline BOOL
GraphicsPath::IsOutlineVisible(
IN REAL x,
IN REAL y,
IN const Pen* pen,
IN const Graphics* g) const
{
BOOL booln = FALSE;
GpGraphics* nativeGraphics = NULL;
GpPen* nativePen = NULL;
if(g)
nativeGraphics = g->nativeGraphics;
if(pen)
nativePen = pen->nativePen;
SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
x, y, nativePen, nativeGraphics,
&booln));
return booln;
}
inline BOOL
GraphicsPath::IsOutlineVisible(
IN INT x,
IN INT y,
IN const Pen* pen,
IN const Graphics* g) const
{
BOOL booln = FALSE;
GpGraphics* nativeGraphics = NULL;
GpPen* nativePen = NULL;
if(g)
nativeGraphics = g->nativeGraphics;
if(pen)
nativePen = pen->nativePen;
SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
x, y, nativePen, nativeGraphics,
&booln));
return booln;
}
#endif