diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index c8f711f7b9d..e69294d8278 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -183,6 +183,9 @@ NtUserCallOneParam( DWORD Param, DWORD Routine); +#define TWOPARAM_ROUTINE_SETDCPENCOLOR 0x45 +#define TWOPARAM_ROUTINE_SETDCBRUSHCOLOR 0x46 +#define TWOPARAM_ROUTINE_GETDCCOLOR 0x47 #define TWOPARAM_ROUTINE_GETWINDOWRGNBOX 0x48 #define TWOPARAM_ROUTINE_GETWINDOWRGN 0x49 #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0x50 diff --git a/reactos/lib/gdi32/misc/stubs.c b/reactos/lib/gdi32/misc/stubs.c index 69261936a9f..45b67f7c15d 100644 --- a/reactos/lib/gdi32/misc/stubs.c +++ b/reactos/lib/gdi32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.59 2004/04/25 16:40:39 weiden Exp $ +/* $Id: stubs.c,v 1.60 2004/04/25 20:05:30 weiden Exp $ * * reactos/lib/gdi32/misc/stubs.c * @@ -2285,32 +2285,6 @@ GetCharWidthI( return 0; } -/* - * @unimplemented - */ -COLORREF -STDCALL -GetDCBrushColor( - HDC hdc -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -COLORREF -STDCALL -GetDCPenColor( - HDC hdc -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -2546,34 +2520,6 @@ SetBrushAttributes(HBRUSH hbm, DWORD dwFlags) return 0; } -/* - * @unimplemented - */ -COLORREF -STDCALL -SetDCBrushColor( - HDC hdc, - COLORREF crColor -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -COLORREF -STDCALL -SetDCPenColor( - HDC hdc, - COLORREF crColor -) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/gdi32/objects/dc.c b/reactos/lib/gdi32/objects/dc.c index 7083fee4230..49c3d753705 100644 --- a/reactos/lib/gdi32/objects/dc.c +++ b/reactos/lib/gdi32/objects/dc.c @@ -11,6 +11,18 @@ #define NDEBUG #include +#define NtUserGetDCBrushColor(hbr) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), OBJ_BRUSH, TWOPARAM_ROUTINE_GETDCCOLOR) + +#define NtUserGetDCPenColor(hbr) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), OBJ_PEN, TWOPARAM_ROUTINE_GETDCCOLOR) + +#define NtUserSetDCBrushColor(hbr, crColor) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), (DWORD)crColor, TWOPARAM_ROUTINE_SETDCBRUSHCOLOR) + +#define NtUserSetDCPenColor(hbr, crColor) \ + (COLORREF)NtUserCallTwoParam((DWORD)(hbr), (DWORD)crColor, TWOPARAM_ROUTINE_SETDCPENCOLOR) + /* * @implemented */ @@ -1059,3 +1071,52 @@ PtVisible( return NtGdiPtVisible(hdc, X, Y); } +/* + * @implemented + */ +COLORREF +STDCALL +GetDCBrushColor( + HDC hdc +) +{ + return NtUserGetDCBrushColor(hdc); +} + +/* + * @implemented + */ +COLORREF +STDCALL +GetDCPenColor( + HDC hdc +) +{ + return NtUserGetDCPenColor(hdc); +} + +/* + * @implemented + */ +COLORREF +STDCALL +SetDCBrushColor( + HDC hdc, + COLORREF crColor +) +{ + return NtUserSetDCBrushColor(hdc, crColor); +} + +/* + * @implemented + */ +COLORREF +STDCALL +SetDCPenColor( + HDC hdc, + COLORREF crColor +) +{ + return NtUserSetDCPenColor(hdc, crColor); +} diff --git a/reactos/subsys/win32k/include/intgdi.h b/reactos/subsys/win32k/include/intgdi.h index 3374f5f6a34..131d3457553 100644 --- a/reactos/subsys/win32k/include/intgdi.h +++ b/reactos/subsys/win32k/include/intgdi.h @@ -121,6 +121,12 @@ IntGdiCreateDC(PUNICODE_STRING Driver, PUNICODE_STRING Output, CONST PDEVMODEW InitData); +COLORREF FASTCALL +IntGetDCColor(HDC hDC, ULONG Object); + +COLORREF FASTCALL +IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color); + /* Coord functions */ BOOL FASTCALL diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 21cc8ac14b1..c13af9e9110 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.62 2004/04/15 23:36:03 weiden Exp $ +/* $Id: misc.c,v 1.63 2004/04/25 20:05:30 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include #include @@ -208,6 +210,18 @@ NtUserCallTwoParam( switch(Routine) { + case TWOPARAM_ROUTINE_SETDCPENCOLOR: + { + return (DWORD)IntSetDCColor((HDC)Param1, OBJ_PEN, (COLORREF)Param2); + } + case TWOPARAM_ROUTINE_SETDCBRUSHCOLOR: + { + return (DWORD)IntSetDCColor((HDC)Param1, OBJ_BRUSH, (COLORREF)Param2); + } + case TWOPARAM_ROUTINE_GETDCCOLOR: + { + return (DWORD)IntGetDCColor((HDC)Param1, (ULONG)Param2); + } case TWOPARAM_ROUTINE_GETWINDOWRGNBOX: { DWORD Ret; diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index 78e6494aa24..fcbb256d011 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.131 2004/04/25 15:31:43 weiden Exp $ +/* $Id: dc.c,v 1.132 2004/04/25 20:05:30 weiden Exp $ * * DC.C - Device context functions * @@ -2221,4 +2221,236 @@ IntIsPrimarySurface(PSURFGDI SurfGDI) return SurfGDI == (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle) ? TRUE : FALSE; } +/* + * Returns the color of the brush or pen that is currently selected into the DC. + * This function is called from GetDCBrushColor() and GetDCPenColor() + */ +COLORREF FASTCALL +IntGetDCColor(HDC hDC, ULONG Object) +{ + COLORREF Result; + DC *dc; + PPALGDI PalGDI; + PGDIBRUSHOBJ pen; + PGDIBRUSHOBJ brush; + XLATEOBJ *XlateObj; + HPALETTE Pal; + USHORT Mode; + ULONG iColor; + + if(!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return CLR_INVALID; + } + + switch(Object) + { + case OBJ_PEN: + { + if(!(pen = PENOBJ_LockPen(dc->w.hPen))) + { + DC_UnlockDc(hDC); + return CLR_INVALID; + } + if(!(pen->flAttrs & GDIBRUSH_IS_SOLID)) + { + /* FIXME - just bail here? */ + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + iColor = pen->BrushObject.iSolidColor; + PENOBJ_UnlockPen(dc->w.hPen); + break; + } + case OBJ_BRUSH: + { + if(!(brush = BRUSHOBJ_LockBrush(dc->w.hBrush))) + { + DC_UnlockDc(hDC); + return CLR_INVALID; + } + if(!(brush->flAttrs & GDIBRUSH_IS_SOLID)) + { + /* FIXME - just bail here? */ + BRUSHOBJ_UnlockBrush(dc->w.hBrush); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + iColor = brush->BrushObject.iSolidColor; + BRUSHOBJ_UnlockBrush(dc->w.hBrush); + break; + } + default: + { + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return CLR_INVALID; + } + } + + /* translate the color into RGB */ + + if(dc->w.hPalette) + Pal = dc->w.hPalette; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + + Result = CLR_INVALID; + + if((PalGDI = PALETTE_LockPalette(dc->w.hPalette))) + { + Mode = PalGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, Pal); + if(XlateObj) + { + Result = XLATEOBJ_iXlate(XlateObj, iColor); + EngDeleteXlate(XlateObj); + } + } + + DC_UnlockDc(hDC); + return Result; +} + +/* + * Changes the color of the brush or pen that is currently selected into the DC. + * This function is called from SetDCBrushColor() and SetDCPenColor() + */ +COLORREF FASTCALL +IntSetDCColor(HDC hDC, ULONG Object, COLORREF Color) +{ + COLORREF Result; + DC *dc; + PPALGDI PalGDI; + PGDIBRUSHOBJ pen; + PGDIBRUSHOBJ brush; + XLATEOBJ *XlateObj; + HPALETTE Pal; + USHORT Mode; + ULONG iColor; + + if(Color == CLR_INVALID) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return CLR_INVALID; + } + + if(!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return CLR_INVALID; + } + + switch(Object) + { + case OBJ_PEN: + { + if(!(pen = PENOBJ_LockPen(dc->w.hPen))) + { + DC_UnlockDc(hDC); + return CLR_INVALID; + } + if(!(pen->flAttrs & GDIBRUSH_IS_SOLID)) + { + /* FIXME - just bail here? */ + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + + /* save old color index, translate it to RGB later */ + iColor = pen->BrushObject.iSolidColor; + + if(!(PalGDI = PALETTE_LockPalette(dc->w.hPalette))) + { + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + Mode = PalGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + if(!(XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL))) + { + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + pen->BrushObject.iSolidColor = XLATEOBJ_iXlate(XlateObj, (ULONG)Color); + EngDeleteXlate(XlateObj); + PENOBJ_UnlockPen(dc->w.hPen); + break; + } + case OBJ_BRUSH: + { + if(!(brush = BRUSHOBJ_LockBrush(dc->w.hBrush))) + { + DC_UnlockDc(hDC); + return CLR_INVALID; + } + if(!(brush->flAttrs & GDIBRUSH_IS_SOLID)) + { + /* FIXME - just bail here? */ + BRUSHOBJ_UnlockBrush(dc->w.hBrush); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + + /* save old color index, translate it to RGB later */ + iColor = brush->BrushObject.iSolidColor; + + if(!(PalGDI = PALETTE_LockPalette(dc->w.hPalette))) + { + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + Mode = PalGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + if(!(XlateObj = (XLATEOBJ*)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL))) + { + PENOBJ_UnlockPen(dc->w.hPen); + DC_UnlockDc(hDC); + return CLR_INVALID; + } + brush->BrushObject.iSolidColor = XLATEOBJ_iXlate(XlateObj, (ULONG)Color); + EngDeleteXlate(XlateObj); + BRUSHOBJ_UnlockBrush(dc->w.hBrush); + break; + } + default: + { + DC_UnlockDc(hDC); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return CLR_INVALID; + } + } + + /* translate the old color into RGB */ + + if(dc->w.hPalette) + Pal = dc->w.hPalette; + else + Pal = NtGdiGetStockObject(DEFAULT_PALETTE); + + Result = CLR_INVALID; + + if((PalGDI = PALETTE_LockPalette(dc->w.hPalette))) + { + Mode = PalGDI->Mode; + PALETTE_UnlockPalette(dc->w.hPalette); + XlateObj = (XLATEOBJ*)IntEngCreateXlate(PAL_RGB, Mode, NULL, Pal); + if(XlateObj) + { + Result = XLATEOBJ_iXlate(XlateObj, iColor); + EngDeleteXlate(XlateObj); + } + } + + DC_UnlockDc(hDC); + return Result; +} + /* EOF */