1#include "region.h"
2#include "util.h"
3
4#include <pixman.h>
5#include <stdlib.h>
6#include <wayland-server.h>
7
8static void
9add(struct wl_client *client, struct wl_resource *resource, int32_t x,
10 int32_t y, int32_t width, int32_t height)
11{
12 pixman_region32_t *region = wl_resource_get_user_data(resource);
13
14 pixman_region32_union_rect(region, region, x, y, width, height);
15}
16
17static void
18subtract(struct wl_client *client, struct wl_resource *resource, int32_t x,
19 int32_t y, int32_t width, int32_t height)
20{
21 pixman_region32_t *region = wl_resource_get_user_data(resource);
22 pixman_region32_t operand;
23
24 pixman_region32_init_rect(&operand, x, y, width, height);
25 pixman_region32_subtract(region, region, &operand);
26}
27
28static const struct wl_region_interface region_impl = {
29 .destroy = destroy_resource,
30 .add = add,
31 .subtract = subtract,
32};
33
34static void
35region_destroy(struct wl_resource *resource)
36{
37 pixman_region32_t *region = wl_resource_get_user_data(resource);
38
39 pixman_region32_fini(region);
40 free(region);
41}
42
43struct wl_resource *
44region_new(struct wl_client *client, uint32_t version, uint32_t id)
45{
46 pixman_region32_t *region;
47 struct wl_resource *resource;
48
49 region = malloc(sizeof(*region));
50 if (!region) {
51 goto error0;
52 }
53
54 resource = wl_resource_create(client, &wl_region_interface, version, id);
55 if (!resource) {
56 goto error1;
57 }
58 wl_resource_set_implementation(resource, ®ion_impl, region,
59 ®ion_destroy);
60
61 pixman_region32_init(region);
62
63 return resource;
64
65error1:
66 free(region);
67error0:
68 return NULL;
69}