main neuswc / libswc / region.c
 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, &region_impl, region,
59	                               &region_destroy);
60
61	pixman_region32_init(region);
62
63	return resource;
64
65error1:
66	free(region);
67error0:
68	return NULL;
69}