From 7b58319e9c320426f7dee202bf9201b6628bf958 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Thu, 13 Apr 2017 14:27:20 -0700 Subject: libpayload: cbgfx: Show square images on portrait displays CBGFX currently doesn't support portrait screens at all. This will have to be fixed eventually but might take a bit of effort. As a first step to make devices with a portrait panel somewhat usable, this patch will just force a square canvas on these panels and keep the bottom part of the screen black. Also switch set_pixel to calculate framebuffer position via bytes_per_line instead of x_resolution. This is supposed to be the canonical way to do that and may differ in cases where the display controller requires a certain alignment from framebuffer lines. Change-Id: I47dd3bf95ab8a7d8b7e1913e0ddab346eedd46f1 Signed-off-by: Julius Werner Reviewed-on: https://review.coreboot.org/19279 Tested-by: build bot (Jenkins) Reviewed-by: Daisuke Nojiri --- payloads/libpayload/drivers/video/graphics.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'payloads/libpayload') diff --git a/payloads/libpayload/drivers/video/graphics.c b/payloads/libpayload/drivers/video/graphics.c index f1d916a18f..4a8792c151 100644 --- a/payloads/libpayload/drivers/video/graphics.c +++ b/payloads/libpayload/drivers/video/graphics.c @@ -125,9 +125,9 @@ static inline uint32_t calculate_color(const struct rgb_color *rgb) static inline void set_pixel(struct vector *coord, uint32_t color) { const int bpp = fbinfo->bits_per_pixel; + const int bpl = fbinfo->bytes_per_line; int i; - uint8_t * const pixel = fbaddr + (coord->x + - coord->y * fbinfo->x_resolution) * bpp / 8; + uint8_t * const pixel = fbaddr + coord->y * bpl + coord->x * bpp / 8; for (i = 0; i < bpp / 8; i++) pixel[i] = (color >> (i * 8)); } @@ -156,8 +156,11 @@ static int cbgfx_init(void) /* Calculate canvas size & offset, assuming the screen is landscape */ if (screen.size.height > screen.size.width) { - LOG("Portrait screen not supported\n"); - return CBGFX_ERROR_PORTRAIT_SCREEN; + const int bpl = fbinfo->bytes_per_line; + LOG("Portrait screen not supported, forcing square image!\n"); + memset(fbaddr + screen.size.width * bpl, 0, + (screen.size.height - screen.size.width) * bpl); + screen.size.height = screen.size.width; } canvas.size.height = screen.size.height; canvas.size.width = canvas.size.height; -- cgit v1.2.3