mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-12 08:21:33 -04:00
scene: use fractional sizes
Signed-off-by: Loukas Agorgianitis <loukas@agorgianitis.com>
This commit is contained in:
parent
c7d6629d16
commit
41d9e1086b
3 changed files with 50 additions and 45 deletions
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
struct wlr_scene *scene_node_get_root(struct wlr_scene_node *node);
|
||||
|
||||
void scene_node_get_size(struct wlr_scene_node *node, int *width, int *height);
|
||||
void scene_node_get_size(struct wlr_scene_node *node, double *width, double *height);
|
||||
|
||||
void scene_surface_set_clip(struct wlr_scene_surface *surface, struct wlr_box *clip);
|
||||
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ struct wlr_scene_buffer {
|
|||
float opacity;
|
||||
enum wlr_scale_filter_mode filter_mode;
|
||||
struct wlr_fbox src_box;
|
||||
int dst_width, dst_height;
|
||||
double dst_width, dst_height;
|
||||
enum wl_output_transform transform;
|
||||
pixman_region32_t opaque_region;
|
||||
enum wlr_color_transfer_function transfer_function;
|
||||
|
|
@ -538,7 +538,7 @@ void wlr_scene_buffer_set_source_box(struct wlr_scene_buffer *scene_buffer,
|
|||
* destination size is zero.
|
||||
*/
|
||||
void wlr_scene_buffer_set_dest_size(struct wlr_scene_buffer *scene_buffer,
|
||||
int width, int height);
|
||||
double width, double height);
|
||||
|
||||
/**
|
||||
* Set a transform which will be applied to the buffer.
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ struct wlr_scene_tree *wlr_scene_tree_create(struct wlr_scene_tree *parent) {
|
|||
typedef bool (*scene_node_box_iterator_func_t)(struct wlr_scene_node *node,
|
||||
double sx, double sy, void *data);
|
||||
|
||||
static bool _scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_box *box,
|
||||
static bool _scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_fbox *box,
|
||||
scene_node_box_iterator_func_t iterator, void *user_data, double lx, double ly) {
|
||||
if (!node->enabled) {
|
||||
return false;
|
||||
|
|
@ -222,10 +222,10 @@ static bool _scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_box *box
|
|||
break;
|
||||
case WLR_SCENE_NODE_RECT:
|
||||
case WLR_SCENE_NODE_BUFFER:;
|
||||
struct wlr_box node_box = { .x = lx, .y = ly };
|
||||
struct wlr_fbox node_box = { .x = lx, .y = ly };
|
||||
scene_node_get_size(node, &node_box.width, &node_box.height);
|
||||
|
||||
if (wlr_box_intersects(&node_box, box) &&
|
||||
if (wlr_fbox_intersects(&node_box, box) &&
|
||||
iterator(node, lx, ly, user_data)) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -235,7 +235,7 @@ static bool _scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_box *box
|
|||
return false;
|
||||
}
|
||||
|
||||
static bool scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_box *box,
|
||||
static bool scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_fbox *box,
|
||||
scene_node_box_iterator_func_t iterator, void *user_data) {
|
||||
double x, y;
|
||||
wlr_scene_node_coords(node, &x, &y);
|
||||
|
|
@ -245,7 +245,7 @@ static bool scene_nodes_in_box(struct wlr_scene_node *node, struct wlr_box *box,
|
|||
|
||||
static void scene_node_opaque_region(struct wlr_scene_node *node, double x, double y,
|
||||
pixman_region32_t *opaque) {
|
||||
int width, height;
|
||||
double width, height;
|
||||
scene_node_get_size(node, &width, &height);
|
||||
|
||||
if (node->type == WLR_SCENE_NODE_RECT) {
|
||||
|
|
@ -279,7 +279,7 @@ static void scene_node_opaque_region(struct wlr_scene_node *node, double x, doub
|
|||
struct scene_update_data {
|
||||
pixman_region32_t *visible;
|
||||
const pixman_region32_t *update_region;
|
||||
struct wlr_box update_box;
|
||||
struct wlr_fbox update_box;
|
||||
struct wl_list *outputs;
|
||||
bool calculate_visibility;
|
||||
bool restack_xwayland_surfaces;
|
||||
|
|
@ -312,7 +312,7 @@ static void scale_region(pixman_region32_t *region, float scale, bool round_up)
|
|||
struct render_data {
|
||||
enum wl_output_transform transform;
|
||||
float scale;
|
||||
struct wlr_box logical;
|
||||
struct wlr_fbox logical;
|
||||
int trans_width, trans_height;
|
||||
|
||||
struct wlr_scene_output *output;
|
||||
|
|
@ -336,20 +336,20 @@ static void output_to_buffer_coords(pixman_region32_t *damage, struct wlr_output
|
|||
wlr_output_transform_invert(output->transform), width, height);
|
||||
}
|
||||
|
||||
static int scale_length(int length, int offset, float scale) {
|
||||
static int scale_length(double length, double offset, float scale) {
|
||||
return round((offset + length) * scale) - round(offset * scale);
|
||||
}
|
||||
|
||||
static void scale_box(struct wlr_box *box, float scale) {
|
||||
box->width = scale_length(box->width, box->x, scale);
|
||||
box->height = scale_length(box->height, box->y, scale);
|
||||
box->x = round(box->x * scale);
|
||||
box->y = round(box->y * scale);
|
||||
static void scale_box(struct wlr_box *box, struct wlr_fbox *src, float scale) {
|
||||
box->width = scale_length(src->width, src->x, scale);
|
||||
box->height = scale_length(src->height, src->y, scale);
|
||||
box->x = round(src->x * scale);
|
||||
box->y = round(src->y * scale);
|
||||
}
|
||||
|
||||
static void transform_output_box(struct wlr_box *box, const struct render_data *data) {
|
||||
static void transform_output_box(struct wlr_box *box, struct wlr_fbox *src, const struct render_data *data) {
|
||||
enum wl_output_transform transform = wlr_output_transform_invert(data->transform);
|
||||
scale_box(box, data->scale);
|
||||
scale_box(box, src, data->scale);
|
||||
wlr_box_transform(box, box, transform, data->trans_width, data->trans_height);
|
||||
}
|
||||
|
||||
|
|
@ -523,7 +523,7 @@ static struct wlr_xwayland_surface *scene_node_try_get_managed_xwayland_surface(
|
|||
}
|
||||
|
||||
static void restack_xwayland_surface(struct wlr_scene_node *node,
|
||||
struct wlr_box *box, struct scene_update_data *data) {
|
||||
struct wlr_fbox *box, struct scene_update_data *data) {
|
||||
struct wlr_xwayland_surface *xwayland_surface =
|
||||
scene_node_try_get_managed_xwayland_surface(node);
|
||||
if (!xwayland_surface) {
|
||||
|
|
@ -532,7 +532,7 @@ static void restack_xwayland_surface(struct wlr_scene_node *node,
|
|||
|
||||
// ensure this node is entirely inside the update region. If not, we can't
|
||||
// restack this node since we're not considering the whole thing.
|
||||
if (wlr_box_contains_box(&data->update_box, box)) {
|
||||
if (wlr_fbox_contains_box(&data->update_box, box)) {
|
||||
if (data->restack_above) {
|
||||
wlr_xwayland_surface_restack(xwayland_surface, data->restack_above, XCB_STACK_MODE_BELOW);
|
||||
} else {
|
||||
|
|
@ -548,7 +548,7 @@ static bool scene_node_update_iterator(struct wlr_scene_node *node,
|
|||
double lx, double ly, void *_data) {
|
||||
struct scene_update_data *data = _data;
|
||||
|
||||
struct wlr_box box = { .x = lx, .y = ly };
|
||||
struct wlr_fbox box = { .x = lx, .y = ly };
|
||||
scene_node_get_size(node, &box.width, &box.height);
|
||||
|
||||
pixman_region32_subtract(&node->visible, &node->visible, data->update_region);
|
||||
|
|
@ -607,7 +607,7 @@ static void scene_node_bounds(struct wlr_scene_node *node,
|
|||
return;
|
||||
}
|
||||
|
||||
int width, height;
|
||||
double width, height;
|
||||
scene_node_get_size(node, &width, &height);
|
||||
pixman_region32_union_rect(visible, visible, x, y, width, height);
|
||||
}
|
||||
|
|
@ -1059,7 +1059,7 @@ void wlr_scene_buffer_set_source_box(struct wlr_scene_buffer *scene_buffer,
|
|||
}
|
||||
|
||||
void wlr_scene_buffer_set_dest_size(struct wlr_scene_buffer *scene_buffer,
|
||||
int width, int height) {
|
||||
double width, double height) {
|
||||
if (scene_buffer->dst_width == width && scene_buffer->dst_height == height) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -1170,7 +1170,7 @@ static struct wlr_texture *scene_buffer_get_texture(
|
|||
return texture;
|
||||
}
|
||||
|
||||
void scene_node_get_size(struct wlr_scene_node *node, int *width, int *height) {
|
||||
void scene_node_get_size(struct wlr_scene_node *node, double *width, double *height) {
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
|
||||
|
|
@ -1188,9 +1188,10 @@ void scene_node_get_size(struct wlr_scene_node *node, int *width, int *height) {
|
|||
*width = scene_buffer->dst_width;
|
||||
*height = scene_buffer->dst_height;
|
||||
} else {
|
||||
*width = scene_buffer->buffer_width;
|
||||
*height = scene_buffer->buffer_height;
|
||||
wlr_output_transform_coords(scene_buffer->transform, width, height);
|
||||
int w = scene_buffer->buffer_width, h = scene_buffer->buffer_height;
|
||||
wlr_output_transform_coords(scene_buffer->transform, &w, &h);
|
||||
*width = w;
|
||||
*height = h;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -1375,9 +1376,9 @@ static bool scene_node_at_iterator(struct wlr_scene_node *node,
|
|||
|
||||
struct wlr_scene_node *wlr_scene_node_at(struct wlr_scene_node *node,
|
||||
double lx, double ly, double *nx, double *ny) {
|
||||
struct wlr_box box = {
|
||||
.x = floor(lx),
|
||||
.y = floor(ly),
|
||||
struct wlr_fbox box = {
|
||||
.x = lx,
|
||||
.y = ly,
|
||||
.width = 1,
|
||||
.height = 1
|
||||
};
|
||||
|
|
@ -1428,12 +1429,13 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren
|
|||
double x = entry->x - data->logical.x;
|
||||
double y = entry->y - data->logical.y;
|
||||
|
||||
struct wlr_box dst_box = {
|
||||
struct wlr_fbox node_box = {
|
||||
.x = x,
|
||||
.y = y,
|
||||
};
|
||||
scene_node_get_size(node, &dst_box.width, &dst_box.height);
|
||||
transform_output_box(&dst_box, data);
|
||||
scene_node_get_size(node, &node_box.width, &node_box.height);
|
||||
struct wlr_box dst_box = {0};
|
||||
transform_output_box(&dst_box, &node_box, data);
|
||||
|
||||
pixman_region32_t opaque;
|
||||
pixman_region32_init(&opaque);
|
||||
|
|
@ -1873,7 +1875,7 @@ static bool scene_node_invisible(struct wlr_scene_node *node) {
|
|||
}
|
||||
|
||||
struct render_list_constructor_data {
|
||||
struct wlr_box box;
|
||||
struct wlr_fbox box;
|
||||
struct wl_array *render_list;
|
||||
bool calculate_visibility;
|
||||
bool highlight_transparent_region;
|
||||
|
|
@ -2094,11 +2096,12 @@ static enum scene_direct_scanout_result scene_entry_try_direct_scanout(
|
|||
}
|
||||
|
||||
// Translate the position from scene coordinates to output coordinates
|
||||
pending.buffer_dst_box.x = entry->x - scene_output->x;
|
||||
pending.buffer_dst_box.y = entry->y - scene_output->y;
|
||||
|
||||
scene_node_get_size(node, &pending.buffer_dst_box.width, &pending.buffer_dst_box.height);
|
||||
transform_output_box(&pending.buffer_dst_box, data);
|
||||
struct wlr_fbox node_box = {
|
||||
.x = entry->x - scene_output->x,
|
||||
.y = entry->y - scene_output->y
|
||||
};
|
||||
scene_node_get_size(node, &node_box.width, &node_box.height);
|
||||
transform_output_box(&pending.buffer_dst_box, &node_box, data);
|
||||
|
||||
struct wlr_buffer *wlr_buffer = buffer->buffer;
|
||||
struct wlr_client_buffer *client_buffer = wlr_client_buffer_get(wlr_buffer);
|
||||
|
|
@ -2655,7 +2658,7 @@ void wlr_scene_output_send_frame_done(struct wlr_scene_output *scene_output,
|
|||
scene_output, now);
|
||||
}
|
||||
|
||||
static void scene_output_for_each_scene_buffer(const struct wlr_box *output_box,
|
||||
static void scene_output_for_each_scene_buffer(const struct wlr_fbox *output_box,
|
||||
struct wlr_scene_node *node, double lx, double ly,
|
||||
wlr_scene_buffer_iterator_func_t user_iterator, void *user_data) {
|
||||
if (!node->enabled) {
|
||||
|
|
@ -2666,10 +2669,10 @@ static void scene_output_for_each_scene_buffer(const struct wlr_box *output_box,
|
|||
ly += node->y;
|
||||
|
||||
if (node->type == WLR_SCENE_NODE_BUFFER) {
|
||||
struct wlr_box node_box = { .x = lx, .y = ly };
|
||||
struct wlr_fbox node_box = { .x = lx, .y = ly };
|
||||
scene_node_get_size(node, &node_box.width, &node_box.height);
|
||||
|
||||
if (wlr_box_intersects(output_box, &node_box)) {
|
||||
if (wlr_fbox_intersects(output_box, &node_box)) {
|
||||
struct wlr_scene_buffer *scene_buffer =
|
||||
wlr_scene_buffer_from_node(node);
|
||||
user_iterator(scene_buffer, lx, ly, user_data);
|
||||
|
|
@ -2686,9 +2689,11 @@ static void scene_output_for_each_scene_buffer(const struct wlr_box *output_box,
|
|||
|
||||
void wlr_scene_output_for_each_buffer(struct wlr_scene_output *scene_output,
|
||||
wlr_scene_buffer_iterator_func_t iterator, void *user_data) {
|
||||
struct wlr_box box = { .x = scene_output->x, .y = scene_output->y };
|
||||
wlr_output_effective_resolution(scene_output->output,
|
||||
&box.width, &box.height);
|
||||
struct wlr_fbox box = { .x = scene_output->x, .y = scene_output->y };
|
||||
int width, height;
|
||||
wlr_output_effective_resolution(scene_output->output, &width, &height);
|
||||
box.width = width;
|
||||
box.height = height;
|
||||
scene_output_for_each_scene_buffer(&box, &scene_output->scene->tree.node, 0, 0,
|
||||
iterator, user_data);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue