diff --git a/include/render/drm_format_set.h b/include/render/drm_format_set.h index c94c2af2..9d78b2b1 100644 --- a/include/render/drm_format_set.h +++ b/include/render/drm_format_set.h @@ -17,4 +17,6 @@ struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format); struct wlr_drm_format *wlr_drm_format_intersect( const struct wlr_drm_format *a, const struct wlr_drm_format *b); +bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_drm_format_set *src); + #endif diff --git a/render/drm_format_set.c b/render/drm_format_set.c index 13471746..3adef0b2 100644 --- a/render/drm_format_set.c +++ b/render/drm_format_set.c @@ -140,6 +140,31 @@ struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) { return duped_format; } +bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_drm_format_set *src) { + struct wlr_drm_format **formats = malloc(src->len * sizeof(formats[0])); + if (formats == NULL) { + return false; + } + + struct wlr_drm_format_set out = { + .len = 0, + .capacity = src->len, + .formats = formats, + }; + + size_t i; + for (i = 0; i < src->len; i++) { + out.formats[out.len] = wlr_drm_format_dup(src->formats[i]); + if (out.formats[out.len] == NULL) { + wlr_drm_format_set_finish(&out); + return false; + } + out.len++; + } + + return true; +} + struct wlr_drm_format *wlr_drm_format_intersect( const struct wlr_drm_format *a, const struct wlr_drm_format *b) { assert(a->format == b->format);