www.pudn.com > GdiplusTest16.zip > GdiPlusGraphics.h


/**************************************************************************\ 
* 
* Copyright (c) 1998-2001, Microsoft Corp.  All Rights Reserved. 
* 
* Module Name: 
* 
*   GdiplusGraphics.h 
* 
* Abstract: 
* 
*   GDI+ Graphics Object 
* 
\**************************************************************************/ 
 
#ifndef _GDIPLUSGRAPHICS_H 
#define _GDIPLUSGRAPHICS_H 
 
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; 
 
    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); 
    } 
 
    //------------------------------------------------------------------------ 
    // GDI 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) const 
    { 
        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 SetTextContrast(IN UINT contrast) 
    { 
        return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics, 
                                                          contrast)); 
    } 
 
    UINT GetTextContrast() const 
    { 
        UINT contrast; 
 
        SetStatus(DllExports::GdipGetTextContrast(nativeGraphics, 
                                                    &contrast)); 
 
        return contrast; 
    } 
 
    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 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 const 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)); 
    } 
 
    Status GetTransform(OUT Matrix* matrix) const 
    { 
        return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics, 
                                                           matrix->nativeMatrix)); 
    } 
 
    Status SetPageUnit(IN Unit unit) 
    { 
        return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics, 
                                                     unit)); 
    } 
 
    Status SetPageScale(IN REAL scale) 
    { 
        return SetStatus(DllExports::GdipSetPageScale(nativeGraphics, 
                                                      scale)); 
    } 
 
    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; 
    } 
 
    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)); 
    } 
 
    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; 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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); 
    } 
 
    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); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    Status DrawPolygon(IN const Pen* pen, 
                       IN const PointF* points, 
                       IN INT count) 
    { 
        return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics, 
                                                     pen->nativePen, 
                                                     points, 
                                                     count)); 
    } 
 
    Status DrawPolygon(IN const Pen* pen, 
                       IN const Point* points, 
                       IN INT count) 
    { 
        return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics, 
                                                      pen->nativePen, 
                                                      points, 
                                                      count)); 
    } 
 
    Status DrawPath(IN const Pen* pen, 
                    IN const GraphicsPath* path) 
    { 
        return SetStatus(DllExports::GdipDrawPath(nativeGraphics, 
                                                  pen ? pen->nativePen : NULL, 
                                                  path ? path->nativePath : NULL)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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())); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    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)); 
    } 
 
    Status FillRegion(IN const Brush* brush, 
                      IN const Region* region) 
    { 
        return SetStatus(DllExports::GdipFillRegion(nativeGraphics, 
                                                    brush->nativeBrush, 
                                                    region->nativeRegion)); 
    } 
 
    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 ? font->nativeFont : NULL, 
            &layoutRect, 
            stringFormat ? stringFormat->nativeFormat : NULL, 
            brush ? brush->nativeBrush : NULL 
        )); 
    } 
 
    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 ? font->nativeFont : NULL, 
            &rect, 
            NULL, 
            brush ? brush->nativeBrush : NULL 
        )); 
    } 
 
    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 ? font->nativeFont : NULL, 
            &rect, 
            stringFormat ? stringFormat->nativeFormat : NULL, 
            brush ? brush->nativeBrush : NULL 
        )); 
    } 
 
    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 ? font->nativeFont : NULL, 
            &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 ? font->nativeFont : NULL, 
            &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 ? font->nativeFont : NULL, 
            &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 ? font->nativeFont : NULL, 
            &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 ? font->nativeFont : NULL, 
            &rect, 
            NULL, 
            boundingBox, 
            NULL, 
            NULL 
        )); 
    } 
 
 
    Status 
    MeasureCharacterRanges( 
        IN const WCHAR        *string, 
        IN INT                 length, 
        IN const Font         *font, 
        IN const RectF        &layoutRect, 
        IN const StringFormat *stringFormat, 
        IN INT                 regionCount, 
        OUT Region            *regions 
    ) const 
    { 
        if (!regions || regionCount <= 0) 
        { 
            return InvalidParameter; 
        } 
 
        GpRegion **nativeRegions = new GpRegion* [regionCount]; 
 
        if (!nativeRegions) 
        { 
            return OutOfMemory; 
        } 
 
        for (INT i = 0; i < regionCount; i++) 
        { 
            nativeRegions[i] = regions[i].nativeRegion; 
        } 
 
        Status status = SetStatus(DllExports::GdipMeasureCharacterRanges( 
            nativeGraphics, 
            string, 
            length, 
            font ? font->nativeFont : NULL, 
            layoutRect, 
            stringFormat ? stringFormat->nativeFormat : NULL, 
            regionCount, 
            nativeRegions 
        )); 
 
        delete [] nativeRegions; 
 
        return status; 
    } 
 
    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 const 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 const Matrix        *matrix, 
        OUT RectF        *boundingBox 
    ) const 
    { 
        return SetStatus(DllExports::GdipMeasureDriverString( 
            nativeGraphics, 
            text, 
            length, 
            font ? font->nativeFont : NULL, 
            positions, 
            flags, 
            matrix ? matrix->nativeMatrix : NULL, 
            boundingBox 
        )); 
    } 
 
    // 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 
        )); 
    } 
 
    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 const 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)); 
    } 
 
    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 Draw Image 
    // 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 
     
    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)); 
    } 
 
    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 const 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 const 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)); 
    } 
 
    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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const ImageAttributes *       imageAttributes = NULL 
        ) 
    { 
        return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI( 
                    nativeGraphics, 
                    (const GpMetafile *)(metafile ? metafile->nativeImage:NULL), 
                    destPoints, 
                    count, 
                    srcRect, 
                    srcUnit, 
                    callback, 
                    callbackData, 
                    imageAttributes ? imageAttributes->nativeImageAttr : NULL)); 
    } 
     
    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)); 
    } 
 
    Status GetClip(OUT Region* region) const 
    { 
        return SetStatus(DllExports::GdipGetClip(nativeGraphics, 
                                                 region->nativeRegion)); 
    } 
 
    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; 
    } 
 
    GraphicsState Save() const 
    { 
        GraphicsState gstate; 
 
        SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate)); 
 
        return gstate; 
    } 
 
    Status Restore(IN GraphicsState gstate) 
    { 
        return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics, 
                                                         gstate)); 
    } 
 
    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; 
    } 
 
    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)); 
    } 
 
    static HPALETTE GetHalftonePalette() 
    { 
        return DllExports::GdipCreateHalftonePalette(); 
    } 
 
    Status GetLastStatus() const 
    { 
        Status lastStatus = lastResult; 
        lastResult = Ok; 
 
        return lastStatus; 
    } 
 
private: 
    Graphics(const Graphics &); 
    Graphics& operator=(const Graphics &); 
 
protected: 
    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; 
    } 
 
    GpGraphics* GetNativeGraphics() const 
    { 
        return this->nativeGraphics; 
    } 
 
    GpPen* GetNativePen(const Pen* pen) 
    { 
        return pen->nativePen; 
    } 
 
protected: 
    GpGraphics* nativeGraphics; 
    mutable Status lastResult; 
 
}; 
 
//---------------------------------------------------------------------------- 
// Implementation of GraphicsPath methods that use Graphics 
//---------------------------------------------------------------------------- 
 
// The GetBounds rectangle may not be 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)); 
} 
 
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)); 
} 
 
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