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 <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/19279
Tested-by: build bot (Jenkins)
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
This commit is contained in:
Julius Werner 2017-04-13 14:27:20 -07:00 committed by Martin Roth
parent 1f8a28cbae
commit 7b58319e9c
1 changed files with 7 additions and 4 deletions

View File

@ -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) static inline void set_pixel(struct vector *coord, uint32_t color)
{ {
const int bpp = fbinfo->bits_per_pixel; const int bpp = fbinfo->bits_per_pixel;
const int bpl = fbinfo->bytes_per_line;
int i; int i;
uint8_t * const pixel = fbaddr + (coord->x + uint8_t * const pixel = fbaddr + coord->y * bpl + coord->x * bpp / 8;
coord->y * fbinfo->x_resolution) * bpp / 8;
for (i = 0; i < bpp / 8; i++) for (i = 0; i < bpp / 8; i++)
pixel[i] = (color >> (i * 8)); pixel[i] = (color >> (i * 8));
} }
@ -156,8 +156,11 @@ static int cbgfx_init(void)
/* Calculate canvas size & offset, assuming the screen is landscape */ /* Calculate canvas size & offset, assuming the screen is landscape */
if (screen.size.height > screen.size.width) { if (screen.size.height > screen.size.width) {
LOG("Portrait screen not supported\n"); const int bpl = fbinfo->bytes_per_line;
return CBGFX_ERROR_PORTRAIT_SCREEN; 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.height = screen.size.height;
canvas.size.width = canvas.size.height; canvas.size.width = canvas.size.height;