diff --git a/reactos/dll/win32/gdi32/misc/hacks.c b/reactos/dll/win32/gdi32/misc/hacks.c index ec4f215b5a3..d1cdaed39d8 100644 --- a/reactos/dll/win32/gdi32/misc/hacks.c +++ b/reactos/dll/win32/gdi32/misc/hacks.c @@ -48,17 +48,6 @@ SetDIBitsToDevice( NULL); } -/* - * @implemented - * - */ -HGDIOBJ -STDCALL -SelectObject(HDC hdc, - HGDIOBJ hgdiobj) -{ - return NtGdiSelectObject(hdc,hgdiobj); -} /* * @implemented diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index e3cfc8a1e81..5f7ffd14bd5 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1333,3 +1333,58 @@ GetHFONT(HDC hdc) } +/* + * @implemented + * + */ +HGDIOBJ +STDCALL +SelectObject(HDC hDC, + HGDIOBJ hGdiObj) +{ + PDC_ATTR pDc_Attr; +// HGDIOBJ hOldObj = NULL; + + if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) + { + SetLastError(ERROR_INVALID_HANDLE); + return NULL; + } + + hGdiObj = GdiFixUpHandle(hGdiObj); + if (!GdiIsHandleValid(hGdiObj)) + { + return NULL; + } + + UINT uType = GDI_HANDLE_GET_TYPE(hGdiObj); + + switch (uType) + { + case GDI_OBJECT_TYPE_PALETTE: + SetLastError(ERROR_INVALID_FUNCTION); + return NULL; + + case GDI_OBJECT_TYPE_REGION: + return (HGDIOBJ)ExtSelectClipRgn(hDC, hGdiObj, RGN_COPY); + + case GDI_OBJECT_TYPE_BITMAP: + return NtGdiSelectBitmap(hDC, hGdiObj); + + case GDI_OBJECT_TYPE_BRUSH: + return NtGdiSelectBrush(hDC, hGdiObj); + + case GDI_OBJECT_TYPE_PEN: + case GDI_OBJECT_TYPE_EXTPEN: + return NtGdiSelectPen(hDC, hGdiObj); + + case GDI_OBJECT_TYPE_FONT: + return NtGdiSelectFont(hDC, hGdiObj); + + } + + return NULL; +} + + +