Implement rotation in renderer for floating containers

This commit is contained in:
Ryan Dwyer 2018-07-02 20:49:21 +10:00
parent b9050fca69
commit f259d24138
2 changed files with 21 additions and 3 deletions

View file

@ -133,6 +133,7 @@ struct sway_container {
struct sway_container *parent;
float alpha;
float rotation; // in radians
struct wlr_texture *title_focused;
struct wlr_texture *title_focused_inactive;

View file

@ -32,6 +32,7 @@ struct render_context {
double output_lx;
double output_ly;
pixman_region32_t *damage;
float matrix[9];
float scale;
};
struct render_context context;
@ -94,8 +95,6 @@ damage_finish:
static void render_surface(struct wlr_surface *surface, int ox, int oy,
float alpha) {
struct wlr_output *wlr_output = context.output->wlr_output;
struct wlr_texture *texture = wlr_surface_get_texture(surface);
if (!texture) {
return;
@ -122,7 +121,7 @@ static void render_surface(struct wlr_surface *surface, int ox, int oy,
enum wl_output_transform transform =
wlr_output_transform_invert(surface->current->transform);
wlr_matrix_project_box(matrix, &surface_box, transform, 0,
wlr_output->transform_matrix);
context.matrix);
render_texture(texture, &surface_box, matrix, alpha);
}
@ -708,6 +707,19 @@ static void render_container(struct sway_container *con, bool parent_focused) {
}
static void render_floating_container(struct sway_container *con) {
float saved_matrix[9];
if (con->rotation) {
memcpy(saved_matrix, context.matrix, sizeof(saved_matrix));
double cx = con->current.swayc_x - context.output_lx +
con->current.swayc_width / 2;
double cy = con->current.swayc_y - context.output_ly +
con->current.swayc_height / 2;
wlr_matrix_translate(context.matrix, cx, cy);
wlr_matrix_rotate(context.matrix, con->rotation);
wlr_matrix_translate(context.matrix, -cx, -cy);
}
if (con->type == C_VIEW) {
struct sway_view *view = con->sway_view;
struct sway_seat *seat = input_manager_current_seat(input_manager);
@ -737,6 +749,10 @@ static void render_floating_container(struct sway_container *con) {
} else {
render_container(con, false);
}
if (con->rotation) {
memcpy(context.matrix, saved_matrix, sizeof(saved_matrix));
}
}
static void render_floating() {
@ -784,6 +800,7 @@ void render_output(struct sway_output *output, struct timespec *when,
context.output_ly = output->swayc->current.swayc_y;
context.damage = damage;
context.scale = output->wlr_output->scale;
memcpy(&context.matrix, wlr_output->transform_matrix, sizeof(context.matrix));
struct wlr_renderer *renderer =
wlr_backend_get_renderer(wlr_output->backend);