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/dc.c?rev=65067&r1=65066&r2=65067&view=diff
==============================================================================
--- 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;
     }


Reply via email to