Implement separate functions for all SelectObject cases.

svn path=/trunk/; revision=65067
This commit is contained in:
Timo Kreuzer 2014-10-28 09:06:33 +00:00
parent 27b8f91dbd
commit 1bc1ae75f3

View file

@ -1695,26 +1695,23 @@ GetHFONT(HDC hdc)
} }
/* HBITMAP
* @implemented
*
*/
HGDIOBJ
WINAPI WINAPI
SelectObject( GdiSelectBitmap(
_In_ HDC hdc, _In_ HDC hdc,
_In_ HGDIOBJ hGdiObj) _In_ HBITMAP hbmp)
{
return NtGdiSelectBitmap(hdc, hbmp);
}
HBRUSH
WINAPI
GdiSelectBrush(
_In_ HDC hdc,
_In_ HBRUSH hbr)
{ {
PDC_ATTR pdcattr; PDC_ATTR pdcattr;
HGDIOBJ hOldObj = NULL; HBRUSH hbrOld;
UINT uType;
/* Fix up 16 bit handles */
hGdiObj = GdiFixUpHandle(hGdiObj);
if (!GdiIsHandleValid(hGdiObj))
{
return NULL;
}
/* Get the DC attribute */ /* Get the DC attribute */
pdcattr = GdiGetDcAttr(hdc); pdcattr = GdiGetDcAttr(hdc);
@ -1724,39 +1721,73 @@ SelectObject(
return NULL; return NULL;
} }
uType = GDI_HANDLE_GET_TYPE(hGdiObj); /* Get the current brush. If it matches the new brush, we're done */
hbrOld = pdcattr->hbrush;
if (hbrOld == hbr)
return hbrOld;
switch (uType) /* Set the new brush and update dirty flags */
{ pdcattr->hbrush = hbr;
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->ulDirty_ |= DC_BRUSH_DIRTY;
pdcattr->hbrush = hGdiObj; return hbrOld;
return hOldObj; }
// return NtGdiSelectBrush(hdc, hGdiObj);
case GDI_OBJECT_TYPE_PEN: HPEN
case GDI_OBJECT_TYPE_EXTPEN: WINAPI
hOldObj = pdcattr->hpen; 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->ulDirty_ |= DC_PEN_DIRTY;
pdcattr->hpen = hGdiObj; pdcattr->hpen = hpen;
return hOldObj; return hpenOld;
// return NtGdiSelectPen(hdc, hGdiObj); }
case GDI_OBJECT_TYPE_FONT: HFONT
hOldObj = pdcattr->hlfntNew; WINAPI
if (hOldObj == hGdiObj) return hOldObj; 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_ &= ~SLOW_WIDTHS;
pdcattr->ulDirty_ |= DIRTY_CHARSET; pdcattr->ulDirty_ |= DIRTY_CHARSET;
pdcattr->hlfntNew = hGdiObj;
/* If the DC does not have a DIB section selected, try a batch command */
if (!(pdcattr->ulDirty_ & DC_DIBSECTION)) if (!(pdcattr->ulDirty_ & DC_DIBSECTION))
{ {
PGDIBSOBJECT pgO; PGDIBSOBJECT pgO;
@ -1764,28 +1795,59 @@ SelectObject(
pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj); pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj);
if (pgO) if (pgO)
{ {
pgO->hgdiobj = hGdiObj; pgO->hgdiobj = hfont;
return hOldObj; return hfontOld;
} }
} }
// default for select object font /* We could not use the batch command, call win32k */
return NtGdiSelectFont(hdc, hGdiObj); return NtGdiSelectFont(hdc, hfont);
}
#if 0
case GDI_OBJECT_TYPE_METADC: /*
return MFDRV_SelectObject(hdc, hGdiObj); * @implemented
case GDI_OBJECT_TYPE_EMF: *
PLDC pLDC = GdiGetLDC(hdc); */
if (!pLDC) return NULL; HGDIOBJ
return EMFDRV_SelectObject(hdc, hGdiObj); WINAPI
#endif SelectObject(
case GDI_OBJECT_TYPE_COLORSPACE: _In_ HDC hdc,
SetColorSpace(hdc, (HCOLORSPACE) hGdiObj); _In_ HGDIOBJ hobj)
{
/* Fix up 16 bit handles */
hobj = GdiFixUpHandle(hobj);
if (!GdiIsHandleValid(hobj))
{
return NULL; return NULL;
}
case GDI_OBJECT_TYPE_PALETTE: /* 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); SetLastError(ERROR_INVALID_FUNCTION);
default: default:
return NULL; return NULL;
} }