[GDI+: 6/10] GdipDrawLineI test

Evan Stade estade at gmail.com
Mon Jun 11 14:58:42 CDT 2007


attached this time

On 6/11/07, Evan Stade <estade at gmail.com> wrote:
> Hi,
>
> Changelog:
> *Added framework for pixel-by-pixel comparison in tests
> *added GdipDrawLineI test
>
>  dlls/gdiplus/tests/graphics.c |  164 +++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 164 insertions(+), 0 deletions(-)
>
> -Evan Stade
>
-------------- next part --------------
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index 29a4b55..e5ebba1 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -53,6 +53,122 @@ static LRESULT WINAPI testname##_window_
     } \
 }
 
+static const INT drawline_bmp1[192] =
+{0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xddffffff,0xccddbbcc,0xffffffbb,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xddbbccdd,0xccddbbcc,0xffffffbb,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xbbccddff,0xddbbccdd,
+ 0xffffbbcc,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xccddffff,0xbbccddbb,0xffbbccdd,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xddffffff,
+ 0xccddbbcc,0xbbccddbb,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xddbbccdd,0xccddbbcc,0xffffffbb,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xbbccddff,0xddbbccdd,0xffffbbcc,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffbbccdd,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff};
+
+static const INT drawline_bmp2[192] =
+{0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xbbccddff,
+ 0xddbbccdd,0xccddbbcc,0xbbccddbb,0xddbbccdd,0xffffbbcc,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xbbccddff,0xddbbccdd,0xccddbbcc,
+ 0xbbccddbb,0xddbbccdd,0xffffbbcc,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
+ 0xffffffff,0xffffffff,0xffffffff};
+
+static INT smart_GetDIBits(HDC hdc, HBITMAP hbm, BYTE** buff, INT *bytes,
+    INT bitcount, INT compression, INT imagesize)
+{
+    INT ret;
+    BITMAPINFO bi;
+
+    bi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
+    bi.bmiHeader.biHeight       = 0;
+    bi.bmiHeader.biWidth        = 0;
+    bi.bmiHeader.biPlanes       = 1;
+    bi.bmiHeader.biBitCount     = 0;
+    bi.bmiHeader.biCompression  = 0;
+
+    ret = GetDIBits(hdc, hbm, 0, 0, NULL, &bi, DIB_RGB_COLORS);
+    assert(ret);
+
+    bi.bmiHeader.biBitCount     = bitcount;
+    bi.bmiHeader.biCompression  = compression;
+    bi.bmiHeader.biSizeImage    = imagesize;
+
+    ret = GetDIBits(hdc, hbm, 0, 0, NULL, &bi, DIB_RGB_COLORS);
+    assert(ret);
+    *buff = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
+            bi.bmiHeader.biSizeImage);
+    *bytes = bi.bmiHeader.biSizeImage;
+    return GetDIBits(hdc, hbm, 0, bi.bmiHeader.biHeight, *buff, &bi, 
+            DIB_RGB_COLORS);
+}
+
+/* captures bitmap into buff and returns height of captured bitmap */
+static INT capture_dc(HDC hdc, BYTE** buff, INT* bytes)
+{
+    HDC hdcCap;
+    HBITMAP hbmCap;
+    INT scanlines;
+
+    hdcCap = CreateCompatibleDC(hdc);
+    hbmCap = CreateCompatibleBitmap(hdc, WND_SZ, WND_SZ);
+    SelectObject(hdcCap, hbmCap);
+    BitBlt(hdcCap, 
+            0,0, 
+            WND_SZ, WND_SZ, 
+            hdc, 
+            0,0, 
+            SRCCOPY);
+
+    /* get bitmap, 3 bytes per pixel */
+    scanlines = smart_GetDIBits(hdc, hbmCap, buff, bytes,
+                24, 0, WND_SZ*WND_SZ*3);
+
+    DeleteDC(hdcCap);
+    DeleteObject(hbmCap);
+
+    return scanlines;
+}
+
 static void constructor(HWND hwnd, HDC hdc)
 {
     GpStatus stat;
@@ -82,7 +198,48 @@ static void constructor(HWND hwnd, HDC h
     expect(stat, InvalidParameter);
 }
 
+static void drawline(HWND hwnd, HDC hdc)
+{
+    GpStatus stat;
+    GpPen *pen, *eraser;
+    GpGraphics *graphics;
+
+    INT height = 0, num_bytes = 0;
+    BYTE* buff;
+
+    stat = GdipCreatePen1((ARGB)0xffffffff, 2.0f, UnitPixel, &eraser);
+
+    stat = GdipCreateFromHDC(hdc, &graphics);
+    expect(stat, Ok);
+    stat = GdipCreatePen1((ARGB)0xffbbccdd, 2.0f, UnitPixel, &pen);
+    expect(stat, Ok);
+    stat = GdipDrawLineI(graphics, pen, 3, 3, 10, 10);
+    expect(stat, Ok);
+
+    height = capture_dc(hdc, &buff, &num_bytes);
+    assert(height == WND_SZ);
+
+    /* diagonal lines do not come out the same */
+    todo_wine
+        ok(!memcmp(buff, drawline_bmp1, num_bytes), "Expected different bitmap\n");
+
+    GdipDrawLineI(graphics, eraser, 3, 3, 10, 10);
+    GdipDrawLineI(graphics, pen, 3, 10, 10, 10);
+
+    HeapFree(GetProcessHeap(), 0, buff);
+    height = capture_dc(hdc, &buff, &num_bytes);
+    assert(height == WND_SZ);
+
+    ok(!memcmp(buff, drawline_bmp2, num_bytes), "Expected different bitmap\n");
+
+    HeapFree(GetProcessHeap(), 0, buff);
+    GdipDeleteGraphics(graphics);
+    GdipDeletePen(pen);
+    GdipDeletePen(eraser);
+}
+
 SIMPLE_WINDOW_PROC(constructor)
+SIMPLE_WINDOW_PROC(drawline)
 
 static BOOL RegisterHelper(WNDPROC x, LPCTSTR ClassName)
 {
@@ -110,6 +267,7 @@ static BOOL RegisterWindowClasses(void)
     BOOL ret;
 
     ret = RegisterHelper(constructor_window_proc, TEXT("Constructor"));
+    ret = ret && RegisterHelper(drawline_window_proc, TEXT("DrawLine"));
 
     return ret;
 }
@@ -137,6 +295,11 @@ static void test_constructor_destructor(
     window_test_runner(TEXT("Constructor"), TEXT("Graphics constructor test"));
 }
 
+static void test_drawline(void)
+{
+    window_test_runner(TEXT("DrawLine"), TEXT("Draw line test"));
+}
+
 START_TEST(graphics)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -152,6 +315,7 @@ START_TEST(graphics)
     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
     test_constructor_destructor();
+    test_drawline();
 
     GdiplusShutdown(gdiplusToken);
 }
-- 
1.4.1


More information about the wine-patches mailing list