diff options
Diffstat (limited to 'render/drm_format_set.c')
-rw-r--r-- | render/drm_format_set.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/render/drm_format_set.c b/render/drm_format_set.c index 52603db7..ee9b1b2c 100644 --- a/render/drm_format_set.c +++ b/render/drm_format_set.c @@ -130,26 +130,22 @@ bool wlr_drm_format_add(struct wlr_drm_format *fmt, uint64_t modifier) { return true; } -struct wlr_drm_format *wlr_drm_format_dup(const struct wlr_drm_format *format) { - assert(format->len <= format->capacity); +bool wlr_drm_format_copy(struct wlr_drm_format *dst, const struct wlr_drm_format *src) { + assert(src->len <= src->capacity); - uint64_t *modifiers = malloc(sizeof(*format->modifiers) * format->capacity); + uint64_t *modifiers = malloc(sizeof(*modifiers) * src->len); if (!modifiers) { - return NULL; + return false; } - memcpy(modifiers, format->modifiers, sizeof(*format->modifiers) * format->len); - - struct wlr_drm_format *dst = calloc(1, sizeof(*dst)); - if (!dst) { - return NULL; - } + memcpy(modifiers, src->modifiers, sizeof(*modifiers) * src->len); - dst->capacity = format->capacity; - dst->len = format->len; + wlr_drm_format_finish(dst); + dst->capacity = src->len; + dst->len = src->len; + dst->format = src->format; dst->modifiers = modifiers; - - return dst; + return true; } bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_drm_format_set *src) { @@ -166,7 +162,15 @@ bool wlr_drm_format_set_copy(struct wlr_drm_format_set *dst, const struct wlr_dr size_t i; for (i = 0; i < src->len; i++) { - out.formats[out.len] = wlr_drm_format_dup(src->formats[i]); + struct wlr_drm_format *fmt = calloc(1, sizeof(*fmt)); + if (!fmt) { + wlr_drm_format_set_finish(&out); + return false; + } + + wlr_drm_format_copy(fmt, src->formats[i]); + + out.formats[out.len] = fmt; if (out.formats[out.len] == NULL) { wlr_drm_format_set_finish(&out); return false; |