From f2024aa2746e7bb2fca27f56432d4514e5963676 Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Sat, 29 Sep 2018 01:13:47 +0900 Subject: [PATCH] Properly support strides --- apps/compositor.c | 4 ---- base/usr/include/toaru/graphics.h | 6 ++++-- ext/ext_cairo_renderer.c | 4 ++-- lib/graphics.c | 13 ++++++++----- lib/yutani.c | 2 ++ 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/compositor.c b/apps/compositor.c index 8c8efa0e..f29a1ef2 100644 --- a/apps/compositor.c +++ b/apps/compositor.c @@ -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) { diff --git a/base/usr/include/toaru/graphics.h b/base/usr/include/toaru/graphics.h index 8085dacf..ea7b53e6 100644 --- a/base/usr/include/toaru/graphics.h +++ b/base/usr/include/toaru/graphics.h @@ -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(); diff --git a/ext/ext_cairo_renderer.c b/ext/ext_cairo_renderer.c index 84dd6c15..ad7b590f 100644 --- a/ext/ext_cairo_renderer.c +++ b/ext/ext_cairo_renderer.c @@ -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; diff --git a/lib/graphics.c b/lib/graphics.c index 8ac14c21..737355f6 100644 --- a/lib/graphics.c +++ b/lib/graphics.c @@ -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); diff --git a/lib/yutani.c b/lib/yutani.c index b451fa96..8a107808 100644 --- a/lib/yutani.c +++ b/lib/yutani.c @@ -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) {