From cc13becc46ab2f42a2e784ed798c979243b35d17 Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Tue, 18 Jun 2024 19:01:51 +0300 Subject: [PATCH] Drop cairo --- main.c | 60 ++++++++++++++++++++++++++++++++++++++--------------- meson.build | 2 -- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/main.c b/main.c index 71eb5e8..6353630 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -24,8 +23,7 @@ struct dp_swapchain_buffer { struct wl_buffer *buffer; void *data; - cairo_surface_t *cairo_surface; - cairo_t *cairo; + pixman_image_t *image; bool used; }; @@ -104,6 +102,10 @@ static int pointer_y = 0; static bool quick = false; +static pixman_image_t *unselected_fill_image = NULL; +static pixman_image_t *selected_fill_image = NULL; +static pixman_image_t *border_fill_image = NULL; + static void die(const char *fmt, ...) { va_list args; va_start(args, fmt); @@ -227,23 +229,29 @@ static void redraw(struct dp_output *output) { } sc_buffer->used = true; - cairo_set_operator(sc_buffer->cairo, CAIRO_OPERATOR_SOURCE); - - cairo_set_source_rgba(sc_buffer->cairo, 0.5, 0.5, 0.5, 0.5); - cairo_paint(sc_buffer->cairo); + pixman_image_composite32(PIXMAN_OP_SRC, unselected_fill_image, NULL, sc_buffer->image, 0, 0, 0, + 0, 0, 0, output->px_width, output->px_height); if (output == selected_output) { - cairo_rectangle(sc_buffer->cairo, selected_x, selected_y, selected_width, selected_height); - cairo_set_line_width(sc_buffer->cairo, 4); + int border_size = 2; - cairo_set_source_rgba(sc_buffer->cairo, 1.0, 1.0, 1.0, 1.0); - cairo_stroke_preserve(sc_buffer->cairo); - cairo_set_source_rgba(sc_buffer->cairo, 0.0, 0.0, 0.0, 0.0); - cairo_fill(sc_buffer->cairo); + pixman_image_composite32(PIXMAN_OP_SRC, border_fill_image, NULL, sc_buffer->image, 0, 0, 0, + 0, selected_x - border_size, selected_y - border_size, + selected_width + border_size * 2, border_size); + pixman_image_composite32(PIXMAN_OP_SRC, border_fill_image, NULL, sc_buffer->image, 0, 0, 0, + 0, selected_x - border_size, selected_y + selected_height, + selected_width + border_size * 2, border_size); + pixman_image_composite32(PIXMAN_OP_SRC, border_fill_image, NULL, sc_buffer->image, 0, 0, 0, + 0, selected_x - border_size, selected_y, border_size, selected_height); + pixman_image_composite32(PIXMAN_OP_SRC, border_fill_image, NULL, sc_buffer->image, 0, 0, 0, + 0, selected_x + selected_width, selected_y, border_size, selected_height); + + pixman_image_composite32(PIXMAN_OP_SRC, selected_fill_image, NULL, sc_buffer->image, 0, 0, + 0, 0, selected_x, selected_y, selected_width, selected_height); } wl_surface_attach(output->ui_surface, sc_buffer->buffer, 0, 0); - wl_surface_damage(output->ui_surface, 0, 0, 200000000, 200000000); + wl_surface_damage(output->ui_surface, 0, 0, output->px_width, output->px_height); wl_surface_commit(output->ui_surface); } @@ -734,9 +742,8 @@ int main(void) { int stride = output->frame_width * 4; sc_buffer->buffer = create_buffer(output->px_width, output->px_height, stride, WL_SHM_FORMAT_ARGB8888, &sc_buffer->data); - sc_buffer->cairo_surface = cairo_image_surface_create_for_data(sc_buffer->data, - CAIRO_FORMAT_ARGB32, output->px_width, output->px_height, stride); - sc_buffer->cairo = cairo_create(sc_buffer->cairo_surface); + sc_buffer->image = pixman_image_create_bits( + PIXMAN_a8r8g8b8, output->px_width, output->px_height, sc_buffer->data, stride); wl_buffer_add_listener(sc_buffer->buffer, &sc_buffer_listener, sc_buffer); } @@ -750,6 +757,25 @@ int main(void) { } } + unselected_fill_image = pixman_image_create_solid_fill(&(pixman_color_t){ + .red = UINT16_MAX / 2, + .green = UINT16_MAX / 2, + .blue = UINT16_MAX / 2, + .alpha = UINT16_MAX / 2, + }); + selected_fill_image = pixman_image_create_solid_fill(&(pixman_color_t){ + .red = 0, + .green = 0, + .blue = 0, + .alpha = 0, + }); + border_fill_image = pixman_image_create_solid_fill(&(pixman_color_t){ + .red = UINT16_MAX, + .green = UINT16_MAX, + .blue = UINT16_MAX, + .alpha = UINT16_MAX, + }); + // Select the "first" output, whatever that is selected_output = wl_container_of(outputs.next, selected_output, link); select_whole(); diff --git a/meson.build b/meson.build index dd69fee..92be204 100644 --- a/meson.build +++ b/meson.build @@ -43,7 +43,6 @@ add_project_arguments(cc.get_supported_arguments([ wayland_client = dependency('wayland-client') wayland_protos = dependency('wayland-protocols') -cairo = dependency('cairo') pixman = dependency('pixman-1') xkbcommon = dependency('xkbcommon') @@ -59,7 +58,6 @@ executable( dependencies: [ client_protos, wayland_client, - cairo, pixman, xkbcommon, ],