[Bug 18145] FillRect: Undocumented feature
wine-bugs at winehq.org
wine-bugs at winehq.org
Wed Apr 29 05:18:28 CDT 2009
http://bugs.winehq.org/show_bug.cgi?id=18145
--- Comment #3 from Marintsev Miron <marintsev at gmail.com> 2009-04-29 05:18:28 ---
(In reply to comment #2)
> Probably what happens is that FillRect() ignores an error of SelectObject()
> when an invalid brush handle is passed. That needs a test case.
>
#1. FillRect && GetSysColorBrush
FillRect code:
...
if ( hbrush <= (HBRUSH) (COLOR_MAX + 1)) hbrush = GetSysColorBrush(
HandleToULong(hbrush) - 1 );
...
GetSysColorBrush( (unsigned) -1 ) returns NULL under windows, but wine returns
GetStockObject( LTGRAY_BRUSH ).
So it's necessary to add such code to dlls/user32/sysparams.c/GetSysColorBrush:
if( (unsigned int) -1 == index ) return NULL;
MSDN says:
Return Value
The return value identifies a logical brush if the nIndex parameter is
supported by the current platform. Otherwise, it returns NULL.
#2. SelectObject( hdc, 0 )
There is no problem with SelectObject( hdc, 0 ). It returns 0 and do nothing
both under Windows and wine.
#3. FillRect && SelectObject( hdc, 0 )
dlls/user32/uitools.c/FillRect code:
...
if ( !(prevBrush = SelectObject( hdc, hbrush ))) return 0;
PatBlt( hdc, rect->left, rect->top,
rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
SelectObject( hdc, prevBrush );
...
SelectObject( hdc, 0 ) will return 0, so prevBrush will be 0 and FillRect
returns 0, before drawing using PatBlt. It's improper.
According to item #2 it's safely to use SelectObject( hdc, 0 ) before and after
PatBlt, but lacks performance.
So this is my vision of FillRect reconstruction:
if ( hbrush && !(prevBrush = SelectObject( hdc, hbrush ))) return 0;
PatBlt( hdc, rect->left, rect->top,
rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
if( hbrush ) SelectObject( hdc, prevBrush );
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list