aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/render.c
diff options
context:
space:
mode:
authorLibravatar emersion <contact@emersion.fr>2018-07-27 19:16:36 +0100
committerLibravatar emersion <contact@emersion.fr>2018-07-29 14:33:26 +0100
commit8d5cc8625ce04c657eab6bd5f242a02e97ddd647 (patch)
treecf6ce6cf223a508361139b223fe72d4fe2c79065 /sway/desktop/render.c
parentwip: redesign output_view_for_each_surface iterator (diff)
downloadsway-8d5cc8625ce04c657eab6bd5f242a02e97ddd647.tar.gz
sway-8d5cc8625ce04c657eab6bd5f242a02e97ddd647.tar.zst
sway-8d5cc8625ce04c657eab6bd5f242a02e97ddd647.zip
Completely switch over to new iterators
Diffstat (limited to 'sway/desktop/render.c')
-rw-r--r--sway/desktop/render.c49
1 files changed, 5 insertions, 44 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 18d076df..f25055b8 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -29,10 +29,7 @@
29#include "sway/tree/workspace.h" 29#include "sway/tree/workspace.h"
30 30
31struct render_data { 31struct render_data {
32 struct root_geometry root_geo;
33 struct sway_output *output;
34 pixman_region32_t *damage; 32 pixman_region32_t *damage;
35 struct sway_view *view;
36 float alpha; 33 float alpha;
37}; 34};
38 35
@@ -92,38 +89,7 @@ damage_finish:
92 pixman_region32_fini(&damage); 89 pixman_region32_fini(&damage);
93} 90}
94 91
95static void render_surface_iterator(struct wlr_surface *surface, int sx, int sy, 92static void render_surface_iterator(struct sway_output *output,
96 void *_data) {
97 struct render_data *data = _data;
98 struct wlr_output *wlr_output = data->output->wlr_output;
99 float rotation = data->root_geo.rotation;
100 pixman_region32_t *output_damage = data->damage;
101 float alpha = data->alpha;
102
103 struct wlr_texture *texture = wlr_surface_get_texture(surface);
104 if (!texture) {
105 return;
106 }
107
108 struct wlr_box box;
109 bool intersects = output_get_surface_box(&data->root_geo, data->output,
110 surface, sx, sy, &box);
111 if (!intersects) {
112 return;
113 }
114
115 scale_box(&box, wlr_output->scale);
116
117 float matrix[9];
118 enum wl_output_transform transform =
119 wlr_output_transform_invert(surface->current.transform);
120 wlr_matrix_project_box(matrix, &box, transform, rotation,
121 wlr_output->transform_matrix);
122
123 render_texture(wlr_output, output_damage, texture, &box, matrix, alpha);
124}
125
126static void render_surface_iterator2(struct sway_output *output,
127 struct wlr_surface *surface, struct wlr_box *_box, float rotation, 93 struct wlr_surface *surface, struct wlr_box *_box, float rotation,
128 void *_data) { 94 void *_data) {
129 struct render_data *data = _data; 95 struct render_data *data = _data;
@@ -151,36 +117,33 @@ static void render_surface_iterator2(struct sway_output *output,
151static void render_layer(struct sway_output *output, 117static void render_layer(struct sway_output *output,
152 pixman_region32_t *damage, struct wl_list *layer_surfaces) { 118 pixman_region32_t *damage, struct wl_list *layer_surfaces) {
153 struct render_data data = { 119 struct render_data data = {
154 .output = output,
155 .damage = damage, 120 .damage = damage,
156 .alpha = 1.0f, 121 .alpha = 1.0f,
157 }; 122 };
158 output_layer_for_each_surface(output, layer_surfaces, 123 output_layer_for_each_surface(output, layer_surfaces,
159 render_surface_iterator2, &data); 124 render_surface_iterator, &data);
160} 125}
161 126
162#ifdef HAVE_XWAYLAND 127#ifdef HAVE_XWAYLAND
163static void render_unmanaged(struct sway_output *output, 128static void render_unmanaged(struct sway_output *output,
164 pixman_region32_t *damage, struct wl_list *unmanaged) { 129 pixman_region32_t *damage, struct wl_list *unmanaged) {
165 struct render_data data = { 130 struct render_data data = {
166 .output = output,
167 .damage = damage, 131 .damage = damage,
168 .alpha = 1.0f, 132 .alpha = 1.0f,
169 }; 133 };
170 output_unmanaged_for_each_surface(output, unmanaged, 134 output_unmanaged_for_each_surface(output, unmanaged,
171 render_surface_iterator2, &data); 135 render_surface_iterator, &data);
172} 136}
173#endif 137#endif
174 138
175static void render_drag_icons(struct sway_output *output, 139static void render_drag_icons(struct sway_output *output,
176 pixman_region32_t *damage, struct wl_list *drag_icons) { 140 pixman_region32_t *damage, struct wl_list *drag_icons) {
177 struct render_data data = { 141 struct render_data data = {
178 .output = output,
179 .damage = damage, 142 .damage = damage,
180 .alpha = 1.0f, 143 .alpha = 1.0f,
181 }; 144 };
182 output_drag_icons_for_each_surface(output, drag_icons, 145 output_drag_icons_for_each_surface(output, drag_icons,
183 render_surface_iterator2, &data); 146 render_surface_iterator, &data);
184} 147}
185 148
186static void render_rect(struct wlr_output *wlr_output, 149static void render_rect(struct wlr_output *wlr_output,
@@ -226,12 +189,10 @@ static void premultiply_alpha(float color[4], float opacity) {
226static void render_view_surfaces(struct sway_view *view, 189static void render_view_surfaces(struct sway_view *view,
227 struct sway_output *output, pixman_region32_t *damage, float alpha) { 190 struct sway_output *output, pixman_region32_t *damage, float alpha) {
228 struct render_data data = { 191 struct render_data data = {
229 .output = output,
230 .damage = damage, 192 .damage = damage,
231 .view = view,
232 .alpha = alpha, 193 .alpha = alpha,
233 }; 194 };
234 output_view_for_each_surface(output, view, render_surface_iterator2, &data); 195 output_view_for_each_surface(output, view, render_surface_iterator, &data);
235} 196}
236 197
237static void render_saved_view(struct sway_view *view, 198static void render_saved_view(struct sway_view *view,