mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
Add union function for format sets
This commit is contained in:
parent
bf8ae8a036
commit
ec37d55a5e
2 changed files with 48 additions and 0 deletions
|
@ -72,4 +72,12 @@ bool wlr_drm_format_set_add(struct wlr_drm_format_set *set, uint32_t format,
|
||||||
bool wlr_drm_format_set_intersect(struct wlr_drm_format_set *dst,
|
bool wlr_drm_format_set_intersect(struct wlr_drm_format_set *dst,
|
||||||
const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b);
|
const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unions DRM format set `a` and `b`, storing in the destination set
|
||||||
|
* `dst`.
|
||||||
|
*
|
||||||
|
* Returns false on failure.
|
||||||
|
*/
|
||||||
|
bool wlr_drm_format_set_union(struct wlr_drm_format_set *dst,
|
||||||
|
const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -240,3 +240,43 @@ bool wlr_drm_format_set_intersect(struct wlr_drm_format_set *dst,
|
||||||
*dst = out;
|
*dst = out;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool drm_format_set_extend(struct wlr_drm_format_set *dst,
|
||||||
|
const struct wlr_drm_format_set *src) {
|
||||||
|
for (size_t i = 0; i < src->len; i++) {
|
||||||
|
struct wlr_drm_format *format = src->formats[i];
|
||||||
|
for (size_t j = 0; j < format->len; j++) {
|
||||||
|
if (!wlr_drm_format_set_add(dst, format->format, format->modifiers[j])) {
|
||||||
|
wlr_log_errno(WLR_ERROR, "Adding format/modifier to set failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wlr_drm_format_set_union(struct wlr_drm_format_set *dst,
|
||||||
|
const struct wlr_drm_format_set *a, const struct wlr_drm_format_set *b) {
|
||||||
|
assert(dst != a && dst != b);
|
||||||
|
|
||||||
|
struct wlr_drm_format_set out = {0};
|
||||||
|
out.capacity = a->len + b->len;
|
||||||
|
out.formats = calloc(out.capacity, sizeof(struct wlr_drm_format *));
|
||||||
|
if (out.formats == NULL) {
|
||||||
|
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add both a and b sets into out
|
||||||
|
if (!drm_format_set_extend(&out, a)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!drm_format_set_extend(&out, b)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dst = out;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue