[PATCH] gdiplus: Check return value of SelectClipPath in brush_fill_path().
Zhiyi Zhang
zzhang at codeweavers.com
Sat Jun 16 09:31:28 CDT 2018
Hi Vincent,
Yes, we could check if a path is empty just like get_path_hrgn did.
I also worried that a not empty but open path will also make SelectClipPath()
fail. Is there any function to check if a path is closed? I couldn't found any.
As for SelectClipPath() last error, I don't think any further operation should
be continued if any error occurs.
So we add a check for empty path and also skip further operation if SelectClipPath()
returns any error. Is that enough?
Thanks,
Zhiyi
On Fri 6 15 23:55, Vincent Povirk wrote:
> It looks like we also encountered this case in get_path_hrgn. Maybe we
> shouldn't call brush_fill_pixels if the path is empty? If we're going
> to ignore errors, I think we should at least check GetLastError() to
> make sure it's one we expect.
>
> On Fri, Jun 15, 2018 at 4:04 AM, Zhiyi Zhang <zzhang at codeweavers.com> wrote:
>> For Crossover bug 16126.
>>
>> When GraphicPath is empty, filling path with gdi32 will
>> result in a DC with empty path. When SelectClipPath() is
>> called with such a DC, it will fail because it requires
>> a closed path in DC. Thus further operation should be canceled.
>>
>> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
>> ---
>> dlls/gdiplus/graphics.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
>> index 76aabe74bf..2a95d686fa 100644
>> --- a/dlls/gdiplus/graphics.c
>> +++ b/dlls/gdiplus/graphics.c
>> @@ -1052,6 +1052,7 @@ static BOOL brush_can_fill_path(GpBrush *brush, BOOL is_fill)
>>
>> static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>> {
>> + BOOL success;
>> switch (brush->bt)
>> {
>> case BrushTypeSolidColor:
>> @@ -1064,8 +1065,8 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
>> RECT rc;
>> /* partially transparent fill */
>>
>> - SelectClipPath(graphics->hdc, RGN_AND);
>> - if (GetClipBox(graphics->hdc, &rc) != NULLREGION)
>> + success = SelectClipPath(graphics->hdc, RGN_AND);
>> + if (success && GetClipBox(graphics->hdc, &rc) != NULLREGION)
>> {
>> HDC hdc = CreateCompatibleDC(NULL);
>>
>> --
>> 2.17.1
>>
>>
>>
More information about the wine-devel
mailing list