Index: /Include/Classes/System/Drawing/Graphics.ab
===================================================================
--- /Include/Classes/System/Drawing/Graphics.ab	(revision 32)
+++ /Include/Classes/System/Drawing/Graphics.ab	(revision 33)
@@ -0,0 +1,2019 @@
+' Classes/System/Drawing/Graphics.ab
+
+#ifndef __SYSTEM_DRAWING_GRAPHICS_AB__
+#define __SYSTEM_DRAWING_GRAPHICS_AB__
+
+#include <GdiPlusGpStabus.ab>
+#include <GdiPlusFlat.ab>
+#include <Classes/System/Drawing/Graphics/misc.ab>
+#include <Classes/System/Drawing/Graphics/Rectangle.ab>
+#include <Classes/System/Drawing/Graphics/RectangleF.ab>
+#include <Classes/System/Drawing/Graphics/Point.ab>
+#include <Classes/System/Drawing/Graphics/PointF.ab>
+#include <Classes/System/Drawing/Graphics/SizeF.ab>
+#include <Classes/System/Drawing/Graphics/Brush.ab>
+#include <Classes/System/Drawing/Graphics/Pen.ab>
+#include <Classes/System/Drawing/Graphics/Region.ab>
+#include <Classes/System/Drawing/Graphics/StringFormat.ab>
+#include <Classes/System/Drawing/Graphics/Image.ab>
+#include <Classes/System/Drawing/Graphics/Drawing2D/misc.ab>
+#include <Classes/System/Drawing/Graphics/Drawing2D/Matrix.ab>
+
+Class Graphics
+Public
+	'=========================================================================
+	' Properties
+	'=========================================================================
+	Const Function Clip() As Region
+		Dim r As Regino
+		GetClip(r)
+		Return r
+	End Function
+
+	Sub Clip(ByRef region As /*Const*/ Region)
+		SetClip(region, CombineMode.Replace)
+	End Sub
+
+	Const Function ClipBounds() As RectangleF
+		Dim rc As RectangleF
+		GetClipBounds(rc)
+		Return rc
+	End Function
+
+	Sub ClipBounds(rc As RectangleF)
+		SetClipBounds(rc)
+	End Sub
+
+	Function CompositingMode() As CompositingMode
+		Return GetCompositingMode()
+	End Function
+
+	Sub CompositingMode(mode As CompositingMode)
+		SetCompositingMode(mode)
+	End Sub
+
+	Function CompositingQuality() As CompositingQuality
+		Return GetCompositingQuality()
+	End Function
+
+	Sub CompositingQuality(cq As CompositingQuality)
+		SetCompositingQuality(cq)
+	End Sub
+
+	Const Function DpiX() As Single
+		Dim dpi As Single
+		SetStatus(GdipGetDpiX(nativeGraphics, dpi))
+		Return dpi
+	End Function
+
+	Const Function DpiY() As Single
+		Dim dpi As Single
+		SetStatus(GdipGetDpiY(nativeGraphics, dpi))
+		Return dpi
+	End Function
+
+	Const Function InterpolationMode() As InterpolationMode
+		Return GetInterpolationMode()
+	End Function
+
+	Sub InterpolationMode(im As InterpolationMode)
+		SetInterpolationMode(im)
+	End Sub
+
+	Const Function IsClipEmpty() As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsClipEmpty(nativeGraphics, b))
+		Return b
+	End Function
+
+	Const Function IsVisibleClipEmpty() As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsVisibleClipEmpty(nativeGraphics, b))
+		Return b
+	End Function
+
+	Function PageScale(scale As Single) As Status
+		Return SetStatus(GdipSetPageScale(nativeGraphics, scale))
+	End Function
+
+	Const Function PageScale() As Single
+		Dim scale As Single
+		SetStatus(GdipGetPageScale(nativeGraphics, scale))
+		Return scale
+	End Function
+
+	Const Function PageUnit() As GraphicsUnit
+		Dim unit As GraphicsUnit
+		SetStatus(GdipGetPageUnit(nativeGraphics, unit))
+		Return unit
+	End Function
+
+	Function PageUnit(unit As GraphicsUnit) As Status
+		Return SetStatus(GdipSetPageUnit(nativeGraphics, unit))
+	End Function
+
+	Function PixelOffsetMode() As PixelOffsetMode
+		Return GetPixelOffsetMode()
+	End Function
+
+	Sub PixelOffsetMode(mode  As PixelOffsetMode)
+		SetPixelOffsetMode(mode)
+	End Sub
+
+	Function RenderingOrigin() As Point
+		Dim pt As Point
+		GetRenderingOrigin(pt.X, pt.Y)
+		Return pt
+	End Function
+
+	Sub RenderingOrigin(pt As Point)
+		SetRenderingOrigin(pt.X, pt.Y)
+	End Sub
+
+	Function SmoothingMode() As SmoothingMode
+		Return GetSmoothingMode()
+	End Function
+
+	Sub SmoothingMode(mode As SmoothingMode)
+		SetSmoothingMode(mode)
+	End Sub
+
+	Function TextContrast() As DWord
+		Return GetTextContrast()
+	End Function
+
+	Sub TextContrast(contrast As DWord)
+		SetTextContrast(contrast)
+	End Sub
+
+	Function TextRenderingHint() As TextRenderingHint
+		Return GetTextRenderingHint()
+	End Function
+
+	Sub TextRenderingHint(mode As TextRenderingHint)
+		SetTextRenderingHint(mode)
+	End Sub
+
+	Function Transform() As Matrix
+		Dim matrix As Matrix
+		GetTransform(matrix)
+		Return matrix
+	End Function
+
+	Sub Transform(ByRef matrix As Matrix)
+		SetTransform(matirx)
+	End Sub
+
+	Function VisibleClipBounds() As RectangleF
+		Dim rc As RectangleF
+		GetVisibleClipBounds(rc)
+		Return rc
+	End Function
+
+	'=========================================================================
+	' Methods
+	'=========================================================================
+	Static Function FromHDC(hdc As HDC) As *Graphics
+		Return New Graphics(hdc)
+	End Function
+
+	Static Function FromHDC(hdc As HDC, hdevice As HANDLE) As *Graphics
+		Return New Graphics(hdc, hdevice)
+	End Function
+
+	Static Function FromHWND(hwnd As HWND) As *Graphics
+		Return New Graphics(hwnd, FALSE)
+	End Function
+
+	Static Function FromHWND(hwnd As DWord, icm As BOOL) As *Graphics
+		Return New Graphics(hwnd, icm)
+	End Function
+
+	Static Function FromImage(image As *Image) As *Graphics
+		Return New Graphics(image)
+	End Function
+
+	Sub Graphics(hdc As HDC)
+		Dim graphics = 0 As *GpGraphics
+		lastResult = GdipCreateFromHDC(hdc, graphics)
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub Graphics(hdc As HDC, hdevice As HANDLE)
+		Dim graphics = 0 As *GpGraphics
+		lastResult = GdipCreateFromHDC2(hdc, hdevice, graphics)
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub Graphics(hwnd As HWND)
+		Dim graphics = 0 As *GpGraphics
+		lastResult = GdipCreateFromHWND(hwnd, graphics)
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub Graphics(hwnd As HWND, icm As BOOL)
+		Dim graphics = 0 As *GpGraphics
+		If icm <> FALSE Then
+			lastResult = GdipCreateFromHWNDICM(hwnd, graphics)
+		Else
+			lastResult = GdipCreateFromHWND(hwnd, graphics)
+		End If
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub Graphics(image As *Image)
+		Dim graphics = 0 As *GpGraphics
+		If (image != 0)
+			lastResult = GdipGetImageGraphicsContext(image->nativeImage, graphics)
+		End If
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub ~Graphics()
+		GdipDeleteGraphics(nativeGraphics)
+	End Sub
+
+	Sub Flush()
+		GdipFlush(nativeGraphics, FlushIntention.Flush)
+	End Sub
+
+	Sub Flush(intention As FlushIntention)
+		GdipFlush(nativeGraphics, intention)
+	End Sub
+
+	'------------------------------------------------------------------------
+	' GDI Interop methods
+	'------------------------------------------------------------------------
+
+	' Locks the graphics until ReleaseDC is called
+
+	Function GetHDC() As HDC
+		Dim hdc = 0 As HDC
+		SetStatus(GdipGetDC(nativeGraphics, hdc))
+		Return hdc
+	End Function
+
+	Sub ReleaseHDC(hdc As HDC)
+		SetStatus(GdipReleaseDC(nativeGraphics, hdc))
+	End Sub
+
+	'------------------------------------------------------------------------
+	' Rendering modes
+	'------------------------------------------------------------------------
+
+	Function SetRenderingOrigin(x As Long, y As Long) As Status
+		Return SetStatus(GdipSetRenderingOrigin(nativeGraphics, x, y))
+	End Function
+
+	Const Function GetRenderingOrigin(ByRef x As Long, ByRef y As Long) As Status
+		Return SetStatus(GdipGetRenderingOrigin(nativeGraphics, x, y))
+	End Function
+
+	Function SetCompositingMode(compositingMode As CompositingMode) As Status
+		Return SetStatus(GdipSetCompositingMode(nativeGraphics, compositingMode))
+	End Function
+
+	Const Function GetCompositingMode() As CompositingMode
+		Dim mode As CompositingMode
+		SetStatus(GdipGetCompositingMode(nativeGraphics, mode))
+		Return mode
+	End Function
+
+	Function SetCompositingQuality(compositingQuality As CompositingQuality)
+		Return SetStatus(GdipSetCompositingQuality(nativeGraphics, compositingQuality))
+	End Function
+
+	Const Function GetCompositingQuality() As CompositingQuality
+		Dim quality As CompositingQuality
+		SetStatus(GdipGetCompositingQuality(nativeGraphics, quality))
+		Return quality
+	End Function
+
+	Function SetTextRenderingHint(newMode As TextRenderingHint) As Status
+		Return SetStatus(GdipSetTextRenderingHint(nativeGraphics, newMode))
+	End Function
+
+	Const Function GetTextRenderingHint() As TextRenderingHint
+		Dim hint As TextRenderingHint
+		SetStatus(GdipGetTextRenderingHint(nativeGraphics, hint))
+		Return hint
+	End Function
+
+	Function SetTextContrast(contrast As DWord) As Status
+		Return SetStatus(GdipSetTextContrast(nativeGraphics, contrast))
+	End Function
+
+	Const Function GetTextContrast() As DWord
+		Dim contrast As DWord
+		SetStatus(GdipGetTextContrast(nativeGraphics, contrast))
+		Return contrast
+	End Function
+
+	Const Function GetInterpolationMode() As InterpolationMode
+		Dim mode = InterpolationMode.Invalid As InterpolationMode
+		SetStatus(GdipGetInterpolationMode(nativeGraphics, mode))
+		Return mode
+	End Function
+
+	Function SetInterpolationMode(interpolationMode As InterpolationMode) As Status
+		Return SetStatus(GdipSetInterpolationMode(nativeGraphics, interpolationMode))
+	End Function
+
+	Const Function GetSmoothingMode() As SmoothingMode
+		Dim smoothingMode = SmoothingMode.Invalid As SmoothingMode
+		SetStatus(GdipGetSmoothingMode(nativeGraphics, smoothingMode))
+		Return smoothingMode
+	End Function
+
+	Function SetSmoothingMode(smoothingMode As SmoothingMode) As Status
+		Return SetStatus(GdipSetSmoothingMode(nativeGraphics, smoothingMode))
+	End Function
+
+	Const Function GetPixelOffsetMode() As PixelOffsetMode
+		Dim pixelOffsetMode = PixelOffsetMode.Invalid As PixelOffsetMode
+		SetStatus(GdipGetPixelOffsetMode(nativeGraphics, pixelOffsetMode))
+		Return pixelOffsetMode
+	End Function
+
+	Function SetPixelOffsetMode(pixelOffsetMode As PixelOffsetMode) As Status
+		Return SetStatus(GdipSetPixelOffsetMode(nativeGraphics, pixelOffsetMode))
+	End Function
+
+	'------------------------------------------------------------------------
+	' Manipulate current world transform
+	'------------------------------------------------------------------------
+
+	Function SetTransform(ByRef matrix As /*Const*/ *Matrix) As Status
+		Return SetStatus(GdipSetWorldTransform(nativeGraphics, matrix->nativeMatrix))
+	End Function
+
+	Function ResetTransform() As Status
+		Return SetStatus(GdipResetWorldTransform(nativeGraphics))
+	End Function
+
+	Function MultiplyTransform(ByRef matrix As /*Const*/ Matrix) As Status
+		Return SetStatus(GdipMultiplyWorldTransform(nativeGraphics, matrix->nativeMatrix, MatrixOrder.Prepend))
+	End Function
+
+	Function MultiplyTransform(ByRef matrix As /*Const*/ Matrix, order As MatrixOrder) As Status
+		Return SetStatus(GdipMultiplyWorldTransform(nativeGraphics, matrix->nativeMatrix, order))
+	End Function
+
+	Function TranslateTransform(dx As Single, dy As Single) As Status
+		Return SetStatus(GdipTranslateWorldTransform(nativeGraphics, dx, dy, MatrixOrder.Prepend))
+	End Function
+
+	Function TranslateTransform(dx As Single, dy As Single, order As MatrixOrder) As Status
+		Return SetStatus(GdipTranslateWorldTransform(nativeGraphics, dx, dy, order))
+	End Function
+
+	Function ScaleTransform(sx As Single, sy As Single) As Status
+		Return SetStatus(GdipScaleWorldTransform(nativeGraphics, sx, sy, MatrixOrder.Prepend))
+	End Function
+
+	Function ScaleTransform(sx As Single, sy As Single, order As MatrixOrder) As Status
+		Return SetStatus(GdipScaleWorldTransform(nativeGraphics, sx, sy, order))
+	End Function
+
+	Function RotateTransform(angle As Single) As Status
+		Return SetStatus(GdipRotateWorldTransform(nativeGraphics, angle, MatrixOrder.Prepend))
+	End Function
+
+	Function RotateTransform(angle As Single, order As MatrixOrder) As Status
+		Return SetStatus(GdipRotateWorldTransform(nativeGraphics, angle, order))
+	End Function
+
+	Const Function GetTransform(ByRef matrix As Matrix) As Status
+		Return SetStatus(GdipGetWorldTransform(nativeGraphics, matrix->nativeMatrix))
+	End Function
+
+	Const Function TransformPoints(destSpace As CoordinateSpace, srcSpace As CoordinateSpace, pts As PointF, count As Long) As Status
+		Return SetStatus(GdipTransformPoints(nativeGraphics, destSpace, srcSpace, pts, count))
+	End Function
+
+	Const Function TransformPoints(destSpace As CoordinateSpace, srcSpace As CoordinateSpace, pts As Point, count As Long) As Status
+		Return SetStatus(GdipTransformPointsI(nativeGraphics, destSpace, srcSpace, pts, count))
+	End Function
+
+	'------------------------------------------------------------------------
+	' GetNearestColor (for <= 8bpp surfaces).	Note: Alpha is ignored.
+	'------------------------------------------------------------------------
+
+	Const Function GetNearestColor(ByRef color As Color) As Status
+		Dim argb = color->Value
+		Dim status = SetStatus(GdipGetNearestColor(nativeGraphics, argb))
+		color->Value = argb
+		Return status
+	End Function
+
+	Function DrawLine(ByRef pen As /*Const*/ Pen, x1 As Single, y1 As Single, x2 As Single, y2 As Single) As Status
+		Return SetStatus(GdipDrawLine(nativeGraphics, pen->nativePen, x1, y1, x2, y2))
+	End Function
+
+	Function DrawLine(ByRef pen As /*Const*/ Pen, ByRef pt1 As /*Const*/ PointF, ByRef pt2 As /*Const*/ PointF) As Status
+		Return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y)
+	End Function
+
+	Function DrawLines(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipDrawLines(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawLine(ByRef pen As /*Const*/ Pen, x1 As Long, y1 As Long, x2 As Long, y2 As Long) As Status
+		Return SetStatus(GdipDrawLineI(nativeGraphics, pen->nativePen, x1, y1, x2, y2))
+	End Function
+
+	Function DrawLine(ByRef pen As /*Const*/ Pen, ByRef pt1 As /*Const*/ Point, ByRef pt2 As /*Const*/ Point) As Status
+		Return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y)
+	End Function
+
+	Function DrawLines(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long) As Status
+		Return SetStatus(GdipDrawLinesI(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawArc(ByRef pen As /*Const*/ Pen, x As Single, y As Single, width As Single, height As Single, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipDrawArc(nativeGraphics, pen->nativePen, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function DrawArc(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ RectangleF, startAngle As Single, sweepAngle As Single) As Status
+		Return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function DrawArc(ByRef pen As /*Const*/ Pen, x As Long, y As Long, width As Long, height As Long, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipDrawArcI(nativeGraphics, pen->nativePen, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function DrawArc(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ RectangleF, startAngle As Single, sweepAngle As Single) As Status
+		Return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function DrawBezier(ByRef pen As /*Const*/ Pen, x1 As Single, y1 As Single, x2 As Single, y2 As Single, x3 As Single, y3 As Single, x4 As Single, y4 As Single) As Status
+		Return SetStatus(GdipDrawBezier(nativeGraphics, pen->nativePen, x1, y1,x2, y2, x3, y3, x4, y4))
+	End Function
+
+	Function DrawBezier(ByRef pen As /*Const*/ Pen, ByRef pt1 As /*Const*/ PointF, ByRef pt2 As /*Const*/ PointF, ByRef pt3 As /*Const*/ PointF, ByRef pt4 As /*Const*/ PointF) As Status
+		Return DrawBezier(pen, pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y)
+	End Function
+
+	Function DrawBeziers(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipDrawBeziers(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawBezier(ByRef pen As /*Const*/ Pen, x1 As Long, y1 As Long, x2 As Long, y2 As Long, x3 As Long, y3 As Long, x4 As Long, y4 As Long) As Status
+		Return SetStatus(GdipDrawBezierI(nativeGraphics, pen->nativePen, x1, y1, x2, y2, x3, y3, x4, y4))
+	End Function
+
+	Function DrawBezier(ByRef pen As /*Const*/ Pen, ByRef pt1 As /*Const*/ Point, ByRef pt2 As /*Const*/ Point, ByRef pt3 As /*Const*/ Point, ByRef pt4 As /*Const*/ Point) As Status
+		Return DrawBezier(pen pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y)
+	End Function
+
+	Function DrawBeziers(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point count As Long) As Status
+		Return SetStatus(GdipDrawBeziersI(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawRectangle(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ RectangleF) As Status
+		Return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawRectangle(ByRef pen As /*Const*/ Pen, x As Single, y As Single, width As Single, height As Single) As Status
+		Return SetStatus(GdipDrawRectangle(nativeGraphics, pen->nativePen, x, y, width, height))
+	End Function
+
+	Function DrawRectangles(ByRef pen As /*Const*/ Pen, rects As /*Const*/ *RectangleF, count As Long) As Status
+		Return SetStatus(GdipDrawRectangles(nativeGraphics, pen->nativePen, rects, count))
+	End Function
+
+	Function DrawRectangle(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ Rectangle) As Status
+		Return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawRectangle(ByRef pen As /*Const*/ Pen, x As Long, y As Long, width As Long, height As Long) As Status
+		Return SetStatus(GdipDrawRectangleI(nativeGraphics, pen->nativePen, x, y, width, height))
+	End Function
+
+	Function DrawRectangles(ByRef pen As /*Const*/ Pen, rects As /*Const*/ *Rectangle,  count As Long) As Status
+		Return SetStatus(GdipDrawRectanglesI(nativeGraphics, pen->nativePen, rects, count))
+	End Function
+
+	Function DrawEllipse(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ RectangleF) As Status
+		Return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawEllipse(ByRef pen As /*Const*/ Pen, x As Single, y As Single, width As Single, height As Single) As Status
+		Return SetStatus(GdipDrawEllipse(nativeGraphics, pen->nativePen, x, y, width, height))
+	End Function
+
+	Function DrawEllipse(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ Rectangle) As Status
+		Return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawEllipse(ByRef pen As /*Const*/ Pen, x As Long, y As Long, width As Long, height As Long) As Status
+		Return SetStatus(GdipDrawEllipseI(nativeGraphics, pen->nativePen, x, y, width, height))
+	End Function
+
+	Function DrawPie(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ RectangleF, startAngle As Single, sweepAngle As Single) As Status
+		Return DrawPie(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function DrawPie(ByRef pen As /*Const*/ Pen, x As Single, y As Single, width As Single, height As Single, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipDrawPie(nativeGraphics, pen->nativePen, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function DrawPie(ByRef pen As /*Const*/ Pen, ByRef rect As /*Const*/ Rectangle, startAngle As Single, sweepAngle As Single) As Status
+		Return DrawPie(pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function DrawPie(ByRef pen As /*Const*/ Pen, x As Long, y As Long, width As Long, height As Long, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipDrawPieI(nativeGraphics, pen->nativePen, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function DrawPolygon(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipDrawPolygon(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawPolygon(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long) As Status
+		Return SetStatus(GdipDrawPolygonI(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawPath(ByRef pen As /*Const*/ Pen, ByRef path As /*Const*/ GraphicsPath) As Status
+		Return SetStatus(GdipDrawPath(nativeGraphics, pen->nativePen, path->nativePath))
+'		Return SetStatus(GdipDrawPath(nativeGraphics, pen ? pen->nativePen : NULL, path ? path->nativePath : NULL))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipDrawCurve(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawCurve2(nativeGraphics, pen->nativePen, points,count, tension))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long, offset As Long, numberOfSegments As Long) As Status
+		Return SetStatus(GdipDrawCurve3(nativeGraphics, pen->nativePen, points, count, offset,numberOfSegments, 0.5))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long, offset As Long, numberOfSegments As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawCurve3(nativeGraphics, pen->nativePen, points, count, offset,numberOfSegments, tension))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long) As Status
+		Return SetStatus(GdipDrawCurveI(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawCurve2I(nativeGraphics, pen->nativePen, points, count, tension))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long, offset As Long, numberOfSegments As Long) As Status
+		Return SetStatus(GdipDrawCurve3I(nativeGraphics, pen->nativePen, points, count, offset, numberOfSegments, 0.5))
+	End Function
+
+	Function DrawCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long, offset As Long, numberOfSegments As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawCurve3I(nativeGraphics, pen->nativePen, points, count, offset, numberOfSegments, tension))
+	End Function
+
+	Function DrawClosedCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipDrawClosedCurve(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawClosedCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *PointF, count As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawClosedCurve2(nativeGraphics, pen->nativePen, points, count, tension))
+	End Function
+
+	Function DrawClosedCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long) As Status
+		Return SetStatus(GdipDrawClosedCurveI(nativeGraphics, pen->nativePen, points, count))
+	End Function
+
+	Function DrawClosedCurve(ByRef pen As /*Const*/ Pen, points As /*Const*/ *Point, count As Long, tension As Single) As Status
+		Return SetStatus(GdipDrawClosedCurve2I(nativeGraphics, pen->nativePen, points, count, tension))
+	End Function
+
+	Function Clear(ByRef color As /*Const*/ Color) As Status
+		Return SetStatus(GdipGraphicsClear(nativeGraphics, color.Value))
+	End Function
+
+	Function FillRectangle(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ RectangleF) As Status
+		Return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function FillRectangle(ByRef brush As /*Const*/ Brush, x As Single, y As Single, width As Single, height As Single) As Status
+		Return SetStatus(GdipFillRectangle(nativeGraphics, brush->nativeBrush, x, y, width, height))
+	End Function
+
+	Function FillRectangles(ByRef brush As /*Const*/ Brush, rects As /*Const*/ *RectangleF, count As Long) As Status
+		Return SetStatus(GdipFillRectangles(nativeGraphics,brush->nativeBrush,rects, count))
+	End Function
+
+	Function FillRectangle(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ Rectangle) As Status
+		Return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function FillRectangle(ByRef brush As /*Const*/ Brush, x As Long, y As Long, width As Long, height As Long) As Status
+		Return SetStatus(GdipFillRectangleI(nativeGraphics, brush->nativeBrush, x, y, width, height))
+	End Function
+
+	Function FillRectangles(ByRef brush As /*Const*/ Brush, rects As /*Const*/ *Rectangle, count As Long) As Status
+		Return SetStatus(GdipFillRectanglesI(nativeGraphics, brush->nativeBrush, rects, count))
+	End Function
+
+	Function FillPolygon(ByRef brush As /*Const*/ Brush, points As /*Const*/ *PointF, count As Long) As Status
+		Return FillPolygon(brush, points, count, FillModeAlternate)
+	End Function
+
+	Function FillPolygon(ByRef brush As /*Const*/ Brush, points As /*Const*/ *PointF, count As Long, fillMode As FillMode) As Status
+		Return SetStatus(GdipFillPolygon(nativeGraphics, brush->nativeBrush, points, count, fillMode))
+	End Function
+
+	Function FillPolygon(ByRef brush As /*Const*/ Brush, points As /*Const*/ *Point, count As Long) As Status
+		Return FillPolygon(brush, points, count, FillModeAlternate)
+	End Function
+
+	Function FillPolygon(ByRef brush As /*Const*/ Brush, points As /*Const*/ *Point, count As Long, fillMode As FillMode) As Status
+		Return SetStatus(GdipFillPolygonI(nativeGraphics, brush->nativeBrush, points, count, fillMode))
+	End Function
+
+	Function FillEllipse(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ RectangleF) As Status
+		Return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function FillEllipse(ByRef brush As /*Const*/ Brush, x As Single, y As Single, width As Single, height As Single) As Status
+		Return SetStatus(GdipFillEllipse(nativeGraphics, brush->nativeBrush, x, y, width, height))
+	End Function
+
+	Function FillEllipse(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ Rectangle) As Status
+		Return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function FillEllipse(ByRef brush As /*Const*/ Brush, x As Long, y As Long, width As Long, height As Long) As Status
+		Return SetStatus(GdipFillEllipseI(nativeGraphics, brush->nativeBrush, x, y, width, height))
+	End Function
+
+	Function FillPie(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ RectangleF, startAngle As Single, sweepAngle As Single) As Status
+		Return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function FillPie(ByRef brush As /*Const*/ Brush, x As Single, y As Single, width As Single, height As Single, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipFillPie(nativeGraphics, brush->nativeBrush, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function FillPie(ByRef brush As /*Const*/ Brush, ByRef rect As /*Const*/ Rectangle, startAngle As Single, sweepAngle As Single) As Status
+		Return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle)
+	End Function
+
+	Function FillPie(ByRef brush As /*Const*/ Brush, x As Long, y As Long, width As Long, height As Long, startAngle As Single, sweepAngle As Single) As Status
+		Return SetStatus(GdipFillPieI(nativeGraphics, brush->nativeBrush, x, y, width, height, startAngle, sweepAngle))
+	End Function
+
+	Function FillPath(ByRef brush As /*Const*/ Brush, ByRef path As /*Const*/ GraphicsPath) As Status
+		Return SetStatus(GdipFillPath(nativeGraphics, brush->nativeBrush, path->nativePath))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *PointF, count As Long) As Status
+		Return SetStatus(GdipFillClosedCurve(nativeGraphics, brush->nativeBrush, points, count))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *PointF, count As Long, fillMode As FillMode) As Status
+		Return SetStatus(GdipFillClosedCurve2(nativeGraphics, brush->nativeBrush, points, count, 0.5, fillMode))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *PointF, count As Long, fillMode As FillMode, tension As Single) As Status
+		Return SetStatus(GdipFillClosedCurve2(nativeGraphics, brush->nativeBrush, points, count, tension, fillMode))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *Point, count As Long) As Status
+		Return SetStatus(GdipFillClosedCurveI(nativeGraphics, brush->nativeBrush, points, count))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *Point, count As Long, fillMode As FillMode) As Status
+		Return SetStatus(GdipFillClosedCurve2I(nativeGraphics, brush->nativeBrush, points, count, 0.5, fillMode))
+	End Function
+
+	Function FillClosedCurve(ByRef brush As /*Const*/ Brush, points As /*Const*/ *Point, count As Long, fillMode As FillMode, tension As Single) As Status
+		Return SetStatus(GdipFillClosedCurve2I(nativeGraphics, brush->nativeBrush, points, count, tension, fillMode))
+	End Function
+
+	Function FillRegion(ByRef brush As /*Const*/ Brush, ByRef region As /*Const*/ Region) As Status
+		Return SetStatus(GdipFillRegion(nativeGraphics, brush->nativeBrush, region->nativeRegion))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF) As Status
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Return SetStatus(GdipDrawString( nativeGraphics, str, length, nativeFont, layoutRect, 0, 0))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef brush As /*Const*/ Brush) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(layoutRect) <> 0 Then
+			nativeFormat = layoutRect.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		Return SetStatus(GdipDrawString( nativeGraphics, str, length, nativeFont, layoutRect, nativeFormat, 0))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef brush As /*Const*/ Brush) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		Dim nativeBrush As *GpBrush
+		If VarPtr(brush) <> 0 Then
+			nativeBrush = brush.nativeFormat
+		Else
+			nativeBrush = 0
+		End If
+		Return SetStatus(GdipDrawString(nativeGraphics, str, length, nativeFont, layoutRect, nativeFormat, nativeBrush))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef origin As /*Const*/ PointF) As Status
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Return SetStatus(GdipDrawString(nativeGraphics, str, length, nativeFont, rect, 0, 0))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef origin As /*Const*/ PointF,
+		ByRef brush As /*Const*/ Brush) As Status
+
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeBrush As *GpBrush
+		If VarPtr(brush) <> 0 Then
+			nativeBrush = brush.nativeFormat
+		Else
+			nativeBrush = 0
+		End If
+		Return SetStatus(GdipDrawString(nativeGraphics, str, length, nativeFont, rect, 0, nativeBrush))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef origin As /*Const*/ PointF) As Status
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Return SetStatus(GdipDrawString(nativeGraphics, str, length, nativeFont, rect, 0, 0))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef origin As /*Const*/ PointF,
+		ByRef stringFormat As /*Const*/ StringFormat) As Status
+
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		Return SetStatus(GdipDrawString(nativeGraphics, str, length, nativeFont, rect, nativeFormat, 0))
+	End Function
+
+	Function DrawString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef origin As /*Const*/ PointF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef brush As /*Const*/ Brush) As Status
+
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		If VarPtr(brush) <> 0 Then
+			nativeBrush = brush.nativeFormat
+		Else
+			nativeBrush = 0
+		End If
+		Return SetStatus(GdipDrawString( nativeGraphics, str, length, nativeFont, rect, nativeFormat, nativeBrush))
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef boundingBox As RectangleF) As Status
+
+		Return MeasureString(str, length, font, layoutRect, stringFormat, boundingBox, ByVal 0, ByVal 0)
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef boundingBox As RectangleF,
+		ByRef codepointsFitted As Long) As Status
+
+		Return MeasureString(str, length, font, layoutRect, stringFormat, boundingBox, codepointsFitted, ByVal 0)
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font, ByRef layoutRect As /*Const*/ RectangleF,
+		ByRef stringFormat As /*Const*/ StringFormat, ByRef boundingBox As RectangleF,
+		ByRef codepointsFitted As Long, ByRef linesFilled As Long) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		Return SetStatus(GdipMeasureString(nativeGraphics, str, length, nativeFont, layoutRect, nativeFormat,
+			boundingBox, codepointsFitted, linesFilled))
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef layoutRectSize As /*Const*/ SizeF, ByRef stringFormat As /*Const*/ StringFormat,
+		ByRef size As SizeF) As Status
+
+			Return MeasureString, str, length, font, layoutRectSize, stringFormat, size, ByVal 0, ByVal 0)
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef layoutRectSize As /*Const*/ SizeF, ByRef stringFormat As /*Const*/ StringFormat,
+		ByRef size As SizeF, ByRef codepointsFitted As Long) As Status
+
+			Return MeasureString, str, length, font, layoutRectSize, stringFormat, size, codepointsFitted, ByVal 0)
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef layoutRectSize As /*Const*/ SizeF, ByRef stringFormat As /*Const*/ StringFormat,
+		ByRef size As SizeF, ByRef codepointsFitted As Long, ByRef linesFilled As Long) As Status
+
+		Dim layoutRect As RectangleF(0, 0, layoutRectSize.Width, layoutRectSize.Height)
+		Dim boundingBox As RectangleF, pBoundingBox As *RectangleF
+		If VarPtr(size) <> 0 Then
+			pBoundingBox = VarPtr(boundingBox)
+		Else
+			pBoundingBox = 0
+		End If
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+		Dim status = SetStatus(GdipMeasureString(nativeGraphics, str, length,
+			nativeFont, layoutRect, nativeFormat, pBoundingBox, codepointsFitted, linesFilled))
+
+		If VarPtr(size) <> 0 And status = Ok Then
+			size.Width  = boundingBox.Width
+			size.Height = boundingBox.Height
+		End Function
+
+		Return status
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef origin As /*Const*/ PointF, ByRef stringFormat As /*Const*/ StringFormat,
+		ByRef boundingBox As RectangleF) As Status
+
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0f, 0.0f)
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+
+		Return SetStatus(GdipMeasureString(nativeGraphics, str, length, nativeFont, rect, nativeFormat, boundingBox, 0, 0))
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef layoutRect As /*Const*/ RectangleF, ByRef boundingBox As RectangleF) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+
+		Return SetStatus(GdipMeasureString(nativeGraphics, str, length, nativeFont, layoutRect, 0, boundingBox, 0, 0))
+	End Function
+
+	Const Function MeasureString(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef origin As /*Const*/ PointF, ByRef boundingBox As RectangleF) As Status
+		Dim rect As RectangleF(origin.X, origin.Y, 0.0, 0.0)
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Return SetStatus(GdipMeasureString(nativeGraphics, str, length, nativeFont, rect, 0, boundingBox, 0, 0))
+	End Function
+
+	Const Function MeasureCharacterRanges(str As PCWSTR, length As Long, ByRef font As /*Const*/ Font,
+		ByRef layoutRect As /*Const*/ RectangleF, ByRef stringFormat As /*Const*/ StringFormat,
+		regionCount As Long, regions As *Region) As Status
+		If regions = 0 Or regionCount <= 0 Then
+			Return InvalidParameter
+		End If
+
+		Dim nativeRegions = _System_malloc(regionCount * SizeOf (GpRegion*)) As **GpRegion
+
+		If nativeRegions = 0 Then
+			Return OutOfMemory
+		End If
+
+		Dim i As Long
+		For i = 0 To regionCount
+			nativeRegions[i] = regions[i].nativeRegion
+		Next
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeFormat As *GpStringFormat
+		If VarPtr(stringFormat) <> 0 Then
+			nativeFormat = stringFormat.nativeFormat
+		Else
+			nativeFormat = 0
+		End If
+
+		Dim status = SetStatus(GdipMeasureCharacterRanges(nativeGraphics,
+			str, length, nativeFont, layoutRect, nativeFormat,regionCount, nativeRegions))
+		_System_free(nativeRegions)
+		Return status
+	End Function
+
+	Function DrawDriverString(text As /*Const*/ Word, length As Long, ByRef font As /*Const*/ Font,
+		ByRef brush As /*Const*/ Brush, positions As /*Const*/ *PointF, flags As Long) As Status
+
+		Return DrawDriverString(text, length, font, brush, positions, flags, ByVal 0)
+	End Function
+
+	Function DrawDriverString(text As /*Const*/ Word, length As Long, ByRef font As /*Const*/ Font,
+		ByRef brush As /*Const*/ Brush, positions As /*Const*/ *PointF, flags As Long, ByRef matrix As /*Const*/ Matrix) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeBrush As *GpBrush
+		If VarPtr(brush) <> 0 Then
+			nativeBrush = brush.nativeBrush
+		Else
+			nativeBrush = 0
+		End If
+		Dim nativeMatrix As *GpMatrix
+		If VarPtr(matrix) <> 0 Then
+			nativeMatrix = matrix.nativeMatrix
+		Else
+			nativeMatrix = 0
+		End If
+		Return SetStatus(GdipDrawDriverString(nativeGraphics, text, length, nativeFont, nativeBrush, positions, flags, nativeMatrix))
+	End Function
+
+	Const Function MeasureDriverString(text As /*Const*/ Word, length As Long, ByRef font As /*Const*/ Font,
+		positions As /*Const*/ *PointF, flags As Long, ByRef matrix As /*Const*/ Matrix, ByRef boundingBox As RectangleF) As Status
+
+		Dim nativeFont As *GpFont
+		If VarPtr(font) <> 0 Then
+			nativeFont = font.nativeFormat
+		Else
+			nativeFont = 0
+		End If
+		Dim nativeMatrix As *GpMatrix
+		If VarPtr(matrix) <> 0 Then
+			nativeMatrix = matrix.nativeMatrix
+		Else
+			nativeMatrix = 0
+		End If
+		Return SetStatus(GdipMeasureDriverString(nativeGraphics, text, length, nativeFont, positions, flags, nativeMatrix, boundingBox))
+	End Function
+
+	' 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.
+
+	Function DrawCachedBitmap(ByRef cb As CachedBitma, x As Long, y As Long) As Status
+		Return SetStatus(GdipDrawCachedBitmap(nativeGraphics, cb->nativeCachedBitmap, x, y))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef point As /*Const*/ PointF) As Status
+		Return DrawImage(image, point.X, point.Y)
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Single, y As Single) As Status
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImage(nativeGraphics, nativeImage, x, y))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef rect As /*Const*/ RectangleF) As Status
+		Return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Single, y As Single, width As Single, height As Single) As Status
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImageRect(nativeGraphics, nativeImage, x, y, width, height))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef point As /*Const*/ Point) As Status
+		Return DrawImage(image, point.X, point.Y) As Status
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Long, y As Long) As Status
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImageI(nativeGraphics, nativeImage, x, y))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef rect As /*Const*/ Rectangle) As Status
+		Return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height)
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Long, y As Long, width As Long, height As Long) As Status
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImageRectI(nativeGraphics, nativeImage, x, y, width, height))
+	End Function
+
+	' 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
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ PointF, count As Long) As Status
+		If count <> 3 And count <> 4 Then
+			Return SetStatus(InvalidParameter)
+		End If
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImagePoints(nativeGraphics, nativeImage, destPoints, count))
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ Point, count As Long) As Status
+		If count <> 3 And count <> 4 Then
+			Return SetStatus(InvalidParameter)
+		End If
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImagePointsI(nativeGraphics, nativeImage, destPoints, count))
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Single, y As Single,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImagePointRect(nativeGraphics, nativeImage, x, y, srcx, srcy, srcwidth, srcheight, srcUnit))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ RectangleF,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, 0, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ RectangleF,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ RectangleF,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes,
+		callback As DrawImageAbort) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ RectangleF,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipDrawImageRectRect(nativeGraphics, nativeImageAttr,
+			destRect.X, destRect.Y, destRect.Width, destRect.Height, srcx, srcy, srcwidth, srcheight,
+			srcUnit, nativeImageAttr, callback, callbackData))
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ PointF, count As Long,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, 0, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ PointF, count As Long,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ PointF, count As Long,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes,
+		callback As DrawImageAbort) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ PointF, count As Long,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipDrawImagePointsRect(nativeGraphics, nativeImage, destPoints, count,
+			srcx, srcy, srcwidth, srcheight, srcUnit, nativeImageAttr, callback, callbackData))
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Long, y As Long,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Return SetStatus(GdipDrawImagePointRectI(nativeGraphics, nativeImage, x, y, srcx, srcy, srcwidth, srcheight, srcUnit))
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ Rectangle,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, 0, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ Rectangle,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ Rectangle,
+		srcx As Single, srcy As Single, srcwidth As Single, srcheight As Single, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort) As Status
+
+		Return DrawImage(image, destRect, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, ByRef destRect As /*Const*/ Rectangle,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipDrawImageRectRectI(nativeGraphics, nativeImage,
+			destRect.X, destRect.Y, destRect.Width, destRect.Height,
+			srcx, srcy, srcwidth, srcheight, srcUnit, nativeImageAttr, callback, callbackData))
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ Point, count As Long,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, 0, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ Point, count As Long,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, 0, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ Point, count As Long,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes,
+		DrawImageAbort callback As DrawImageAbort) As Status
+
+		Return DrawImage(image, destPoints, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, 0)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ Point, count As Long,
+		srcx As Long, srcy As Long, srcwidth As Long, srcheight As Long, srcUnit As GraphicsUnit,
+		ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+
+		Dim nativeImage As *GpImage
+		If VarPtr(image) <> 0 Then
+			nativeImage = image.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipDrawImagePointsRectI(nativeGraphics, nativeImage, destPoints, count,
+			srcx, srcy, srcwidth, srcheight, srcUnit, nativeImageAttr, callback, callbackData))
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As Rectangle, srcUnit As GraphicsUnit) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As RectangleF, srcUnit As GraphicsUnit) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit)
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Long, y As Long, ByRef srcRect As Rectangle, srcUnit As GraphicsUnit) As Status
+		Return DrawImage(image, x, y, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit)
+	End Function
+
+	Function DrawImage(ByRef image As Image, x As Single, y As Single, ByRef srcRect As RectangleF, srcUnit As GraphicsUnit) As Status
+		Return DrawImage(image, x, y, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As Rectangle, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As RectangleF, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As Rectangle, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes, callback)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As RectangleF, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes, callback)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As Rectangle, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes, callback, callbackData)
+	End Function
+
+	Function DrawImage(ByRef image As Image, destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As RectangleF, srcUnit As GraphicsUnit, ByRef imageAttributes As /*Const*/ ImageAttributes, callback As DrawImageAbort, callbackData As VoidPtr) As Status
+		Return DrawImage(image, destPoints, count, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit, imageAttributes, callback, callbackData)
+	End Function
+
+	' 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.
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ PointF,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ PointF,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ PointF,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestPoint(nativeGraphics,
+			nativeImage, destPoint, callback, callbackData,nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ Point,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ Point,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destPoint As /*Const*/ Point,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestPointI(nativeGraphics,
+			nativeImage, destPoint, callback, callbackData,nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ RectangleF,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destRect, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ RectangleF,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destRect, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ RectangleF,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestRect(nativeGraphics,
+			nativeImage, destRect, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ Rectangle,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destRect, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ Rectangle,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destRect, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, ByRef destRect As /*Const*/ Rectangle,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestRectI(nativeGraphics,
+			nativeImage, destRect, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *PointF, count As Long,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *PointF, count As Long,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *PointF, count As Long,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestPoints(nativeGraphics,
+			nativeImage,destPoints, count, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *Point, count As Long,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *Point, count As Long,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile, destPoints As /*Const*/ *Point, count As Long,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileDestPointsI(nativeGraphics,
+			nativeImage,destPoints, count, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ PointF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, count, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ PointF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ PointF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestPoint(nativeGraphics,
+			nativeImage, destPoint, srcRect, srcUnit, callback, callbackData, nativeImageAttr)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ Point, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, count, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ Point, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoint, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destPoint As /*Const*/ Point, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestPointI(nativeGraphics,
+			nativeImage, destPoint, srcRect, srcUnit, callback, callbackData, nativeImageAttr)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ RectangleF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destRect, count, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ RectangleF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destRect, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ RectangleF, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestRect(nativeGraphics,
+			nativeImage, destRect, srcRect, srcUnit, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ Rectangle, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destRect, srcRect, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ Rectangle, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destRect, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		ByRef destRect As /*Const*/ Rectangle, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestRectI(nativeGraphics,
+			nativeImage, destRect, srcRect, srcUnit, callback, callbackData, nativeImageAttr))
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, srcRect, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *PointF, count As Long, ByRef srcRect As /*Const*/ RectangleF, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestPoints(nativeGraphics,
+			nativeImage, destPoints, count, srcRect, srcUnit, callback, callbackData, nativeImageAttr)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, srcRect, srcUnit, callback, 0, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr) As Status
+
+		Return EnumerateMetafile(metafile, destPoints, count, srcRect, srcUnit, callback, callbackData, 0)
+	End Function
+
+	Function EnumerateMetafile(ByRef metafile As /*Const*/ Metafile,
+		destPoints As /*Const*/ *Point, count As Long, ByRef srcRect As /*Const*/ Rectangle, srcUnit As GraphicsUnit,
+		callback As EnumerateMetafileProc, callbackData As VoidPtr, ByRef imageAttributes As /*Const*/ ImageAttributes) As Status
+
+		Dim nativeImage As /*Const*/ *GpMetafile
+		If VarPtr(metafile) <> 0 Then
+			nativeImage = metafile.nativeImage
+		Else
+			nativeImage = 0
+		End If
+		Dim nativeImageAttr As *GpImageAttributes
+		If VarPtr(imageAttributes) <> 0 Then
+			nativeImageAttr = image.nativeImageAttr
+		Else
+			nativeImageAttr = 0
+		End If
+
+		Return SetStatus(GdipEnumerateMetafileSrcRectDestPointsI(nativeGraphics,
+			nativeImage, destPoints, count, srcRect, srcUnit, callback, callbackData, nativeImageAttr)
+	End Function
+
+	Function SetClip(ByRef g As /*Const*/ Graphics) As Status
+		Return SetClip(g, CombineMode.Replace)
+	End Function
+
+	Function SetClip(ByRef rc As /*Const*/ RectangleF) As Status
+		Return SetStatus(GdipSetClipRect(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Replace))
+	End Function
+
+	Function SetClip(ByRef rc As /*Const*/ Rectangle) As Status
+		Return SetStatus(GdipSetClipRectI(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Replace))
+	End Function
+
+	Function SetClip(ByRef path As /*Const*/ GraphicsPath) As Status
+		Return SetStatus(GdipSetClipPath(nativeGraphics, path->nativePath, CombineMode.Replace))
+	End Function
+
+	Function SetClip(ByRef region As /*Const*/ Region) As Status
+		Return SetStatus(GdipSetClipRegion(nativeGraphics, region->nativeRegion, CombineMode.Replace))
+	End Function
+
+	Function SetClip(ByRef g As /*Const*/ Graphics, combineMode As CombineMode) As Status
+		Return SetStatus(GdipSetClipGraphics(nativeGraphics, g->nativeGraphics, combineMode))
+	End Function
+
+	Function SetClip(ByRef rc As /*Const*/ RectangleF, combineMode As CombineMode) As Status
+		Return SetStatus(GdipSetClipRect(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, combineMode))
+	End Function
+
+	Function SetClip(ByRef rc As /*Const*/ Rectangle, combineMode As CombineMode) As Status
+		Return SetStatus(GdipSetClipRectI(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, combineMode))
+	End Function
+
+	Function SetClip(ByRef path As /*Const*/ GraphicsPath, combineMode As CombineMode) As Status
+		Return SetStatus(GdipSetClipPath(nativeGraphics, path->nativePath, combineMode))
+	End Function
+
+	Function SetClip(ByRef region As /*Const*/ Region, combineMode As CombineMode) As Status
+		Return SetStatus(GdipSetClipRegion(nativeGraphics, region->nativeRegion, combineMode))
+	End Function
+
+	' 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.
+
+	Function SetClip(hrgn As HRGN, combineMode As CombineMode /* = CombineModeReplace*/) As Status
+		Return SetStatus(GdipSetClipHrgn(nativeGraphics, hrgn, combineMode))
+	End Function
+
+	Function IntersectClip(ByRef rc As /*Const*/ RectangleF) As Status
+		Return SetStatus(GdipSetClipRect(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Intersect))
+	End Function
+
+	Function IntersectClip(ByRef rc As /*Const*/ Rectangle) As Status
+		Return SetStatus(GdipSetClipRectI(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Intersect))
+	End Function
+
+	Function IntersectClip(ByRef region As /*Const*/ Region) As Status
+		Return SetStatus(GdipSetClipRegion(nativeGraphics, region->nativeRegion, CombineMode.Intersect))
+	End Function
+
+	Function ExcludeClip(ByRef rc As /*Const*/ RectangleF) As Status
+		Return SetStatus(GdipSetClipRect(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Exclude))
+	End Function
+
+	Function ExcludeClip(ByRef rc As /*Const*/ Rectangle) As Status
+		Return SetStatus(GdipSetClipRectI(nativeGraphics, rc.X, rc.Y, rc.Width, rc.Height, CombineMode.Exclude))
+	End Function
+
+	Function ExcludeClip(ByRef region As /*Const*/ Region) As Status
+		Return SetStatus(GdipSetClipRegion(nativeGraphics, region->nativeRegion, CombineMode.Exclude))
+	End Function
+
+	Function ResetClip() As Status
+		Return SetStatus(GdipResetClip(nativeGraphics))
+	End Function
+
+	Function TranslateClip(dx As Single, dy As Single) As Status
+		Return SetStatus(GdipTranslateClip(nativeGraphics, dx, dy))
+	End Function
+
+	Function TranslateClip(dx As Long, dy As Long) As Status
+		Return SetStatus(GdipTranslateClipI(nativeGraphics, dx, dy))
+	End Function
+
+	Const Function GetClip(ByRef region As Region) As Status
+		Return SetStatus(GdipGetClip(nativeGraphics, region->nativeRegion))
+	End Function
+
+	Const Function GetClipBounds(ByRef rc As RectangleF) As Status
+		Return SetStatus(GdipGetClipBounds(nativeGraphics, rc))
+	End Function
+
+	Const Function GetClipBounds(ByRef rc As Rectangle) As Status
+		Return SetStatus(GdipGetClipBoundsI(nativeGraphics, rc))
+	End Function
+
+	Const Function GetVisibleClipBounds(ByRef rc As RectangleF) As Status
+		Return SetStatus(GdipGetVisibleClipBounds(nativeGraphics, rc))
+	End Function
+
+	Const Function GetVisibleClipBounds(ByRef rc As Rectangle) As Status
+		Return SetStatus(GdipGetVisibleClipBoundsI(nativeGraphics, rc))
+	End Function
+
+	Const Function IsVisible(x As Long, y As Long) As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsVisiblePointI(nativeGraphics, x, y, b))
+		Return b
+	End Function
+
+	Const Function IsVisible(ByRef pt As /*Const*/ Point) As BOOL
+		Return IsVisible(pt.X, pt.Y)
+	End Function
+
+	Const Function IsVisible(x As Long, y As Long, width As Long, height As Long) As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsVisibleRectI(nativeGraphics, x, y, width, height, b))
+		Return b
+	End Function
+
+	Const Function IsVisible(ByRef rc As /*Const*/ Rectangle) As BOOL
+		Return IsVisible(rc.X, rc.Y, rc.Width, rc.Height)
+	End Function
+
+	Const Function IsVisible(x As Single, y As Single) As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsVisiblePoint(nativeGraphics, x, y, b))
+		Return b
+	End Function
+
+	Const Function IsVisible(ByRef point As /*Const*/ PointF) As BOOL
+		Return IsVisible(pt.X, pt.Y)
+	End Function
+
+	Const Function IsVisible(x As Single, y As Single, width As Single, height As Single) As BOOL
+		Dim b = FALSE As BOOL
+		SetStatus(GdipIsVisibleRect(nativeGraphics, x, y, width, height, b))
+		Return b
+	End Function
+
+	Const Function IsVisible(ByRef rect As /*Const*/ RectangleF) As BOOL
+		Return IsVisible(rc.X, rc.Y, rc.Width, rc.Height)
+	End Function
+
+	Const Function Save() As GraphicsState
+		Dim gstate As GraphicsState
+		SetStatus(GdipSaveGraphics(nativeGraphics, state))
+		Return gstate
+	End Function
+
+	Function Restore(gstate As GraphicsState)
+		Return SetStatus(GdipRestoreGraphics(nativeGraphics, gstate))
+	End Function
+
+	Function BeginContainer(ByRef dstrect As /*Const*/ RectangleF, ByRef srcrect As /*Const*/ RectangleF, unit As GraphicsUnit) As GraphicsContainer
+		Dim state As GraphicsContainer
+		SetStatus(GdipBeginContainer(nativeGraphics, dstrect, srcrect, unit, state))
+		Return state
+	End Function
+
+	Function BeginContainer(ByRef dstrect As /*Const*/ Rectangle, ByRef srcrect As /*Const*/ Rectangle, unit As GraphicsUnit) As GraphicsContainer
+		Dim state As GraphicsContainer
+		SetStatus(GdipBeginContainerI(nativeGraphics, dstrect, srcrect, unit, state))
+		Return state
+	End Function
+
+	Function BeginContainer() As GraphicsContainer
+		Dim state As GraphicsContainer
+		SetStatus(GdipBeginContainer2(nativeGraphics, state))
+		Return state
+	End Function
+
+	Function EndContainer(state As GraphicsContainer) As Status
+		Return SetStatus(GdipEndContainer(nativeGraphics, state))
+	End Function
+
+	' Only valid when recording metafiles.
+
+	Function AddMetafileComment(data As /*Const*/ *Byte, sizeData As DWord)
+		Return SetStatus(GdipComment(nativeGraphics, sizeData, data))
+	End Function
+
+	Static Function GetHalftonePalette() As HPALETTE
+		Return GdipCreateHalftonePalette()
+	End Function
+
+	Const Function GetLastStatus() As Status
+		Dim lastStatus = lastResult
+		lastResult = Status.Ok
+		Return lastStatus
+	End Function
+
+Private
+	Sub Graphics(ByRef gr As Graphics)
+		Debug
+	End Sub
+	Sub Operator =(ByRef gr As Graphics)
+		Debug
+	End Sub
+
+Protected
+	Sub Graphics(graphics As *GpGraphics)
+		lastResult = Ok
+		SetNativeGraphics(graphics)
+	End Sub
+
+	Sub SetNativeGraphics(graphics As *GpGraphics)
+		This.nativeGraphics = graphics
+	End Sub
+
+	Const Function SetStatus(status As Status) As Status
+		If status <> Status.Ok Then
+			lastResult = status
+		End If
+		Return status
+	End Function
+
+	Const Function GetNativeGraphics() As *GpGraphics
+		Return This.nativeGraphics
+	End Function
+
+	Function GetNativePen(const Pen* pen) As *GpPen
+		Return pen->nativePen
+	End Function
+
+Protected
+	nativeGraphics As *GpGraphics
+	lastResult As /*Mutable*/ Status
+End Class
+
+#endif
Index: /Include/Classes/System/Drawing/misc.ab
===================================================================
--- /Include/Classes/System/Drawing/misc.ab	(revision 32)
+++ /Include/Classes/System/Drawing/misc.ab	(revision 33)
@@ -26,3 +26,13 @@
 End Enum
 
+Const Enum GraphicsUnit
+	World       ' 0
+	Display     ' 1
+	Pixel       ' 2
+	Point       ' 3
+	Inch        ' 4
+	Document    ' 5
+	Millimeter  ' 6
+End Enum
+
 #endif '__SYSTEM_DRAWING_MISC_AB__
Index: /Include/GdiPlusEnums.ab
===================================================================
--- /Include/GdiPlusEnums.ab	(revision 32)
+++ /Include/GdiPlusEnums.ab	(revision 33)
@@ -8,41 +8,4 @@
 TypeDef GraphicsState = DWord
 TypeDef GraphicsContainer = DWord
-
-Const Enum FillMode
-	FillModeAlternate         ' 0
-	FillModeWinding           ' 1
-End Enum
-
-
-Const Enum QualityMode
-	QualityModeInvalid   = -1
-	QualityModeDefault   = 0
-	QualityModeLow       = 1  ' Best performance
-	QualityModeHigh      = 2  ' Best rendering quality
-End Enum
-
-Const Enum CompositingMode
-	CompositingModeSourceOver     ' 0
-	CompositingModeSourceCopy     ' 1
-End Enum
-
-Const Enum CompositingQuality
-	CompositingQualityInvalid          = QualityModeInvalid
-	CompositingQualityDefault          = QualityModeDefault
-	CompositingQualityHighSpeed        = QualityModeLow
-	CompositingQualityHighQuality      = QualityModeHigh
-	CompositingQualityGammaCorrected
-	CompositingQualityAssumeLinear
-End Enum
-
-Const Enum Unit
-	UnitWorld       ' 0
-	UnitDisplay     ' 1
-	UnitPixel       ' 2
-	UnitPoint       ' 3
-	UnitInch        ' 4
-	UnitDocument    ' 5
-	UnitMillimeter  ' 6
-End Enum
 
 Const Enum MetafileFrameUnit
@@ -53,10 +16,4 @@
 	MetafileFrameUnitMillimeter = 6
 	MetafileFrameUnitGdi
-End Enum
-
-Const Enum CoordinateSpace
-	CoordinateSpaceWorld      ' 0
-	CoordinateSpacePage       ' 1
-	CoordinateSpaceDevice     ' 2
 End Enum
 
@@ -198,29 +155,8 @@
 End Enum
 
-Const Enum CombineMode
-	CombineModeReplace      ' 0
-	CombineModeIntersect    ' 1
-	CombineModeUnion        ' 2
-	CombineModeXor          ' 3
-	CombineModeExclude      ' 4
-	CombineModeComplement   ' 5
-End Enum
-
 Const Enum ImageType
 	ImageTypeUnknown    ' 0
 	ImageTypeBitmap     ' 1
 	ImageTypeMetafile   ' 2
-End Enum
-
-Const Enum InterpolationMode
-	InterpolationModeInvalid          = QualityModeInvalid
-	InterpolationModeDefault          = QualityModeDefault
-	InterpolationModeLowQuality       = QualityModeLow
-	InterpolationModeHighQuality      = QualityModeHigh
-	InterpolationModeBilinear
-	InterpolationModeBicubic
-	InterpolationModeNearestNeighbor
-	InterpolationModeHighQualityBilinear
-	InterpolationModeHighQualityBicubic
 End Enum
 
@@ -239,15 +175,10 @@
 
 Const Enum PenType
-   PenTypeSolidColor       = BrushTypeSolidColor
-   PenTypeHatchFill        = BrushTypeHatchFill
-   PenTypeTextureFill      = BrushTypeTextureFill
-   PenTypePathGradient     = BrushTypePathGradient
-   PenTypeLinearGradient   = BrushTypeLinearGradient
-   PenTypeUnknown          = -1
-End Enum
-
-Const Enum MatrixOrder
-	MatrixOrderPrepend    = 0
-	MatrixOrderAppend     = 1
+	PenTypeSolidColor       = BrushTypeSolidColor
+	PenTypeHatchFill        = BrushTypeHatchFill
+	PenTypeTextureFill      = BrushTypeTextureFill
+	PenTypePathGradient     = BrushTypePathGradient
+	PenTypeLinearGradient   = BrushTypeLinearGradient
+	PenTypeUnknown          = -1
 End Enum
 
@@ -256,5 +187,4 @@
 	GenericFontFamilySansSerif
 	GenericFontFamilyMonospace
-
 End Enum
 
@@ -266,31 +196,4 @@
 	FontStyleUnderline  = 4
 	FontStyleStrikeout  = 8
-End Enum
-
-Const Enum SmoothingMode
-	SmoothingModeInvalid     = QualityModeInvalid
-	SmoothingModeDefault     = QualityModeDefault
-	SmoothingModeHighSpeed   = QualityModeLow
-	SmoothingModeHighQuality = QualityModeHigh
-	SmoothingModeNone
-	SmoothingModeAntiAlias
-End Enum
-
-Const Enum PixelOffsetMode
-	PixelOffsetModeInvalid     = QualityModeInvalid
-	PixelOffsetModeDefault     = QualityModeDefault
-	PixelOffsetModeHighSpeed   = QualityModeLow
-	PixelOffsetModeHighQuality = QualityModeHigh
-	PixelOffsetModeNone
-	PixelOffsetModeHalf
-End Enum
-
-Const Enum TextRenderingHint
-	TextRenderingHintSystemDefault = 0
-	TextRenderingHintSingleBitPerPixelGridFit
-	TextRenderingHintSingleBitPerPixel
-	TextRenderingHintAntiAliasGridFit
-	TextRenderingHintAntiAlias
-	TextRenderingHintClearTypeGridFit
 End Enum
 
@@ -665,9 +568,4 @@
 End Enum
 
-Const Enum FlushIntention
-	FlushIntentionFlush = 0
-	FlushIntentionSync = 1
-End Enum
-
 Const Enum EncoderParameterValueType
 	EncoderParameterValueTypeByte           = 1
Index: /Include/GdiPlusFlat.ab
===================================================================
--- /Include/GdiPlusFlat.ab	(revision 32)
+++ /Include/GdiPlusFlat.ab	(revision 33)
@@ -518,10 +518,10 @@
 Declare Function GdipEnumerateMetafileDestPoints Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *PointF, ByVal count As Long, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
 Declare Function GdipEnumerateMetafileDestPointsI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *Point, ByVal count As Long, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestPoint Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destPoint As PointF, ByRef srcRect As GpRectF, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestPointI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destPoint As Point, ByRef srcRect As GpRect, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestRect Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destRect As GpRectF, ByRef srcRect As GpRectF, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestRectI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destRect As GpRect, ByRef srcRect As GpRect, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestPoints Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *PointF, ByVal count As Long, ByRef srcRect As GpRectF, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
-Declare Function GdipEnumerateMetafileSrcRectDestPointsI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *Point, ByVal count As Long, ByRef srcRect As GpRect, ByVal srcUnit As Unit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestPoint Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destPoint As PointF, ByRef srcRect As GpRectF, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestPointI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destPoint As Point, ByRef srcRect As GpRect, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestRect Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destRect As GpRectF, ByRef srcRect As GpRectF, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestRectI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByRef destRect As GpRect, ByRef srcRect As GpRect, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestPoints Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *PointF, ByVal count As Long, ByRef srcRect As GpRectF, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
+Declare Function GdipEnumerateMetafileSrcRectDestPointsI Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal metafile As GpMetafile, ByVal destPoints As *Point, ByVal count As Long, ByRef srcRect As GpRect, ByVal srcUnit As GraphicsUnit, ByVal callback As EnumerateMetafileProc, ByVal callbackData As VoidPtr, ByVal callbackData As VoidPtr) As GpStatus
 Declare Function GdipPlayMetafileRecord Lib "gdiplus.dll" (ByVal metafile As GpMetafile, ByVal recordType As EmfPlusRecordType, ByVal flags As DWord, dataSize As DWord, ByVal data As *Byte) As GpStatus
 Declare Function GdipSetClipGraphics Lib "gdiplus.dll" (ByVal graphics As *GpGraphics, ByVal srcgraphics As *GpGraphics, ByVal combineMode As CombineMode) As GpStatus
@@ -597,5 +597,5 @@
 Declare Function GdipCreateFontFromLogfontA Lib "gdiplus.dll" (ByVal hdc As HDC, ByRef logfont As LOGFONTA, ByRef font As *GpFont) As GpStatus
 Declare Function GdipCreateFontFromLogfontW Lib "gdiplus.dll" (ByVal hdc As HDC, ByRef logfont As LOGFONTW, ByRef font As *GpFont) As GpStatus
-Declare Function GdipCreateFont Lib "gdiplus.dll" (ByVal fontFamily As *GpFontFamily, ByVal emSize As Single, ByVal style As Long, ByVal unit As Unit, ByRef font As *GpFont) As GpStatus
+Declare Function GdipCreateFont Lib "gdiplus.dll" (ByVal fontFamily As *GpFontFamily, ByVal emSize As Single, ByVal style As Long, ByVal unit As GraphicsUnit, ByRef font As *GpFont) As GpStatus
 Declare Function GdipCloneFont Lib "gdiplus.dll" (ByVal font As *GpFont, ByRef cloneFont As *GpFont) As GpStatus
 Declare Function GdipDeleteFont Lib "gdiplus.dll" (ByVal font As *GpFont) As GpStatus
@@ -603,5 +603,5 @@
 Declare Function GdipGetFontStyle Lib "gdiplus.dll" (ByVal font As *GpFont, ByRef style As Long) As GpStatus
 Declare Function GdipGetFontSize Lib "gdiplus.dll" (ByVal font As *GpFont, ByRef size As Single) As GpStatus
-Declare Function GdipGetFontUnit Lib "gdiplus.dll" (ByVal font As *GpFont, ByRef unit As Unit) As GpStatus
+Declare Function GdipGetFontUnit Lib "gdiplus.dll" (ByVal font As *GpFont, ByRef unit As GraphicsUnit) As GpStatus
 Declare Function GdipGetFontHeight Lib "gdiplus.dll" (ByVal font As *GpFont, ByVal graphics As *GpGraphics, ByRef height As Single) As GpStatus
 Declare Function GdipGetFontHeightGivenDPI Lib "gdiplus.dll" (ByVal font As *GpFont, ByVal dpi As Single, ByRef height As Single) As GpStatus
Index: /Include/GdiPlusGpStubs.ab
===================================================================
--- /Include/GdiPlusGpStubs.ab	(revision 32)
+++ /Include/GdiPlusGpStubs.ab	(revision 33)
@@ -3,4 +3,6 @@
 #ifndef __GDIPLUSGPSTUBS_AB__
 #define __GDIPLUSGPSTUBS_AB__
+
+#include <Classes/System/Drawing/Drawing2D/Matrix.ab>
 
 Class GpGraphics
@@ -97,7 +99,4 @@
 TypeDef GpPathData = PathData
 
-Type Matrix
-End Type
-
 #endif '__GDIPLUSGPSTUBS_AB__
 
