@ -2735,6 +2735,28 @@ weston_surface_is_pending_viewport_source_valid(
return true ;
}
static bool
fixed_is_integer ( wl_fixed_t v )
{
return ( v & 0xff ) = = 0 ;
}
static bool
weston_surface_is_pending_viewport_dst_size_int (
const struct weston_surface * surface )
{
const struct weston_buffer_viewport * vp =
& surface - > pending . buffer_viewport ;
if ( vp - > surface . width ! = - 1 ) {
assert ( vp - > surface . width > 0 & & vp - > surface . height > 0 ) ;
return true ;
}
return fixed_is_integer ( vp - > buffer . src_width ) & &
fixed_is_integer ( vp - > buffer . src_height ) ;
}
/* Translate pending damage in buffer co-ordinates to surface
* co - ordinates and union it with a pixman_region32_t .
* This should only be called after the buffer is attached .
@ -2884,6 +2906,16 @@ surface_commit(struct wl_client *client, struct wl_resource *resource)
return ;
}
if ( ! weston_surface_is_pending_viewport_dst_size_int ( surface ) ) {
assert ( surface - > viewport_resource ) ;
wl_resource_post_error ( surface - > viewport_resource ,
WP_VIEWPORT_ERROR_BAD_SIZE ,
" wl_surface@%d viewport dst size not integer " ,
wl_resource_get_id ( resource ) ) ;
return ;
}
if ( sub ) {
weston_subsurface_commit ( sub ) ;
return ;