winex11: Force the alpha bits in the window surface for 32-bit visuals.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a2a2b5bc88
commit
dcf526b5b1
|
@ -1067,8 +1067,8 @@ static inline BOOL image_needs_byteswap( XImage *image, BOOL is_r8g8b8, int bit_
|
||||||
|
|
||||||
/* copy image bits with byte swapping and/or pixel mapping */
|
/* copy image bits with byte swapping and/or pixel mapping */
|
||||||
static void copy_image_byteswap( BITMAPINFO *info, const unsigned char *src, unsigned char *dst,
|
static void copy_image_byteswap( BITMAPINFO *info, const unsigned char *src, unsigned char *dst,
|
||||||
int src_stride, int dst_stride, int height,
|
int src_stride, int dst_stride, int height, BOOL byteswap,
|
||||||
BOOL byteswap, const int *mapping, unsigned int zeropad_mask )
|
const int *mapping, unsigned int zeropad_mask, unsigned int alpha_bits )
|
||||||
{
|
{
|
||||||
int x, y, padding_pos = abs(dst_stride) / sizeof(unsigned int) - 1;
|
int x, y, padding_pos = abs(dst_stride) / sizeof(unsigned int) - 1;
|
||||||
|
|
||||||
|
@ -1148,7 +1148,7 @@ static void copy_image_byteswap( BITMAPINFO *info, const unsigned char *src, uns
|
||||||
case 32:
|
case 32:
|
||||||
for (y = 0; y < height; y++, src += src_stride, dst += dst_stride)
|
for (y = 0; y < height; y++, src += src_stride, dst += dst_stride)
|
||||||
for (x = 0; x < info->bmiHeader.biWidth; x++)
|
for (x = 0; x < info->bmiHeader.biWidth; x++)
|
||||||
((ULONG *)dst)[x] = RtlUlongByteSwap( ((const ULONG *)src)[x] );
|
((ULONG *)dst)[x] = RtlUlongByteSwap( ((const ULONG *)src)[x] | alpha_bits );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1200,7 +1200,7 @@ DWORD copy_image_bits( BITMAPINFO *info, BOOL is_r8g8b8, XImage *image,
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_image_byteswap( info, src, dst, image->bytes_per_line, width_bytes, height,
|
copy_image_byteswap( info, src, dst, image->bytes_per_line, width_bytes, height,
|
||||||
need_byteswap, mapping, zeropad_mask );
|
need_byteswap, mapping, zeropad_mask, 0 );
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1565,6 +1565,7 @@ struct x11drv_window_surface
|
||||||
RECT bounds;
|
RECT bounds;
|
||||||
BOOL byteswap;
|
BOOL byteswap;
|
||||||
BOOL is_argb;
|
BOOL is_argb;
|
||||||
|
DWORD alpha_bits;
|
||||||
COLORREF color_key;
|
COLORREF color_key;
|
||||||
HRGN region;
|
HRGN region;
|
||||||
void *bits;
|
void *bits;
|
||||||
|
@ -1918,7 +1919,16 @@ static void x11drv_surface_flush( struct window_surface *window_surface )
|
||||||
dst += coords.visrect.top * width_bytes;
|
dst += coords.visrect.top * width_bytes;
|
||||||
copy_image_byteswap( &surface->info, src, dst, width_bytes, width_bytes,
|
copy_image_byteswap( &surface->info, src, dst, width_bytes, width_bytes,
|
||||||
coords.visrect.bottom - coords.visrect.top,
|
coords.visrect.bottom - coords.visrect.top,
|
||||||
surface->byteswap, mapping, ~0u );
|
surface->byteswap, mapping, ~0u, surface->alpha_bits );
|
||||||
|
}
|
||||||
|
else if (surface->alpha_bits)
|
||||||
|
{
|
||||||
|
int x, y, stride = surface->image->bytes_per_line / sizeof(ULONG);
|
||||||
|
ULONG *ptr = (ULONG *)dst + coords.visrect.top * stride;
|
||||||
|
|
||||||
|
for (y = coords.visrect.top; y < coords.visrect.bottom; y++, ptr += stride)
|
||||||
|
for (x = coords.visrect.left; x < coords.visrect.right; x++)
|
||||||
|
ptr[x] |= surface->alpha_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBXXSHM
|
#ifdef HAVE_LIBXXSHM
|
||||||
|
@ -2033,6 +2043,9 @@ struct window_surface *create_surface( Window window, const XVisualInfo *vis, co
|
||||||
XSetSubwindowMode( gdi_display, surface->gc, IncludeInferiors );
|
XSetSubwindowMode( gdi_display, surface->gc, IncludeInferiors );
|
||||||
surface->byteswap = image_needs_byteswap( surface->image, is_r8g8b8(vis), format->bits_per_pixel );
|
surface->byteswap = image_needs_byteswap( surface->image, is_r8g8b8(vis), format->bits_per_pixel );
|
||||||
|
|
||||||
|
if (vis->depth == 32 && !surface->is_argb)
|
||||||
|
surface->alpha_bits = ~(vis->red_mask | vis->green_mask | vis->blue_mask);
|
||||||
|
|
||||||
if (surface->byteswap || format->bits_per_pixel == 4 || format->bits_per_pixel == 8)
|
if (surface->byteswap || format->bits_per_pixel == 4 || format->bits_per_pixel == 8)
|
||||||
{
|
{
|
||||||
/* allocate separate surface bits if byte swapping or palette mapping is required */
|
/* allocate separate surface bits if byte swapping or palette mapping is required */
|
||||||
|
|
Loading…
Reference in New Issue