summaryrefslogtreecommitdiff
path: root/types/scene/wlr_scene.c
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2024-01-03 23:50:21 +0100
committerErik Reider <[email protected]>2024-01-04 02:11:25 +0100
commitb392638c8a8d142376fa0f44b3cc0f3a6ebd93f3 (patch)
tree669262d9e7341340af1c227e005a0c25bf014873 /types/scene/wlr_scene.c
parentc15af4a182314d8384fc6b28e7c3fc58c0352b83 (diff)
Fixed scaling issues
Diffstat (limited to 'types/scene/wlr_scene.c')
-rw-r--r--types/scene/wlr_scene.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c
index d822392..8ded6a8 100644
--- a/types/scene/wlr_scene.c
+++ b/types/scene/wlr_scene.c
@@ -1156,31 +1156,43 @@ struct wlr_scene_node *wlr_scene_node_at(struct wlr_scene_node *node,
// which extends the node size past the actual window size. This gets
// the actual surface geometry, mostly ignoring CSD decorations
// but only if we need to.
-static void clip_xdg(struct wlr_scene_buffer *scene_buffer,
+static void clip_xdg(struct wlr_scene_node *node,
pixman_region32_t *clip, struct wlr_box *dst_box,
- int x, int y, int scale) {
- if (scene_buffer->corner_radius == 0 &&
- !scene_buffer_has_shadow(&scene_buffer->shadow_data)) {
+ int x, int y, float scale) {
+ struct wlr_scene_buffer *scene_buffer = NULL;
+ switch (node->type) {
+ default:
+ return;
+ case WLR_SCENE_NODE_BUFFER:
+ scene_buffer = wlr_scene_buffer_from_node(node);
+ break;
+ }
+
+ if (!scene_buffer || (scene_buffer->corner_radius == 0 &&
+ !scene_buffer_has_shadow(&scene_buffer->shadow_data))) {
return;
}
- struct wlr_scene_surface *scene_surface =
- wlr_scene_surface_try_from_buffer(scene_buffer);
+ struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(scene_buffer);
struct wlr_xdg_surface *xdg_surface = NULL;
if (scene_surface &&
- (xdg_surface =
- wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface))) {
+ (xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface))) {
struct wlr_box geometry;
wlr_xdg_surface_get_geometry(xdg_surface, &geometry);
- dst_box->width = fmin(dst_box->width, geometry.width);
- dst_box->height = fmin(dst_box->height, geometry.height);
- dst_box->x = fmax(dst_box->x, geometry.x + x);
- dst_box->y = fmax(dst_box->y, geometry.y + y);
scale_box(&geometry, scale);
+ if (dst_box->width > geometry.width) {
+ dst_box->width = geometry.width;
+ dst_box->x = geometry.x + x;
+ }
+ if (dst_box->height > geometry.height) {
+ dst_box->height = geometry.height;
+ dst_box->y = geometry.y + y;
+ }
+
pixman_region32_intersect_rect(clip, clip,
- geometry.x + x, geometry.y + y,
- geometry.width, geometry.height);
+ dst_box->x, dst_box->y,
+ dst_box->width, dst_box->height);
}
}
@@ -1217,7 +1229,12 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
scale_output_damage(&opaque, data->scale);
pixman_region32_subtract(&opaque, &render_region, &opaque);
+ struct wlr_box xdg_box = dst_box;
+ // Tries to clip
+ clip_xdg(node, &render_region, &xdg_box, dst_box.x, dst_box.y, data->scale);
+
transform_output_box(&dst_box, data);
+ transform_output_box(&xdg_box, data);
transform_output_damage(&render_region, data);
switch (node->type) {
@@ -1238,6 +1255,7 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
},
.clip = &render_region,
},
+ .scale = data->scale,
};
fx_render_pass_add_rect(data->render_pass, &rect_options);
break;
@@ -1255,10 +1273,6 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
wlr_output_transform_invert(scene_buffer->transform);
transform = wlr_output_transform_compose(transform, data->transform);
- struct wlr_box xdg_box = dst_box;
- // Tries to clip
- clip_xdg(scene_buffer, &render_region, &xdg_box,
- entry->x, entry->y, data->scale);
// Shadow
if (scene_buffer_has_shadow(&scene_buffer->shadow_data)) {
// TODO: Compensate for SSD borders here
@@ -1266,15 +1280,17 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
pixman_region32_init(&shadow_clip);
// Extend the size of the clip box
wlr_region_expand(&shadow_clip, &render_region,
- scene_buffer->shadow_data.blur_sigma);
+ scene_buffer->shadow_data.blur_sigma * data->scale);
struct fx_render_rect_options shadow_options = {
.base = {
.box = xdg_box,
.clip = &shadow_clip,
},
+ .scale = data->scale,
};
fx_render_pass_add_box_shadow(data->render_pass, &shadow_options,
- scene_buffer->corner_radius, &scene_buffer->shadow_data);
+ scene_buffer->corner_radius * data->scale,
+ &scene_buffer->shadow_data);
pixman_region32_fini(&shadow_clip);
}
@@ -1290,8 +1306,9 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
.blend_mode = pixman_region32_not_empty(&opaque) ?
WLR_RENDER_BLEND_MODE_PREMULTIPLIED : WLR_RENDER_BLEND_MODE_NONE,
},
+ .scale = data->scale,
.clip_box = &xdg_box,
- .corner_radius = scene_buffer->corner_radius,
+ .corner_radius = scene_buffer->corner_radius * data->scale,
};
fx_render_pass_add_texture(data->render_pass, &tex_options);