main: Use pixman for rendering
parent
767f7ce816
commit
80d18ac6aa
50
src/main.c
50
src/main.c
|
@ -36,6 +36,7 @@
|
||||||
#include "pointer.h"
|
#include "pointer.h"
|
||||||
#include "keyboard.h"
|
#include "keyboard.h"
|
||||||
#include "vnc.h"
|
#include "vnc.h"
|
||||||
|
#include "pixels.h"
|
||||||
|
|
||||||
struct buffer {
|
struct buffer {
|
||||||
int width, height, stride;
|
int width, height, stride;
|
||||||
|
@ -290,28 +291,45 @@ static void window_attach(struct window* w, int x, int y)
|
||||||
|
|
||||||
static void window_transfer_pixels(struct window* w)
|
static void window_transfer_pixels(struct window* w)
|
||||||
{
|
{
|
||||||
struct buffer* buffer = w->back_buffer;
|
void* src_pixels = w->vnc_fb;
|
||||||
|
int src_width = w->back_buffer->width;
|
||||||
|
int src_height = w->back_buffer->height;
|
||||||
|
int src_stride = w->back_buffer->stride;
|
||||||
|
|
||||||
uint32_t* dst = buffer->pixels;
|
void* dst_pixels = w->back_buffer->pixels;
|
||||||
uint32_t* src = w->vnc_fb;
|
int dst_width = w->back_buffer->width;
|
||||||
|
int dst_height = w->back_buffer->height;
|
||||||
|
int dst_stride = w->back_buffer->stride;
|
||||||
|
|
||||||
int stride = buffer->width;
|
bool ok __attribute__((unused));
|
||||||
|
|
||||||
int n_rects = 0;
|
pixman_format_code_t dst_fmt = 0;
|
||||||
struct pixman_box16* rects =
|
ok = wl_shm_to_pixman_fmt(&dst_fmt, w->back_buffer->format);
|
||||||
pixman_region_rectangles(&buffer->damage, &n_rects);
|
assert(ok);
|
||||||
|
|
||||||
for (int i = 0; i < n_rects; ++i) {
|
pixman_format_code_t src_fmt = 0;
|
||||||
struct pixman_box16* r = &rects[i];
|
ok = wl_shm_to_pixman_fmt(&src_fmt, w->back_buffer->format);
|
||||||
int width = r->x2 - r->x1;
|
assert(ok);
|
||||||
|
|
||||||
for (int y = r->y1; y < r->y2; ++y) {
|
pixman_image_t* dstimg = pixman_image_create_bits_no_clear(
|
||||||
memcpy(dst + r->x1 + y * stride,
|
dst_fmt, dst_width, dst_height, dst_pixels, dst_stride);
|
||||||
src + r->x1 + y * stride, width * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pixman_region_clear(&buffer->damage);
|
pixman_image_t* srcimg = pixman_image_create_bits_no_clear(src_fmt,
|
||||||
|
src_width, src_height, src_pixels, src_stride);
|
||||||
|
|
||||||
|
// pixman_transform_t xform;
|
||||||
|
// pixman_image_set_transform(srcimg, pxform);
|
||||||
|
|
||||||
|
pixman_image_set_clip_region(dstimg, &w->back_buffer->damage);
|
||||||
|
|
||||||
|
pixman_image_composite(PIXMAN_OP_OVER, srcimg, NULL, dstimg,
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
dst_width, dst_height);
|
||||||
|
|
||||||
|
pixman_image_unref(srcimg);
|
||||||
|
pixman_image_unref(dstimg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void window_commit(struct window* w)
|
static void window_commit(struct window* w)
|
||||||
|
|
Loading…
Reference in New Issue