mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 15:52:57 +00:00
[GDI32]
Implement separate functions for all SelectObject cases. svn path=/trunk/; revision=65067
This commit is contained in:
parent
27b8f91dbd
commit
1bc1ae75f3
1 changed files with 127 additions and 65 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue