Properly support strides

This commit is contained in:
K. Lange 2018-09-29 01:13:47 +09:00
parent 37e30140ec
commit f2024aa274
5 changed files with 16 additions and 13 deletions

View File

@ -880,10 +880,8 @@ static void redraw_windows(yutani_globals_t * yg) {
if (!yutani_options.nested) {
reinit_graphics_fullscreen(yg->backend_ctx);
yg->stride = framebuffer_stride();
} else {
reinit_graphics_yutani(yg->backend_ctx, yg->host_window);
yg->stride = yg->backend_ctx->width * 4;
yutani_window_resize_done(yg->host_context, yg->host_window);
}
TRACE("graphics context resized...");
@ -1961,7 +1959,6 @@ int main(int argc, char * argv[]) {
yutani_window_move(yg->host_context, yg->host_window, 50, 50);
yutani_window_advertise_icon(yg->host_context, yg->host_window, "Compositor", "compositor");
yg->backend_ctx = init_graphics_yutani_double_buffer(yg->host_window);
yg->stride = yg->backend_ctx->width * 4;
} else {
char * d = getenv("DISPLAY");
if (d && *d) {
@ -1971,7 +1968,6 @@ int main(int argc, char * argv[]) {
_static_yg = yg;
signal(SIGWINEVENT, yutani_display_resize_handle);
yg->backend_ctx = init_graphics_fullscreen_double_buffer();
yg->stride = framebuffer_stride();
}
if (!yg->backend_ctx) {

View File

@ -8,6 +8,7 @@
#define GFX_W(ctx) ((ctx)->width) /* Display width */
#define GFX_H(ctx) ((ctx)->height) /* Display height */
#define GFX_B(ctx) ((ctx)->depth / 8) /* Display byte depth */
#define GFX_S(ctx) ((ctx)->stride) /* Stride */
#define _RED(color) ((color & 0x00FF0000) / 0x10000)
#define _GRE(color) ((color & 0x0000FF00) / 0x100)
@ -17,8 +18,8 @@
/*
* Macros make verything easier.
*/
#define GFX(ctx,x,y) *((uint32_t *)&((ctx)->backbuffer)[(GFX_W(ctx) * (y) + (x)) * GFX_B(ctx)])
#define GFXR(ctx,x,y) *((uint32_t *)&((ctx)->buffer)[(GFX_W(ctx) * (y) + (x)) * GFX_B(ctx)])
#define GFX(ctx,x,y) *((uint32_t *)&((ctx)->backbuffer)[(GFX_S(ctx) * (y) + (x) * GFX_B(ctx))])
#define GFXR(ctx,x,y) *((uint32_t *)&((ctx)->buffer)[(GFX_S(ctx) * (y) + (x) * GFX_B(ctx))])
#define SPRITE(sprite,x,y) sprite->bitmap[sprite->width * (y) + (x)]
#define SMASKS(sprite,x,y) sprite->masks[sprite->width * (y) + (x)]
@ -40,6 +41,7 @@ typedef struct context {
char * backbuffer;
char * clips;
int32_t clips_size;
uint32_t stride;
} gfx_context_t;
extern gfx_context_t * init_graphics_fullscreen();

View File

@ -30,13 +30,13 @@ int renderer_alloc(yutani_globals_t * yg) {
int renderer_init(yutani_globals_t * yg) {
struct cairo_renderer * c = yg->renderer_ctx;
int stride = yg->width * 4;
int stride = yg->backend_ctx->stride;
c->framebuffer_surface = cairo_image_surface_create_for_data(
yg->backend_framebuffer, CAIRO_FORMAT_ARGB32, yg->width, yg->height, stride);
c->framebuffer_ctx = cairo_create(c->framebuffer_surface);
c->real_surface = cairo_image_surface_create_for_data(
(unsigned char *)yg->backend_ctx->buffer, CAIRO_FORMAT_ARGB32, yg->width, yg->height, yg->stride);
(unsigned char *)yg->backend_ctx->buffer, CAIRO_FORMAT_ARGB32, yg->width, yg->height, stride);
c->real_ctx = cairo_create(c->real_surface);
return 0;

View File

@ -69,7 +69,7 @@ void flip(gfx_context_t * ctx) {
if (ctx->clips) {
for (size_t i = 0; i < ctx->height; ++i) {
if (_is_in_clip(ctx,i)) {
memcpy(&ctx->buffer[i*ctx->width*4], &ctx->backbuffer[i*ctx->width*4], 4 * ctx->width);
memcpy(&ctx->buffer[i*GFX_S(ctx)], &ctx->backbuffer[i*GFX_S(ctx)], 4 * ctx->width);
}
}
} else {
@ -99,10 +99,11 @@ gfx_context_t * init_graphics_fullscreen() {
ioctl(framebuffer_fd, IO_VID_WIDTH, &out->width);
ioctl(framebuffer_fd, IO_VID_HEIGHT, &out->height);
ioctl(framebuffer_fd, IO_VID_DEPTH, &out->depth);
ioctl(framebuffer_fd, IO_VID_STRIDE, &out->stride);
ioctl(framebuffer_fd, IO_VID_ADDR, &out->buffer);
ioctl(framebuffer_fd, IO_VID_SIGNAL, NULL);
out->size = GFX_H(out) * GFX_W(out) * GFX_B(out);
out->size = GFX_H(out) * GFX_S(out);
out->backbuffer = out->buffer;
return out;
}
@ -116,7 +117,7 @@ uint32_t framebuffer_stride(void) {
gfx_context_t * init_graphics_fullscreen_double_buffer() {
gfx_context_t * out = init_graphics_fullscreen();
if (!out) return NULL;
out->backbuffer = malloc(sizeof(uint32_t) * GFX_W(out) * GFX_H(out));
out->backbuffer = malloc(GFX_S(out) * GFX_H(out));
return out;
}
@ -125,8 +126,9 @@ void reinit_graphics_fullscreen(gfx_context_t * out) {
ioctl(framebuffer_fd, IO_VID_WIDTH, &out->width);
ioctl(framebuffer_fd, IO_VID_HEIGHT, &out->height);
ioctl(framebuffer_fd, IO_VID_DEPTH, &out->depth);
ioctl(framebuffer_fd, IO_VID_STRIDE, &out->stride);
out->size = GFX_H(out) * GFX_W(out) * GFX_B(out);
out->size = GFX_H(out) * GFX_S(out);
if (out->clips && out->clips_size != out->height) {
free(out->clips);
@ -136,7 +138,7 @@ void reinit_graphics_fullscreen(gfx_context_t * out) {
if (out->buffer != out->backbuffer) {
ioctl(framebuffer_fd, IO_VID_ADDR, &out->buffer);
out->backbuffer = realloc(out->backbuffer, sizeof(uint32_t) * GFX_W(out) * GFX_H(out));
out->backbuffer = realloc(out->backbuffer, GFX_S(out) * GFX_H(out));
} else {
ioctl(framebuffer_fd, IO_VID_ADDR, &out->buffer);
out->backbuffer = out->buffer;
@ -149,6 +151,7 @@ gfx_context_t * init_graphics_sprite(sprite_t * sprite) {
out->clips = NULL;
out->width = sprite->width;
out->stride = sprite->width * sizeof(uint32_t);
out->height = sprite->height;
out->depth = 32;
out->size = GFX_H(out) * GFX_W(out) * GFX_B(out);

View File

@ -1061,6 +1061,7 @@ gfx_context_t * init_graphics_yutani(yutani_window_t * window) {
gfx_context_t * out = malloc(sizeof(gfx_context_t));
out->width = window->width;
out->height = window->height;
out->stride = window->width * sizeof(uint32_t);
out->depth = 32;
out->size = GFX_H(out) * GFX_W(out) * GFX_B(out);
out->buffer = window->buffer;
@ -1090,6 +1091,7 @@ gfx_context_t * init_graphics_yutani_double_buffer(yutani_window_t * window) {
void reinit_graphics_yutani(gfx_context_t * out, yutani_window_t * window) {
out->width = window->width;
out->height = window->height;
out->stride = window->width * 4;
out->depth = 32;
out->size = GFX_H(out) * GFX_W(out) * GFX_B(out);
if (out->buffer == out->backbuffer) {