opt: optimize buffer scale

This commit is contained in:
DreamMaoMao 2025-04-09 22:43:18 +08:00
parent 3eb9db2f2c
commit 240b0a19b8

View file

@ -253,7 +253,6 @@ struct Client {
pid_t pid; pid_t pid;
Client *swallowing, *swallowedby; Client *swallowing, *swallowedby;
bool is_clip_to_hide; bool is_clip_to_hide;
bool need_scale_first_frame;
}; };
@ -1075,13 +1074,13 @@ struct uvec2 clip_to_hide(Client *c, struct wlr_box *clip_box) {
return offset; return offset;
} }
void apply_buffer_scale(Client *c, struct wlr_box clip_box ) { void apply_buffer_scale(Client *c, struct wlr_box clip_box, struct wlr_box geom) {
animationScale scale_data; animationScale scale_data;
scale_data.width = clip_box.width - 2 * c->bw; scale_data.width = clip_box.width - 2 * c->bw;
scale_data.height = clip_box.height - 2 * c->bw; scale_data.height = clip_box.height - 2 * c->bw;
scale_data.m = c->mon; scale_data.m = c->mon;
scale_data.width_scale = (float)clip_box.width / c->current.width; scale_data.width_scale = (float)scale_data.width / geom.width;
scale_data.height_scale = (float)clip_box.height / c->current.height; scale_data.height_scale = (float)scale_data.height / geom.height;
buffer_set_size(c, scale_data); buffer_set_size(c, scale_data);
} }
@ -1126,7 +1125,7 @@ void client_apply_clip(Client *c) {
wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box); wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip_box);
apply_border(c, clip_box, offset.x, offset.y); apply_border(c, clip_box, offset.x, offset.y);
apply_buffer_scale(c,clip_box); apply_buffer_scale(c,clip_box, geometry);
} }
bool client_draw_frame(Client *c) { bool client_draw_frame(Client *c) {
@ -3979,8 +3978,6 @@ mapnotify(struct wl_listener *listener, void *data) {
c->need_float_size_reduce = 0; c->need_float_size_reduce = 0;
c->iskilling = 0; c->iskilling = 0;
c->scroller_proportion = scroller_default_proportion; c->scroller_proportion = scroller_default_proportion;
c->need_scale_first_frame = true;
// nop
if (new_is_master && if (new_is_master &&
strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name, strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name,
@ -4444,11 +4441,7 @@ void scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, int sy,
void *data) { void *data) {
animationScale *scale_data = (animationScale *)data; animationScale *scale_data = (animationScale *)data;
if(scale_data->height_scale <= 0 || scale_data->width_scale <= 0) { if(scale_data->height_scale < 1 || scale_data->width_scale < 1) {
return;
}
if(scale_data->height <= 0 || scale_data->width <= 0) {
return; return;
} }
@ -4464,15 +4457,18 @@ void scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, int sy,
surface_width *= scale_data->width_scale; surface_width *= scale_data->width_scale;
surface_height *= scale_data->height_scale; surface_height *= scale_data->height_scale;
if (wlr_subsurface_try_from_wlr_surface(surface) != NULL && if (surface_width > scale_data->width && wlr_subsurface_try_from_wlr_surface(surface) == NULL) {
surface_width <= scale_data->m->m.width && surface_width = scale_data->width;
surface_height <= scale_data->m->m.height &&
surface_height > 0 && surface_width > 0) {
wlr_scene_buffer_set_dest_size(buffer, surface_width, surface_height);
} else if(scale_data->width >0 && scale_data->height > 0) {
wlr_scene_buffer_set_dest_size(buffer, scale_data->width,
scale_data->height);
} }
if (surface_height > scale_data->height && wlr_subsurface_try_from_wlr_surface(surface) == NULL) {
surface_height = scale_data->height;
}
if (surface_height > 0 && surface_width > 0) {
wlr_scene_buffer_set_dest_size(buffer, surface_width, surface_height);
}
} }
void snap_scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx, void snap_scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx,
@ -4483,13 +4479,6 @@ void snap_scene_buffer_apply_size(struct wlr_scene_buffer *buffer, int sx,
void buffer_set_size(Client *c, animationScale data) { void buffer_set_size(Client *c, animationScale data) {
if (c->animation.current.width <= c->geom.width &&
c->animation.current.height <= c->geom.height && !c->need_scale_first_frame) {
return;
}
c->need_scale_first_frame = false;
if (c->iskilling || c->animation.tagouting || if (c->iskilling || c->animation.tagouting ||
c->animation.tagouted || c->animation.tagining) { c->animation.tagouted || c->animation.tagining) {
return; return;