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,68 +1721,133 @@ 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;
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)
{ {
case GDI_OBJECT_TYPE_REGION: SetLastError(ERROR_INVALID_PARAMETER);
return (HGDIOBJ)ExtSelectClipRgn(hdc, hGdiObj, RGN_COPY); return NULL;
}
case GDI_OBJECT_TYPE_BITMAP: /* Get the current pen. If it matches the new pen, we're done */
return NtGdiSelectBitmap(hdc, hGdiObj); hpenOld = pdcattr->hpen;
if (hpenOld == hpen)
return hpenOld;
case GDI_OBJECT_TYPE_BRUSH: /* Set the new pen and update dirty flags */
hOldObj = pdcattr->hbrush; pdcattr->ulDirty_ |= DC_PEN_DIRTY;
pdcattr->ulDirty_ |= DC_BRUSH_DIRTY; pdcattr->hpen = hpen;
pdcattr->hbrush = hGdiObj; return hpenOld;
return hOldObj; }
// return NtGdiSelectBrush(hdc, hGdiObj);
case GDI_OBJECT_TYPE_PEN: HFONT
case GDI_OBJECT_TYPE_EXTPEN: WINAPI
hOldObj = pdcattr->hpen; GdiSelectFont(
pdcattr->ulDirty_ |= DC_PEN_DIRTY; _In_ HDC hdc,
pdcattr->hpen = hGdiObj; _In_ HFONT hfont)
return hOldObj; {
// return NtGdiSelectPen(hdc, hGdiObj); PDC_ATTR pdcattr;
HFONT hfontOld;
case GDI_OBJECT_TYPE_FONT: /* Get the DC attribute */
hOldObj = pdcattr->hlfntNew; pdcattr = GdiGetDcAttr(hdc);
if (hOldObj == hGdiObj) return hOldObj; if (pdcattr == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
pdcattr->ulDirty_ &= ~SLOW_WIDTHS; /* Get the current font. If it matches the new font, we're done */
pdcattr->ulDirty_ |= DIRTY_CHARSET; hfontOld = pdcattr->hlfntNew;
pdcattr->hlfntNew = hGdiObj; if (hfontOld == hfont)
return hfontOld;
if (!(pdcattr->ulDirty_ & DC_DIBSECTION)) /* Set the new font and update dirty flags */
{ pdcattr->hlfntNew = hfont;
PGDIBSOBJECT pgO; pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
pdcattr->ulDirty_ |= DIRTY_CHARSET;
pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj); /* If the DC does not have a DIB section selected, try a batch command */
if (pgO) if (!(pdcattr->ulDirty_ & DC_DIBSECTION))
{ {
pgO->hgdiobj = hGdiObj; PGDIBSOBJECT pgO;
return hOldObj;
}
}
// default for select object font pgO = GdiAllocBatchCommand(hdc, GdiBCSelObj);
return NtGdiSelectFont(hdc, hGdiObj); if (pgO)
{
pgO->hgdiobj = hfont;
return hfontOld;
}
}
#if 0 /* We could not use the batch command, call win32k */
case GDI_OBJECT_TYPE_METADC: return NtGdiSelectFont(hdc, hfont);
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:
/*
* @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); SetLastError(ERROR_INVALID_FUNCTION);
default: default:
return NULL; return NULL;
} }