@ -414,55 +414,63 @@ static const struct wl_surface_listener surface_listener = {
surface_leave
} ;
static struct wl_buffer *
create_shm_buffer ( struct client * client , int width , int height , void * * pixels )
static struct buffer *
create_shm_buffer ( struct client * client , int width , int height ,
pixman_format_code_t format , uint32_t wlfmt )
{
struct wl_shm * shm = client - > wl_shm ;
int stride = width * 4 ;
int size = stride * height ;
struct buffer * buf ;
size_t stride_bytes ;
struct wl_shm_pool * pool ;
struct wl_buffer * buffer ;
int fd ;
void * data ;
size_t bytes_pp ;
assert ( width > 0 ) ;
assert ( height > 0 ) ;
buf = xzalloc ( sizeof * buf ) ;
bytes_pp = PIXMAN_FORMAT_BPP ( format ) / 8 ;
stride_bytes = width * bytes_pp ;
/* round up to multiple of 4 bytes for Pixman */
stride_bytes = ( stride_bytes + 3 ) & ~ 3u ;
assert ( stride_bytes / bytes_pp > = ( unsigned ) width ) ;
fd = os_create_anonymous_file ( size ) ;
buf - > len = stride_bytes * height ;
assert ( buf - > len / stride_bytes = = ( unsigned ) height ) ;
fd = os_create_anonymous_file ( buf - > len ) ;
assert ( fd > = 0 ) ;
data = mmap ( NULL , size , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 ) ;
data = mmap ( NULL , buf - > len , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 ) ;
if ( data = = MAP_FAILED ) {
close ( fd ) ;
assert ( data ! = MAP_FAILED ) ;
}
pool = wl_shm_create_pool ( shm , fd , size ) ;
buffer = wl_shm_pool_create_buffer ( pool , 0 , width , height , stride ,
WL_SHM_FORMAT_ARGB8888 ) ;
pool = wl_shm_create_pool ( shm , fd , buf - > len ) ;
buf - > proxy = wl_shm_pool_create_buffer ( pool , 0 , width , height ,
stride_bytes , wlfmt ) ;
wl_shm_pool_destroy ( pool ) ;
close ( fd ) ;
if ( pixels )
* pixels = data ;
buf - > image = pixman_image_create_bits ( format , width , height ,
data , stride_bytes ) ;
assert ( buf - > proxy ) ;
assert ( buf - > image ) ;
return buffer ;
return buf ;
}
struct buffer *
create_shm_buffer_a8r8g8b8 ( struct client * client , int width , int height )
{
struct buffer * buf ;
void * pixels ;
buf = xzalloc ( sizeof * buf ) ;
buf - > proxy = create_shm_buffer ( client , width , height , & pixels ) ;
buf - > image = pixman_image_create_bits ( PIXMAN_a8r8g8b8 , width , height ,
pixels , width * 4 ) ;
buf - > len = width * height * 4 ;
assert ( buf - > proxy ) ;
assert ( buf - > image ) ;
assert ( client - > has_argb ) ;
return buf ;
return create_shm_buffer ( client , width , height ,
PIXMAN_a8r8g8b8 , WL_SHM_FORMAT_ARGB8888 ) ;
}
void