compositor: Avoid more transformations.

This commit is contained in:
K. Lange 2021-07-13 20:19:30 +09:00
parent 22208034e8
commit bc6e04b958
3 changed files with 17 additions and 5 deletions

View File

@ -697,6 +697,13 @@ uint32_t yutani_color_for_wid(yutani_wid_t wid) {
return colors[i];
}
/**
* Determine if a matrix has an identity transformation for its linear component.
*/
static inline int matrix_is_translation(gfx_matrix_t m) {
return (m[0][0] == 1.0 && m[0][1] == 0.0 && m[1][0] == 0.0 && m[1][1] == 1.0);
}
/**
* Blit a window to the framebuffer.
*
@ -717,9 +724,10 @@ static int yutani_blit_window(yutani_globals_t * yg, yutani_server_window_t * wi
_win_sprite.blank = 0;
_win_sprite.alpha = ALPHA_EMBEDDED;
double opacity = (double)(window->opacity) / 255.0;
if (window->rotation || window == yg->resizing_window || window->anim_mode) {
double m[2][3];
double opacity = (double)(window->opacity) / 255.0;
gfx_matrix_identity(m);
gfx_matrix_translate(m,x,y);
@ -788,9 +796,13 @@ static int yutani_blit_window(yutani_globals_t * yg, yutani_server_window_t * wi
}
}
}
draw_sprite_transform(yg->backend_ctx, &_win_sprite, m, opacity);
if (matrix_is_translation(m)) {
draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, opacity);
} else {
draw_sprite_transform(yg->backend_ctx, &_win_sprite, m, opacity);
}
} else if (window->opacity != 255) {
draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, (float)window->opacity / 255.0);
draw_sprite_alpha(yg->backend_ctx, &_win_sprite, window->x, window->y, opacity);
} else {
draw_sprite(yg->backend_ctx, &_win_sprite, window->x, window->y);
}

View File

@ -1783,7 +1783,7 @@ int main(int argc, char * argv[]) {
signal(SIGUSR1, sig_usr1);
signal(SIGUSR2, sig_usr2);
draw_background(yctx->display_width, yctx->display_height);
main_window = yutani_window_create_flags(yctx, yctx->display_width, yctx->display_height, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS);
main_window = yutani_window_create_flags(yctx, yctx->display_width, yctx->display_height, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS | YUTANI_WINDOW_FLAG_ALT_ANIMATION);
yutani_window_move(yctx, main_window, 0, 0);
yutani_set_stack(yctx, main_window, YUTANI_ZORDER_BOTTOM);
arg_ind++;

View File

@ -1547,7 +1547,7 @@ int main (int argc, char ** argv) {
height = yctx->display_height;
/* Create the panel window */
panel = yutani_window_create_flags(yctx, width, PANEL_HEIGHT, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS);
panel = yutani_window_create_flags(yctx, width, PANEL_HEIGHT, YUTANI_WINDOW_FLAG_NO_STEAL_FOCUS | YUTANI_WINDOW_FLAG_ALT_ANIMATION);
/* And move it to the top layer */
yutani_set_stack(yctx, panel, YUTANI_ZORDER_TOP);