mirror of
https://github.com/reactos/reactos.git
synced 2025-07-30 03:52:09 +00:00
implemented GetDCBrushColor(), SetDCBrushColor(), GetDCPenColor() and SetDCPenColor(). they're UNTESTED so far!
svn path=/trunk/; revision=9221
This commit is contained in:
parent
ffa06b86eb
commit
c038032038
6 changed files with 319 additions and 57 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue