From c9b378d21a06fd690223a95fe437054dff0228cd Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 2 Dec 2022 14:32:50 +0100 Subject: [PATCH] render/drm-format-set: add wlr_drm_format_set_copy() --- include/render/drm_format_set.h | 2 ++ render/drm_format_set.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) 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);