1 // Copyright © 2017-2021 Rémi Thebault
2 module wayland.server.shm;
3
4 import wayland.server.protocol : WlShm;
5 import wayland.server.core;
6 import wayland.native.server;
7 import wayland.native.util;
8 import wayland.util;
9
10 class WlShmBuffer : Native!wl_shm_buffer
11 {
12 mixin nativeImpl!wl_shm_buffer;
13
14 private this(wl_shm_buffer* native)
15 {
16 _native = native;
17 ObjectCache.set(native, this);
18 }
19
20 static WlShmBuffer get(WlResource res)
21 {
22 auto natBuf = wl_shm_buffer_get(res.native);
23 if (!natBuf) return null;
24 auto buf = cast(WlShmBuffer)ObjectCache.get(natBuf);
25 if (!buf)
26 {
27 buf = new WlShmBuffer(natBuf);
28 }
29 return buf;
30 }
31
32 void beginAccess()
33 {
34 wl_shm_buffer_begin_access(native);
35 }
36
37 void endAccess()
38 {
39 wl_shm_buffer_end_access(native);
40 }
41
42 @property void[] data()
43 {
44 auto dp = wl_shm_buffer_get_data(native);
45 if (!dp) return null;
46 return dp[0 .. height*stride];
47 }
48
49 @property size_t stride()
50 {
51 return wl_shm_buffer_get_stride(native);
52 }
53
54 @property int width()
55 {
56 return wl_shm_buffer_get_width(native);
57 }
58
59 @property int height()
60 {
61 return wl_shm_buffer_get_height(native);
62 }
63
64 @property WlShm.Format format()
65 {
66 return cast(WlShm.Format)wl_shm_buffer_get_format(native);
67 }
68
69 WlShmPool refPool()
70 {
71 return new WlShmPool(wl_shm_buffer_ref_pool(native));
72 }
73 }
74
75 class WlShmPool : Native!wl_shm_pool
76 {
77 mixin nativeImpl!wl_shm_pool;
78
79 private this(wl_shm_pool* native)
80 {
81 _native = native;
82 }
83
84 void unref()
85 {
86 wl_shm_pool_unref(native);
87 }
88 }