view dwt/internal/gdip/Gdip.d @ 339:210994f12c4c

Fixes for dmd 1.041 and tango 0.99.8
author Frank Benoit <benoit@tionex.de>
date Sat, 28 Mar 2009 03:12:07 +0100
parents 27479f54069d
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2000, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    IBM Corporation - initial API and implementation
 * Port to the D programming language:
 *    John Reimer <terminal.node@gmail.com>
 *    Frank Benoit <benoit@tionex.de>
 *******************************************************************************/

module dwt.internal.gdip.Gdip;

import dwt.internal.gdip.native;

import dwt.internal.Library;
import dwt.internal.Platform;
import dwt.internal.win32.WINTYPES;
import dwt.internal.win32.WINAPI;
import dwt.internal.win32.OS;
import tango.sys.win32.UserGdi;

alias dwt.internal.gdip.native.GdiplusStartupInput  GdiplusStartupInput;
alias dwt.internal.gdip.native.GdiplusStartupOutput GdiplusStartupOutput;

/******************************************************************************

    Gdip Class: provides access to the Gdi+ interface

/*****************************************************************************/

public class Gdip : Platform
{
    static this(){
        if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) {
            loadLib_Gdip();
        }
    }
    /**************************************************************************

    **************************************************************************/

private:

    static FontFamily GenericSansSerifFontFamily = null;
    static FontFamily GenericSerifFontFamily     = null;
    static FontFamily GenericMonospaceFontFamily = null;

    /**************************************************************************

    **************************************************************************/

    struct FontFamily_T
    {
        Handle  nativeFamily;
        Status  lastResult;
    }

    struct StringFormat_T
    {

        StringFormat format;
        Status  lastError;
    }

    static ubyte GenericTypographicStringFormatBuffer[StringFormat_T.sizeof] = 0;
    static ubyte GenericDefaultStringFormatBuffer [StringFormat_T.sizeof] = 0;
    static ubyte GenericSansSerifFontFamilyBuffer [FontFamily_T.sizeof] = 0;
    static ubyte GenericSerifFontFamilyBuffer     [FontFamily_T.sizeof] = 0;
    static ubyte GenericMonospaceFontFamilyBuffer [FontFamily_T.sizeof] = 0;

    /**************************************************************************

    **************************************************************************/

public:

    alias GpPoint           Point;
    alias GpPointF          PointF;
    alias GpRect            Rect;
    alias GpRectF           RectF;
    alias GpBitmapData      BitmapData;
    alias GpColorPalette    ColorPalette;
    alias GpDrawImageAbort  DrawImageAbort;
    alias GpColorMatrix     ColorMatrix;

    alias GpFontFamily          FontFamily;
    alias GpImage               Image;
    alias GpBrush               Brush;
    alias GpFont                Font;
    alias GpFontCollection      FontCollection;
    alias GpGraphics            Graphics;
    alias GpGraphicsPath        GraphicsPath;
    alias GpImageAttributes     ImageAttributes;
    alias GpHatchBrush          HatchBrush;
    alias GpLinearGradientBrush LinearGradientBrush;
    alias GpMatrix              Matrix;
    alias GpPen                 Pen;
    alias GpRegion              Region;
    alias GpSolidBrush          SolidBrush;
    alias GpStringFormat        StringFormat;
    alias GpTextureBrush        TextureBrush;
    alias GpPath                Path;

    alias Image  Bitmap;

    alias  uint  ARGB;

    alias dwt.internal.gdip.native.GdiplusStartupInput  GdiplusStartupInput;
    alias dwt.internal.gdip.native.GdiplusStartupOutput GdiplusStartupOutput;

    /**************************************************************************

        Gdi+ Constants

    **************************************************************************/

    enum {
        BrushTypeSolidColor = 0,
        BrushTypeHatchFill = 1,
        BrushTypeTextureFill = 2,
        BrushTypePathGradient = 3,
        BrushTypeLinearGradient = 4,
        //  ColorAdjustTypeBitmap = 1,
        ColorMatrixFlagsDefault = 0,
        CombineModeReplace = 0,
        CombineModeIntersect = 1,
        CombineModeUnion = 2,
        CombineModeXor = 3,
        CombineModeExclude = 4,
        CombineModeComplement = 5,
        FillModeAlternate = 0,
        FillModeWinding = 1,
        DashCapFlat = 0,
        DashCapRound = 2,
        DashCapTriangle = 3,
        DashStyleSolid = 0,
        DashStyleDash = 1,
        DashStyleDot = 2,
        DashStyleDashDot = 3,
        DashStyleDashDotDot = 4,
        DashStyleCustom = 5,
        FontStyleRegular = 0,
        FontStyleBold = 1,
        FontStyleItalic = 2,
        FontStyleBoldItalic = 3,
        FontStyleUnderline = 4,
        FontStyleStrikeout = 8,
        PaletteFlagsHasAlpha = 0x0001,
        FlushIntentionFlush = 0,
        FlushIntentionSync = 1,
        HotkeyPrefixNone = 0,
        HotkeyPrefixShow = 1,
        HotkeyPrefixHide = 2,
        LineJoinMiter = 0,
        LineJoinBevel = 1,
        LineJoinRound = 2,
        LineCapFlat = 0,
        LineCapSquare = 1,
        LineCapRound = 2,
        MatrixOrderPrepend = 0,
        MatrixOrderAppend = 1,
        QualityModeDefault = 0,
        QualityModeLow = 1,
        QualityModeHigh = 2,
        InterpolationModeInvalid = -1,
        InterpolationModeDefault = QualityModeDefault,
        InterpolationModeLowQuality = QualityModeLow,
        InterpolationModeHighQuality = QualityModeHigh,
        InterpolationModeBilinear = QualityModeHigh + 1,
        InterpolationModeBicubic = QualityModeHigh + 2,
        InterpolationModeNearestNeighbor = QualityModeHigh + 3,
        InterpolationModeHighQualityBilinear = QualityModeHigh + 4,
        InterpolationModeHighQualityBicubic = QualityModeHigh + 5,
        PathPointTypeStart = 0,
        PathPointTypeLine = 1,
        PathPointTypeBezier = 3,
        PathPointTypePathTypeMask = 0x7,
        PathPointTypePathDashMode = 0x10,
        PathPointTypePathMarker = 0x20,
        PathPointTypeCloseSubpath = 0x80,
        PathPointTypeBezier3 = 3,
        PixelFormatIndexed = 0x00010000,
        PixelFormatGDI = 0x00020000,
        PixelFormatAlpha = 0x00040000,
        PixelFormatPAlpha = 0x00080000,
        PixelFormatExtended = 0x00100000,
        PixelFormatCanonical = 0x00200000,
        PixelFormat1bppIndexed = (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI),
        PixelFormat4bppIndexed = (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI),
        PixelFormat8bppIndexed = (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI),
        PixelFormat16bppGrayScale = (4 | (16 << 8) | PixelFormatExtended),
        PixelFormat16bppRGB555 = (5 | (16 << 8) | PixelFormatGDI),
        PixelFormat16bppRGB565 = (6 | (16 << 8) | PixelFormatGDI),
        PixelFormat16bppARGB1555 = (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI),
        PixelFormat24bppRGB = (8 | (24 << 8) | PixelFormatGDI),
        PixelFormat32bppRGB = (9 | (32 << 8) | PixelFormatGDI),
        PixelFormat32bppARGB = (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical),
        PixelFormat32bppPARGB = (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI),
        PixelFormat48bppRGB = (12 | (48 << 8) | PixelFormatExtended),
        PixelFormat64bppARGB = (13 | (64 << 8) | PixelFormatAlpha  | PixelFormatCanonical | PixelFormatExtended),
        PixelFormat64bppPARGB = (14 | (64 << 8) | PixelFormatAlpha  | PixelFormatPAlpha | PixelFormatExtended),
        PixelFormatMax = 15,
        PixelOffsetModeNone = QualityModeHigh + 1,
        PixelOffsetModeHalf = QualityModeHigh + 2,
        SmoothingModeInvalid = -1,
        SmoothingModeDefault = QualityModeDefault,
        SmoothingModeHighSpeed = QualityModeLow,
        SmoothingModeHighQuality = QualityModeHigh,
        SmoothingModeNone = 3,
        SmoothingModeAntiAlias8x4 = 4,
        SmoothingModeAntiAlias = SmoothingModeAntiAlias8x4,
        SmoothingModeAntiAlias8x8 = 5,
        StringFormatFlagsDirectionRightToLeft = 0x00000001,
        StringFormatFlagsDirectionVertical = 0x00000002,
        StringFormatFlagsNoFitBlackBox = 0x00000004,
        StringFormatFlagsDisplayFormatControl = 0x00000020,
        StringFormatFlagsNoFontFallback = 0x00000400,
        StringFormatFlagsMeasureTrailingSpaces = 0x00000800,
        StringFormatFlagsNoWrap = 0x00001000,
        StringFormatFlagsLineLimit = 0x00002000,
        StringFormatFlagsNoClip = 0x00004000,
        TextRenderingHintSystemDefault = 0,
        TextRenderingHintSingleBitPerPixelGridFit = 1,
        TextRenderingHintSingleBitPerPixel = 2,
        TextRenderingHintAntiAliasGridFit = 3,
        TextRenderingHintAntiAlias = 4,
        TextRenderingHintClearTypeGridFit = 5,
        //  UnitPixel = 2,
        WrapModeTile = 0,
        WrapModeTileFlipX = 1,
        WrapModeTileFlipY = 2,
        WrapModeTileFlipXY = 3,
        WrapModeClamp = 4
    }

    enum
    {
        PenTypeSolidColor       = BrushTypeSolidColor,
        PenTypeHatchFill        = BrushTypeHatchFill,
        PenTypeTextureFill      = BrushTypeTextureFill,
        PenTypePathGradient     = BrushTypePathGradient,
        PenTypeLinearGradient   = BrushTypeLinearGradient,
        PenTypeUnknown          = -1
    }

    enum
    {
        UnitWorld,      // 0 -- World coordinate (non-physical unit)
        UnitDisplay,    // 1 -- Variable -- for PageTransform only
        UnitPixel,      // 2 -- Each unit is one device pixel.
        UnitPoint,      // 3 -- Each unit is a printer's point, or 1/72 inch.
        UnitInch,       // 4 -- Each unit is 1 inch.
        UnitDocument,   // 5 -- Each unit is 1/300 inch.
        UnitMillimeter  // 6 -- Each unit is 1 millimeter.
    }

    enum
    {
        AliceBlue            = 0xFFF0F8FF,
        AntiqueWhite         = 0xFFFAEBD7,
        Aqua                 = 0xFF00FFFF,
        Aquamarine           = 0xFF7FFFD4,
        Azure                = 0xFFF0FFFF,
        Beige                = 0xFFF5F5DC,
        Bisque               = 0xFFFFE4C4,
        Black                = 0xFF000000,
        BlanchedAlmond       = 0xFFFFEBCD,
        Blue                 = 0xFF0000FF,
        BlueViolet           = 0xFF8A2BE2,
        Brown                = 0xFFA52A2A,
        BurlyWood            = 0xFFDEB887,
        CadetBlue            = 0xFF5F9EA0,
        Chartreuse           = 0xFF7FFF00,
        Chocolate            = 0xFFD2691E,
        Coral                = 0xFFFF7F50,
        CornflowerBlue       = 0xFF6495ED,
        Cornsilk             = 0xFFFFF8DC,
        Crimson              = 0xFFDC143C,
        Cyan                 = 0xFF00FFFF,
        DarkBlue             = 0xFF00008B,
        DarkCyan             = 0xFF008B8B,
        DarkGoldenrod        = 0xFFB8860B,
        DarkGray             = 0xFFA9A9A9,
        DarkGreen            = 0xFF006400,
        DarkKhaki            = 0xFFBDB76B,
        DarkMagenta          = 0xFF8B008B,
        DarkOliveGreen       = 0xFF556B2F,
        DarkOrange           = 0xFFFF8C00,
        DarkOrchid           = 0xFF9932CC,
        DarkRed              = 0xFF8B0000,
        DarkSalmon           = 0xFFE9967A,
        DarkSeaGreen         = 0xFF8FBC8B,
        DarkSlateBlue        = 0xFF483D8B,
        DarkSlateGray        = 0xFF2F4F4F,
        DarkTurquoise        = 0xFF00CED1,
        DarkViolet           = 0xFF9400D3,
        DeepPink             = 0xFFFF1493,
        DeepSkyBlue          = 0xFF00BFFF,
        DimGray              = 0xFF696969,
        DodgerBlue           = 0xFF1E90FF,
        Firebrick            = 0xFFB22222,
        FloralWhite          = 0xFFFFFAF0,
        ForestGreen          = 0xFF228B22,
        Fuchsia              = 0xFFFF00FF,
        Gainsboro            = 0xFFDCDCDC,
        GhostWhite           = 0xFFF8F8FF,
        Gold                 = 0xFFFFD700,
        Goldenrod            = 0xFFDAA520,
        Gray                 = 0xFF808080,
        Green                = 0xFF008000,
        GreenYellow          = 0xFFADFF2F,
        Honeydew             = 0xFFF0FFF0,
        HotPink              = 0xFFFF69B4,
        IndianRed            = 0xFFCD5C5C,
        Indigo               = 0xFF4B0082,
        Ivory                = 0xFFFFFFF0,
        Khaki                = 0xFFF0E68C,
        Lavender             = 0xFFE6E6FA,
        LavenderBlush        = 0xFFFFF0F5,
        LawnGreen            = 0xFF7CFC00,
        LemonChiffon         = 0xFFFFFACD,
        LightBlue            = 0xFFADD8E6,
        LightCoral           = 0xFFF08080,
        LightCyan            = 0xFFE0FFFF,
        LightGoldenrodYellow = 0xFFFAFAD2,
        LightGray            = 0xFFD3D3D3,
        LightGreen           = 0xFF90EE90,
        LightPink            = 0xFFFFB6C1,
        LightSalmon          = 0xFFFFA07A,
        LightSeaGreen        = 0xFF20B2AA,
        LightSkyBlue         = 0xFF87CEFA,
        LightSlateGray       = 0xFF778899,
        LightSteelBlue       = 0xFFB0C4DE,
        LightYellow          = 0xFFFFFFE0,
        Lime                 = 0xFF00FF00,
        LimeGreen            = 0xFF32CD32,
        Linen                = 0xFFFAF0E6,
        Magenta              = 0xFFFF00FF,
        Maroon               = 0xFF800000,
        MediumAquamarine     = 0xFF66CDAA,
        MediumBlue           = 0xFF0000CD,
        MediumOrchid         = 0xFFBA55D3,
        MediumPurple         = 0xFF9370DB,
        MediumSeaGreen       = 0xFF3CB371,
        MediumSlateBlue      = 0xFF7B68EE,
        MediumSpringGreen    = 0xFF00FA9A,
        MediumTurquoise      = 0xFF48D1CC,
        MediumVioletRed      = 0xFFC71585,
        MidnightBlue         = 0xFF191970,
        MintCream            = 0xFFF5FFFA,
        MistyRose            = 0xFFFFE4E1,
        Moccasin             = 0xFFFFE4B5,
        NavajoWhite          = 0xFFFFDEAD,
        Navy                 = 0xFF000080,
        OldLace              = 0xFFFDF5E6,
        Olive                = 0xFF808000,
        OliveDrab            = 0xFF6B8E23,
        Orange               = 0xFFFFA500,
        OrangeRed            = 0xFFFF4500,
        Orchid               = 0xFFDA70D6,
        PaleGoldenrod        = 0xFFEEE8AA,
        PaleGreen            = 0xFF98FB98,
        PaleTurquoise        = 0xFFAFEEEE,
        PaleVioletRed        = 0xFFDB7093,
        PapayaWhip           = 0xFFFFEFD5,
        PeachPuff            = 0xFFFFDAB9,
        Peru                 = 0xFFCD853F,
        Pink                 = 0xFFFFC0CB,
        Plum                 = 0xFFDDA0DD,
        PowderBlue           = 0xFFB0E0E6,
        Purple               = 0xFF800080,
        Red                  = 0xFFFF0000,
        RosyBrown            = 0xFFBC8F8F,
        RoyalBlue            = 0xFF4169E1,
        SaddleBrown          = 0xFF8B4513,
        Salmon               = 0xFFFA8072,
        SandyBrown           = 0xFFF4A460,
        SeaGreen             = 0xFF2E8B57,
        SeaShell             = 0xFFFFF5EE,
        Sienna               = 0xFFA0522D,
        Silver               = 0xFFC0C0C0,
        SkyBlue              = 0xFF87CEEB,
        SlateBlue            = 0xFF6A5ACD,
        SlateGray            = 0xFF708090,
        Snow                 = 0xFFFFFAFA,
        SpringGreen          = 0xFF00FF7F,
        SteelBlue            = 0xFF4682B4,
        Tan                  = 0xFFD2B48C,
        Teal                 = 0xFF008080,
        Thistle              = 0xFFD8BFD8,
        Tomato               = 0xFFFF6347,
        Transparent          = 0x00FFFFFF,
        Turquoise            = 0xFF40E0D0,
        Violet               = 0xFFEE82EE,
        Wheat                = 0xFFF5DEB3,
        White                = 0xFFFFFFFF,
        WhiteSmoke           = 0xFFF5F5F5,
        Yellow               = 0xFFFFFF00,
        YellowGreen          = 0xFF9ACD32
    }

    // Shift count and bit mask for A, R, G, B components

    enum
    {
        AlphaShift  = 24,
        RedShift    = 16,
        GreenShift  = 8,
        BlueShift   = 0
    }

    enum
    {
        AlphaMask   = 0xff000000,
        RedMask     = 0x00ff0000,
        GreenMask   = 0x0000ff00,
        BlueMask    = 0x000000ff
    }

    enum
    {
        ColorAdjustTypeDefault,
        ColorAdjustTypeBitmap,
        ColorAdjustTypeBrush,
        ColorAdjustTypePen,
        ColorAdjustTypeText,
        ColorAdjustTypeCount,
        ColorAdjustTypeAny      // Reserved
    }

    static ARGB MakeARGB( ubyte a,
                          ubyte r,
                          ubyte g,
                          ubyte b )
    {
        return ((cast(ARGB) (b) <<  Gdip.BlueShift) |
                (cast(ARGB) (g) <<  Gdip.GreenShift) |
                (cast(ARGB) (r) <<  Gdip.RedShift) |
                (cast(ARGB) (a) <<  Gdip.AlphaShift));
    }

/**************************************************************************

    Error Status control

**************************************************************************/

    private static Status SetStatus( Status status )
    {
        if (status != Status.OK)
            return ( lastResult = status );
        else
            return status;
    }

    private static Status lastResult;

/**************************************************************************

    GDI+ Bitmap Wrap Interface

**************************************************************************/

public:

    static void BitmapData_delete (BitmapData* bitmapdata)
    {
        delete bitmapdata;
    }

    /**************************************************************************

    **************************************************************************/

    static BitmapData* BitmapData_new()
    {
        return new BitmapData;
    }

    /**************************************************************************

    **************************************************************************/

    static int Bitmap_GetHBITMAP( Bitmap bitmap, ARGB colorBackground,
                                        out HBITMAP hbmReturn                )
    {
        return SetStatus( GdipCreateHBITMAPFromBitmap( bitmap, hbmReturn,
                                                       colorBackground ) );
    }

    /**************************************************************************

    **************************************************************************/

    static int Bitmap_GetHICON( Bitmap bitmap, out HICON hIconReturn)
    {
        return SetStatus( GdipCreateHICONFromBitmap( bitmap, hIconReturn ) );
    }

    /**************************************************************************

    **************************************************************************/

    static int Bitmap_LockBits( Bitmap bitmap, Rect* rect,
                                      uint flags, PixelFormat pixelFormat,
                                    BitmapData* lockedBitmapData        )
    {
        return SetStatus( GdipBitmapLockBits( bitmap, rect, flags,
                                        pixelFormat, lockedBitmapData ) );
    }

    /**************************************************************************

    **************************************************************************/

    static int Bitmap_UnlockBits( Bitmap bitmap, BitmapData* lockedBitmapData )
    {
        return SetStatus( GdipBitmapUnlockBits( bitmap, lockedBitmapData ) );
    }

    /**************************************************************************

    **************************************************************************/

    static void Bitmap_delete( Bitmap bitmap )
    {
        GdipDisposeImage( bitmap );
    }

    /**************************************************************************

    **************************************************************************/

    static Bitmap Bitmap_new( HICON hicon )
    {
        Bitmap bitmap;
        Gdip.lastResult = GdipCreateBitmapFromHICON( hicon, bitmap );
        return bitmap;
    }

    /**************************************************************************

    **************************************************************************/

    static Bitmap Bitmap_new( HBITMAP hbm, HPALETTE hpal )
    {
        Bitmap bitmap;
        Gdip.lastResult = GdipCreateBitmapFromHBITMAP( hbm, hpal, bitmap );
        return bitmap;
    }

    /**************************************************************************

    **************************************************************************/

    static Bitmap Bitmap_new( int width, int height, int stride,
                       PixelFormat format, ubyte* scan0  )
    {
        Bitmap bitmap;
        Gdip.lastResult = GdipCreateBitmapFromScan0( width, height, stride,
                                                    format, scan0,
                                                    bitmap );
        return bitmap;
    }

    /**************************************************************************

    **************************************************************************/

    static Bitmap Bitmap_new( wchar* filename, bool useIcm )
    {
        Bitmap bitmap;
        if (useIcm) {
            Gdip.lastResult = GdipCreateBitmapFromFileICM( filename, bitmap );
        } else {
            Gdip.lastResult = GdipCreateBitmapFromFile( filename, bitmap );
        }
        return bitmap;
    }


/**************************************************************************

    Gdi+ Image Wrap Interface

**************************************************************************/

    static Status Image_GetLastStatus( Image image )
    {
        Status lastStatus = Gdip.lastResult;
        Gdip.lastResult = Status.OK;
        return lastStatus;
    }

    /**************************************************************************

    **************************************************************************/

    static PixelFormat Image_GetPixelFormat( Image image )
    {
        PixelFormat format;
        SetStatus( GdipGetImagePixelFormat( image, format ) );
        return format;
    }

    /**************************************************************************

    **************************************************************************/

    static uint Image_GetWidth( Image image )
    {
        uint width = 0;
        SetStatus( GdipGetImageWidth( image, width ) );
        return width;
    }

    /**************************************************************************

    **************************************************************************/

    static uint Image_GetHeight( Image image )
    {
        uint height = 0;
        SetStatus( GdipGetImageHeight( image, height ) );
        return height;
    }

    /**************************************************************************

    **************************************************************************/

    static Status Image_GetPalette( Image image, ColorPalette* palette, int size )
    {
        return SetStatus( GdipGetImagePalette( image, palette, size ) );
    }

    /**************************************************************************

    **************************************************************************/

    static int Image_GetPaletteSize( Image image )
    {
        int size = 0;
        SetStatus( GdipGetImagePaletteSize( image, size ) );
        return size;
    }

/**************************************************************************

    Gdi+ ImageAttributes Wrap Interface

**************************************************************************/

    static ImageAttributes ImageAttributes_new()
    {
        ImageAttributes ImageAttr = null;
        Gdip.lastResult = GdipCreateImageAttributes( ImageAttr );
        return ImageAttr;
    }

    /**************************************************************************

    **************************************************************************/

    static void ImageAttributes_delete( ImageAttributes attrib )
    {
        GdipDisposeImageAttributes( attrib );
    }

    /**************************************************************************

    **************************************************************************/

    static Status ImageAttributes_SetWrapMode( ImageAttributes attrib,
                                               WrapMode wrap,
                                               ARGB color = Gdip.Black,
                                               bool clamp = false )
    {
        return SetStatus(GdipSetImageAttributesWrapMode(
                           attrib, wrap, color, clamp));
    }


    /**************************************************************************

    **************************************************************************/

    static Status ImageAttributes_SetColorMatrix( ImageAttributes attrib,
                                                  ref ColorMatrix matrix,
                                               ColorMatrixFlag mode = Gdip.ColorMatrixFlagsDefault,
                                               ColorAdjustType type = Gdip.ColorAdjustTypeDefault  )
    {
        return SetStatus( GdipSetImageAttributesColorMatrix(
                                            attrib,
                                            type,
                                            true,
                                            &matrix,
                                            null,
                                            mode));
    }


/**************************************************************************

    Gdi+ Brush Wrap Interface

**************************************************************************/

    static Brush Brush_Clone( Brush brush )
    {
        Brush cloneBrush;
        SetStatus( GdipCloneBrush( brush, cloneBrush ) );
        return cloneBrush;
    }

    /**************************************************************************

    **************************************************************************/

    static BrushType Brush_GetType( Brush brush )
    {
        BrushType brushType = -1;
        SetStatus( GdipGetBrushType( brush, brushType ) );
        return brushType;
    }

/**************************************************************************

    Gdi+ HatchedBrush Wrap Interface

**************************************************************************/

    static void HatchBrush_delete( HatchBrush brush )
    {
        GdipDeleteBrush(brush);
    }

    /**************************************************************************

    **************************************************************************/

    static HatchBrush HatchBrush_new( HatchStyle hatchStyle,
                                      ARGB foreColor, ARGB backColor )
    {
        HatchBrush brush = null;

        Gdip.lastResult = GdipCreateHatchBrush( hatchStyle,
                                                foreColor,
                                                backColor,
                                                brush );
        return brush;
    }

/**************************************************************************

    Gdi+ LinearGradientBrush Wrap Interface

**************************************************************************/

    static LinearGradientBrush LinearGradientBrush_new( ref PointF point1, ref PointF point2,
                                                        ARGB color1, ARGB color2 )
    {
        LinearGradientBrush brush = null;

        lastResult = GdipCreateLineBrush(point1, point2,
                                         color1, color2,
                                         WrapModeTile, brush);
        return brush;

    }

    /**************************************************************************

    **************************************************************************/

    static void LinearGradientBrush_delete( LinearGradientBrush brush )
    {
        GdipDeleteBrush(brush);
    }

    /**************************************************************************

    **************************************************************************/

    static Status LinearGradientBrush_SetInterpolationColors( LinearGradientBrush brush,
                              ARGB* presetColors, float* blendPositions, int count )
    {
        if ((count <= 0) || presetColors is null)
            return SetStatus(Status.InvalidParameter);

        return SetStatus(GdipSetLinePresetBlend(brush, presetColors,
                                                       blendPositions,
                                                       count ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status LinearGradientBrush_SetWrapMode( LinearGradientBrush brush, WrapMode wrapMode )
    {
        return SetStatus(GdipSetLineWrapMode( brush, wrapMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status LinearGradientBrush_ResetTransform(LinearGradientBrush brush )
    {
        return SetStatus(GdipResetLineTransform(brush));
    }

    /**************************************************************************

    **************************************************************************/

    static int LinearGradientBrush_ScaleTransform( LinearGradientBrush brush,
                                                   float sx, float sy,
                                                   MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus(GdipScaleLineTransform(brush, sx, sy, order));
    }

    /**************************************************************************

    **************************************************************************/

    static int LinearGradientBrush_TranslateTransform( LinearGradientBrush brush,
                                                       float dx, float dy,
                                                       MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus(GdipTranslateLineTransform(brush, dx, dy, order));
    }


/**************************************************************************

    GDI+ TextureBrush Wrap Interface

**************************************************************************/

    static TextureBrush TextureBrush_new( Image image, WrapMode wrapMode,
                                          float dstX, float dstY,
                                          float dstWidth, float dstHeight )
    {
        TextureBrush brush = null;

        Gdip.lastResult = GdipCreateTexture2( image,
                                              wrapMode,
                                              dstX, dstY,
                                              dstWidth, dstHeight,
                                              brush  );
        return brush;

    }

    /**************************************************************************

    **************************************************************************/

    static void TextureBrush_delete( TextureBrush brush )
    {
        GdipDeleteBrush( brush );
    }

    /**************************************************************************

    **************************************************************************/

    static Status TextureBrush_SetTransform( TextureBrush brush, Matrix matrix )
    {
        return SetStatus(GdipSetTextureTransform(brush, matrix));
    }

    /**************************************************************************

    **************************************************************************/

    static Status TextureBrush_ResetTransform( TextureBrush brush )
    {
                return SetStatus(GdipResetTextureTransform(brush));
    }

    /**************************************************************************

    **************************************************************************/

    static Status TextureBrush_ScaleTransform( TextureBrush brush,
                                               float sx, float sy,
                                               MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus(GdipScaleTextureTransform(brush, sx, sy, order));
    }

    /**************************************************************************

    **************************************************************************/

    static Status TextureBrush_TranslateTransform( TextureBrush brush,
                                                   float dx, float dy,
                                                   MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus(GdipTranslateTextureTransform(brush, dx, dy, order));
    }


/**************************************************************************

    GDI+ Pen Wrap Interface

**************************************************************************/

    static SolidBrush SolidBrush_new( ARGB color )
    {
        SolidBrush brush = null;

        Gdip.lastResult = GdipCreateSolidFill( color, brush );

        return brush;
    }

    /**************************************************************************

    **************************************************************************/

    static void SolidBrush_delete( SolidBrush brush )
    {
        GdipDeleteBrush(brush);
    }

/**************************************************************************

    GDI+ Pen Wrap Interface

**************************************************************************/

    static Pen Pen_new( Brush brush, float width )
    {
        Unit unit = UnitWorld;
        Pen pen = null;
        Gdip.lastResult = GdipCreatePen2(brush, width, unit, pen);
        return pen;
    }

    /**************************************************************************

    **************************************************************************/

    static void Pen_delete( Pen pen )
    {
        GdipDeletePen(pen);
    }

    /**************************************************************************

    **************************************************************************/

    static PenType Pen_GetPenType( Pen pen )
    {
       PenType type;
       SetStatus(GdipGetPenFillType( pen, type ));
       return type;
    }

    /**************************************************************************

    **************************************************************************/

    static Brush Pen_GetBrush( Pen pen )
    {
        Brush brush;
        SetStatus(GdipGetPenBrushFill(pen, brush));
        return brush;
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetBrush( Pen pen, Brush brush )
    {
        return SetStatus(GdipSetPenBrushFill(pen, brush));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetDashOffset( Pen pen, float dashOffset )
    {
        return SetStatus(GdipSetPenDashOffset(pen, dashOffset));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetDashPattern( Pen pen, float* dashArray, int count )
    {
        return SetStatus(GdipSetPenDashArray(pen, dashArray, count));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetDashStyle( Pen pen, DashStyle dashStyle )
    {
        return SetStatus(GdipSetPenDashStyle(pen, dashStyle));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetLineCap( Pen pen, LineCap startCap, LineCap endCap, DashCap dashCap )
    {
        return SetStatus(GdipSetPenLineCap197819(pen, startCap, endCap, dashCap));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetLineJoin( Pen pen, LineJoin lineJoin )
    {
        return SetStatus(GdipSetPenLineJoin(pen, lineJoin));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetMiterLimit( Pen pen, float miterLimit )
    {
        return SetStatus(GdipSetPenMiterLimit(pen, miterLimit));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Pen_SetWidth( Pen pen, float width )
    {
        return SetStatus(GdipSetPenWidth(pen, width));
    }


/**************************************************************************

    GDI+ Color Wrap Interface

**************************************************************************/

    // The following two color functions appear to serve little use
    // and should probably be replaced with an actual ARGB type assignment
    // wherever they are used.

    // I'm guessing they are being used in case of future adoption of the
    // gdi+ Color class functionality in Swt.

    static void Color_delete( ARGB color )
    {
        // no op
    }

    /**************************************************************************

    **************************************************************************/

    static ARGB Color_new( ARGB color )
    {
        return color;
    }

/**************************************************************************

    GDI+ FontFamily Wrap Interface

**************************************************************************/

    static int FontFamily_GetFamilyName( FontFamily family, wchar* name, int language )
    {
        return SetStatus( GdipGetFamilyName( family, name, language ) );
    }

    /**************************************************************************

    **************************************************************************/

    // CAUTION:  Next two methods need to be tested - JJR

    static void FontFamily_delete( FontFamily family )
    {
        if (family !is null)
            GdipDeleteFontFamily( family );
    }

    /**************************************************************************

        FontFamily_new() returns a null because flat Gdi+ FontFamily is
        internally assigned a null until it is associated with a font
        (see gdi+ C++ wrapper for details).

    **************************************************************************/

    static FontFamily FontFamily_new()
    {
        return null;
    }

/**************************************************************************

    GDI+ Font Wrap Interface

**************************************************************************/


    static int Font_GetFamily( Font font, ref FontFamily family )
    {
        return SetStatus( GdipGetFamily( font, family ) );
    }

    /**************************************************************************

    **************************************************************************/

    static float Font_GetSize( Font font )
    {
        float  size;
        SetStatus( GdipGetFontSize( font, size ) );
        return size;
    }

    /**************************************************************************

    **************************************************************************/

    static int Font_GetStyle( Font font )
    {
        int style;
        SetStatus( GdipGetFontStyle( font, style ) );
        return style;
    }

    /**************************************************************************

    **************************************************************************/

    static bool Font_IsAvailable( Font font )
    {
        return (font !is null);
    }

    /**************************************************************************

    **************************************************************************/

    static void Font_delete( Font font )
    {
        GdipDeleteFont( font );
    }

    /**************************************************************************

    **************************************************************************/

    static Font Font_new( HDC hdc, HFONT hfont )
    {
        Font font = null;

        if (hfont is null) {
            Gdip.lastResult = GdipCreateFontFromDC( hdc, font );
        } else {
            LOGFONTA logfont;
            if (GetObjectA( hfont, LOGFONTA.sizeof, &logfont ))
                Gdip.lastResult = GdipCreateFontFromLogfontA(hdc, logfont, font);
            else
                Gdip.lastResult = GdipCreateFontFromDC(hdc, font);
        }

        return font;
    }


    /**************************************************************************

    **************************************************************************/

    static Font Font_new( wchar* familyName, float emSize, int style, uint unit,
                          FontCollection fontCollection  )
    {
        Font        nativeFont = null;
        FontFamily  nativeFamily = null;

        Gdip.lastResult = GdipCreateFontFamilyFromName( familyName, fontCollection, nativeFamily );

        if (Gdip.lastResult != Status.OK)
        {
            if (GenericSansSerifFontFamily != null)
            {
                nativeFamily = GenericSansSerifFontFamily;
            }
            //TODO: access buffer via "ptr" property?
            GenericSansSerifFontFamily = cast(FontFamily) GenericSansSerifFontFamilyBuffer;
            Gdip.lastResult = GdipGetGenericFontFamilySansSerif( GenericSansSerifFontFamily );

            nativeFamily = GenericSansSerifFontFamily;

            if (Gdip.lastResult != Status.OK)
                return null;
        }

        Gdip.lastResult = GdipCreateFont( nativeFamily, emSize, style, unit, nativeFont );

        if (Gdip.lastResult != Status.OK)
        {
            if (GenericSansSerifFontFamily != null)
            {
                nativeFamily = GenericSansSerifFontFamily;
            }

            GenericSansSerifFontFamily = cast(FontFamily) GenericSansSerifFontFamilyBuffer;
            Gdip.lastResult = GdipGetGenericFontFamilySansSerif( GenericSansSerifFontFamily );

            nativeFamily = GenericSansSerifFontFamily;

            if (Gdip.lastResult != Status.OK)
                return null;

            Gdip.lastResult = GdipCreateFont( nativeFamily, emSize, style,
                                              unit, nativeFont  );
        }

        return nativeFont;
    }

/**************************************************************************

    GDI+ Startup and Shutdown Wrap Interface

**************************************************************************/

    alias .GdiplusShutdown GdiplusShutdown;

    /**************************************************************************

    **************************************************************************/

    alias .GdiplusStartup GdiplusStartup;


/**************************************************************************

    GDI+ Graphics Path Wrap Interface

**************************************************************************/

    static Path GraphicsPath_new( FillMode fillMode = FillModeAlternate )
    {
        Path path = null;
        lastResult = GdipCreatePath(fillMode, path);
        return path;
    }

    /**************************************************************************

    **************************************************************************/

    static Path GraphicsPath_new( Point* points, ubyte* types, int count,
                                  FillMode fillMode = FillModeAlternate )
    {
        Path path = null;
        lastResult = GdipCreatePath2I(points, types, count, fillMode, path);
        return path;
    }

    /**************************************************************************

    **************************************************************************/

    static void GraphicsPath_delete( Path path )
    {
        GdipDeletePath(path);
    }
    static Path GraphicsPath_Clone( Handle path ){
        Path clonepath = null;
        SetStatus( GdipClonePath(path, clonepath));
        return clonepath;
    }


    static Status GraphicsPath_AddArcF( Path path, float x,     float y,
                                           float width, float height,
                                           float startAngle, float sweepAngle )
    {
        return SetStatus( GdipAddPathArc( path, x, y, width,
                                          height, startAngle, sweepAngle) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddArc( Path path, int x, int y,
                                                  int width, int height,
                                                  float startAngle, float sweepAngle )
    {
        return SetStatus(GdipAddPathArcI(   path,
                                            x,
                                            y,
                                            width,
                                            height,
                                            startAngle,
                                            sweepAngle));
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddBezier( Path path, float x1, float y1,
                                                     float x2, float y2,
                                                     float x3, float y3,
                                                     float x4, float y4 )
    {
        return SetStatus( GdipAddPathBezier( path, x1, y1, x2, y2,
                                                   x3, y3, x4, y4 ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddLine( Path path, float x1, float y1,
                                                   float x2, float y2 )
    {
        return SetStatus( GdipAddPathLine( path, x1, y1, x2, y2 ) );
    }


    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddPath( Path path, Path addingPath, bool connect )
    {
        return SetStatus( GdipAddPathPath( path, addingPath, connect ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddRectangle( Path path, RectF rect )
    {
        return SetStatus( GdipAddPathRectangle( path,
                                                rect.X,
                                                rect.Y,
                                                rect.Width,
                                                rect.Height ) );
    }


    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_AddString( Path path, wchar* string,
                                          int length, FontFamily family,
                                          int style, float emSize,
                                          ref PointF origin, StringFormat format )
    {
        RectF rect = { origin.X, origin.Y, 0.0f, 0.0f };

        return SetStatus( GdipAddPathString( path, string, length, family,
                                             style, emSize, rect, format ) );
    }


    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_CloseFigure( Path path )
    {
        return SetStatus( GdipClosePathFigure(path) );
    }


    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_Flatten( Path path, Matrix matrix, float flatness )
    {
        return SetStatus( GdipFlattenPath( path, matrix, flatness ) );
    }


    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_GetBounds( Path path, ref RectF bounds,
                                          Matrix matrix, Pen pen )
    {

        return SetStatus( GdipGetPathWorldBounds( path, bounds,
                                                  matrix, pen ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_GetLastPoint( Path path, out PointF lastPoint )
    {
        return SetStatus( GdipGetPathLastPoint( path, lastPoint) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_GetPathTypes( Path path, byte* types, int count )
    {
        return SetStatus( GdipGetPathTypes( path, types, count) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status GraphicsPath_GetPathPoints( Path path, PointF* points, int count)
    {
        return SetStatus(GdipGetPathPoints(path, points, count));
    }


    /**************************************************************************

    **************************************************************************/

    static int GraphicsPath_GetPointCount( Path path )
    {
        int count = 0;

        SetStatus(GdipGetPointCount(path, count));

        return count;
    }

    /**************************************************************************

    **************************************************************************/

    static bool GraphicsPath_IsOutlineVisible( Path path,
                                float x, float y, Pen pen, Graphics g = null )
    {
        int booln = false;
        SetStatus( GdipIsOutlineVisiblePathPoint( path, x, y,
                                                  pen, g,
                                                  booln )  );
        return (booln == true);
    }

    /**************************************************************************

    **************************************************************************/

    static bool GraphicsPath_IsVisible( Path path, float x, float y, Graphics graphics )
    {
        int booln = false;

        SetStatus(GdipIsVisiblePathPoint(path, x, y, graphics, booln));

        return (booln == true);
    }

    /**************************************************************************

    **************************************************************************/

    static int GraphicsPath_SetFillMode( Path path, FillMode fillmode )
    {
        return SetStatus( GdipSetPathFillMode(path, fillmode) );
    }

    /**************************************************************************

    **************************************************************************/

    static int GraphicsPath_StartFigure( Path path )
    {
        return SetStatus(GdipStartPathFigure(path));
    }

    /**************************************************************************

    **************************************************************************/

    static int GraphicsPath_Transform( Path path, Matrix matrix )
    {
        if(matrix)
            return SetStatus( GdipTransformPath(path, matrix));
        else
            return Status.OK;

    }


/**************************************************************************

    GDI+ Graphics Wrap Interface

**************************************************************************/

    static Graphics Graphics_new( HDC hdc )
    {

        Graphics graphics = null;

        Gdip.lastResult = GdipCreateFromHDC(hdc, graphics);

        return graphics;
    }

    /**************************************************************************

    **************************************************************************/

    static void Graphics_delete( Graphics graphics)
    {
        GdipDeleteGraphics(graphics);
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawArc( Graphics graphics, Pen pen,
                                    int x, int y, int width, int height,
                                    float startAngle, float sweepAngle )
    {
        return SetStatus(GdipDrawArcI(graphics, pen,
                                      x, y, width, height,
                                      startAngle, sweepAngle));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawEllipse(Graphics graphics, Pen pen,
                                       int x, int y,
                                       int width, int height)
    {
        return SetStatus(GdipDrawEllipseI(graphics, pen,
                                          x, y, width, height));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawImage(Graphics graphics, Image image, int x, int y)
    {
        return SetStatus(GdipDrawImageI(graphics,image, x, y));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawImage( Graphics graphics, Image image, ref Rect destRect,
                                        int srcx, int srcy, int srcwidth, int srcheight,
                                        Unit srcUnit, ImageAttributes imageAttributes = null,
                                        DrawImageAbort callback = null, void* callbackData = null )
    {
        return SetStatus(GdipDrawImageRectRectI(graphics, image,
                                                destRect.X, destRect.Y,
                                                destRect.Width, destRect.Height,
                                                srcx, srcy,
                                                srcwidth, srcheight,
                                                srcUnit, imageAttributes,
                                                callback, callbackData));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawLine( Graphics graphics, Pen pen,
                                     int x1, int y1, int x2, int y2 )
    {
        return SetStatus(GdipDrawLineI(graphics, pen, x1, y1, x2, y2));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawLines( Graphics graphics, Pen pen, Point* points, uint count )
    {
        return SetStatus(GdipDrawLinesI(graphics, pen, points, count));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawPath( Graphics graphics, Pen pen, Path path )
    {
        return SetStatus(GdipDrawPath(graphics, pen, path));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawPolygon(Graphics graphics, Pen pen, Point* points, uint count )
    {
        return SetStatus(GdipDrawPolygonI(graphics, pen, points, count));

    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawRectangle( Graphics graphics, Pen pen, int x, int y,
                                                             int width, int height )
    {
        return SetStatus(GdipDrawRectangleI(graphics, pen, x, y, width, height));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawString( Graphics graphics, wchar* string, int length,
                                       Font font, ref PointF origin, Brush brush  )
    {
        RectF rect = {origin.X, origin.Y, 0.0f, 0.0f};

        return SetStatus(GdipDrawString(graphics,string,length, font, rect, null, brush));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_DrawString( Graphics graphics, wchar* string, int length,
                                       Font font, ref PointF origin,
                                       StringFormat format, Brush brush )
    {
        RectF rect = { origin.X, origin.Y, 0.0f, 0.0f };

        return SetStatus(GdipDrawString(graphics, string, length, font, rect, format, brush));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_FillEllipse( Graphics graphics, Brush brush,
                                        int x, int y,
                                        int width, int height )
    {
        return SetStatus(GdipFillEllipseI(graphics, brush, x,y, width, height));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_FillPath( Graphics graphics, Brush brush, Path path )
    {
        return SetStatus(GdipFillPath(graphics,brush,path));
    }

    /**************************************************************************

    **************************************************************************/

    static void Graphics_Flush( Graphics graphics, FlushIntention intention = FlushIntentionFlush )
    {
        GdipFlush(graphics, intention);
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_FillPie( Graphics graphics, Brush brush,
                                    int x, int y,
                                    int width, int height,
                                    float startAngle, float sweepAngle )
    {
        return SetStatus(GdipFillPieI(graphics, brush,
                                      x, y, width, height,
                                      startAngle, sweepAngle));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_FillPolygon( Graphics graphics, Brush brush,
                                        Point* points, int count, FillMode fillMode )
    {
        return SetStatus(GdipFillPolygonI(graphics, brush, points, count, fillMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_FillRectangle( Graphics graphics, Brush brush,
                                          int x, int y,
                                          int width, int height )
    {
        return SetStatus(GdipFillRectangleI(graphics, brush,
                                            x, y,
                                            width, height));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_GetClipBounds( Graphics graphics, out RectF rect )
    {
        return SetStatus(GdipGetClipBounds(graphics, rect));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_GetClipBounds( Graphics graphics, out Rect rect )
    {
        return SetStatus(GdipGetClipBoundsI(graphics, rect));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_GetClip( Graphics graphics, Region region )
    {
        return SetStatus(GdipGetClip(graphics, region));
    }

    /**************************************************************************

    **************************************************************************/

    static HDC Graphics_GetHDC(Graphics graphics)
    {
        HDC hdc = null;

        SetStatus(GdipGetDC(graphics, hdc));

        return hdc;
    }

    /**************************************************************************

    **************************************************************************/

    static void Graphics_ReleaseHDC(Graphics graphics, HDC hdc)
    {
        SetStatus(GdipReleaseDC(graphics, hdc));
    }

    /**************************************************************************

    **************************************************************************/

    static InterpolationMode Graphics_GetInterpolationMode( Graphics graphics )
    {
        InterpolationMode mode = InterpolationModeInvalid;

        SetStatus(GdipGetInterpolationMode(graphics, mode));

        return mode;
    }

    /**************************************************************************

    **************************************************************************/

    static SmoothingMode Graphics_GetSmoothingMode( Graphics graphics )
    {
        SmoothingMode smoothingMode = SmoothingModeInvalid;

        SetStatus(GdipGetSmoothingMode(graphics, smoothingMode));

        return smoothingMode;
    }

    /**************************************************************************

    **************************************************************************/

    static TextRenderingHint Graphics_GetTextRenderingHint( Graphics graphics )
    {
        TextRenderingHint hint;

        SetStatus(GdipGetTextRenderingHint(graphics, hint));

        return hint;
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_GetTransform( Graphics graphics, Matrix matrix )
    {
        return SetStatus(GdipGetWorldTransform(graphics, matrix));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_GetVisibleClipBounds( Graphics graphics, out Rect rect )
    {

        return SetStatus(GdipGetVisibleClipBoundsI(graphics, rect));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_MeasureString( Graphics graphics, wchar* string, int length,
                                          Font font, ref PointF origin,
                                          ref RectF boundingBox )
    {
        RectF rect = {origin.X, origin.Y, 0.0f, 0.0f};

        return SetStatus(GdipMeasureString(
            graphics,
            string,
            length,
            font,
            rect,
            null,
            boundingBox,
            null,
            null
        ));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_MeasureString( Graphics graphics, wchar* string, int length,
                                          Font font, ref PointF origin,
                                          StringFormat format, ref RectF boundingBox )
    {
        RectF rect = {origin.X, origin.Y, 0.0f, 0.0f};

        return SetStatus(GdipMeasureString(
            graphics,
            string,
            length,
            font,
            rect,
            format,
            boundingBox,
            null,
            null
        ));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_ResetClip( Graphics graphics )
    {
        return SetStatus(GdipResetClip(graphics));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_Restore( Graphics graphics, GraphicsState gstate )
    {
        return SetStatus(GdipRestoreGraphics(graphics, gstate));
    }

    /**************************************************************************

    **************************************************************************/

    static GraphicsState Graphics_Save( Graphics graphics )
    {
        GraphicsState gstate;

        SetStatus(GdipSaveGraphics(graphics, gstate));

        return gstate;
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_ScaleTransform( Graphics graphics, float sx, float sy,
                                           MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus(GdipScaleWorldTransform(graphics, sx, sy, order));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetClip( Graphics graphics, HRGN hrgn,
                                    CombineMode combineMode = CombineModeReplace )
    {
        return SetStatus(GdipSetClipHrgn(graphics, hrgn, combineMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetClipPath( Graphics graphics, Path path,
                                    CombineMode combineMode = CombineModeReplace )
    {
        return SetStatus(GdipSetClipPath(graphics, path, combineMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetClip( Graphics graphics, ref Rect rect,
                                    CombineMode combineMode = CombineModeReplace )
    {
       return SetStatus( GdipSetClipRectI( graphics,
                                                      rect.X, rect.Y,
                                                      rect.Width, rect.Height,
                                                      combineMode));
    }

    //static Status Graphics_SetClipPath(Graphics graphics, GraphicsPath path ){
    //    return SetStatus( SetClipPath( graphics, path ));
    //}
    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetCompositingQuality( Graphics graphics,
                                                  CompositingQuality compositingQuality )
    {
        return SetStatus(GdipSetCompositingQuality(graphics, compositingQuality));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetPageUnit( Graphics graphics, Unit unit )
    {
        return SetStatus(GdipSetPageUnit(graphics, unit));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetPixelOffsetMode( Graphics graphics,
                                               PixelOffsetMode pixelOffsetMode )
    {
        return SetStatus(GdipSetPixelOffsetMode(graphics, pixelOffsetMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetSmoothingMode( Graphics graphics,
                                             SmoothingMode smoothingMode )
    {
        return SetStatus(GdipSetSmoothingMode(graphics, smoothingMode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetTransform( Graphics graphics, Matrix matrix )
    {
        return SetStatus(GdipSetWorldTransform(graphics, matrix));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetInterpolationMode( Graphics graphics,
                                                 InterpolationMode mode )
    {
        return SetStatus(GdipSetInterpolationMode(graphics, mode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_SetTextRenderingHint( Graphics graphics, TextRenderingHint mode )
    {
        return SetStatus(GdipSetTextRenderingHint(graphics, mode));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Graphics_TranslateTransform( Graphics graphics, float dx, float dy,
                                               MatrixOrder order = MatrixOrderPrepend )
    {
                return SetStatus(GdipTranslateWorldTransform(graphics, dx, dy, order));
    }

/**************************************************************************

    Gdi+ Region Wrap Interface

**************************************************************************/

    static Region Region_new( HRGN hRgn )
    {
        Region region = null;

        Gdip.lastResult = GdipCreateRegionHrgn( hRgn, region);

        return region;
    }

    /**************************************************************************

    **************************************************************************/

    static Region Region_new()
    {
        Region region = null;

        Gdip.lastResult = GdipCreateRegion(region);

        return region;
    }

    /**************************************************************************

    **************************************************************************/

    static void Region_delete( Region region )
    {
        GdipDeleteRegion(region);
    }

    /**************************************************************************

    **************************************************************************/

    static HRGN Region_GetHRGN( Region region, Graphics graphics )
    {
        HRGN hrgn;

        SetStatus(GdipGetRegionHRgn(region, graphics, hrgn));

        return hrgn;
    }

    /**************************************************************************

    **************************************************************************/

    static int Region_IsInfinite( Region region, Graphics graphics )
    {
        int booln = false;

        SetStatus(GdipIsInfiniteRegion(region, graphics, booln));

        return booln;
    }

/**************************************************************************

    Gdi+ Matrix Wrap Interface

**************************************************************************/

    static Matrix Matrix_new(float m11, float m12, float m21, float m22, float dx, float dy)
    {
        Matrix matrix = null;

        Gdip.lastResult = GdipCreateMatrix2(m11, m12, m21, m22, dx, dy, matrix);

        return matrix;
    }

    /**************************************************************************

    **************************************************************************/

    static void Matrix_delete( Matrix matrix )
    {
        GdipDeleteMatrix( matrix );
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_GetElements( Matrix matrix, float* m )
    {
        return SetStatus( GdipGetMatrixElements( matrix, m ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_Invert( Matrix matrix )
    {
        return SetStatus( GdipInvertMatrix( matrix ) );
    }

    /**************************************************************************

    **************************************************************************/

    static int Matrix_IsIdentity( Matrix matrix )
    {
        int result = false;

        SetStatus(GdipIsMatrixIdentity( matrix, result ) );

        return result;
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_Multiply( Matrix nativeMatrix, Matrix matrix,
                                   MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus( GdipMultiplyMatrix( nativeMatrix, matrix, order) );
    }

    /**************************************************************************

    **************************************************************************/

    static int  Matrix_Rotate( Matrix matrix, float angle, MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus( GdipRotateMatrix( matrix, angle, order ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_Scale( Matrix matrix, float scaleX , float scaleY,
                                MatrixOrder order = MatrixOrderPrepend )
    {
        return SetStatus( GdipScaleMatrix(matrix, scaleX, scaleY, order) );
    }
    static Status Matrix_Shear( Matrix matrix, float shearX, float shearY, MatrixOrder order ){
        return SetStatus( GdipShearMatrix(matrix, shearX, shearY, order));
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_SetElements( Matrix matrix, float m11, float m12,
                                                     float m21, float m22,
                                                     float dx, float dy     )
    {
        return SetStatus( GdipSetMatrixElements( matrix, m11, m12, m21, m22, dx, dy ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_TransformPoints( Matrix matrix, PointF* pts, int count = 1 )
    {
        return SetStatus( GdipTransformMatrixPoints( matrix, pts, count ) );
    }

    /**************************************************************************

    **************************************************************************/

    static Status Matrix_Translate( Matrix matrix, float offsetX, float offsetY,
                                    MatrixOrder order = MatrixOrderPrepend      )
    {
        return SetStatus( GdipTranslateMatrix( matrix, offsetX, offsetY, order ) );
    }


/**************************************************************************

    Gdi+ StringFromat Wrap Interface

**************************************************************************/

    static void StringFormat_delete( StringFormat format )
    {
        GdipDeleteStringFormat( format );
    }

    /**************************************************************************

    **************************************************************************/

    static StringFormat StringFormat_Clone( StringFormat format )
    {
        StringFormat clonedStringFormat = null;

        Gdip.lastResult = GdipCloneStringFormat( format, clonedStringFormat );

        if (Gdip.lastResult == Status.OK)
            return clonedStringFormat;
        else
            return null;
    }

    /**************************************************************************

    **************************************************************************/

    static StringFormat StringFormat_GenericDefault()
    {
        // TODO:  do we need to access buffer through "ptr" property?
        StringFormat genericDefaultStringFormat =
            cast(StringFormat) GenericDefaultStringFormatBuffer;

        Gdip.lastResult = GdipStringFormatGetGenericDefault( genericDefaultStringFormat );

        return genericDefaultStringFormat;
    }

    /**************************************************************************

    **************************************************************************/

    static StringFormat StringFormat_GenericTypographic()
    {
        // TODO:  do we need to access buffer through "ptr" property?
        StringFormat genericTypographicStringFormat =
            cast(StringFormat) GenericTypographicStringFormatBuffer;

        Gdip.lastResult = GdipStringFormatGetGenericTypographic(
            genericTypographicStringFormat );

        return genericTypographicStringFormat;
    }

    /**************************************************************************

    **************************************************************************/

    // TODO: StringFormat class in Gdi+ maintains it's own lastError status
    // Right now all lastError and lastResult status for dwt's gdip objects
    // are combined in one Gdip SetStatus method and lastResult member.
    // Consider if there is a need to maintain per object lastResult
    // monitoring.  For now, this /should/ work as is.

    static int StringFormat_GetFormatFlags(StringFormat format)
    {
        int flags;
        SetStatus( GdipGetStringFormatFlags(format, flags));
        return flags;
    }

    /**************************************************************************

    **************************************************************************/

    static int StringFormat_SetHotkeyPrefix( StringFormat format, int hotkeyPrefix )
    {
       return SetStatus(GdipSetStringFormatHotkeyPrefix(format, hotkeyPrefix));
    }

    /**************************************************************************

    **************************************************************************/

    static int StringFormat_SetFormatFlags( StringFormat format, int flags )
    {
       return SetStatus(GdipSetStringFormatFlags(format, flags));
    }

    /**************************************************************************

    **************************************************************************/

    static int StringFormat_SetTabStops( StringFormat format, float firstTabOffset,
                                         int count, float* tabStops)
    {
        return SetStatus( GdipSetStringFormatTabStops( format, firstTabOffset,
                                                       count, tabStops ) );
    }

    /**************************************************************************

    **************************************************************************/
}