From 1bea754521e046287a5eff56fc56c1bd42b36c1f Mon Sep 17 00:00:00 2001 From: nyorain Date: Wed, 9 Aug 2017 16:24:28 +0200 Subject: [PATCH] Implement wlr_region using pixman --- README.md | 2 +- include/wlr/types/wlr_region.h | 10 ++++++++ meson.build | 2 ++ types/meson.build | 1 + types/wlr_region.c | 44 ++++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 include/wlr/types/wlr_region.h create mode 100644 types/wlr_region.c diff --git a/README.md b/README.md index 98c359fc..831b900f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ WIP - [Status](https://github.com/SirCmpwn/wlroots/issues/9) Install dependencies: -* cmake * wayland * wayland-protocols * EGL @@ -17,6 +16,7 @@ Install dependencies: * GBM * libinput * udev +* pixman * systemd (optional, for logind support) * libcap (optional, for capability support) * asciidoc (optional, for man pages) diff --git a/include/wlr/types/wlr_region.h b/include/wlr/types/wlr_region.h new file mode 100644 index 00000000..9fff0150 --- /dev/null +++ b/include/wlr/types/wlr_region.h @@ -0,0 +1,10 @@ +#ifndef _WLR_TYPES_REGION_H +#define _WLR_TYPES_REGION_H + +struct wl_resource; + +// Implements the given resource as region. +// Sets the associated pixman_region32_t as userdata. +void wlr_region_create(struct wl_resource *res); + +#endif diff --git a/meson.build b/meson.build index a6c8dd6c..b4a7fdc4 100644 --- a/meson.build +++ b/meson.build @@ -30,6 +30,7 @@ dep_gbm = dependency('gbm') dep_libinput = dependency('libinput') dep_xkbcommon = dependency('xkbcommon') dep_udev = dependency('libudev') +dep_pixman = dependency('pixman-1') dep_libcap = dependency('libcap', required: false) dep_systemd = dependency('libsystemd', required: false) dep_math = cc.find_library('m', required: false) @@ -46,6 +47,7 @@ all_deps = [ dep_libinput, dep_xkbcommon, dep_udev, + dep_pixman, dep_libcap, dep_systemd, dep_math, diff --git a/types/meson.build b/types/meson.build index 323806c6..89e36ac0 100644 --- a/types/meson.build +++ b/types/meson.build @@ -3,6 +3,7 @@ wlr_files += files( 'wlr_keyboard.c', 'wlr_output.c', 'wlr_pointer.c', + 'wlr_region.c', 'wlr_tablet_pad.c', 'wlr_tablet_tool.c', 'wlr_touch.c', diff --git a/types/wlr_region.c b/types/wlr_region.c new file mode 100644 index 00000000..a1c45542 --- /dev/null +++ b/types/wlr_region.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include + +static void region_add(struct wl_client *client, struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, int32_t height) { + pixman_region32_t *region = wl_resource_get_user_data(resource); + pixman_region32_union_rect(region, region, x, y, width, height); +} + +static void region_subtract(struct wl_client *client, struct wl_resource *resource, + int32_t x, int32_t y, int32_t width, int32_t height) { + pixman_region32_t *region = wl_resource_get_user_data(resource); + pixman_region32_union_rect(region, region, x, y, width, height); + + pixman_region32_t rect; + pixman_region32_init_rect(&rect, x, y, width, height); + pixman_region32_subtract(region, region, &rect); + pixman_region32_fini(&rect); +} + +static void region_destroy(struct wl_client *client, struct wl_resource *resource) { + wl_resource_destroy(resource); +} + +static const struct wl_region_interface region_interface = { + region_destroy, + region_add, + region_subtract, +}; + +static void destroy_region(struct wl_resource *resource) { + pixman_region32_t *reg = wl_resource_get_user_data(resource); + pixman_region32_fini(reg); + free(reg); +} + +void wlr_region_create(struct wl_resource *res) { + pixman_region32_t *region = calloc(1, sizeof(pixman_region32_t)); + pixman_region32_init(region); + wl_resource_set_implementation(res, ®ion_interface, region, destroy_region); +}