Nikolay Sivov : gdiplus: Basic GdipGetDC/GdipReleaseDC implementation.
Alexandre Julliard
julliard at winehq.org
Mon Aug 25 06:20:34 CDT 2008
Module: wine
Branch: master
Commit: 366ae1e6c60a3a5c110897666b8193584cacfbfd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=366ae1e6c60a3a5c110897666b8193584cacfbfd
Author: Nikolay Sivov <bunglehead at gmail.com>
Date: Sun Aug 24 14:45:18 2008 +0400
gdiplus: Basic GdipGetDC/GdipReleaseDC implementation.
---
dlls/gdiplus/gdiplus_private.h | 1 +
dlls/gdiplus/graphics.c | 20 ++++++++++++--------
dlls/gdiplus/tests/graphics.c | 12 ++++++++----
3 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 5a18660..8df1c74 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -95,6 +95,7 @@ struct GpGraphics{
GpUnit unit; /* page unit */
REAL scale; /* page scale */
GpMatrix * worldtrans; /* world transform */
+ BOOL busy; /* hdc handle obtained by GdipGetDC */
};
struct GpBrush{
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index b852103..7bc0f03 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -752,6 +752,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
(*graphics)->compmode = CompositingModeSourceOver;
(*graphics)->unit = UnitDisplay;
(*graphics)->scale = 1.0;
+ (*graphics)->busy = FALSE;
return Ok;
}
@@ -2679,26 +2680,29 @@ GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST G
GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc)
{
- FIXME("(%p, %p): stub\n", graphics, hdc);
-
if(!graphics || !hdc)
return InvalidParameter;
- *hdc = NULL;
- return NotImplemented;
+ if(graphics->busy)
+ return ObjectBusy;
+
+ *hdc = graphics->hdc;
+ graphics->busy = TRUE;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc)
{
- FIXME("(%p, %p): stub\n", graphics, hdc);
-
if(!graphics)
return InvalidParameter;
- if(graphics->hdc != hdc)
+ if(graphics->hdc != hdc || !(graphics->busy))
return InvalidParameter;
- return NotImplemented;
+ graphics->busy = FALSE;
+
+ return Ok;
}
GpStatus WINGDIPAPI GdipGetClip(GpGraphics *graphics, GpRegion *region)
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index f70caf5..b933f34 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -545,13 +545,17 @@ static void test_Get_Release_DC(void)
status = GdipReleaseDC(NULL, (HDC)0xdeadbeef);
expect(InvalidParameter, status);
+ /* Release without Get */
+ status = GdipReleaseDC(graphics, hdc);
+ expect(InvalidParameter, status);
+
retdc = NULL;
status = GdipGetDC(graphics, &retdc);
- todo_wine expect(Ok, status);
- todo_wine ok(retdc == hdc, "Invalid HDC returned\n");
+ expect(Ok, status);
+ ok(retdc == hdc, "Invalid HDC returned\n");
/* call it once more */
status = GdipGetDC(graphics, &retdc);
- todo_wine expect(ObjectBusy, status);
+ expect(ObjectBusy, status);
/* try all Graphics calls here */
status = Ok;
@@ -712,7 +716,7 @@ static void test_Get_Release_DC(void)
todo_wine expect(ObjectBusy, status); status = Ok;
status = GdipReleaseDC(graphics, retdc);
- todo_wine expect(Ok, status);
+ expect(Ok, status);
GdipDeletePen(pen);
GdipDeleteGraphics(graphics);
More information about the wine-cvs
mailing list