winex11: Fix a potential deadlock in the GradientFill non-XRender fallback.

This commit is contained in:
Alexandre Julliard 2012-04-02 22:21:22 +02:00
parent c0c7547f37
commit 46390b09d5
1 changed files with 10 additions and 6 deletions

View File

@ -1446,11 +1446,13 @@ BOOL X11DRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert,
} }
for (x = 0, pos = min( pt[0].x, pt[1].x ); x < dx; x++, pos++) for (x = 0, pos = min( pt[0].x, pt[1].x ); x < dx; x++, pos++)
{ {
COLORREF color = RGB( (v[0].Red * (dx - x) + v[1].Red * x) / dx / 256, int color = X11DRV_PALETTE_ToPhysical( physdev,
RGB( (v[0].Red * (dx - x) + v[1].Red * x) / dx / 256,
(v[0].Green * (dx - x) + v[1].Green * x) / dx / 256, (v[0].Green * (dx - x) + v[1].Green * x) / dx / 256,
(v[0].Blue * (dx - x) + v[1].Blue * x) / dx / 256); (v[0].Blue * (dx - x) + v[1].Blue * x) / dx / 256) );
wine_tsx11_lock(); wine_tsx11_lock();
XSetForeground( gdi_display, physdev->gc, X11DRV_PALETTE_ToPhysical( physdev, color )); XSetForeground( gdi_display, physdev->gc, color );
XDrawLine( gdi_display, physdev->drawable, physdev->gc, XDrawLine( gdi_display, physdev->drawable, physdev->gc,
physdev->dc_rect.left + pos, physdev->dc_rect.top + pt[0].y, physdev->dc_rect.left + pos, physdev->dc_rect.top + pt[0].y,
physdev->dc_rect.left + pos, physdev->dc_rect.top + pt[1].y ); physdev->dc_rect.left + pos, physdev->dc_rect.top + pt[1].y );
@ -1491,11 +1493,13 @@ BOOL X11DRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert,
} }
for (y = 0, pos = min( pt[0].y, pt[1].y ); y < dy; y++, pos++) for (y = 0, pos = min( pt[0].y, pt[1].y ); y < dy; y++, pos++)
{ {
COLORREF color = RGB( (v[0].Red * (dy - y) + v[1].Red * y) / dy / 256, int color = X11DRV_PALETTE_ToPhysical( physdev,
RGB( (v[0].Red * (dy - y) + v[1].Red * y) / dy / 256,
(v[0].Green * (dy - y) + v[1].Green * y) / dy / 256, (v[0].Green * (dy - y) + v[1].Green * y) / dy / 256,
(v[0].Blue * (dy - y) + v[1].Blue * y) / dy / 256); (v[0].Blue * (dy - y) + v[1].Blue * y) / dy / 256) );
wine_tsx11_lock(); wine_tsx11_lock();
XSetForeground( gdi_display, physdev->gc, X11DRV_PALETTE_ToPhysical( physdev, color )); XSetForeground( gdi_display, physdev->gc, color );
XDrawLine( gdi_display, physdev->drawable, physdev->gc, XDrawLine( gdi_display, physdev->drawable, physdev->gc,
physdev->dc_rect.left + pt[0].x, physdev->dc_rect.top + pos, physdev->dc_rect.left + pt[0].x, physdev->dc_rect.top + pos,
physdev->dc_rect.left + pt[1].x, physdev->dc_rect.top + pos ); physdev->dc_rect.left + pt[1].x, physdev->dc_rect.top + pos );