Implemented SetDCPenColor and SetDCBrushColor.

This commit is contained in:
Ulrich Czekalla 2003-11-05 01:43:57 +00:00 committed by Alexandre Julliard
parent d48f3b60fe
commit 16ff6689df
11 changed files with 130 additions and 6 deletions

View File

@ -157,7 +157,9 @@ static struct graphics_driver *create_driver( HMODULE module )
GET_FUNC(SetBitmapBits);
GET_FUNC(SetBkColor);
GET_FUNC(SetBkMode);
GET_FUNC(SetDCBrushColor);
GET_FUNC(SetDCOrg);
GET_FUNC(SetDCPenColor);
GET_FUNC(SetDIBColorTable);
GET_FUNC(SetDIBits);
GET_FUNC(SetDIBitsToDevice);

View File

@ -116,7 +116,9 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
NULL, /* pSetBitmapBits */
EMFDRV_SetBkColor, /* pSetBkColor */
EMFDRV_SetBkMode, /* pSetBkMode */
NULL, /* pSetDCBrushColor */
NULL, /* pSetDCOrg */
NULL, /* pSetDCPenColor */
NULL, /* pSetDIBColorTable */
NULL, /* pSetDIBits */
EMFDRV_SetDIBitsToDevice, /* pSetDIBitsToDevice */

View File

@ -350,6 +350,7 @@
@ stdcall SetColorAdjustment(long ptr)
@ stdcall SetColorSpace(long long)
@ stdcall SetDCBrushColor(long long)
@ stdcall SetDCPenColor(long long)
@ stdcall SetDIBColorTable(long long long ptr)
@ stdcall SetDIBits(long long long long ptr ptr long)
@ stdcall SetDIBitsToDevice(long long long long long long long long long ptr ptr long)

View File

@ -117,7 +117,9 @@ static const DC_FUNCTIONS MFDRV_Funcs =
NULL, /* pSetBitmapBits */
MFDRV_SetBkColor, /* pSetBkColor */
MFDRV_SetBkMode, /* pSetBkMode */
NULL, /* pSetDCBrushColor*/
NULL, /* pSetDCOrg */
NULL, /* pSetDCPenColor*/
NULL, /* pSetDIBColorTable */
NULL, /* pSetDIBits */
MFDRV_SetDIBitsToDevice, /* pSetDIBitsToDevice */

View File

@ -46,7 +46,9 @@
@ cdecl SelectPen(ptr long) X11DRV_SelectPen
@ cdecl SetBitmapBits(long ptr long) X11DRV_SetBitmapBits
@ cdecl SetBkColor(ptr long) X11DRV_SetBkColor
@ cdecl SetDCBrushColor(ptr long) X11DRV_SetDCBrushColor
@ cdecl SetDCOrg(ptr long long) X11DRV_SetDCOrg
@ cdecl SetDCPenColor(ptr long) X11DRV_SetDCPenColor
@ cdecl SetDIBColorTable(ptr long long ptr) X11DRV_SetDIBColorTable
@ cdecl SetDIBits(ptr long long long ptr ptr long) X11DRV_SetDIBits
@ cdecl SetDIBitsToDevice(ptr long long long long long long long long ptr ptr long) X11DRV_SetDIBitsToDevice

View File

@ -218,8 +218,6 @@ static BOOL BRUSH_SelectPatternBrush( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
}
/***********************************************************************
* SelectBrush (X11DRV.@)
*/
@ -239,6 +237,8 @@ HBRUSH X11DRV_SelectBrush( X11DRV_PDEVICE *physDev, HBRUSH hbrush )
physDev->brush.pixmap = 0;
}
physDev->brush.style = logbrush.lbStyle;
if (hbrush == GetStockObject( DC_BRUSH ))
logbrush.lbColor = physDev->dc->dcBrushColor;
switch(logbrush.lbStyle)
{
@ -282,3 +282,15 @@ HBRUSH X11DRV_SelectBrush( X11DRV_PDEVICE *physDev, HBRUSH hbrush )
}
return hbrush;
}
/***********************************************************************
* SetDCBrushColor (X11DRV.@)
*/
COLORREF X11DRV_SetDCBrushColor( X11DRV_PDEVICE *physDev, COLORREF crColor )
{
if (GetCurrentObject(physDev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH ))
BRUSH_SelectSolidBrush( physDev, crColor );
return crColor;
}

View File

@ -50,6 +50,8 @@ HPEN X11DRV_SelectPen( X11DRV_PDEVICE *physDev, HPEN hpen )
dc->xformWorld2Vport.eM11);
if (physDev->pen.width < 0) physDev->pen.width = -physDev->pen.width;
if (physDev->pen.width == 1) physDev->pen.width = 0; /* Faster */
if (hpen == GetStockObject( DC_PEN ))
logpen.lopnColor = dc->dcPenColor;
physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( physDev, logpen.lopnColor );
switch(logpen.lopnStyle & PS_STYLE_MASK)
{
@ -79,3 +81,15 @@ HPEN X11DRV_SelectPen( X11DRV_PDEVICE *physDev, HPEN hpen )
}
return hpen;
}
/***********************************************************************
* SetDCPenColor (X11DRV.@)
*/
COLORREF X11DRV_SetDCPenColor( X11DRV_PDEVICE *physDev, COLORREF crColor )
{
if (GetCurrentObject(physDev->hdc, OBJ_PEN) == GetStockObject( DC_PEN ))
physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( physDev, crColor );
return crColor;
}

View File

@ -139,6 +139,8 @@ typedef struct tagDC
WORD backgroundMode;
COLORREF backgroundColor;
COLORREF textColor;
COLORREF dcBrushColor;
COLORREF dcPenColor;
short brushOrgX;
short brushOrgY;
@ -256,7 +258,9 @@ typedef struct tagDC_FUNCS
LONG (*pSetBitmapBits)(HBITMAP,const void*,LONG);
COLORREF (*pSetBkColor)(PHYSDEV,COLORREF);
INT (*pSetBkMode)(PHYSDEV,INT);
COLORREF (*pSetDCBrushColor)(PHYSDEV, COLORREF);
DWORD (*pSetDCOrg)(PHYSDEV,INT,INT);
COLORREF (*pSetDCPenColor)(PHYSDEV, COLORREF);
UINT (*pSetDIBColorTable)(PHYSDEV,UINT,UINT,const RGBQUAD*);
INT (*pSetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT);
INT (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,

View File

@ -1830,8 +1830,10 @@ typedef struct
#define DEFAULT_PALETTE 15
#define SYSTEM_FIXED_FONT 16
#define DEFAULT_GUI_FONT 17
#define DC_BRUSH 18
#define DC_PEN 19
#define STOCK_LAST 17
#define STOCK_LAST 19
#define CLR_INVALID 0xffffffff
/* Metafile header structure */

View File

@ -92,6 +92,8 @@ DC *DC_AllocDC( const DC_FUNCTIONS *funcs, WORD magic )
dc->relAbsMode = ABSOLUTE;
dc->backgroundMode = OPAQUE;
dc->backgroundColor = RGB( 255, 255, 255 );
dc->dcBrushColor = RGB( 255, 255, 255 );
dc->dcPenColor = RGB( 0, 0, 0 );
dc->textColor = RGB( 0, 0, 0 );
dc->brushOrgX = 0;
dc->brushOrgY = 0;
@ -301,6 +303,8 @@ HDC WINAPI GetDCState( HDC hdc )
newdc->backgroundMode = dc->backgroundMode;
newdc->backgroundColor = dc->backgroundColor;
newdc->textColor = dc->textColor;
newdc->dcBrushColor = dc->dcBrushColor;
newdc->dcPenColor = dc->dcPenColor;
newdc->brushOrgX = dc->brushOrgX;
newdc->brushOrgY = dc->brushOrgY;
newdc->textAlign = dc->textAlign;
@ -389,6 +393,8 @@ void WINAPI SetDCState( HDC hdc, HDC hdcs )
dc->backgroundMode = dcs->backgroundMode;
dc->backgroundColor = dcs->backgroundColor;
dc->textColor = dcs->textColor;
dc->dcBrushColor = dcs->dcBrushColor;
dc->dcPenColor = dcs->dcPenColor;
dc->brushOrgX = dcs->brushOrgX;
dc->brushOrgY = dcs->brushOrgY;
dc->textAlign = dcs->textAlign;
@ -855,6 +861,8 @@ COLORREF WINAPI SetBkColor( HDC hdc, COLORREF color )
COLORREF oldColor;
DC * dc = DC_GetDCPtr( hdc );
TRACE("hdc=%p color=0x%08lx\n", hdc, color);
if (!dc) return CLR_INVALID;
oldColor = dc->backgroundColor;
if (dc->funcs->pSetBkColor)
@ -880,6 +888,8 @@ COLORREF WINAPI SetTextColor( HDC hdc, COLORREF color )
COLORREF oldColor;
DC * dc = DC_GetDCPtr( hdc );
TRACE(" hdc=%p color=0x%08lx\n", hdc, color);
if (!dc) return CLR_INVALID;
oldColor = dc->textColor;
if (dc->funcs->pSetTextColor)
@ -904,6 +914,9 @@ UINT WINAPI SetTextAlign( HDC hdc, UINT align )
{
UINT prevAlign;
DC *dc = DC_GetDCPtr( hdc );
TRACE("hdc=%p align=%d\n", hdc, align);
if (!dc) return 0x0;
if (dc->funcs->pSetTextAlign)
prevAlign = dc->funcs->pSetTextAlign(dc->physDev, align);
@ -1455,9 +1468,75 @@ DWORD WINAPI SetLayout(HDC hdc, DWORD layout)
*/
COLORREF WINAPI SetDCBrushColor(HDC hdc, COLORREF crColor)
{
FIXME("(%p, %08lx): stub\n", hdc, crColor);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return CLR_INVALID;
DC *dc;
COLORREF oldClr = CLR_INVALID;
TRACE("hdc(%p) crColor(%08lx)\n", hdc, crColor);
dc = DC_GetDCPtr( hdc );
if (dc)
{
if (dc->funcs->pSetDCBrushColor)
crColor = dc->funcs->pSetDCBrushColor( dc->physDev, crColor );
else if (dc->hBrush == GetStockObject( DC_BRUSH ))
{
/* If DC_BRUSH is selected, update driver pen color */
HBRUSH hBrush = CreateSolidBrush( crColor );
dc->funcs->pSelectBrush( dc->physDev, hBrush );
DeleteObject( hBrush );
}
if (crColor != CLR_INVALID)
{
oldClr = dc->dcBrushColor;
dc->dcBrushColor = crColor;
}
GDI_ReleaseObj( hdc );
}
return oldClr;
}
/***********************************************************************
* SetDCPenColor (GDI32.@)
*
* Sets the current device context (DC) pen color to the specified
* color value. If the device cannot represent the specified color
* value, the color is set to the nearest physical color.
*
*/
COLORREF WINAPI SetDCPenColor(HDC hdc, COLORREF crColor)
{
DC *dc;
COLORREF oldClr = CLR_INVALID;
TRACE("hdc(%p) crColor(%08lx)\n", hdc, crColor);
dc = DC_GetDCPtr( hdc );
if (dc)
{
if (dc->funcs->pSetDCPenColor)
crColor = dc->funcs->pSetDCPenColor( dc->physDev, crColor );
else if (dc->hPen == GetStockObject( DC_PEN ))
{
/* If DC_PEN is selected, update the driver pen color */
LOGPEN logpen = { PS_SOLID, { 0, 0 }, crColor };
HPEN hPen = CreatePenIndirect( &logpen );
dc->funcs->pSelectPen( dc->physDev, hPen );
DeleteObject( hPen );
}
if (crColor != CLR_INVALID)
{
oldClr = dc->dcPenColor;
dc->dcPenColor = crColor;
}
GDI_ReleaseObj( hdc );
}
return oldClr;
}
/***********************************************************************

View File

@ -61,6 +61,8 @@ static const LOGPEN WhitePen = { PS_SOLID, { 0, 0 }, RGB(255,255,255) };
static const LOGPEN BlackPen = { PS_SOLID, { 0, 0 }, RGB(0,0,0) };
static const LOGPEN NullPen = { PS_NULL, { 0, 0 }, 0 };
static const LOGBRUSH DCBrush = { BS_SOLID, RGB(255,255,255), 0 };
static const LOGPEN DCPen = { PS_SOLID, { 0, 0 }, RGB(0,0,0) };
/* reserve one extra entry for the stock default bitmap */
/* this is what Windows does too */
@ -619,6 +621,8 @@ BOOL GDI_Init(void)
stock_objects[SYSTEM_FIXED_FONT] = create_stock_font( "SystemFixed", &deffonts->SystemFixedFont, hkey );
stock_objects[DEFAULT_GUI_FONT] = create_stock_font( "DefaultGui", &deffonts->DefaultGuiFont, hkey );
stock_objects[DC_BRUSH] = CreateBrushIndirect( &DCBrush );
stock_objects[DC_PEN] = CreatePenIndirect( &DCPen );
/* clear the NOSYSTEM bit on all stock objects*/
for (i = 0; i < NB_STOCK_OBJECTS; i++)