implemented GetDCBrushColor(), SetDCBrushColor(), GetDCPenColor() and SetDCPenColor(). they're UNTESTED so far!

svn path=/trunk/; revision=9221
This commit is contained in:
Thomas Bluemel 2004-04-25 20:05:30 +00:00
parent ffa06b86eb
commit c038032038
6 changed files with 319 additions and 57 deletions

View file

@ -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

View file

@ -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
*/

View file

@ -11,6 +11,18 @@
#define NDEBUG
#include <debug.h>
#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);
}

View file

@ -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

View file

@ -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/menu.h>
#include <include/painting.h>
#include <include/dce.h>
#include <include/inteng.h>
#include <include/intgdi.h>
#include <include/mouse.h>
#include <include/winsta.h>
#include <include/caret.h>
@ -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;

View file

@ -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 */