mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 21:05:58 +01:00
Remove cairo dependency, write raw pixels
This commit is contained in:
parent
b27b6cd69c
commit
a87f016017
4 changed files with 37 additions and 14 deletions
|
@ -26,5 +26,5 @@ executable(
|
||||||
executable(
|
executable(
|
||||||
'screenshot',
|
'screenshot',
|
||||||
'screenshot.c',
|
'screenshot.c',
|
||||||
dependencies: [wayland_client, wlr_protos, dependency('cairo')],
|
dependencies: [wayland_client, wlr_protos],
|
||||||
)
|
)
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include <wayland-client.h>
|
#include <wayland-client.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <cairo.h>
|
|
||||||
#include <screenshooter-client-protocol.h>
|
#include <screenshooter-client-protocol.h>
|
||||||
#include "../backend/wayland/os-compatibility.c"
|
#include "../backend/wayland/os-compatibility.c"
|
||||||
|
|
||||||
|
@ -174,11 +173,20 @@ create_shm_buffer(int width, int height, void **data_out)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void argb_to_rgba(uint32_t *data, size_t height, size_t stride) {
|
||||||
|
size_t n = height*stride/4;
|
||||||
|
for (size_t i = 0; i < n; ++i) {
|
||||||
|
uint32_t v = data[i];
|
||||||
|
uint32_t rgb = v & 0x00ffffff;
|
||||||
|
uint32_t a = (v & 0xff000000) >> 24;
|
||||||
|
data[i] = (rgb << 8) | a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_png(int width, int height)
|
write_png(int width, int height)
|
||||||
{
|
{
|
||||||
int output_stride, buffer_stride, i;
|
int output_stride, buffer_stride, i;
|
||||||
cairo_surface_t *surface;
|
|
||||||
void *data, *d, *s;
|
void *data, *d, *s;
|
||||||
struct screenshooter_output *output, *next;
|
struct screenshooter_output *output, *next;
|
||||||
|
|
||||||
|
@ -203,11 +211,13 @@ write_png(int width, int height)
|
||||||
free(output);
|
free(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
surface = cairo_image_surface_create_for_data(data,
|
argb_to_rgba(data, height, buffer_stride);
|
||||||
CAIRO_FORMAT_RGB24,
|
|
||||||
width, height, buffer_stride);
|
// TODO: call convert
|
||||||
cairo_surface_write_to_png(surface, "wayland-screenshot.png");
|
FILE *f = fopen("wayland-screenshot", "w");
|
||||||
cairo_surface_destroy(surface);
|
fwrite(data, buffer_stride * height, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,10 @@ void wlr_output_swap_buffers(struct wlr_output *output);
|
||||||
void wlr_output_set_gamma(struct wlr_output *output,
|
void wlr_output_set_gamma(struct wlr_output *output,
|
||||||
uint16_t size, uint16_t *r, uint16_t *g, uint16_t *b);
|
uint16_t size, uint16_t *r, uint16_t *g, uint16_t *b);
|
||||||
uint16_t wlr_output_get_gamma_size(struct wlr_output *output);
|
uint16_t wlr_output_get_gamma_size(struct wlr_output *output);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads all pixels from the output and stores them as ARGB.
|
||||||
|
*/
|
||||||
void wlr_output_read_pixels(struct wlr_output *output, void *out_data);
|
void wlr_output_read_pixels(struct wlr_output *output, void *out_data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include <wlr/util/list.h>
|
#include <wlr/util/list.h>
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
#include <GLES2/gl2.h>
|
#include <GLES2/gl2.h>
|
||||||
#include <GLES2/gl2ext.h>
|
|
||||||
#include <wlr/render/matrix.h>
|
#include <wlr/render/matrix.h>
|
||||||
#include <wlr/render/gles2.h>
|
#include <wlr/render/gles2.h>
|
||||||
#include <wlr/render.h>
|
#include <wlr/render.h>
|
||||||
|
@ -252,9 +251,19 @@ uint16_t wlr_output_get_gamma_size(struct wlr_output *output) {
|
||||||
return output->impl->get_gamma_size(output);
|
return output->impl->get_gamma_size(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_output_read_pixels(struct wlr_output *output, void *out_data) {
|
static void rgba_to_argb(uint32_t *data, size_t height, size_t stride) {
|
||||||
// TODO: is wlr_output_make_current required?
|
size_t n = height*stride/4;
|
||||||
wlr_output_make_current(output);
|
for (size_t i = 0; i < n; ++i) {
|
||||||
glReadPixels(0, 0, output->width, output->height, GL_BGRA_EXT,
|
uint32_t v = data[i];
|
||||||
GL_UNSIGNED_BYTE, out_data);
|
uint32_t rgb = (v & 0xffffff00) >> 8;
|
||||||
|
uint32_t a = v & 0x000000ff;
|
||||||
|
data[i] = rgb | (a << 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wlr_output_read_pixels(struct wlr_output *output, void *out_data) {
|
||||||
|
wlr_output_make_current(output);
|
||||||
|
glReadPixels(0, 0, output->width, output->height, GL_RGBA, GL_UNSIGNED_BYTE,
|
||||||
|
out_data);
|
||||||
|
rgba_to_argb(out_data, output->height, output->width*4);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue