diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index c1b6f1309..8013b6603 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -168,6 +169,7 @@ struct wlr_scene_buffer { // private state float opacity; + enum wlr_scale_filter_mode filter_mode; uint64_t active_outputs; struct wlr_texture *texture; struct wlr_fbox src_box; @@ -423,6 +425,12 @@ void wlr_scene_buffer_set_transform(struct wlr_scene_buffer *scene_buffer, void wlr_scene_buffer_set_opacity(struct wlr_scene_buffer *scene_buffer, float opacity); +/** +* Sets the filter mode to use when scaling the buffer +*/ +void wlr_scene_buffer_set_filter_mode(struct wlr_scene_buffer *scene_buffer, + enum wlr_scale_filter_mode filter_mode); + /** * Calls the buffer's frame_done signal. */ @@ -455,7 +463,7 @@ bool wlr_scene_output_commit(struct wlr_scene_output *scene_output); * Render and populate given output state. */ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output, - struct wlr_output_state *state); + struct wlr_output_state *state); /** * Call wlr_surface_send_frame_done() on all surfaces in the scene rendered by diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index 7ee492070..d20916a78 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -816,6 +816,16 @@ void wlr_scene_buffer_set_opacity(struct wlr_scene_buffer *scene_buffer, scene_node_update(&scene_buffer->node, NULL); } +void wlr_scene_buffer_set_filter_mode(struct wlr_scene_buffer *scene_buffer, + enum wlr_scale_filter_mode filter_mode) { + if (scene_buffer->filter_mode == filter_mode) { + return; + } + + scene_buffer->filter_mode = filter_mode; + scene_node_update(&scene_buffer->node, NULL); +} + static struct wlr_texture *scene_buffer_get_texture( struct wlr_scene_buffer *scene_buffer, struct wlr_renderer *renderer) { struct wlr_client_buffer *client_buffer = @@ -1146,6 +1156,7 @@ static void scene_node_render(struct wlr_scene_node *node, const struct render_d .transform = transform, .clip = &render_region, .alpha = &scene_buffer->opacity, + .filter_mode = scene_buffer->filter_mode, }); wl_signal_emit_mutable(&scene_buffer->events.output_present, data->output);