[ros-diffs] [rharabien] 56056: [GDIPLUS_WINETEST] - Sync to Wine 1.3.37

rharabien at svn.reactos.org rharabien at svn.reactos.org
Mon Mar 5 20:18:32 UTC 2012


Author: rharabien
Date: Mon Mar  5 20:18:32 2012
New Revision: 56056

URL: http://svn.reactos.org/svn/reactos?rev=56056&view=rev
Log:
[GDIPLUS_WINETEST]
- Sync to Wine 1.3.37

Modified:
    trunk/rostests/winetests/gdiplus/brush.c
    trunk/rostests/winetests/gdiplus/font.c
    trunk/rostests/winetests/gdiplus/graphics.c
    trunk/rostests/winetests/gdiplus/graphicspath.c
    trunk/rostests/winetests/gdiplus/image.c
    trunk/rostests/winetests/gdiplus/matrix.c
    trunk/rostests/winetests/gdiplus/pathiterator.c
    trunk/rostests/winetests/gdiplus/region.c

Modified: trunk/rostests/winetests/gdiplus/brush.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/brush.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/brush.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/brush.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -286,9 +286,14 @@
 static void test_gradientgetrect(void)
 {
     GpLineGradient *brush;
+    GpMatrix *transform;
+    REAL elements[6];
     GpRectF rectf;
     GpStatus status;
     GpPointF pt1, pt2;
+
+    status = GdipCreateMatrix(&transform);
+    expect(Ok, status);
 
     pt1.X = pt1.Y = 1.0;
     pt2.X = pt2.Y = 100.0;
@@ -301,7 +306,21 @@
     expectf(1.0, rectf.Y);
     expectf(99.0, rectf.Width);
     expectf(99.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok, status);
+        expectf(1.0, elements[0]);
+        expectf(1.0, elements[1]);
+        expectf(-1.0, elements[2]);
+        expectf(1.0, elements[3]);
+        expectf(50.50, elements[4]);
+        expectf(-50.50, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok, status);
     /* vertical gradient */
     pt1.X = pt1.Y = pt2.X = 0.0;
     pt2.Y = 10.0;
@@ -314,7 +333,21 @@
     expectf(0.0, rectf.Y);
     expectf(10.0, rectf.Width);
     expectf(10.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok, status);
+        expectf(0.0, elements[0]);
+        expectf(1.0, elements[1]);
+        expectf(-1.0, elements[2]);
+        expectf(0.0, elements[3]);
+        expectf(5.0, elements[4]);
+        expectf(5.0, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok, status);
     /* horizontal gradient */
     pt1.X = pt1.Y = pt2.Y = 0.0;
     pt2.X = 10.0;
@@ -327,7 +360,21 @@
     expectf(-5.0, rectf.Y);
     expectf(10.0, rectf.Width);
     expectf(10.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok, status);
+        expectf(1.0, elements[0]);
+        expectf(0.0, elements[1]);
+        expectf(0.0, elements[2]);
+        expectf(1.0, elements[3]);
+        expectf(0.0, elements[4]);
+        expectf(0.0, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok, status);
     /* slope = -1 */
     pt1.X = pt1.Y = 0.0;
     pt2.X = 20.0;
@@ -341,7 +388,21 @@
     expectf(-20.0, rectf.Y);
     expectf(20.0, rectf.Width);
     expectf(20.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok, status);
+        expectf(1.0, elements[0]);
+        expectf(-1.0, elements[1]);
+        expectf(1.0, elements[2]);
+        expectf(1.0, elements[3]);
+        expectf(10.0, elements[4]);
+        expectf(10.0, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok, status);
     /* slope = 1/100 */
     pt1.X = pt1.Y = 0.0;
     pt2.X = 100.0;
@@ -355,7 +416,35 @@
     expectf(0.0, rectf.Y);
     expectf(100.0, rectf.Width);
     expectf(1.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok,status);
+        expectf(1.0, elements[0]);
+        expectf(0.01, elements[1]);
+        expectf(-0.02, elements[2]);
+        /* expectf(2.0, elements[3]); */
+        expectf(0.01, elements[4]);
+        /* expectf(-1.0, elements[5]); */
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok,status);
+    /* zero height rect */
+    rectf.X = rectf.Y = 10.0;
+    rectf.Width = 100.0;
+    rectf.Height = 0.0;
+    status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeVertical,
+        WrapModeTile, &brush);
+    expect(OutOfMemory, status);
+    /* zero width rect */
+    rectf.X = rectf.Y = 10.0;
+    rectf.Width = 0.0;
+    rectf.Height = 100.0;
+    status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal,
+        WrapModeTile, &brush);
+    expect(OutOfMemory, status);
     /* from rect with LinearGradientModeHorizontal */
     rectf.X = rectf.Y = 10.0;
     rectf.Width = rectf.Height = 100.0;
@@ -369,7 +458,21 @@
     expectf(10.0, rectf.Y);
     expectf(100.0, rectf.Width);
     expectf(100.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok,status);
+        expectf(1.0, elements[0]);
+        expectf(0.0, elements[1]);
+        expectf(0.0, elements[2]);
+        expectf(1.0, elements[3]);
+        expectf(0.0, elements[4]);
+        expectf(0.0, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok,status);
     /* passing negative Width/Height to LinearGradientModeHorizontal */
     rectf.X = rectf.Y = 10.0;
     rectf.Width = rectf.Height = -100.0;
@@ -383,7 +486,23 @@
     expectf(10.0, rectf.Y);
     expectf(-100.0, rectf.Width);
     expectf(-100.0, rectf.Height);
+    status = GdipGetLineTransform(brush, transform);
+    todo_wine expect(Ok, status);
+    if (status == Ok)
+    {
+        status = GdipGetMatrixElements(transform, elements);
+        expect(Ok,status);
+        expectf(1.0, elements[0]);
+        expectf(0.0, elements[1]);
+        expectf(0.0, elements[2]);
+        expectf(1.0, elements[3]);
+        expectf(0.0, elements[4]);
+        expectf(0.0, elements[5]);
+    }
     status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok,status);
+
+    GdipDeleteMatrix(transform);
 }
 
 static void test_lineblend(void)
@@ -400,6 +519,10 @@
     REAL res_factors[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f};
     REAL res_positions[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f};
     ARGB res_colors[6] = {0xdeadbeef, 0, 0, 0, 0};
+
+    pt1.X = pt1.Y = pt2.Y = pt2.X = 1.0;
+    status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush);
+    expect(OutOfMemory, status);
 
     pt1.X = pt1.Y = 1.0;
     pt2.X = pt2.Y = 100.0;

Modified: trunk/rostests/winetests/gdiplus/font.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/font.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/font.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/font.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -34,6 +34,7 @@
 static const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'};
 static const WCHAR CourierNew[] = {'C','o','u','r','i','e','r',' ','N','e','w','\0'};
 static const WCHAR Tahoma[] = {'T','a','h','o','m','a',0};
+static const WCHAR LiberationSerif[] = {'L','i','b','e','r','a','t','i','o','n',' ','S','e','r','i','f',0};
 
 static void test_createfont(void)
 {
@@ -129,7 +130,8 @@
     expect(0, lfa2.lfItalic);
     expect(0, lfa2.lfUnderline);
     expect(0, lfa2.lfStrikeOut);
-    expect(GetTextCharset(hdc), lfa2.lfCharSet);
+    ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET,
+        "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet);
     expect(0, lfa2.lfOutPrecision);
     expect(0, lfa2.lfClipPrecision);
     expect(0, lfa2.lfQuality);
@@ -159,7 +161,8 @@
     expect(TRUE, lfa2.lfItalic);
     expect(TRUE, lfa2.lfUnderline);
     expect(TRUE, lfa2.lfStrikeOut);
-    expect(GetTextCharset(hdc), lfa2.lfCharSet);
+    ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET,
+        "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet);
     expect(0, lfa2.lfOutPrecision);
     expect(0, lfa2.lfClipPrecision);
     expect(0, lfa2.lfQuality);
@@ -252,6 +255,7 @@
         ok(result == 1854, "Expected 1854, got %d\n", result);
         result = 0;
         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
+        expect(Ok, stat);
         ok(result == 434, "Expected 434, got %d\n", result);
         GdipDeleteFontFamily(FontFamily);
     }
@@ -275,65 +279,68 @@
         ok(result == 1825, "Expected 1825, got %d\n", result);
         result = 0;
         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
+        expect(Ok, stat);
         ok(result == 443, "Expected 443 got %d\n", result);
         GdipDeleteFontFamily(FontFamily);
     }
 }
 
+static void check_family(const char* context, GpFontFamily *family, WCHAR *name)
+{
+    GpStatus stat;
+    GpFont* font;
+
+    *name = 0;
+    stat = GdipGetFamilyName(family, name, LANG_NEUTRAL);
+    ok(stat == Ok, "could not get the %s family name: %.8x\n", context, stat);
+
+    stat = GdipCreateFont(family, 12, FontStyleRegular, UnitPixel, &font);
+    ok(stat == Ok, "could not create a font for the %s family: %.8x\n", context, stat);
+    if (stat == Ok)
+    {
+        stat = GdipDeleteFont(font);
+        ok(stat == Ok, "could not delete the %s family font: %.8x\n", context, stat);
+    }
+
+    stat = GdipDeleteFontFamily(family);
+    ok(stat == Ok, "could not delete the %s family: %.8x\n", context, stat);
+}
+
 static void test_getgenerics (void)
 {
     GpStatus stat;
-    GpFontFamily* family;
-    WCHAR familyName[LF_FACESIZE];
-    ZeroMemory(familyName, sizeof(familyName)/sizeof(WCHAR));
-
-    stat = GdipGetGenericFontFamilySansSerif (&family);
+    GpFontFamily *family;
+    WCHAR sansname[LF_FACESIZE], serifname[LF_FACESIZE], mononame[LF_FACESIZE];
+    int missingfonts = 0;
+
+    stat = GdipGetGenericFontFamilySansSerif(&family);
+    expect (Ok, stat);
     if (stat == FontFamilyNotFound)
-    {
-        skip("Microsoft Sans Serif not installed\n");
-        goto serif;
-    }
-    expect (Ok, stat);
-    stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
-    expect (Ok, stat);
-    if (!lstrcmpiW(familyName, Tahoma))
-        todo_wine ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
-                      "Expected Microsoft Sans Serif, got Tahoma\n");
+        missingfonts = 1;
     else
-        ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
-            "Expected Microsoft Sans Serif, got %s\n", wine_dbgstr_w(familyName));
-    stat = GdipDeleteFontFamily (family);
-    expect (Ok, stat);
-
-serif:
-    stat = GdipGetGenericFontFamilySerif (&family);
+        check_family("Sans Serif", family, sansname);
+
+    stat = GdipGetGenericFontFamilySerif(&family);
+    expect (Ok, stat);
     if (stat == FontFamilyNotFound)
-    {
-        skip("Times New Roman not installed\n");
-        goto monospace;
-    }
-    expect (Ok, stat);
-    stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
-    expect (Ok, stat);
-    ok (lstrcmpiW(familyName, TimesNewRoman) == 0,
-        "Expected Times New Roman, got %s\n", wine_dbgstr_w(familyName));
-    stat = GdipDeleteFontFamily (family);
-    expect (Ok, stat);
-
-monospace:
-    stat = GdipGetGenericFontFamilyMonospace (&family);
+        missingfonts = 1;
+    else
+        check_family("Serif", family, serifname);
+
+    stat = GdipGetGenericFontFamilyMonospace(&family);
+    expect (Ok, stat);
     if (stat == FontFamilyNotFound)
-    {
-        skip("Courier New not installed\n");
-        return;
-    }
-    expect (Ok, stat);
-    stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
-    expect (Ok, stat);
-    ok (lstrcmpiW(familyName, CourierNew) == 0,
-        "Expected Courier New, got %s\n", wine_dbgstr_w(familyName));
-    stat = GdipDeleteFontFamily (family);
-    expect (Ok, stat);
+        missingfonts = 1;
+    else
+        check_family("Monospace", family, mononame);
+
+    if (missingfonts && strcmp(winetest_platform, "wine") == 0)
+        trace("You may need to install either the Microsoft Web Fonts or the Liberation Fonts\n");
+
+    /* Check that the family names are all different */
+    ok(lstrcmpiW(sansname, serifname) != 0, "Sans Serif and Serif families should be different: %s\n", wine_dbgstr_w(sansname));
+    ok(lstrcmpiW(sansname, mononame) != 0, "Sans Serif and Monospace families should be different: %s\n", wine_dbgstr_w(sansname));
+    ok(lstrcmpiW(serifname, mononame) != 0, "Serif and Monospace families should be different: %s\n", wine_dbgstr_w(serifname));
 }
 
 static void test_installedfonts (void)

Modified: trunk/rostests/winetests/gdiplus/graphics.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/graphics.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/graphics.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/graphics.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -230,6 +230,139 @@
     ReleaseDC(hwnd, hdc);
 }
 
+static void test_GdipFillClosedCurve2(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpSolidFill *brush = NULL;
+    HDC hdc = GetDC( hwnd );
+    GpPointF points[3];
+
+    points[0].X = 0;
+    points[0].Y = 0;
+
+    points[1].X = 40;
+    points[1].Y = 20;
+
+    points[2].X = 10;
+    points[2].Y = 40;
+
+    /* make a graphics object and brush object */
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+    /* InvalidParameter cases: null graphics, null brush, null points */
+    status = GdipFillClosedCurve2(NULL, NULL, NULL, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(graphics, NULL, NULL, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(NULL, (GpBrush*)brush, NULL, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(NULL, NULL, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, NULL, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(graphics, NULL, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(NULL, (GpBrush*)brush, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    /* InvalidParameter cases: invalid count */
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, points, -1, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, points, 0, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    /* Valid test cases */
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, points, 1, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, points, 2, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, points, 3, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+    GdipDeleteBrush((GpBrush*)brush);
+
+    ReleaseDC(hwnd, hdc);
+}
+
+static void test_GdipFillClosedCurve2I(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpSolidFill *brush = NULL;
+    HDC hdc = GetDC( hwnd );
+    GpPoint points[3];
+
+    points[0].X = 0;
+    points[0].Y = 0;
+
+    points[1].X = 40;
+    points[1].Y = 20;
+
+    points[2].X = 10;
+    points[2].Y = 40;
+
+    /* make a graphics object and brush object */
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+    /* InvalidParameter cases: null graphics, null brush */
+    /* Note: GdipFillClosedCurveI and GdipFillClosedCurve2I hang in Windows
+             when points == NULL, so don't test this condition */
+    status = GdipFillClosedCurve2I(NULL, NULL, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2I(graphics, NULL, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve2I(NULL, (GpBrush*)brush, points, 3, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    /* InvalidParameter cases: invalid count */
+    status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, points, 0, 0.5, FillModeAlternate);
+    expect(InvalidParameter, status);
+
+    /* OutOfMemory cases: large (unsigned) int */
+    status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, points, -1, 0.5, FillModeAlternate);
+    expect(OutOfMemory, status);
+
+    /* Valid test cases */
+    status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, points, 1, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, points, 2, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, points, 3, 0.5, FillModeAlternate);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+    GdipDeleteBrush((GpBrush*)brush);
+
+    ReleaseDC(hwnd, hdc);
+}
+
 static void test_GdipDrawArc(void)
 {
     GpStatus status;
@@ -413,8 +546,9 @@
     status = GdipBeginContainer2(graphics, &cont1);
     expect(Ok, status);
 
-    GdipCreateMatrix2(defTrans[0], defTrans[1], defTrans[2], defTrans[3],
+    status = GdipCreateMatrix2(defTrans[0], defTrans[1], defTrans[2], defTrans[3],
             defTrans[4], defTrans[5], &transform);
+    expect(Ok, status);
     GdipSetWorldTransform(graphics, transform);
     GdipDeleteMatrix(transform);
     transform = NULL;
@@ -422,7 +556,8 @@
     status = GdipBeginContainer2(graphics, &cont2);
     expect(Ok, status);
 
-    GdipCreateMatrix2(10, 20, 30, 40, 50, 60, &transform);
+    status = GdipCreateMatrix2(10, 20, 30, 40, 50, 60, &transform);
+    expect(Ok, status);
     GdipSetWorldTransform(graphics, transform);
     GdipDeleteMatrix(transform);
     transform = NULL;
@@ -430,7 +565,8 @@
     status = GdipEndContainer(graphics, cont2);
     expect(Ok, status);
 
-    GdipCreateMatrix(&transform);
+    status = GdipCreateMatrix(&transform);
+    expect(Ok, status);
     GdipGetWorldTransform(graphics, transform);
     GdipGetMatrixElements(transform, elems);
     ok(fabs(defTrans[0] - elems[0]) < 0.0001 &&
@@ -460,6 +596,7 @@
     GdipSetClipRect(graphics, 2, 4, 6, 8, CombineModeReplace);
 
     status = GdipEndContainer(graphics, cont2);
+    expect(Ok, status);
 
     GdipGetClipBounds(graphics, &clip);
     ok(fabs(defClip[0] - clip.X) < 0.0001 &&
@@ -471,6 +608,7 @@
             clip.X, clip.Y, clip.Width, clip.Height);
 
     status = GdipEndContainer(graphics, cont1);
+    expect(Ok, status);
 
     /* nesting */
     status = GdipBeginContainer2(graphics, &cont1);
@@ -995,6 +1133,60 @@
     ReleaseDC(hwnd, hdc);
 }
 
+static void test_GdipDrawImagePointsRect(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpPointF ptf[4];
+    GpBitmap *bm = NULL;
+    BYTE rbmi[sizeof(BITMAPINFOHEADER)];
+    BYTE buff[400];
+    BITMAPINFO *bmi = (BITMAPINFO*)rbmi;
+    HDC hdc = GetDC( hwnd );
+    if (!hdc)
+        return;
+
+    memset(rbmi, 0, sizeof(rbmi));
+    bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    bmi->bmiHeader.biWidth = 10;
+    bmi->bmiHeader.biHeight = 10;
+    bmi->bmiHeader.biPlanes = 1;
+    bmi->bmiHeader.biBitCount = 32;
+    bmi->bmiHeader.biCompression = BI_RGB;
+    status = GdipCreateBitmapFromGdiDib(bmi, buff, &bm);
+    expect(Ok, status);
+    ok(NULL != bm, "Expected bitmap to be initialized\n");
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ptf[0].X = 0;
+    ptf[0].Y = 0;
+    ptf[1].X = 10;
+    ptf[1].Y = 0;
+    ptf[2].X = 0;
+    ptf[2].Y = 10;
+    ptf[3].X = 10;
+    ptf[3].Y = 10;
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 4, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(NotImplemented, status);
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 2, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(Ok, status);
+    status = GdipDrawImagePointsRect(graphics, NULL, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, NULL, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(InvalidParameter, status);
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 0, 0, UnitPixel, NULL, NULL, NULL);
+    expect(Ok, status);
+    memset(ptf, 0, sizeof(ptf));
+    status = GdipDrawImagePointsRect(graphics, (GpImage*)bm, ptf, 3, 0, 0, 10, 10, UnitPixel, NULL, NULL, NULL);
+    expect(Ok, status);
+
+    GdipDisposeImage((GpImage*)bm);
+    GdipDeleteGraphics(graphics);
+    ReleaseDC(hwnd, hdc);
+}
+
 static void test_GdipDrawLinesI(void)
 {
     GpStatus status;
@@ -1043,6 +1235,139 @@
     GdipFree(ptf);
     GdipDeletePen(pen);
     GdipDeleteGraphics(graphics);
+
+    ReleaseDC(hwnd, hdc);
+}
+
+static void test_GdipFillClosedCurve(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpSolidFill *brush = NULL;
+    HDC hdc = GetDC( hwnd );
+    GpPointF points[3];
+
+    points[0].X = 0;
+    points[0].Y = 0;
+
+    points[1].X = 40;
+    points[1].Y = 20;
+
+    points[2].X = 10;
+    points[2].Y = 40;
+
+    /* make a graphics object and brush object */
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+    /* InvalidParameter cases: null graphics, null brush, null points */
+    status = GdipFillClosedCurve(NULL, NULL, NULL, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(graphics, NULL, NULL, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(NULL, (GpBrush*)brush, NULL, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(NULL, NULL, points, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, NULL, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(graphics, NULL, points, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(NULL, (GpBrush*)brush, points, 3);
+    expect(InvalidParameter, status);
+
+    /* InvalidParameter cases: invalid count */
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, -1);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 0);
+    expect(InvalidParameter, status);
+
+    /* Valid test cases */
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 1);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 2);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 3);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+    GdipDeleteBrush((GpBrush*)brush);
+
+    ReleaseDC(hwnd, hdc);
+}
+
+static void test_GdipFillClosedCurveI(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpSolidFill *brush = NULL;
+    HDC hdc = GetDC( hwnd );
+    GpPoint points[3];
+
+    points[0].X = 0;
+    points[0].Y = 0;
+
+    points[1].X = 40;
+    points[1].Y = 20;
+
+    points[2].X = 10;
+    points[2].Y = 40;
+
+    /* make a graphics object and brush object */
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+    /* InvalidParameter cases: null graphics, null brush */
+    /* Note: GdipFillClosedCurveI and GdipFillClosedCurve2I hang in Windows
+             when points == NULL, so don't test this condition */
+    status = GdipFillClosedCurveI(NULL, NULL, points, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurveI(graphics, NULL, points, 3);
+    expect(InvalidParameter, status);
+
+    status = GdipFillClosedCurveI(NULL, (GpBrush*)brush, points, 3);
+    expect(InvalidParameter, status);
+
+    /* InvalidParameter cases: invalid count */
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 0);
+    expect(InvalidParameter, status);
+
+    /* OutOfMemory cases: large (unsigned) int */
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, -1);
+    expect(OutOfMemory, status);
+
+    /* Valid test cases */
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 1);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 2);
+    expect(Ok, status);
+
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 3);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+    GdipDeleteBrush((GpBrush*)brush);
 
     ReleaseDC(hwnd, hdc);
 }
@@ -1108,7 +1433,8 @@
         rectf[i].Width  = (REAL)rect[i].Width;
     }
 
-    GdipCreateMatrix(&m);
+    status = GdipCreateMatrix(&m);
+    expect(Ok, status);
     GdipCreateRegion(&region);
     GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
     GdipCreatePath(FillModeAlternate, &path);
@@ -1148,189 +1474,194 @@
     expect(ObjectBusy, status);
 
     /* try all Graphics calls here */
-    status = Ok;
     status = GdipDrawArc(graphics, pen, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawArcI(graphics, pen, 0, 0, 1, 1, 0.0, 0.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawBezier(graphics, pen, 0.0, 10.0, 20.0, 15.0, 35.0, -10.0, 10.0, 10.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawBezierI(graphics, pen, 0, 0, 0, 0, 0, 0, 0, 0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawBeziers(graphics, pen, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawBeziersI(graphics, pen, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawClosedCurve(graphics, pen, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawClosedCurveI(graphics, pen, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawClosedCurve2(graphics, pen, ptf, 5, 1.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawClosedCurve2I(graphics, pen, pt, 5, 1.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawCurve(graphics, pen, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawCurveI(graphics, pen, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawCurve2(graphics, pen, ptf, 5, 1.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawCurve2I(graphics, pen, pt, 5, 1.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawEllipse(graphics, pen, 0.0, 0.0, 100.0, 50.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawEllipseI(graphics, pen, 0, 0, 100, 50);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     /* GdipDrawImage/GdipDrawImageI */
     /* GdipDrawImagePointsRect/GdipDrawImagePointsRectI */
     /* GdipDrawImageRectRect/GdipDrawImageRectRectI */
     /* GdipDrawImageRect/GdipDrawImageRectI */
     status = GdipDrawLine(graphics, pen, 0.0, 0.0, 100.0, 200.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawLineI(graphics, pen, 0, 0, 100, 200);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawLines(graphics, pen, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawLinesI(graphics, pen, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawPath(graphics, pen, path);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawPie(graphics, pen, 0.0, 0.0, 100.0, 100.0, 0.0, 90.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawPieI(graphics, pen, 0, 0, 100, 100, 0.0, 90.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawRectangle(graphics, pen, 0.0, 0.0, 100.0, 300.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawRectangleI(graphics, pen, 0, 0, 100, 300);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawRectangles(graphics, pen, rectf, 2);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawRectanglesI(graphics, pen, rect, 2);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     /* GdipDrawString */
     status = GdipFillClosedCurve2(graphics, (GpBrush*)brush, ptf, 5, 1.0, FillModeAlternate);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, pt, 5, 1.0, FillModeAlternate);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
+    status = GdipFillClosedCurve(graphics, (GpBrush*)brush, ptf, 5);
+    expect(ObjectBusy, status);
+    status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, pt, 5);
+    expect(ObjectBusy, status);
     status = GdipFillEllipse(graphics, (GpBrush*)brush, 0.0, 0.0, 100.0, 100.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillEllipseI(graphics, (GpBrush*)brush, 0, 0, 100, 100);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPath(graphics, (GpBrush*)brush, path);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPie(graphics, (GpBrush*)brush, 0.0, 0.0, 100.0, 100.0, 0.0, 15.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPieI(graphics, (GpBrush*)brush, 0, 0, 100, 100, 0.0, 15.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPolygon(graphics, (GpBrush*)brush, ptf, 5, FillModeAlternate);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPolygonI(graphics, (GpBrush*)brush, pt, 5, FillModeAlternate);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPolygon2(graphics, (GpBrush*)brush, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillPolygon2I(graphics, (GpBrush*)brush, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillRectangle(graphics, (GpBrush*)brush, 0.0, 0.0, 100.0, 100.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillRectangleI(graphics, (GpBrush*)brush, 0, 0, 100, 100);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillRectangles(graphics, (GpBrush*)brush, rectf, 2);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillRectanglesI(graphics, (GpBrush*)brush, rect, 2);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFillRegion(graphics, (GpBrush*)brush, region);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipFlush(graphics, FlushIntentionFlush);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetClipBounds(graphics, rectf);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetClipBoundsI(graphics, rect);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetCompositingMode(graphics, &compmode);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetCompositingQuality(graphics, &quality);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetInterpolationMode(graphics, &intmode);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetNearestColor(graphics, &color);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetPageScale(graphics, &r);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetPageUnit(graphics, &unit);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetPixelOffsetMode(graphics, &offsetmode);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetSmoothingMode(graphics, &smoothmode);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetTextRenderingHint(graphics, &texthint);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetWorldTransform(graphics, m);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGraphicsClear(graphics, 0xdeadbeef);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipIsVisiblePoint(graphics, 0.0, 0.0, &res);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipIsVisiblePointI(graphics, 0, 0, &res);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     /* GdipMeasureCharacterRanges */
     /* GdipMeasureString */
     status = GdipResetClip(graphics);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipResetWorldTransform(graphics);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     /* GdipRestoreGraphics */
     status = GdipRotateWorldTransform(graphics, 15.0, MatrixOrderPrepend);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     /*  GdipSaveGraphics */
     status = GdipScaleWorldTransform(graphics, 1.0, 1.0, MatrixOrderPrepend);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetCompositingMode(graphics, CompositingModeSourceOver);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetCompositingQuality(graphics, CompositingQualityDefault);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetInterpolationMode(graphics, InterpolationModeDefault);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetPageScale(graphics, 1.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetPageUnit(graphics, UnitWorld);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetPixelOffsetMode(graphics, PixelOffsetModeDefault);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetSmoothingMode(graphics, SmoothingModeDefault);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetTextRenderingHint(graphics, TextRenderingHintSystemDefault);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetWorldTransform(graphics, m);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipTranslateWorldTransform(graphics, 0.0, 0.0, MatrixOrderPrepend);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetClipHrgn(graphics, hrgn, CombineModeReplace);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetClipPath(graphics, path, CombineModeReplace);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetClipRect(graphics, 0.0, 0.0, 10.0, 10.0, CombineModeReplace);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetClipRectI(graphics, 0, 0, 10, 10, CombineModeReplace);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipSetClipRegion(graphics, clip, CombineModeReplace);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipTranslateClip(graphics, 0.0, 0.0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipTranslateClipI(graphics, 0, 0);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawPolygon(graphics, pen, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipDrawPolygonI(graphics, pen, pt, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetDpiX(graphics, &r);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipGetDpiY(graphics, &r);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipMultiplyWorldTransform(graphics, m, MatrixOrderPrepend);
+    expect(ObjectBusy, status);
     status = GdipGetClip(graphics, region);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
     status = GdipTransformPoints(graphics, CoordinateSpacePage, CoordinateSpaceWorld, ptf, 5);
-    expect(ObjectBusy, status); status = Ok;
+    expect(ObjectBusy, status);
+
     /* try to delete before release */
     status = GdipDeleteGraphics(graphics);
     expect(ObjectBusy, status);
@@ -1487,6 +1818,7 @@
     rect.Height = rect.Width = 100.0;
 
     status = GdipCreateRegionRect(&rect, &clip);
+    expect(Ok, status);
 
     /* NULL arguments */
     status = GdipGetClip(NULL, NULL);
@@ -1608,6 +1940,7 @@
     status = GdipGetTextContrast(graphics, NULL);
     expect(InvalidParameter, status);
     status = GdipGetTextContrast(graphics, &contrast);
+    expect(Ok, status);
     expect(4, contrast);
 
     GdipDeleteGraphics(graphics);
@@ -1625,6 +1958,8 @@
     LOGFONTA logfont;
     HDC hdc = GetDC( hwnd );
     static const WCHAR string[] = {'T','e','s','t',0};
+    static const PointF positions[4] = {{0,0}, {1,1}, {2,2}, {3,3}};
+    GpMatrix *matrix;
 
     memset(&logfont,0,sizeof(logfont));
     strcpy(logfont.lfFaceName,"Arial");
@@ -1656,6 +1991,34 @@
     status = GdipDrawString(graphics, string, 4, fnt, &rect, format, brush);
     expect(Ok, status);
 
+    status = GdipCreateMatrix(&matrix);
+    expect(Ok, status);
+
+    status = GdipDrawDriverString(NULL, string, 4, fnt, brush, positions, DriverStringOptionsCmapLookup, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipDrawDriverString(graphics, NULL, 4, fnt, brush, positions, DriverStringOptionsCmapLookup, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, NULL, brush, positions, DriverStringOptionsCmapLookup, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, fnt, NULL, positions, DriverStringOptionsCmapLookup, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, fnt, brush, NULL, DriverStringOptionsCmapLookup, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, fnt, brush, positions, DriverStringOptionsCmapLookup|0x10, matrix);
+    expect(Ok, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, fnt, brush, positions, DriverStringOptionsCmapLookup, NULL);
+    expect(Ok, status);
+
+    status = GdipDrawDriverString(graphics, string, 4, fnt, brush, positions, DriverStringOptionsCmapLookup, matrix);
+    expect(Ok, status);
+
+    GdipDeleteMatrix(matrix);
     GdipDeleteGraphics(graphics);
     GdipDeleteBrush(brush);
     GdipDeleteFont(fnt);
@@ -1887,6 +2250,8 @@
     GpGraphics *graphics = NULL;
     GpBitmap *bitmap = NULL;
     BYTE bits[48] = {0};
+    HDC hdc=NULL;
+    COLORREF color;
 
     status = GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB, bits, &bitmap);
     expect(Ok, status);
@@ -1900,7 +2265,51 @@
     GdipDeleteGraphics(graphics);
 
     /* drawing writes to the memory provided */
-    todo_wine expect(0x68, bits[10]);
+    expect(0x68, bits[10]);
+
+    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+    expect(Ok, status);
+
+    status = GdipGetDC(graphics, &hdc);
+    expect(Ok, status);
+    ok(hdc != NULL, "got NULL hdc\n");
+
+    color = GetPixel(hdc, 0, 0);
+    /* The HDC is write-only, and native fills with a solid color to figure out
+     * which pixels have changed. */
+    todo_wine expect(0x0c0b0d, color);
+
+    SetPixel(hdc, 0, 0, 0x797979);
+    SetPixel(hdc, 1, 0, 0x0c0b0d);
+
+    status = GdipReleaseDC(graphics, hdc);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+
+    expect(0x79, bits[0]);
+    todo_wine expect(0x68, bits[3]);
+
+    GdipDisposeImage((GpImage*)bitmap);
+
+    /* We get the same kind of write-only HDC for a "normal" bitmap */
+    status = GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB, NULL, &bitmap);
+    expect(Ok, status);
+
+    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+    expect(Ok, status);
+
+    status = GdipGetDC(graphics, &hdc);
+    expect(Ok, status);
+    ok(hdc != NULL, "got NULL hdc\n");
+
+    color = GetPixel(hdc, 0, 0);
+    todo_wine expect(0x0c0b0d, color);
+
+    status = GdipReleaseDC(graphics, hdc);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
 
     GdipDisposeImage((GpImage*)bitmap);
 }
@@ -2347,33 +2756,42 @@
 
     status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat48bppRGB, NULL, &bitmap);
     expect(Ok, status);
-    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
-    expect(Ok, status);
-    status = GdipGetNearestColor(graphics, &color);
-    expect(Ok, status);
-    expect(0xdeadbeef, color);
-    GdipDeleteGraphics(graphics);
-    GdipDisposeImage((GpImage*)bitmap);
+    if (status == Ok)
+    {
+        status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+        expect(Ok, status);
+        status = GdipGetNearestColor(graphics, &color);
+        expect(Ok, status);
+        expect(0xdeadbeef, color);
+        GdipDeleteGraphics(graphics);
+        GdipDisposeImage((GpImage*)bitmap);
+    }
 
     status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppARGB, NULL, &bitmap);
     expect(Ok, status);
-    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
-    expect(Ok, status);
-    status = GdipGetNearestColor(graphics, &color);
-    expect(Ok, status);
-    expect(0xdeadbeef, color);
-    GdipDeleteGraphics(graphics);
-    GdipDisposeImage((GpImage*)bitmap);
+    if (status == Ok)
+    {
+        status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+        expect(Ok, status);
+        status = GdipGetNearestColor(graphics, &color);
+        expect(Ok, status);
+        expect(0xdeadbeef, color);
+        GdipDeleteGraphics(graphics);
+        GdipDisposeImage((GpImage*)bitmap);
+    }
 
     status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppPARGB, NULL, &bitmap);
     expect(Ok, status);
-    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
-    expect(Ok, status);
-    status = GdipGetNearestColor(graphics, &color);
-    expect(Ok, status);
-    expect(0xdeadbeef, color);
-    GdipDeleteGraphics(graphics);
-    GdipDisposeImage((GpImage*)bitmap);
+    if (status == Ok)
+    {
+        status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+        expect(Ok, status);
+        status = GdipGetNearestColor(graphics, &color);
+        expect(Ok, status);
+        expect(0xdeadbeef, color);
+        GdipDeleteGraphics(graphics);
+        GdipDisposeImage((GpImage*)bitmap);
+    }
 
     status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB565, NULL, &bitmap);
     expect(Ok, status);
@@ -2413,6 +2831,7 @@
     HDC hdc = GetDC( hwnd );
     const WCHAR fontname[] = {'T','a','h','o','m','a',0};
     const WCHAR teststring[] = {'M','M',' ','M','\n','M',0};
+    const WCHAR teststring2[] = {'j',0};
     REAL char_width, char_height;
     INT codepointsfitted, linesfilled;
     GpStringFormat *format;
@@ -2420,6 +2839,8 @@
     GpRegion *regions[4] = {0};
     BOOL region_isempty[4];
     int i;
+    PointF position;
+    GpMatrix *identity;
 
     ok(hdc != NULL, "Expected HDC to be initialized\n");
     status = GdipCreateFromHDC(hdc, &graphics);
@@ -2619,6 +3040,96 @@
     for (i=0; i<4; i++)
         GdipDeleteRegion(regions[i]);
 
+    status = GdipCreateMatrix(&identity);
+    expect(Ok, status);
+
+    position.X = 0;
+    position.Y = 0;
+
+    rc.X = 0;
+    rc.Y = 0;
+    rc.Width = 0;
+    rc.Height = 0;
+    status = GdipMeasureDriverString(NULL, teststring, 6, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(InvalidParameter, status);
+
+    status = GdipMeasureDriverString(graphics, NULL, 6, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(InvalidParameter, status);
+
+    status = GdipMeasureDriverString(graphics, teststring, 6, NULL, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(InvalidParameter, status);
+
+    status = GdipMeasureDriverString(graphics, teststring, 6, font, NULL,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(InvalidParameter, status);
+
+    status = GdipMeasureDriverString(graphics, teststring, 6, font, &position,
+        0x100, identity, &rc);
+    expect(Ok, status);
+
+    status = GdipMeasureDriverString(graphics, teststring, 6, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        NULL, &rc);
+    expect(Ok, status);
+
+    status = GdipMeasureDriverString(graphics, teststring, 6, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, NULL);
+    expect(InvalidParameter, status);
+
+    rc.X = 0;
+    rc.Y = 0;
+    rc.Width = 0;
+    rc.Height = 0;
+    status = GdipMeasureDriverString(graphics, teststring, 6, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(Ok, status);
+
+    expectf(0.0, rc.X);
+    ok(rc.Y < 0.0, "unexpected Y %0.2f\n", rc.Y);
+    ok(rc.Width > 0.0, "unexpected Width %0.2f\n", rc.Width);
+    ok(rc.Height > 0.0, "unexpected Y %0.2f\n", rc.Y);
+
+    char_width = rc.Width;
+    char_height = rc.Height;
+
+    rc.X = 0;
+    rc.Y = 0;
+    rc.Width = 0;
+    rc.Height = 0;
+    status = GdipMeasureDriverString(graphics, teststring, 4, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(Ok, status);
+
+    expectf(0.0, rc.X);
+    ok(rc.Y < 0.0, "unexpected Y %0.2f\n", rc.Y);
+    ok(rc.Width < char_width, "got Width %0.2f, expecting less than %0.2f\n", rc.Width, char_width);
+    expectf(char_height, rc.Height);
+
+    rc.X = 0;
+    rc.Y = 0;
+    rc.Width = 0;
+    rc.Height = 0;
+    status = GdipMeasureDriverString(graphics, teststring2, 1, font, &position,
+        DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance,
+        identity, &rc);
+    expect(Ok, status);
+
+    expectf(rc.X, 0.0);
+    ok(rc.Y < 0.0, "unexpected Y %0.2f\n", rc.Y);
+    ok(rc.Width > 0, "unexpected Width %0.2f\n", rc.Width);
+    expectf(rc.Height, char_height);
+
+    GdipDeleteMatrix(identity);
     GdipDeleteStringFormat(format);
     GdipDeleteBrush(brush);
     GdipDeleteFont(font);
@@ -2626,6 +3137,171 @@
     GdipDeleteGraphics(graphics);
 
     ReleaseDC(hwnd, hdc);
+}
+
+static void test_get_set_interpolation(void)
+{
+    GpGraphics *graphics;
+    HDC hdc = GetDC( hwnd );
+    GpStatus status;
+    InterpolationMode mode;
+
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    status = GdipGetInterpolationMode(NULL, &mode);
+    expect(InvalidParameter, status);
+
+    if (0)
+    {
+        /* Crashes on Windows XP */
+        status = GdipGetInterpolationMode(graphics, NULL);
+        expect(InvalidParameter, status);
+    }
+
+    status = GdipSetInterpolationMode(NULL, InterpolationModeNearestNeighbor);
+    expect(InvalidParameter, status);
+
+    /* out of range */
+    status = GdipSetInterpolationMode(graphics, InterpolationModeHighQualityBicubic+1);
+    expect(InvalidParameter, status);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeInvalid);
+    expect(InvalidParameter, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeNearestNeighbor);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeNearestNeighbor, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeDefault);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeLowQuality);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeHighQuality);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeHighQualityBicubic, mode);
+
+    GdipDeleteGraphics(graphics);
+
+    ReleaseDC(hwnd, hdc);
+}
+
+static void test_get_set_textrenderinghint(void)
+{
+    GpGraphics *graphics;
+    HDC hdc = GetDC( hwnd );
+    GpStatus status;
+    TextRenderingHint hint;
+
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    status = GdipGetTextRenderingHint(NULL, &hint);
+    expect(InvalidParameter, status);
+
+    status = GdipGetTextRenderingHint(graphics, NULL);
+    expect(InvalidParameter, status);
+
+    status = GdipSetTextRenderingHint(NULL, TextRenderingHintAntiAlias);
+    expect(InvalidParameter, status);
+
+    /* out of range */
+    status = GdipSetTextRenderingHint(graphics, TextRenderingHintClearTypeGridFit+1);
+    expect(InvalidParameter, status);
+
+    status = GdipGetTextRenderingHint(graphics, &hint);
+    expect(Ok, status);
+    expect(TextRenderingHintSystemDefault, hint);
+
+    status = GdipSetTextRenderingHint(graphics, TextRenderingHintSystemDefault);
+    expect(Ok, status);
+
+    status = GdipGetTextRenderingHint(graphics, &hint);
+    expect(Ok, status);
+    expect(TextRenderingHintSystemDefault, hint);
+
+    status = GdipSetTextRenderingHint(graphics, TextRenderingHintAntiAliasGridFit);
+    expect(Ok, status);
+
+    status = GdipGetTextRenderingHint(graphics, &hint);
+    expect(Ok, status);
+    expect(TextRenderingHintAntiAliasGridFit, hint);
+
+    GdipDeleteGraphics(graphics);
+
+    ReleaseDC(hwnd, hdc);
+}
+
+static void test_getdc_scaled(void)
+{
+    GpStatus status;
+    GpGraphics *graphics = NULL;
+    GpBitmap *bitmap = NULL;
+    HDC hdc=NULL;
+    HBRUSH hbrush, holdbrush;
+    ARGB color;
+
+    status = GdipCreateBitmapFromScan0(10, 10, 12, PixelFormat24bppRGB, NULL, &bitmap);
+    expect(Ok, status);
+
+    status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+    expect(Ok, status);
+
+    status = GdipScaleWorldTransform(graphics, 2.0, 2.0, MatrixOrderPrepend);
+    expect(Ok, status);
+
+    status = GdipGetDC(graphics, &hdc);
+    expect(Ok, status);
+    ok(hdc != NULL, "got NULL hdc\n");
+
+    hbrush = CreateSolidBrush(RGB(255, 0, 0));
+
+    holdbrush = SelectObject(hdc, hbrush);
+
+    Rectangle(hdc, 2, 2, 6, 6);
+
+    SelectObject(hdc, holdbrush);
+
+    DeleteObject(hbrush);
+
+    status = GdipReleaseDC(graphics, hdc);
+    expect(Ok, status);
+
+    GdipDeleteGraphics(graphics);
+
+    status = GdipBitmapGetPixel(bitmap, 3, 3, &color);
+    expect(Ok, status);
+    expect(0xffff0000, color);
+
+    status = GdipBitmapGetPixel(bitmap, 8, 8, &color);
+    expect(Ok, status);
+    expect(0xff000000, color);
+
+    GdipDisposeImage((GpImage*)bitmap);
 }
 
 START_TEST(graphics)
@@ -2656,6 +3332,8 @@
 
     test_constructor_destructor();
     test_save_restore();
+    test_GdipFillClosedCurve2();
+    test_GdipFillClosedCurve2I();
     test_GdipDrawBezierI();
     test_GdipDrawArc();
     test_GdipDrawArcI();
@@ -2667,6 +3345,9 @@
     test_GdipDrawCurve3I();
     test_GdipDrawLineI();
     test_GdipDrawLinesI();
+    test_GdipDrawImagePointsRect();
+    test_GdipFillClosedCurve();
+    test_GdipFillClosedCurveI();
     test_GdipDrawString();
     test_GdipGetNearestColor();
     test_GdipGetVisibleClipBounds();
@@ -2681,6 +3362,9 @@
     test_textcontrast();
     test_fromMemoryBitmap();
     test_string_functions();
+    test_get_set_interpolation();
+    test_get_set_textrenderinghint();
+    test_getdc_scaled();
 
     GdiplusShutdown(gdiplusToken);
     DestroyWindow( hwnd );

Modified: trunk/rostests/winetests/gdiplus/graphicspath.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/graphicspath.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/graphicspath.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/graphicspath.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -1106,6 +1106,34 @@
     ReleaseDC(0, hdc);
 }
 
+static void test_empty_rect(void)
+{
+    GpPath *path;
+    GpStatus status;
+    BOOL result;
+
+    status = GdipCreatePath(FillModeAlternate, &path);
+    expect(Ok, status);
+
+    status = GdipAddPathRectangle(path, 0.0, 0.0, -5.0, 5.0);
+    expect(Ok, status);
+
+    status = GdipIsVisiblePathPoint(path, -2.0, 2.0, NULL, &result);
+    expect(Ok, status);
+    expect(FALSE, status);
+
+    status = GdipAddPathRectangle(path, 0.0, 0.0, 5.0, -5.0);
+    expect(Ok, status);
+
+    status = GdipAddPathRectangle(path, 0.0, 0.0, 0.0, 5.0);
+    expect(Ok, status);
+
+    status = GdipAddPathRectangle(path, 0.0, 0.0, 5.0, 0.0);
+    expect(Ok, status);
+
+    GdipDeletePath(path);
+}
+
 START_TEST(graphicspath)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -1135,6 +1163,7 @@
     test_addpie();
     test_flatten();
     test_isvisible();
+    test_empty_rect();
 
     GdiplusShutdown(gdiplusToken);
 }

Modified: trunk/rostests/winetests/gdiplus/image.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/image.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/image.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/image.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -516,6 +516,8 @@
     GpRect rect;
     BitmapData bd;
     const INT WIDTH = 10, HEIGHT = 20;
+    ARGB color;
+    int y;
 
     bm = NULL;
     stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm);
@@ -526,14 +528,32 @@
     rect.Width = 4;
     rect.Height = 5;
 
+    stat = GdipBitmapSetPixel(bm, 2, 3, 0xffc30000);
+    expect(Ok, stat);
+
+    stat = GdipBitmapSetPixel(bm, 2, 8, 0xff480000);
+    expect(Ok, stat);
+
     /* read-only */
     stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead, PixelFormat24bppRGB, &bd);
     expect(Ok, stat);
 
     if (stat == Ok) {
+        expect(0xc3, ((BYTE*)bd.Scan0)[2]);
+        expect(0x48, ((BYTE*)bd.Scan0)[2 + bd.Stride * 5]);
+
+        ((char*)bd.Scan0)[2] = 0xff;
+
         stat = GdipBitmapUnlockBits(bm, &bd);
         expect(Ok, stat);
     }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xffff0000, color);
+
+    stat = GdipBitmapSetPixel(bm, 2, 3, 0xffc30000);
+    expect(Ok, stat);
 
     /* read-only, with NULL rect -> whole bitmap lock */
     stat = GdipBitmapLockBits(bm, NULL, ImageLockModeRead, PixelFormat24bppRGB, &bd);
@@ -542,9 +562,15 @@
     expect(bd.Height, HEIGHT);
 
     if (stat == Ok) {
+        ((char*)bd.Scan0)[2 + 2*3 + 3*bd.Stride] = 0xff;
+
         stat = GdipBitmapUnlockBits(bm, &bd);
         expect(Ok, stat);
     }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xffff0000, color);
 
     /* read-only, consecutive */
     stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead, PixelFormat24bppRGB, &bd);
@@ -568,6 +594,102 @@
 
     stat = GdipBitmapUnlockBits(bm, &bd);
     expect(Ok, stat);
+
+    stat = GdipDisposeImage((GpImage*)bm);
+    expect(Ok, stat);
+    stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm);
+    expect(Ok, stat);
+
+    stat = GdipBitmapSetPixel(bm, 2, 3, 0xffff0000);
+    expect(Ok, stat);
+
+    stat = GdipBitmapSetPixel(bm, 2, 8, 0xffc30000);
+    expect(Ok, stat);
+
+    /* write, no conversion */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeWrite, PixelFormat24bppRGB, &bd);
+    expect(Ok, stat);
+
+    if (stat == Ok) {
+        /* all bits are readable, inside the rect or not */
+        expect(0xff, ((BYTE*)bd.Scan0)[2]);
+        expect(0xc3, ((BYTE*)bd.Scan0)[2 + bd.Stride * 5]);
+
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    /* read, conversion */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    if (stat == Ok) {
+        expect(0xff, ((BYTE*)bd.Scan0)[2]);
+        if (0)
+            /* Areas outside the rectangle appear to be uninitialized */
+            ok(0xc3 != ((BYTE*)bd.Scan0)[2 + bd.Stride * 5], "original image bits are readable\n");
+
+        ((BYTE*)bd.Scan0)[2] = 0xc3;
+
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    /* writes do not work in read mode if there was a conversion */
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xffff0000, color);
+
+    /* read/write, conversion */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead|ImageLockModeWrite, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    if (stat == Ok) {
+        expect(0xff, ((BYTE*)bd.Scan0)[2]);
+        ((BYTE*)bd.Scan0)[1] = 0x88;
+        if (0)
+            /* Areas outside the rectangle appear to be uninitialized */
+            ok(0xc3 != ((BYTE*)bd.Scan0)[2 + bd.Stride * 5], "original image bits are readable\n");
+
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xffff8800, color);
+
+    /* write, conversion */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeWrite, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    if (stat == Ok) {
+        if (0)
+        {
+            /* This is completely uninitialized. */
+            ok(0xff != ((BYTE*)bd.Scan0)[2], "original image bits are readable\n");
+            ok(0xc3 != ((BYTE*)bd.Scan0)[2 + bd.Stride * 5], "original image bits are readable\n");
+        }
+
+        /* Initialize the buffer so the unlock doesn't access undefined memory */
+        for (y=0; y<5; y++)
+            memset(((BYTE*)bd.Scan0) + bd.Stride * y, 0, 12);
+
+        ((BYTE*)bd.Scan0)[0] = 0x12;
+        ((BYTE*)bd.Scan0)[1] = 0x34;
+        ((BYTE*)bd.Scan0)[2] = 0x56;
+
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xff563412, color);
+
+    stat = GdipBitmapGetPixel(bm, 2, 8, &color);
+    expect(Ok, stat);
+    expect(0xffc30000, color);
 
     stat = GdipDisposeImage((GpImage*)bm);
     expect(Ok, stat);
@@ -609,6 +731,10 @@
         expect(Ok, stat);
     }
 
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xffff0000, color);
+
     stat = GdipDisposeImage((GpImage*)bm);
     expect(Ok, stat);
 
@@ -620,6 +746,102 @@
     stat = GdipDisposeImage((GpImage*)bm);
     expect(Ok, stat);
 }
+
+static void test_LockBits_UserBuf(void)
+{
+    GpStatus stat;
+    GpBitmap *bm;
+    GpRect rect;
+    BitmapData bd;
+    const INT WIDTH = 10, HEIGHT = 20;
+    DWORD bits[200];
+    ARGB color;
+
+    bm = NULL;
+    stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat32bppARGB, NULL, &bm);
+    expect(Ok, stat);
+
+    memset(bits, 0xaa, sizeof(bits));
+
+    rect.X = 2;
+    rect.Y = 3;
+    rect.Width = 4;
+    rect.Height = 5;
+
+    bd.Width = 4;
+    bd.Height = 6;
+    bd.Stride = WIDTH * 4;
+    bd.PixelFormat = PixelFormat32bppARGB;
+    bd.Scan0 = &bits[2+3*WIDTH];
+    bd.Reserved = 0xaaaaaaaa;
+
+    /* read-only */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    expect(0xaaaaaaaa, bits[0]);
+    expect(0, bits[2+3*WIDTH]);
+
+    bits[2+3*WIDTH] = 0xdeadbeef;
+
+    if (stat == Ok) {
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0, color);
+
+    /* write-only */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeWrite|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    expect(0xdeadbeef, bits[2+3*WIDTH]);
+    bits[2+3*WIDTH] = 0x12345678;
+
+    if (stat == Ok) {
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0x12345678, color);
+
+    bits[2+3*WIDTH] = 0;
+
+    /* read/write */
+    stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead|ImageLockModeWrite|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
+    expect(Ok, stat);
+
+    expect(0x12345678, bits[2+3*WIDTH]);
+    bits[2+3*WIDTH] = 0xdeadbeef;
+
+    if (stat == Ok) {
+        stat = GdipBitmapUnlockBits(bm, &bd);
+        expect(Ok, stat);
+    }
+
+    stat = GdipBitmapGetPixel(bm, 2, 3, &color);
+    expect(Ok, stat);
+    expect(0xdeadbeef, color);
+
+    stat = GdipDisposeImage((GpImage*)bm);
+    expect(Ok, stat);
+}
+
+struct BITMAPINFOWITHBITFIELDS
+{
+    BITMAPINFOHEADER bmiHeader;
+    DWORD masks[3];
+};
+
+union BITMAPINFOUNION
+{
+    BITMAPINFO bi;
+    struct BITMAPINFOWITHBITFIELDS bf;
+};
 
 static void test_GdipCreateBitmapFromHBITMAP(void)
 {
@@ -635,8 +857,9 @@
     const REAL WIDTH2 = 10;
     const REAL HEIGHT2 = 20;
     HDC hdc;
-    BITMAPINFO bmi;
+    union BITMAPINFOUNION bmi;
     BYTE *bits;
+    PixelFormat format;
 
     stat = GdipCreateBitmapFromHBITMAP(NULL, NULL, NULL);
     expect(InvalidParameter, stat);
@@ -670,14 +893,15 @@
 
     hdc = CreateCompatibleDC(0);
     ok(hdc != NULL, "CreateCompatibleDC failed\n");
-    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
-    bmi.bmiHeader.biHeight = HEIGHT1;
-    bmi.bmiHeader.biWidth = WIDTH1;
-    bmi.bmiHeader.biBitCount = 24;
-    bmi.bmiHeader.biPlanes = 1;
-    bmi.bmiHeader.biCompression = BI_RGB;
-
-    hbm = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    bmi.bi.bmiHeader.biSize = sizeof(bmi.bi.bmiHeader);
+    bmi.bi.bmiHeader.biHeight = HEIGHT1;
+    bmi.bi.bmiHeader.biWidth = WIDTH1;
+    bmi.bi.bmiHeader.biBitCount = 24;
+    bmi.bi.bmiHeader.biPlanes = 1;
+    bmi.bi.bmiHeader.biCompression = BI_RGB;
+    bmi.bi.bmiHeader.biClrUsed = 0;
+
+    hbm = CreateDIBSection(hdc, &bmi.bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
     ok(hbm != NULL, "CreateDIBSection failed\n");
 
     bits[0] = 0;
@@ -707,15 +931,100 @@
     GdipFree(LogPal);
 
     stat = GdipCreateBitmapFromHBITMAP(hbm, hpal, &gpbm);
-    todo_wine
-    {
-        expect(Ok, stat);
-    }
+    expect(Ok, stat);
+
     if (stat == Ok)
         GdipDisposeImage((GpImage*)gpbm);
 
     DeleteObject(hpal);
     DeleteObject(hbm);
+
+    /* 16-bit 555 dib, rgb */
+    bmi.bi.bmiHeader.biBitCount = 16;
+    bmi.bi.bmiHeader.biCompression = BI_RGB;
+
+    hbm = CreateDIBSection(hdc, &bmi.bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    ok(hbm != NULL, "CreateDIBSection failed\n");
+
+    bits[0] = 0;
+
+    stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
+    expect(Ok, stat);
+
+    if (stat == Ok)
+    {
+        stat = GdipGetImageDimension((GpImage*) gpbm, &width, &height);
+        expect(Ok, stat);
+        expectf(WIDTH1,  width);
+        expectf(HEIGHT1, height);
+
+        stat = GdipGetImagePixelFormat((GpImage*) gpbm, &format);
+        expect(Ok, stat);
+        expect(PixelFormat16bppRGB555, format);
+
+        GdipDisposeImage((GpImage*)gpbm);
+    }
+    DeleteObject(hbm);
+
+    /* 16-bit 555 dib, with bitfields */
+    bmi.bi.bmiHeader.biSize = sizeof(bmi);
+    bmi.bi.bmiHeader.biCompression = BI_BITFIELDS;
+    bmi.bf.masks[0] = 0x7c00;
+    bmi.bf.masks[1] = 0x3e0;
+    bmi.bf.masks[2] = 0x1f;
+
+    hbm = CreateDIBSection(hdc, &bmi.bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    ok(hbm != NULL, "CreateDIBSection failed\n");
+
+    bits[0] = 0;
+
+    stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
+    expect(Ok, stat);
+
+    if (stat == Ok)
+    {
+        stat = GdipGetImageDimension((GpImage*) gpbm, &width, &height);
+        expect(Ok, stat);
+        expectf(WIDTH1,  width);
+        expectf(HEIGHT1, height);
+
+        stat = GdipGetImagePixelFormat((GpImage*) gpbm, &format);
+        expect(Ok, stat);
+        expect(PixelFormat16bppRGB555, format);
+
+        GdipDisposeImage((GpImage*)gpbm);
+    }
+    DeleteObject(hbm);
+
+    /* 16-bit 565 dib, with bitfields */
+    bmi.bf.masks[0] = 0xf800;
+    bmi.bf.masks[1] = 0x7e0;
+    bmi.bf.masks[2] = 0x1f;
+
+    hbm = CreateDIBSection(hdc, &bmi.bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    ok(hbm != NULL, "CreateDIBSection failed\n");
+
+    bits[0] = 0;
+
+    stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm);
+    expect(Ok, stat);
+
+    if (stat == Ok)
+    {
+        stat = GdipGetImageDimension((GpImage*) gpbm, &width, &height);
+        expect(Ok, stat);
+        expectf(WIDTH1,  width);
+        expectf(HEIGHT1, height);
+
+        stat = GdipGetImagePixelFormat((GpImage*) gpbm, &format);
+        expect(Ok, stat);
+        expect(PixelFormat16bppRGB565, format);
+
+        GdipDisposeImage((GpImage*)gpbm);
+    }
+    DeleteObject(hbm);
+
+    DeleteDC(hdc);
 }
 
 static void test_GdipGetImageFlags(void)
@@ -734,6 +1043,115 @@
 
     stat = GdipGetImageFlags(img, NULL);
     expect(InvalidParameter, stat);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat1bppIndexed, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat4bppIndexed, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat8bppIndexed, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppGrayScale, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsNone, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB555, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsNone, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppRGB565, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsNone, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat16bppARGB1555, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat24bppRGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsNone, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat32bppRGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsNone, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat32bppARGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat32bppPARGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    stat = GdipGetImageFlags(img, &flags);
+    expect(Ok, stat);
+    expect(ImageFlagsHasAlpha, flags);
+    GdipDisposeImage(img);
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat48bppRGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    if (stat == Ok)
+    {
+        stat = GdipGetImageFlags(img, &flags);
+        expect(Ok, stat);
+        expect(ImageFlagsNone, flags);
+        GdipDisposeImage(img);
+    }
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppARGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    if (stat == Ok)
+    {
+        expect(Ok, stat);
+        stat = GdipGetImageFlags(img, &flags);
+        expect(Ok, stat);
+        expect(ImageFlagsHasAlpha, flags);
+        GdipDisposeImage(img);
+    }
+
+    stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppPARGB, NULL, (GpBitmap**)&img);
+    expect(Ok, stat);
+    if (stat == Ok)
+    {
+        expect(Ok, stat);
+        stat = GdipGetImageFlags(img, &flags);
+        expect(Ok, stat);
+        expect(ImageFlagsHasAlpha, flags);
+        GdipDisposeImage(img);
+    }
 }
 
 static void test_GdipCloneImage(void)
@@ -828,6 +1246,7 @@
        expect(Ok, stat);
        expect(ImageTypeBitmap, type);
        stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format);
+       expect(Ok, stat);
        expect(PixelFormat32bppARGB, format);
        /* raw format */
        expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)bitmap, __LINE__, FALSE);
@@ -864,6 +1283,7 @@
         expect(Ok, stat);
         expect(ImageTypeBitmap, type);
         stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format);
+	expect(Ok, stat);
         expect(PixelFormat32bppARGB, format);
         /* raw format */
         expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)bitmap, __LINE__, FALSE);
@@ -1195,6 +1615,12 @@
         expect(32, bm.bmBitsPixel);
         ok(bm.bmBits != NULL, "got DDB, expected DIB\n");
 
+        if (bm.bmBits)
+        {
+            DWORD val = *(DWORD*)bm.bmBits;
+            ok(val == 0xff686868, "got %x, expected 0xff686868\n", val);
+        }
+
         hdc = CreateCompatibleDC(NULL);
 
         oldhbitmap = SelectObject(hdc, hbitmap);
@@ -1204,6 +1630,49 @@
         DeleteDC(hdc);
 
         expect(0x686868, pixel);
+
+        DeleteObject(hbitmap);
+    }
+
+    stat = GdipDisposeImage((GpImage*)bitmap);
+    expect(Ok, stat);
+
+    /* create alpha Bitmap */
+    stat = GdipCreateBitmapFromScan0(8, 20, 32, PixelFormat32bppARGB, bits, &bitmap);
+    expect(Ok, stat);
+
+    /* create HBITMAP */
+    stat = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0);
+    expect(Ok, stat);
+
+    if (stat == Ok)
+    {
+        ret = GetObjectA(hbitmap, sizeof(BITMAP), &bm);
+        expect(sizeof(BITMAP), ret);
+
+        expect(0, bm.bmType);
+        expect(8, bm.bmWidth);
+        expect(20, bm.bmHeight);
+        expect(32, bm.bmWidthBytes);
+        expect(1, bm.bmPlanes);
+        expect(32, bm.bmBitsPixel);
+        ok(bm.bmBits != NULL, "got DDB, expected DIB\n");
+
+        if (bm.bmBits)
+        {
+            DWORD val = *(DWORD*)bm.bmBits;
+            ok(val == 0x682a2a2a, "got %x, expected 0x682a2a2a\n", val);
+        }
+
+        hdc = CreateCompatibleDC(NULL);
+
+        oldhbitmap = SelectObject(hdc, hbitmap);
+        pixel = GetPixel(hdc, 5, 5);
+        SelectObject(hdc, oldhbitmap);
+
+        DeleteDC(hdc);
+
+        expect(0x2a2a2a, pixel);
 
         DeleteObject(hbitmap);
     }
@@ -1407,6 +1876,7 @@
     INT size;
     BYTE buffer[1040];
     ColorPalette *palette=(ColorPalette*)buffer;
+    ARGB *entries = palette->Entries;
     ARGB color=0;
 
     /* test initial palette from non-indexed bitmap */
@@ -1450,8 +1920,8 @@
     expect(PaletteFlagsGrayScale, palette->Flags);
     expect(2, palette->Count);
 
-    expect(0xff000000, palette->Entries[0]);
-    expect(0xffffffff, palette->Entries[1]);
+    expect(0xff000000, entries[0]);
+    expect(0xffffffff, entries[1]);
 
     /* test getting/setting pixels */
     stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
@@ -1459,7 +1929,7 @@
     expect(0xff000000, color);
 
     stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffffffff);
-    todo_wine ok((stat == Ok) ||
+    ok((stat == Ok) ||
        broken(stat == InvalidParameter) /* pre-win7 */, "stat=%.8x\n", stat);
 
     if (stat == Ok)
@@ -1492,7 +1962,7 @@
     expect(0xff000000, color);
 
     stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffff00ff);
-    todo_wine ok((stat == Ok) ||
+    ok((stat == Ok) ||
        broken(stat == InvalidParameter) /* pre-win7 */, "stat=%.8x\n", stat);
 
     if (stat == Ok)
@@ -1525,7 +1995,7 @@
     expect(0xff000000, color);
 
     stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffcccccc);
-    todo_wine ok((stat == Ok) ||
+    ok((stat == Ok) ||
        broken(stat == InvalidParameter) /* pre-win7 */, "stat=%.8x\n", stat);
 
     if (stat == Ok)
@@ -1536,12 +2006,12 @@
     }
 
     /* test setting/getting a different palette */
-    palette->Entries[1] = 0xffcccccc;
+    entries[1] = 0xffcccccc;
 
     stat = GdipSetImagePalette((GpImage*)bitmap, palette);
     expect(Ok, stat);
 
-    palette->Entries[1] = 0;
+    entries[1] = 0;
 
     stat = GdipGetImagePaletteSize((GpImage*)bitmap, &size);
     expect(Ok, stat);
@@ -1551,7 +2021,7 @@
     expect(Ok, stat);
     expect(PaletteFlagsHalftone, palette->Flags);
     expect(256, palette->Count);
-    expect(0xffcccccc, palette->Entries[1]);
+    expect(0xffcccccc, entries[1]);
 
     /* test count < 256 */
     palette->Flags = 12345;
@@ -1560,8 +2030,8 @@
     stat = GdipSetImagePalette((GpImage*)bitmap, palette);
     expect(Ok, stat);
 
-    palette->Entries[1] = 0;
-    palette->Entries[3] = 0xdeadbeef;
+    entries[1] = 0;
+    entries[3] = 0xdeadbeef;
 
     stat = GdipGetImagePaletteSize((GpImage*)bitmap, &size);
     expect(Ok, stat);
@@ -1571,8 +2041,8 @@
     expect(Ok, stat);
     expect(12345, palette->Flags);
     expect(3, palette->Count);
-    expect(0xffcccccc, palette->Entries[1]);
-    expect(0xdeadbeef, palette->Entries[3]);
+    expect(0xffcccccc, entries[1]);
+    expect(0xdeadbeef, entries[3]);
 
     /* test count > 256 */
     palette->Count = 257;
@@ -1602,6 +2072,12 @@
         {0.0,0.0,1.0,0.0,0.0},
         {0.0,0.0,0.0,1.0,0.0},
         {0.0,0.0,0.0,0.0,1.0}}};
+    const ColorMatrix asymmetric = {{
+        {0.0,1.0,0.0,0.0,0.0},
+        {0.0,0.0,1.0,0.0,0.0},
+        {0.0,0.0,0.0,1.0,0.0},
+        {1.0,0.0,0.0,0.0,0.0},
+        {0.0,0.0,0.0,0.0,1.0}}};
     GpBitmap *bitmap1, *bitmap2;
     GpGraphics *graphics;
     ARGB color;
@@ -1662,13 +2138,13 @@
         TRUE, &colormatrix, NULL, ColorMatrixFlagsDefault);
     expect(Ok, stat);
 
-    stat = GdipCreateBitmapFromScan0(1, 1, 0, PixelFormat32bppRGB, NULL, &bitmap1);
-    expect(Ok, stat);
-
-    stat = GdipCreateBitmapFromScan0(1, 1, 0, PixelFormat32bppRGB, NULL, &bitmap2);
-    expect(Ok, stat);
-
-    stat = GdipBitmapSetPixel(bitmap1, 0, 0, 0xff40ffff);
+    stat = GdipCreateBitmapFromScan0(1, 1, 0, PixelFormat32bppARGB, NULL, &bitmap1);
+    expect(Ok, stat);
+
+    stat = GdipCreateBitmapFromScan0(1, 1, 0, PixelFormat32bppARGB, NULL, &bitmap2);
+    expect(Ok, stat);
+
+    stat = GdipBitmapSetPixel(bitmap1, 0, 0, 0xff40ccee);
     expect(Ok, stat);
 
     stat = GdipGetImageGraphicsContext((GpImage*)bitmap2, &graphics);
@@ -1680,7 +2156,23 @@
 
     stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color);
     expect(Ok, stat);
-    todo_wine expect(0xff80ffff, color);
+    expect(0xff80ccee, color);
+
+    colormatrix = asymmetric;
+    stat = GdipSetImageAttributesColorMatrix(imageattr, ColorAdjustTypeDefault,
+        TRUE, &colormatrix, NULL, ColorMatrixFlagsDefault);
+    expect(Ok, stat);
+
+    stat = GdipBitmapSetPixel(bitmap2, 0, 0, 0);
+    expect(Ok, stat);
+
+    stat = GdipDrawImageRectRectI(graphics, (GpImage*)bitmap1, 0,0,1,1, 0,0,1,1,
+        UnitPixel, imageattr, NULL, NULL);
+    expect(Ok, stat);
+
+    stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color);
+    expect(Ok, stat);
+    ok(color_match(0xeeff40cc, color, 3), "expected 0xeeff40cc, got 0x%08x\n", color);
 
     GdipDeleteGraphics(graphics);
     GdipDisposeImage((GpImage*)bitmap1);
@@ -1742,7 +2234,7 @@
 
     stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color);
     expect(Ok, stat);
-    todo_wine ok(color_match(0xff20ffff, color, 1), "Expected ff20ffff, got %.8x\n", color);
+    ok(color_match(0xff20ffff, color, 1), "Expected ff20ffff, got %.8x\n", color);
 
     GdipDeleteGraphics(graphics);
     GdipDisposeImage((GpImage*)bitmap1);
@@ -2141,6 +2633,29 @@
     GdipDisposeImageAttributes(imageattr);
 }
 
+static void test_dispose(void)
+{
+    GpStatus stat;
+    GpImage *image;
+    char invalid_image[256];
+
+    stat = GdipDisposeImage(NULL);
+    expect(InvalidParameter, stat);
+
+    stat = GdipCreateBitmapFromScan0(2, 2, 0, PixelFormat32bppARGB, NULL, (GpBitmap**)&image);
+    expect(Ok, stat);
+
+    stat = GdipDisposeImage(image);
+    expect(Ok, stat);
+
+    stat = GdipDisposeImage(image);
+    expect(ObjectBusy, stat);
+
+    memset(invalid_image, 0, 256);
+    stat = GdipDisposeImage((GpImage*)invalid_image);
+    expect(ObjectBusy, stat);
+}
+
 START_TEST(image)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -2161,6 +2676,7 @@
     test_SavingImages();
     test_encoders();
     test_LockBits();
+    test_LockBits_UserBuf();
     test_GdipCreateBitmapFromHBITMAP();
     test_GdipGetImageFlags();
     test_GdipCloneImage();
@@ -2180,6 +2696,7 @@
     test_rotateflip();
     test_remaptable();
     test_colorkey();
+    test_dispose();
 
     GdiplusShutdown(gdiplusToken);
 }

Modified: trunk/rostests/winetests/gdiplus/matrix.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/matrix.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/matrix.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/matrix.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -26,6 +26,7 @@
 #include "wine/test.h"
 
 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
+#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got)
 
 static void test_constructor_destructor(void)
 {
@@ -220,6 +221,87 @@
     GdipDeleteMatrix(matrix);
 }
 
+static void test_constructor3(void)
+{
+    /* MSDN is on crack. GdipCreateMatrix3 makes a matrix that transforms the
+     * corners of the given rectangle to the three points given. */
+    GpMatrix *matrix;
+    REAL values[6];
+    GpRectF rc;
+    GpPointF pt[3];
+    GpStatus stat;
+
+    rc.X = 10;
+    rc.Y = 10;
+    rc.Width = 10;
+    rc.Height = 10;
+
+    pt[0].X = 10;
+    pt[0].Y = 10;
+    pt[1].X = 20;
+    pt[1].Y = 10;
+    pt[2].X = 10;
+    pt[2].Y = 20;
+
+    stat = GdipCreateMatrix3(&rc, pt, &matrix);
+    expect(Ok, stat);
+
+    stat = GdipGetMatrixElements(matrix, values);
+    expect(Ok, stat);
+
+    expectf(1.0, values[0]);
+    expectf(0.0, values[1]);
+    expectf(0.0, values[2]);
+    expectf(1.0, values[3]);
+    expectf(0.0, values[4]);
+    expectf(0.0, values[5]);
+
+    GdipDeleteMatrix(matrix);
+
+    pt[0].X = 20;
+    pt[0].Y = 10;
+    pt[1].X = 40;
+    pt[1].Y = 10;
+    pt[2].X = 20;
+    pt[2].Y = 20;
+
+    stat = GdipCreateMatrix3(&rc, pt, &matrix);
+    expect(Ok, stat);
+
+    stat = GdipGetMatrixElements(matrix, values);
+    expect(Ok, stat);
+
+    expectf(2.0, values[0]);
+    expectf(0.0, values[1]);
+    expectf(0.0, values[2]);
+    expectf(1.0, values[3]);
+    expectf(0.0, values[4]);
+    expectf(0.0, values[5]);
+
+    GdipDeleteMatrix(matrix);
+
+    pt[0].X = 10;
+    pt[0].Y = 20;
+    pt[1].X = 20;
+    pt[1].Y = 30;
+    pt[2].X = 10;
+    pt[2].Y = 30;
+
+    stat = GdipCreateMatrix3(&rc, pt, &matrix);
+    expect(Ok, stat);
+
+    stat = GdipGetMatrixElements(matrix, values);
+    expect(Ok, stat);
+
+    expectf(1.0, values[0]);
+    expectf(1.0, values[1]);
+    expectf(0.0, values[2]);
+    expectf(1.0, values[3]);
+    expectf(0.0, values[4]);
+    expectf(0.0, values[5]);
+
+    GdipDeleteMatrix(matrix);}
+
 START_TEST(matrix)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -237,6 +319,7 @@
     test_isinvertible();
     test_invert();
     test_shear();
+    test_constructor3();
 
     GdiplusShutdown(gdiplusToken);
 }

Modified: trunk/rostests/winetests/gdiplus/pathiterator.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/pathiterator.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/pathiterator.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/pathiterator.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -124,6 +124,7 @@
     expect(4, result);
     start = end = result = (INT)0xdeadbeef;
     stat = GdipPathIterNextMarker(iter, &result, &start, &end);
+    expect(Ok, stat);
     /* start/end remain unchanged */
     expect((INT)0xdeadbeef, start);
     expect((INT)0xdeadbeef, end);

Modified: trunk/rostests/winetests/gdiplus/region.c
URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdiplus/region.c?rev=56056&r1=56055&r2=56056&view=diff
==============================================================================
--- trunk/rostests/winetests/gdiplus/region.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/gdiplus/region.c [iso-8859-1] Mon Mar  5 20:18:32 2012
@@ -22,6 +22,7 @@
 #include "gdiplus.h"
 #include "wingdi.h"
 #include "wine/test.h"
+#include <math.h>
 
 #define RGNDATA_RECT            0x10000000
 #define RGNDATA_PATH            0x10000001
@@ -32,6 +33,9 @@
 #define RGNDATA_MAGIC2          0xdbc01002
 
 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
+
+#define expectf_(expected, got, precision) ok(fabs(expected - got) < precision, "Expected %.2f, got %.2f\n", expected, got)
+#define expectf(expected, got) expectf_(expected, got, 0.0001)
 
 #define expect_magic(value) ok(*value == RGNDATA_MAGIC || *value == RGNDATA_MAGIC2, "Expected a known magic value, got %8x\n", *value)
 
@@ -1123,6 +1127,251 @@
     ReleaseDC(0, hdc);
 }
 
+static void test_transform(void)
+{
+    GpRegion *region, *region2;
+    GpMatrix *matrix;
+    GpGraphics *graphics;
+    GpPath *path;
+    GpRectF rectf;
+    GpStatus status;
+    HDC hdc = GetDC(0);
+    BOOL res;
+
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+
+    status = GdipCreatePath(FillModeAlternate, &path);
+    expect(Ok, status);
+
+    status = GdipCreateRegion(&region);
+    expect(Ok, status);
+    status = GdipCreateRegion(&region2);
+    expect(Ok, status);
+
+    status = GdipCreateMatrix(&matrix);
+    expect(Ok, status);
+    status = GdipScaleMatrix(matrix, 2.0, 3.0, MatrixOrderAppend);
+    expect(Ok, status);
+
+    /* NULL */
+    status = GdipTransformRegion(NULL, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipTransformRegion(region, NULL);
+    expect(InvalidParameter, status);
+
+    /* infinite */
+    status = GdipTransformRegion(region, matrix);
+    expect(Ok, status);
+
+    res = FALSE;
+    status = GdipIsEqualRegion(region, region2, graphics, &res);
+    expect(Ok, status);
+    ok(res, "Expected to be equal.\n");
+
+    /* empty */
+    status = GdipSetEmpty(region);
+    expect(Ok, status);
+    status = GdipTransformRegion(region, matrix);
+    expect(Ok, status);
+
+    status = GdipSetEmpty(region2);
+    expect(Ok, status);
+
+    res = FALSE;
+    status = GdipIsEqualRegion(region, region2, graphics, &res);
+    expect(Ok, status);
+    ok(res, "Expected to be equal.\n");
+
+    /* rect */
+    rectf.X = 10.0;
+    rectf.Y = 0.0;
+    rectf.Width = rectf.Height = 100.0;
+    status = GdipCombineRegionRect(region, &rectf, CombineModeReplace);
+    expect(Ok, status);
+    rectf.X = 20.0;
+    rectf.Y = 0.0;
+    rectf.Width = 200.0;
+    rectf.Height = 300.0;
+    status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace);
+    expect(Ok, status);
+    status = GdipTransformRegion(region, matrix);
+    expect(Ok, status);
+    res = FALSE;
+    status = GdipIsEqualRegion(region, region2, graphics, &res);
+    expect(Ok, status);
+    ok(res, "Expected to be equal.\n");
+
+    /* path */
+    status = GdipAddPathEllipse(path, 0.0, 10.0, 100.0, 150.0);
+    expect(Ok, status);
+    status = GdipCombineRegionPath(region, path, CombineModeReplace);
+    expect(Ok, status);
+    status = GdipResetPath(path);
+    expect(Ok, status);
+    status = GdipAddPathEllipse(path, 0.0, 30.0, 200.0, 450.0);
+    expect(Ok, status);
+    status = GdipCombineRegionPath(region2, path, CombineModeReplace);
+    expect(Ok, status);
+    status = GdipTransformRegion(region, matrix);
+    expect(Ok, status);
+    res = FALSE;
+    status = GdipIsEqualRegion(region, region2, graphics, &res);
+    expect(Ok, status);
+    ok(res, "Expected to be equal.\n");
+
+    status = GdipDeleteRegion(region);
+    expect(Ok, status);
+    status = GdipDeleteRegion(region2);
+    expect(Ok, status);
+    status = GdipDeleteGraphics(graphics);
+    expect(Ok, status);
+    status = GdipDeletePath(path);
+    expect(Ok, status);
+    status = GdipDeleteMatrix(matrix);
+    expect(Ok, status);
+    ReleaseDC(0, hdc);
+}
+
+static void test_scans(void)
+{
+    GpRegion *region;
+    GpMatrix *matrix;
+    GpRectF rectf;
+    GpStatus status;
+    ULONG count=80085;
+    INT icount;
+    GpRectF scans[2];
+    GpRect scansi[2];
+
+    status = GdipCreateRegion(&region);
+    expect(Ok, status);
+
+    status = GdipCreateMatrix(&matrix);
+    expect(Ok, status);
+
+    /* test NULL values */
+    status = GdipGetRegionScansCount(NULL, &count, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipGetRegionScansCount(region, NULL, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipGetRegionScansCount(region, &count, NULL);
+    expect(InvalidParameter, status);
+
+    status = GdipGetRegionScans(NULL, scans, &icount, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipGetRegionScans(region, scans, NULL, matrix);
+    expect(InvalidParameter, status);
+
+    status = GdipGetRegionScans(region, scans, &icount, NULL);
+    expect(InvalidParameter, status);
+
+    /* infinite */
+    status = GdipGetRegionScansCount(region, &count, matrix);
+    expect(Ok, status);
+    expect(1, count);
+
+    status = GdipGetRegionScans(region, NULL, &icount, matrix);
+    expect(Ok, status);
+    expect(1, icount);
+
+    status = GdipGetRegionScans(region, scans, &icount, matrix);
+    expect(Ok, status);
+    expect(1, icount);
+
+    status = GdipGetRegionScansI(region, scansi, &icount, matrix);
+    expect(Ok, status);
+    expect(1, icount);
+    expect(-0x400000, scansi[0].X);
+    expect(-0x400000, scansi[0].Y);
+    expect(0x800000, scansi[0].Width);
+    expect(0x800000, scansi[0].Height);
+
+    status = GdipGetRegionScans(region, scans, &icount, matrix);
+    expect(Ok, status);
+    expect(1, icount);
+    expectf((double)-0x400000, scans[0].X);
+    expectf((double)-0x400000, scans[0].Y);
+    expectf((double)0x800000, scans[0].Width);
+    expectf((double)0x800000, scans[0].Height);
+
+    /* empty */
+    status = GdipSetEmpty(region);
+    expect(Ok, status);
+
+    status = GdipGetRegionScansCount(region, &count, matrix);
+    expect(Ok, status);
+    expect(0, count);
+
+    status = GdipGetRegionScans(region, scans, &icount, matrix);
+    expect(Ok, status);
+    expect(0, icount);
+
+    /* single rectangle */
+    rectf.X = rectf.Y = 0.0;
+    rectf.Width = rectf.Height = 5.0;
+    status = GdipCombineRegionRect(region, &rectf, CombineModeReplace);
+    expect(Ok, status);
+
+    status = GdipGetRegionScansCount(region, &count, matrix);
+    expect(Ok, status);
+    expect(1, count);
+
+    status = GdipGetRegionScans(region, scans, &icount, matrix);
+    expect(Ok, status);
+    expect(1, icount);
+    expectf(0.0, scans[0].X);
+    expectf(0.0, scans[0].Y);
+    expectf(5.0, scans[0].Width);
+    expectf(5.0, scans[0].Height);
+
+    /* two rectangles */
+    rectf.X = rectf.Y = 5.0;
+    rectf.Width = rectf.Height = 5.0;
+    status = GdipCombineRegionRect(region, &rectf, CombineModeUnion);
+    expect(Ok, status);
+
+    status = GdipGetRegionScansCount(region, &count, matrix);
+    expect(Ok, status);
+    expect(2, count);
+
+    /* Native ignores the initial value of count */
+    scans[1].X = scans[1].Y = scans[1].Width = scans[1].Height = 8.0;
+    icount = 1;
+    status = GdipGetRegionScans(region, scans, &icount, matrix);
+    expect(Ok, status);
+    expect(2, icount);
+    expectf(0.0, scans[0].X);
+    expectf(0.0, scans[0].Y);
+    expectf(5.0, scans[0].Width);
+    expectf(5.0, scans[0].Height);
+    expectf(5.0, scans[1].X);
+    expectf(5.0, scans[1].Y);
+    expectf(5.0, scans[1].Width);
+    expectf(5.0, scans[1].Height);
+
+    status = GdipGetRegionScansI(region, scansi, &icount, matrix);
+    expect(Ok, status);
+    expect(2, icount);
+    expect(0, scansi[0].X);
+    expect(0, scansi[0].Y);
+    expect(5, scansi[0].Width);
+    expect(5, scansi[0].Height);
+    expect(5, scansi[1].X);
+    expect(5, scansi[1].Y);
+    expect(5, scansi[1].Width);
+    expect(5, scansi[1].Height);
+
+    status = GdipDeleteRegion(region);
+    expect(Ok, status);
+    status = GdipDeleteMatrix(matrix);
+    expect(Ok, status);
+}
+
 static void test_getbounds(void)
 {
     GpRegion *region;
@@ -1634,6 +1883,8 @@
     test_gethrgn();
     test_isequal();
     test_translate();
+    test_transform();
+    test_scans();
     test_getbounds();
     test_isvisiblepoint();
     test_isvisiblerect();




More information about the Ros-diffs mailing list