mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
buffer: add buffer_create_from_wlr_buffer()
This commit is contained in:
parent
82b0235aca
commit
649773b4f8
2 changed files with 34 additions and 0 deletions
|
|
@ -70,6 +70,13 @@ struct lab_data_buffer *buffer_create_cairo(uint32_t logical_width,
|
|||
struct lab_data_buffer *buffer_create_from_data(void *pixel_data, uint32_t width,
|
||||
uint32_t height, uint32_t stride);
|
||||
|
||||
/*
|
||||
* Create a lab_data_buffer from a wlr_buffer by copying its content.
|
||||
* The wlr_buffer must be backed by shm.
|
||||
*/
|
||||
struct lab_data_buffer *buffer_create_from_wlr_buffer(
|
||||
struct wlr_buffer *wlr_buffer);
|
||||
|
||||
/*
|
||||
* Resize a buffer to the given size. The source buffer is rendered at the
|
||||
* center of the output buffer and shrunk if it overflows from the output buffer.
|
||||
|
|
|
|||
27
src/buffer.c
27
src/buffer.c
|
|
@ -28,6 +28,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <drm_fourcc.h>
|
||||
#include <wlr/interfaces/wlr_buffer.h>
|
||||
#include <wlr/util/log.h>
|
||||
#include "buffer.h"
|
||||
#include "common/box.h"
|
||||
#include "common/mem.h"
|
||||
|
|
@ -148,6 +149,32 @@ buffer_create_from_data(void *pixel_data, uint32_t width, uint32_t height,
|
|||
return buffer;
|
||||
}
|
||||
|
||||
struct lab_data_buffer *
|
||||
buffer_create_from_wlr_buffer(struct wlr_buffer *wlr_buffer)
|
||||
{
|
||||
void *data;
|
||||
uint32_t format;
|
||||
size_t stride;
|
||||
if (!wlr_buffer_begin_data_ptr_access(wlr_buffer,
|
||||
WLR_BUFFER_DATA_PTR_ACCESS_READ, &data, &format, &stride)) {
|
||||
wlr_log(WLR_ERROR, "failed to access wlr_buffer");
|
||||
return NULL;
|
||||
}
|
||||
if (format != DRM_FORMAT_ARGB8888) {
|
||||
/* TODO: support other formats */
|
||||
wlr_buffer_end_data_ptr_access(wlr_buffer);
|
||||
wlr_log(WLR_ERROR, "cannot create buffer: format=%d", format);
|
||||
return NULL;
|
||||
}
|
||||
size_t buffer_size = stride * wlr_buffer->height;
|
||||
void *copied_data = xmalloc(buffer_size);
|
||||
memcpy(copied_data, data, buffer_size);
|
||||
wlr_buffer_end_data_ptr_access(wlr_buffer);
|
||||
|
||||
return buffer_create_from_data(copied_data,
|
||||
wlr_buffer->width, wlr_buffer->height, stride);
|
||||
}
|
||||
|
||||
struct lab_data_buffer *
|
||||
buffer_resize(struct lab_data_buffer *src_buffer, int width, int height,
|
||||
double scale)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue