diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 59fc8696595..3c5dc4bd5c8 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -484,50 +484,6 @@ IntGdiCreateNullBrush(VOID) return hBrush; } -HBRUSH -FASTCALL -IntGdiSelectBrush( - PDC pDC, - HBRUSH hBrush) -{ - PDC_ATTR pdcattr; - HBRUSH hOrgBrush; - PBRUSH pbrush; - XLATEOBJ *XlateObj; - BOOLEAN bFailed; - - if (pDC == NULL || hBrush == NULL) return NULL; - - pdcattr = pDC->pdcattr; - - pbrush = BRUSH_LockBrush(hBrush); - if (pbrush == NULL) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return NULL; - } - - XlateObj = IntGdiCreateBrushXlate(pDC, pbrush, &bFailed); - BRUSH_UnlockBrush(pbrush); - if(bFailed) - { - return NULL; - } - - hOrgBrush = pdcattr->hbrush; - pdcattr->hbrush = hBrush; - - if (pDC->rosdc.XlateBrush != NULL) - { - EngDeleteXlate(pDC->rosdc.XlateBrush); - } - pDC->rosdc.XlateBrush = XlateObj; - - pdcattr->ulDirty_ &= ~DC_BRUSH_DIRTY; - - return hOrgBrush; -} - /* PUBLIC FUNCTIONS ***********************************************************/ @@ -675,31 +631,4 @@ IntGdiSetSolidBrushColor(HBRUSH hBrush, COLORREF Color) BRUSH_UnlockBrush(pbrush); } - /* - * @implemented - */ -HBRUSH -APIENTRY -NtGdiSelectBrush( - IN HDC hDC, - IN HBRUSH hBrush) -{ - PDC pDC; - HBRUSH hOrgBrush; - - if (hDC == NULL || hBrush == NULL) return NULL; - - pDC = DC_LockDc(hDC); - if (!pDC) - { - return NULL; - } - - hOrgBrush = IntGdiSelectBrush(pDC,hBrush); - - DC_UnlockDc(pDC); - - return hOrgBrush; -} - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index 7d2ccac115a..142ad8f1e27 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -164,8 +164,309 @@ DC_vUpdateBackgroundBrush(PDC pdc) } } +HPALETTE +FASTCALL +GdiSelectPalette( + HDC hDC, + HPALETTE hpal, + BOOL ForceBackground) +{ + PDC pdc; + HPALETTE oldPal = NULL; + PPALGDI ppal; + + // FIXME: mark the palette as a [fore\back]ground pal + pdc = DC_LockDc(hDC); + if (!pdc) + { + return NULL; + } + + /* Check if this is a valid palette handle */ + ppal = PALETTE_LockPalette(hpal); + if (!ppal) + { + DC_UnlockDc(pdc); + return NULL; + } + + /* Is this a valid palette for this depth? */ + if ((pdc->rosdc.bitsPerPixel <= 8 && ppal->Mode == PAL_INDEXED) || + (pdc->rosdc.bitsPerPixel > 8 && ppal->Mode != PAL_INDEXED)) + { + oldPal = pdc->dclevel.hpal; + pdc->dclevel.hpal = hpal; + } + else if (pdc->rosdc.bitsPerPixel > 8 && ppal->Mode == PAL_INDEXED) + { + oldPal = pdc->dclevel.hpal; + pdc->dclevel.hpal = hpal; + } + + PALETTE_UnlockPalette(ppal); + DC_UnlockDc(pdc); + + return oldPal; +} + +HBRUSH +FASTCALL +IntGdiSelectBrush( + PDC pDC, + HBRUSH hBrush) +{ + PDC_ATTR pdcattr; + HBRUSH hOrgBrush; + PBRUSH pbrush; + XLATEOBJ *XlateObj; + BOOLEAN bFailed; + + if (pDC == NULL || hBrush == NULL) return NULL; + + pdcattr = pDC->pdcattr; + + pbrush = BRUSH_LockBrush(hBrush); + if (pbrush == NULL) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } + + XlateObj = IntGdiCreateBrushXlate(pDC, pbrush, &bFailed); + BRUSH_UnlockBrush(pbrush); + if(bFailed) + { + return NULL; + } + + hOrgBrush = pdcattr->hbrush; + pdcattr->hbrush = hBrush; + + if (pDC->rosdc.XlateBrush != NULL) + { + EngDeleteXlate(pDC->rosdc.XlateBrush); + } + pDC->rosdc.XlateBrush = XlateObj; + + pdcattr->ulDirty_ &= ~DC_BRUSH_DIRTY; + + return hOrgBrush; +} + +HPEN +FASTCALL +IntGdiSelectPen( + PDC pDC, + HPEN hPen) +{ + PDC_ATTR pdcattr; + HPEN hOrgPen = NULL; + PBRUSH pbrushPen; + XLATEOBJ *XlateObj; + BOOLEAN bFailed; + + if (pDC == NULL || hPen == NULL) return NULL; + + pdcattr = pDC->pdcattr; + + pbrushPen = PEN_LockPen(hPen); + if (pbrushPen == NULL) + { + return NULL; + } + + XlateObj = IntGdiCreateBrushXlate(pDC, pbrushPen, &bFailed); + PEN_UnlockPen(pbrushPen); + if (bFailed) + { + SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); + return NULL; + } + + hOrgPen = pdcattr->hpen; + pdcattr->hpen = hPen; + + if (pDC->rosdc.XlatePen != NULL) + { + EngDeleteXlate(pDC->rosdc.XlatePen); + } + pdcattr->ulDirty_ &= ~DC_PEN_DIRTY; + + pDC->rosdc.XlatePen = XlateObj; + + return hOrgPen; +} + /* + * @implemented + */ +HBRUSH +APIENTRY +NtGdiSelectBrush( + IN HDC hDC, + IN HBRUSH hBrush) +{ + PDC pDC; + HBRUSH hOrgBrush; + + if (hDC == NULL || hBrush == NULL) return NULL; + + pDC = DC_LockDc(hDC); + if (!pDC) + { + return NULL; + } + + hOrgBrush = IntGdiSelectBrush(pDC,hBrush); + + DC_UnlockDc(pDC); + + return hOrgBrush; +} + + /* + * @implemented + */ +HPEN +APIENTRY +NtGdiSelectPen( + IN HDC hDC, + IN HPEN hPen) +{ + PDC pDC; + HPEN hOrgPen; + + if (hDC == NULL || hPen == NULL) return NULL; + + pDC = DC_LockDc(hDC); + if (!pDC) + { + return NULL; + } + + hOrgPen = IntGdiSelectPen(pDC, hPen); + + DC_UnlockDc(pDC); + + return hOrgPen; +} + +BOOL +APIENTRY +NtGdiSelectClipPath( + HDC hDC, + int Mode) +{ + HRGN hrgnPath; + PPATH pPath; + BOOL success = FALSE; + PDC_ATTR pdcattr; + PDC pdc; + + pdc = DC_LockDc(hDC); + if (!pdc) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return FALSE; + } + pdcattr = pdc->pdcattr; + + pPath = PATH_LockPath(pdc->dclevel.hPath); + if (!pPath) + { + DC_UnlockDc(pdc); + return FALSE; + } + + /* Check that path is closed */ + if (pPath->state != PATH_Closed) + { + SetLastWin32Error(ERROR_CAN_NOT_COMPLETE); + return FALSE; + } + + /* Construct a region from the path */ + else if (PATH_PathToRegion(pPath, pdcattr->jFillMode, &hrgnPath)) + { + success = GdiExtSelectClipRgn(pdc, hrgnPath, Mode) != ERROR; + GreDeleteObject( hrgnPath ); + + /* Empty the path */ + if (success) + PATH_EmptyPath(pPath); + + /* FIXME: Should this function delete the path even if it failed? */ + } + + PATH_UnlockPath(pPath); + DC_UnlockDc(pdc); + + return success; +} + +HANDLE +APIENTRY +NtGdiGetDCObject(HDC hDC, INT ObjectType) +{ + HGDIOBJ SelObject; + DC *pdc; + PDC_ATTR pdcattr; + + /* From Wine: GetCurrentObject does not SetLastError() on a null object */ + if(!hDC) return NULL; + + if(!(pdc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return NULL; + } + pdcattr = pdc->pdcattr; + + if (pdcattr->ulDirty_ & DC_BRUSH_DIRTY) + IntGdiSelectBrush(pdc, pdcattr->hbrush); + + if (pdcattr->ulDirty_ & DC_PEN_DIRTY) + IntGdiSelectPen(pdc, pdcattr->hpen); + + switch(ObjectType) + { + case GDI_OBJECT_TYPE_EXTPEN: + case GDI_OBJECT_TYPE_PEN: + SelObject = pdcattr->hpen; + break; + + case GDI_OBJECT_TYPE_BRUSH: + SelObject = pdcattr->hbrush; + break; + + case GDI_OBJECT_TYPE_PALETTE: + SelObject = pdc->dclevel.hpal; + break; + + case GDI_OBJECT_TYPE_FONT: + SelObject = pdcattr->hlfntNew; + break; + + case GDI_OBJECT_TYPE_BITMAP: + SelObject = pdc->rosdc.hBitmap; + break; + + case GDI_OBJECT_TYPE_COLORSPACE: + DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_COLORSPACE not supported yet!\n"); + // SelObject = dc->dclevel.pColorSpace.BaseObject.hHmgr; ? + SelObject = NULL; + break; + + default: + SelObject = NULL; + SetLastWin32Error(ERROR_INVALID_PARAMETER); + break; + } + + DC_UnlockDc(pdc); + return SelObject; +} ULONG APIENTRY @@ -175,107 +476,7 @@ NtGdiEnumObjects( IN ULONG cjBuf, OUT OPTIONAL PVOID pvBuf) { - UNIMPLEMENTED; - return 0; + UNIMPLEMENTED; + return 0; } -HANDLE -APIENTRY -NtGdiGetDCObject(HDC hDC, INT ObjectType) -{ - HGDIOBJ SelObject; - DC *dc; - PDC_ATTR pdcattr; - - /* From Wine: GetCurrentObject does not SetLastError() on a null object */ - if(!hDC) return NULL; - - if(!(dc = DC_LockDc(hDC))) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return NULL; - } - pdcattr = dc->pdcattr; - - if (pdcattr->ulDirty_ & DC_BRUSH_DIRTY) - IntGdiSelectBrush(dc,pdcattr->hbrush); - - if (pdcattr->ulDirty_ & DC_PEN_DIRTY) - IntGdiSelectPen(dc,pdcattr->hpen); - - switch(ObjectType) - { - case GDI_OBJECT_TYPE_EXTPEN: - case GDI_OBJECT_TYPE_PEN: - SelObject = pdcattr->hpen; - break; - case GDI_OBJECT_TYPE_BRUSH: - SelObject = pdcattr->hbrush; - break; - case GDI_OBJECT_TYPE_PALETTE: - SelObject = dc->dclevel.hpal; - break; - case GDI_OBJECT_TYPE_FONT: - SelObject = pdcattr->hlfntNew; - break; - case GDI_OBJECT_TYPE_BITMAP: - SelObject = dc->rosdc.hBitmap; - break; - case GDI_OBJECT_TYPE_COLORSPACE: - DPRINT1("FIXME: NtGdiGetCurrentObject() ObjectType OBJ_COLORSPACE not supported yet!\n"); - // SelObject = dc->dclevel.pColorSpace.BaseObject.hHmgr; ? - SelObject = NULL; - break; - default: - SelObject = NULL; - SetLastWin32Error(ERROR_INVALID_PARAMETER); - break; - } - - DC_UnlockDc(dc); - return SelObject; -} - -HPALETTE -FASTCALL -GdiSelectPalette(HDC hDC, - HPALETTE hpal, - BOOL ForceBackground) -{ - PDC dc; - HPALETTE oldPal = NULL; - PPALGDI PalGDI; - - // FIXME: mark the palette as a [fore\back]ground pal - dc = DC_LockDc(hDC); - if (!dc) - { - return NULL; - } - - /* Check if this is a valid palette handle */ - PalGDI = PALETTE_LockPalette(hpal); - if (!PalGDI) - { - DC_UnlockDc(dc); - return NULL; - } - - /* Is this a valid palette for this depth? */ - if ((dc->rosdc.bitsPerPixel <= 8 && PalGDI->Mode == PAL_INDEXED) || - (dc->rosdc.bitsPerPixel > 8 && PalGDI->Mode != PAL_INDEXED)) - { - oldPal = dc->dclevel.hpal; - dc->dclevel.hpal = hpal; - } - else if (8 < dc->rosdc.bitsPerPixel && PAL_INDEXED == PalGDI->Mode) - { - oldPal = dc->dclevel.hpal; - dc->dclevel.hpal = hpal; - } - - PALETTE_UnlockPalette(PalGDI); - DC_UnlockDc(dc); - - return oldPal; -} diff --git a/reactos/subsystems/win32/win32k/objects/path.c b/reactos/subsystems/win32/win32k/objects/path.c index 03e64f0bae3..9e360bd16bd 100644 --- a/reactos/subsystems/win32/win32k/objects/path.c +++ b/reactos/subsystems/win32/win32k/objects/path.c @@ -2635,51 +2635,4 @@ NtGdiWidenPath(HDC hDC) return Ret; } -BOOL -APIENTRY -NtGdiSelectClipPath(HDC hDC, - int Mode) -{ - HRGN hrgnPath; - PPATH pPath; - BOOL success = FALSE; - PDC_ATTR pdcattr; - PDC dc = DC_LockDc ( hDC ); - - if ( !dc ) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - - pdcattr = dc->pdcattr; - - pPath = PATH_LockPath( dc->dclevel.hPath ); - if (!pPath) - { - DC_UnlockDc ( dc ); - return FALSE; - } - /* Check that path is closed */ - if( pPath->state != PATH_Closed ) - { - SetLastWin32Error(ERROR_CAN_NOT_COMPLETE); - return FALSE; - } - /* Construct a region from the path */ - else if( PATH_PathToRegion( pPath, pdcattr->jFillMode, &hrgnPath ) ) - { - success = GdiExtSelectClipRgn( dc, hrgnPath, Mode ) != ERROR; - GreDeleteObject( hrgnPath ); - - /* Empty the path */ - if( success ) - PATH_EmptyPath( pPath); - /* FIXME: Should this function delete the path even if it failed? */ - } - PATH_UnlockPath( pPath ); - DC_UnlockDc ( dc ); - return success; -} - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index 7a7f6ead5fe..d1e962d10c2 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -276,50 +276,6 @@ PEN_GetObject(PBRUSH pbrushPen, INT cbCount, PLOGPEN pBuffer) } -HPEN -FASTCALL -IntGdiSelectPen( - PDC pDC, - HPEN hPen) -{ - PDC_ATTR pdcattr; - HPEN hOrgPen = NULL; - PBRUSH pbrushPen; - XLATEOBJ *XlateObj; - BOOLEAN bFailed; - - if (pDC == NULL || hPen == NULL) return NULL; - - pdcattr = pDC->pdcattr; - - pbrushPen = PEN_LockPen(hPen); - if (pbrushPen == NULL) - { - return NULL; - } - - XlateObj = IntGdiCreateBrushXlate(pDC, pbrushPen, &bFailed); - PEN_UnlockPen(pbrushPen); - if (bFailed) - { - SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES); - return NULL; - } - - hOrgPen = pdcattr->hpen; - pdcattr->hpen = hPen; - - if (pDC->rosdc.XlatePen != NULL) - { - EngDeleteXlate(pDC->rosdc.XlatePen); - } - pdcattr->ulDirty_ &= ~DC_PEN_DIRTY; - - pDC->rosdc.XlatePen = XlateObj; - - return hOrgPen; -} - /* PUBLIC FUNCTIONS ***********************************************************/ HPEN APIENTRY @@ -439,31 +395,6 @@ NtGdiExtCreatePen( return hPen; } - /* - * @implemented - */ -HPEN -APIENTRY -NtGdiSelectPen( - IN HDC hDC, - IN HPEN hPen) -{ - PDC pDC; - HPEN hOrgPen; - if (hDC == NULL || hPen == NULL) return NULL; - - pDC = DC_LockDc(hDC); - if (!pDC) - { - return NULL; - } - - hOrgPen = IntGdiSelectPen(pDC,hPen); - - DC_UnlockDc(pDC); - - return hOrgPen; -} /* EOF */