Author: tkreuzer
Date: Tue Oct 28 09:06:33 2014
New Revision: 65067
URL:
http://svn.reactos.org/svn/reactos?rev=65067&view=rev
Log:
[GDI32]
Implement separate functions for all SelectObject cases.
Modified:
trunk/reactos/win32ss/gdi/gdi32/objects/dc.c
Modified: trunk/reactos/win32ss/gdi/gdi32/objects/dc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/gdi32/objects/…
==============================================================================
--- trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/gdi32/objects/dc.c [iso-8859-1] Tue Oct 28 09:06:33 2014
@@ -1695,26 +1695,23 @@
}
-/*
- * @implemented
- *
- */
-HGDIOBJ
-WINAPI
-SelectObject(
- _In_ HDC hdc,
- _In_ HGDIOBJ hGdiObj)
-{
- PDC_ATTR pdcattr;
- HGDIOBJ hOldObj = NULL;
- UINT uType;
-
- /* Fix up 16 bit handles */
- hGdiObj = GdiFixUpHandle(hGdiObj);
- if (!GdiIsHandleValid(hGdiObj))
- {
- return NULL;
- }
+HBITMAP
+WINAPI
+GdiSelectBitmap(
+ _In_ HDC hdc,
+ _In_ HBITMAP hbmp)
+{
+ return NtGdiSelectBitmap(hdc, hbmp);
+}
+
+HBRUSH
+WINAPI
+GdiSelectBrush(
+ _In_ HDC hdc,
+ _In_ HBRUSH hbr)
+{
+ PDC_ATTR pdcattr;
+ HBRUSH hbrOld;
/* Get the DC attribute */
pdcattr = GdiGetDcAttr(hdc);
@@ -1724,68 +1721,133 @@
return NULL;
}
- uType = GDI_HANDLE_GET_TYPE(hGdiObj);
-
- switch (uType)
- {
- 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:
- hOldObj = pdcattr->hbrush;
- pdcattr->ulDirty_ |= DC_BRUSH_DIRTY;
- pdcattr->hbrush = hGdiObj;
- return hOldObj;
-// return NtGdiSelectBrush(hdc, hGdiObj);
-
- case GDI_OBJECT_TYPE_PEN:
- case GDI_OBJECT_TYPE_EXTPEN:
- hOldObj = pdcattr->hpen;
- pdcattr->ulDirty_ |= DC_PEN_DIRTY;
- pdcattr->hpen = hGdiObj;
- return hOldObj;
-// return NtGdiSelectPen(hdc, hGdiObj);
-
- case GDI_OBJECT_TYPE_FONT:
- hOldObj = pdcattr->hlfntNew;
- if (hOldObj == hGdiObj) return hOldObj;
-
- pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
- pdcattr->ulDirty_ |= DIRTY_CHARSET;
- pdcattr->hlfntNew = hGdiObj;
-
- if (!(pdcattr->ulDirty_ & DC_DIBSECTION))
- {
- PGDIBSOBJECT pgO;
-
- pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj);
- if (pgO)
- {
- pgO->hgdiobj = hGdiObj;
- return hOldObj;
- }
- }
-
- // default for select object font
- return NtGdiSelectFont(hdc, hGdiObj);
-
-#if 0
- case GDI_OBJECT_TYPE_METADC:
- return MFDRV_SelectObject(hdc, hGdiObj);
- case GDI_OBJECT_TYPE_EMF:
- PLDC pLDC = GdiGetLDC(hdc);
- if (!pLDC) return NULL;
- return EMFDRV_SelectObject(hdc, hGdiObj);
-#endif
- case GDI_OBJECT_TYPE_COLORSPACE:
- SetColorSpace(hdc, (HCOLORSPACE) hGdiObj);
- return NULL;
-
- case GDI_OBJECT_TYPE_PALETTE:
+ /* Get the current brush. If it matches the new brush, we're done */
+ hbrOld = pdcattr->hbrush;
+ if (hbrOld == hbr)
+ return hbrOld;
+
+ /* Set the new brush and update dirty flags */
+ pdcattr->hbrush = hbr;
+ pdcattr->ulDirty_ |= DC_BRUSH_DIRTY;
+ return hbrOld;
+}
+
+HPEN
+WINAPI
+GdiSelectPen(
+ _In_ HDC hdc,
+ _In_ HPEN hpen)
+{
+ PDC_ATTR pdcattr;
+ HPEN hpenOld;
+
+ /* Get the DC attribute */
+ pdcattr = GdiGetDcAttr(hdc);
+ if (pdcattr == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+
+ /* Get the current pen. If it matches the new pen, we're done */
+ hpenOld = pdcattr->hpen;
+ if (hpenOld == hpen)
+ return hpenOld;
+
+ /* Set the new pen and update dirty flags */
+ pdcattr->ulDirty_ |= DC_PEN_DIRTY;
+ pdcattr->hpen = hpen;
+ return hpenOld;
+}
+
+HFONT
+WINAPI
+GdiSelectFont(
+ _In_ HDC hdc,
+ _In_ HFONT hfont)
+{
+ PDC_ATTR pdcattr;
+ HFONT hfontOld;
+
+ /* Get the DC attribute */
+ pdcattr = GdiGetDcAttr(hdc);
+ if (pdcattr == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+
+ /* Get the current font. If it matches the new font, we're done */
+ hfontOld = pdcattr->hlfntNew;
+ if (hfontOld == hfont)
+ return hfontOld;
+
+ /* Set the new font and update dirty flags */
+ pdcattr->hlfntNew = hfont;
+ pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
+ pdcattr->ulDirty_ |= DIRTY_CHARSET;
+
+ /* If the DC does not have a DIB section selected, try a batch command */
+ if (!(pdcattr->ulDirty_ & DC_DIBSECTION))
+ {
+ PGDIBSOBJECT pgO;
+
+ pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj);
+ if (pgO)
+ {
+ pgO->hgdiobj = hfont;
+ return hfontOld;
+ }
+ }
+
+ /* We could not use the batch command, call win32k */
+ return NtGdiSelectFont(hdc, hfont);
+}
+
+
+/*
+ * @implemented
+ *
+ */
+HGDIOBJ
+WINAPI
+SelectObject(
+ _In_ HDC hdc,
+ _In_ HGDIOBJ hobj)
+{
+ /* Fix up 16 bit handles */
+ hobj = GdiFixUpHandle(hobj);
+ if (!GdiIsHandleValid(hobj))
+ {
+ return NULL;
+ }
+
+ /* Call the appropriate select function */
+ switch (GDI_HANDLE_GET_TYPE(hobj))
+ {
+ case GDILoObjType_LO_REGION_TYPE:
+ return (HGDIOBJ)ExtSelectClipRgn(hdc, hobj, RGN_COPY);
+
+ case GDILoObjType_LO_BITMAP_TYPE:
+ case GDILoObjType_LO_DIBSECTION_TYPE:
+ return GdiSelectBitmap(hdc, hobj);
+
+ case GDILoObjType_LO_BRUSH_TYPE:
+ return GdiSelectBrush(hdc, hobj);
+
+ case GDILoObjType_LO_PEN_TYPE:
+ case GDILoObjType_LO_EXTPEN_TYPE:
+ return GdiSelectPen(hdc, hobj);
+
+ case GDILoObjType_LO_FONT_TYPE:
+ return GdiSelectFont(hdc, hobj);
+
+ case GDILoObjType_LO_ICMLCS_TYPE:
+ return SetColorSpace(hdc, hobj);
+
+ case GDILoObjType_LO_PALETTE_TYPE:
SetLastError(ERROR_INVALID_FUNCTION);
+
default:
return NULL;
}