Extract rendering into own unit
parent
9c7a4d6b07
commit
ec51388fec
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Andri Yngvason
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <pixman.h>
|
||||
|
||||
struct wl_buffer;
|
||||
|
||||
struct buffer {
|
||||
int width, height, stride;
|
||||
size_t size;
|
||||
uint32_t format;
|
||||
struct wl_buffer* wl_buffer;
|
||||
void* pixels;
|
||||
bool is_attached;
|
||||
bool please_clean_up;
|
||||
struct pixman_region16 damage;
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Andri Yngvason
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <pixman.h>
|
||||
|
||||
struct buffer;
|
||||
|
||||
struct image {
|
||||
int width, height, stride;
|
||||
uint32_t format;
|
||||
void* pixels;
|
||||
};
|
||||
|
||||
void render_image(struct buffer* dst, const struct image* src, double scale,
|
||||
int pos_x, int pos_y);
|
|
@ -71,6 +71,7 @@ sources = [
|
|||
'src/evdev-to-qnum.c',
|
||||
'src/pixels.c',
|
||||
'src/region.c',
|
||||
'src/renderer.c',
|
||||
]
|
||||
|
||||
dependencies = [
|
||||
|
|
64
src/main.c
64
src/main.c
|
@ -39,17 +39,8 @@
|
|||
#include "vnc.h"
|
||||
#include "pixels.h"
|
||||
#include "region.h"
|
||||
|
||||
struct buffer {
|
||||
int width, height, stride;
|
||||
size_t size;
|
||||
uint32_t format;
|
||||
struct wl_buffer* wl_buffer;
|
||||
void* pixels;
|
||||
bool is_attached;
|
||||
bool please_clean_up;
|
||||
struct pixman_region16 damage;
|
||||
};
|
||||
#include "buffer.h"
|
||||
#include "renderer.h"
|
||||
|
||||
struct window {
|
||||
struct wl_surface* wl_surface;
|
||||
|
@ -329,53 +320,20 @@ static void window_calculate_tranform(struct window* w, double* scale,
|
|||
|
||||
static void window_transfer_pixels(struct window* w)
|
||||
{
|
||||
void* src_pixels = w->vnc_fb;
|
||||
int src_width = vnc_client_get_width(w->vnc);
|
||||
int src_height = vnc_client_get_height(w->vnc);
|
||||
int src_stride = vnc_client_get_stride(w->vnc);
|
||||
|
||||
void* dst_pixels = w->back_buffer->pixels;
|
||||
int dst_width = w->back_buffer->width;
|
||||
int dst_height = w->back_buffer->height;
|
||||
int dst_stride = w->back_buffer->stride;
|
||||
|
||||
bool ok __attribute__((unused));
|
||||
|
||||
pixman_format_code_t dst_fmt = 0;
|
||||
ok = drm_format_to_pixman_fmt(&dst_fmt, w->back_buffer->format);
|
||||
assert(ok);
|
||||
|
||||
pixman_format_code_t src_fmt = 0;
|
||||
ok = drm_format_to_pixman_fmt(&src_fmt, w->back_buffer->format);
|
||||
assert(ok);
|
||||
|
||||
pixman_image_t* dstimg = pixman_image_create_bits_no_clear(
|
||||
dst_fmt, dst_width, dst_height, dst_pixels, dst_stride);
|
||||
|
||||
pixman_image_t* srcimg = pixman_image_create_bits_no_clear(src_fmt,
|
||||
src_width, src_height, src_pixels, src_stride);
|
||||
|
||||
double scale;
|
||||
int x_pos, y_pos;
|
||||
window_calculate_tranform(w, &scale, &x_pos, &y_pos);
|
||||
pixman_fixed_t src_scale = pixman_double_to_fixed(1.0 / scale);
|
||||
|
||||
pixman_transform_t xform;
|
||||
pixman_transform_init_scale(&xform, src_scale, src_scale);
|
||||
pixman_image_set_transform(srcimg, &xform);
|
||||
struct image image = {
|
||||
.pixels = w->vnc_fb,
|
||||
.width = vnc_client_get_width(w->vnc),
|
||||
.height = vnc_client_get_height(w->vnc),
|
||||
.stride = vnc_client_get_stride(w->vnc),
|
||||
// TODO: Get the format from the vnc module
|
||||
.format = w->back_buffer->format,
|
||||
};
|
||||
|
||||
pixman_image_set_clip_region(dstimg, &w->back_buffer->damage);
|
||||
|
||||
pixman_image_composite(PIXMAN_OP_OVER, srcimg, NULL, dstimg,
|
||||
0, 0,
|
||||
0, 0,
|
||||
x_pos, y_pos,
|
||||
dst_width, dst_height);
|
||||
|
||||
pixman_image_unref(srcimg);
|
||||
pixman_image_unref(dstimg);
|
||||
|
||||
pixman_region_clear(&w->back_buffer->damage);
|
||||
render_image(w->back_buffer, &image, scale, x_pos, y_pos);
|
||||
}
|
||||
|
||||
static void window_commit(struct window* w)
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright (c) 2022 Andri Yngvason
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "renderer.h"
|
||||
#include "buffer.h"
|
||||
#include "pixels.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <pixman.h>
|
||||
#include <assert.h>
|
||||
|
||||
void render_image(struct buffer* dst, const struct image* src, double scale,
|
||||
int x_pos, int y_pos)
|
||||
{
|
||||
bool ok __attribute__((unused));
|
||||
|
||||
pixman_format_code_t dst_fmt = 0;
|
||||
ok = drm_format_to_pixman_fmt(&dst_fmt, dst->format);
|
||||
assert(ok);
|
||||
|
||||
pixman_format_code_t src_fmt = 0;
|
||||
ok = drm_format_to_pixman_fmt(&src_fmt, src->format);
|
||||
assert(ok);
|
||||
|
||||
pixman_image_t* dstimg = pixman_image_create_bits_no_clear(dst_fmt,
|
||||
dst->width, dst->height, dst->pixels, dst->stride);
|
||||
|
||||
pixman_image_t* srcimg = pixman_image_create_bits_no_clear(src_fmt,
|
||||
src->width, src->height, src->pixels, src->stride);
|
||||
|
||||
pixman_fixed_t src_scale = pixman_double_to_fixed(1.0 / scale);
|
||||
|
||||
pixman_transform_t xform;
|
||||
pixman_transform_init_scale(&xform, src_scale, src_scale);
|
||||
pixman_image_set_transform(srcimg, &xform);
|
||||
|
||||
pixman_image_set_clip_region(dstimg, &dst->damage);
|
||||
|
||||
pixman_image_composite(PIXMAN_OP_OVER, srcimg, NULL, dstimg,
|
||||
0, 0,
|
||||
0, 0,
|
||||
x_pos, y_pos,
|
||||
dst->width, dst->height);
|
||||
|
||||
pixman_image_unref(srcimg);
|
||||
pixman_image_unref(dstimg);
|
||||
|
||||
pixman_region_clear(&dst->damage);
|
||||
}
|
||||
|
Loading…
Reference in New Issue