Change FBIO_UPDATE argument from nxgl_rect_s to fb_area_s

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Change-Id: Ibaf4b0180afecdcd3248693a3092c8a23e22a2fa
This commit is contained in:
Xiang Xiao 2020-07-23 12:27:14 +08:00 committed by Abdelatif Guettouche
parent 8917467d04
commit 4136d42596
3 changed files with 119 additions and 121 deletions

View File

@ -47,8 +47,6 @@
#include <fcntl.h>
#include <errno.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxglib.h>
#include <nuttx/video/fb.h>
#include <nuttx/video/rgbcolors.h>
@ -83,17 +81,20 @@ static const char g_default_fbdev[] = CONFIG_EXAMPLES_FB_DEFAULTFB;
static const uint32_t g_rgb24[NCOLORS] =
{
RGB24_VIOLET, RGB24_BLUE, RGB24_GREEN, RGB24_YELLOW, RGB24_ORANGE, RGB24_RED
RGB24_VIOLET, RGB24_BLUE, RGB24_GREEN,
RGB24_YELLOW, RGB24_ORANGE, RGB24_RED
};
static const uint16_t g_rgb16[NCOLORS] =
{
RGB16_VIOLET, RGB16_BLUE, RGB16_GREEN, RGB16_YELLOW, RGB16_ORANGE, RGB16_RED
RGB16_VIOLET, RGB16_BLUE, RGB16_GREEN,
RGB16_YELLOW, RGB16_ORANGE, RGB16_RED
};
static const uint8_t g_rgb8[NCOLORS] =
{
RGB8_VIOLET, RGB8_BLUE, RGB8_GREEN, RGB8_YELLOW, RGB8_ORANGE, RGB8_RED
RGB8_VIOLET, RGB8_BLUE, RGB8_GREEN,
RGB8_YELLOW, RGB8_ORANGE, RGB8_RED
};
/****************************************************************************
@ -105,18 +106,18 @@ static const uint8_t g_rgb8[NCOLORS] =
****************************************************************************/
static void draw_rect32(FAR struct fb_state_s *state,
FAR struct nxgl_rect_s *rect, int color)
FAR struct fb_area_s *area, int color)
{
FAR uint32_t *dest;
FAR uint8_t *row;
int x;
int y;
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * rect->pt1.y;
for (y = rect->pt1.y; y <= rect->pt2.y; y++)
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * area->y;
for (y = 0; y < area->h; y++)
{
dest = ((FAR uint32_t *)row) + rect->pt1.x;
for (x = rect->pt1.x; x <= rect->pt2.x; x++)
dest = ((FAR uint32_t *)row) + area->x;
for (x = 0; x < area->w; x++)
{
*dest++ = g_rgb24[color];
}
@ -126,18 +127,18 @@ static void draw_rect32(FAR struct fb_state_s *state,
}
static void draw_rect16(FAR struct fb_state_s *state,
FAR struct nxgl_rect_s *rect, int color)
FAR struct fb_area_s *area, int color)
{
FAR uint16_t *dest;
FAR uint8_t *row;
int x;
int y;
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * rect->pt1.y;
for (y = rect->pt1.y; y <= rect->pt2.y; y++)
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * area->y;
for (y = 0; y < area->h; y++)
{
dest = ((FAR uint16_t *)row) + rect->pt1.x;
for (x = rect->pt1.x; x <= rect->pt2.x; x++)
dest = ((FAR uint16_t *)row) + area->x;
for (x = 0; x < area->w; x++)
{
*dest++ = g_rgb16[color];
}
@ -147,18 +148,18 @@ static void draw_rect16(FAR struct fb_state_s *state,
}
static void draw_rect8(FAR struct fb_state_s *state,
FAR struct nxgl_rect_s *rect, int color)
FAR struct fb_area_s *area, int color)
{
FAR uint8_t *dest;
FAR uint8_t *row;
int x;
int y;
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * rect->pt1.y;
for (y = rect->pt1.y; y <= rect->pt2.y; y++)
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * area->y;
for (y = 0; y < area->h; y++)
{
dest = row + rect->pt1.x;
for (x = rect->pt1.x; x <= rect->pt2.x; x++)
dest = row + area->x;
for (x = 0; x < area->w; x++)
{
*dest++ = g_rgb8[color];
}
@ -168,7 +169,7 @@ static void draw_rect8(FAR struct fb_state_s *state,
}
static void draw_rect1(FAR struct fb_state_s *state,
FAR struct nxgl_rect_s *rect, int color)
FAR struct fb_area_s *area, int color)
{
FAR uint8_t *pixel;
FAR uint8_t *row;
@ -182,7 +183,7 @@ static void draw_rect1(FAR struct fb_state_s *state,
/* Calculate the framebuffer address of the first row to draw on */
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * rect->pt1.y;
row = (FAR uint8_t *)state->fbmem + state->pinfo.stride * area->y;
/* Calculate the start byte position rounding down so that we get the
* first byte containing any part of the pixel sequence. Then calculate
@ -190,19 +191,19 @@ static void draw_rect1(FAR struct fb_state_s *state,
* final pixels of the sequence.
*/
startx = (rect->pt1.x >> 3);
endx = ((rect->pt2.x + 7) >> 3);
startx = (area->x >> 3);
endx = ((area->x + area->w + 6) >> 3);
/* Calculate a mask on the first and last bytes of the sequence that may
* not be completely filled with pixel.
*/
lmask = 0xff << (8 - (rect->pt1.x & 7));
rmask = 0xff >> (rect->pt2.x & 7);
lmask = 0xff << (8 - (area->x & 7));
rmask = 0xff >> ((area->x + area->w - 1) & 7);
/* Now draw each row, one-at-a-time */
for (y = rect->pt1.y; y <= rect->pt2.y; y++)
for (y = 0; y < area->h; y++)
{
/* 'pixel' points to the 1st pixel the next row */
@ -218,7 +219,6 @@ static void draw_rect1(FAR struct fb_state_s *state,
}
else
{
/* Special case the first byte of the row */
*pixel = (*pixel & lmask) | (color8 & ~lmask);
@ -234,42 +234,42 @@ static void draw_rect1(FAR struct fb_state_s *state,
/* Handle the final byte of the row */
*pixel = (*pixel & rmask) | (color8 & ~rmask);
}
}
row += state->pinfo.stride;
}
}
static void draw_rect(FAR struct fb_state_s *state,
FAR struct nxgl_rect_s *rect, int color)
FAR struct fb_area_s *area, int color)
{
#ifdef CONFIG_LCD_UPDATE
#ifdef CONFIG_FB_UPDATE
int ret;
#endif
switch (state->pinfo.bpp)
{
case 32:
draw_rect32(state, rect, color);
draw_rect32(state, area, color);
break;
case 16:
draw_rect16(state, rect, color);
draw_rect16(state, area, color);
break;
case 8:
default:
draw_rect8(state, rect, color);
draw_rect8(state, area, color);
break;
case 1:
draw_rect1(state, rect, color);
draw_rect1(state, area, color);
break;
}
#ifdef CONFIG_LCD_UPDATE
#ifdef CONFIG_FB_UPDATE
ret = ioctl(state->fd, FBIO_UPDATE,
(unsigned long)((uintptr_t)rect));
(unsigned long)((uintptr_t)area));
if (ret < 0)
{
int errcode = errno;
@ -291,7 +291,7 @@ int main(int argc, FAR char *argv[])
{
FAR const char *fbdev = g_default_fbdev;
struct fb_state_s state;
struct nxgl_rect_s rect;
struct fb_area_s area;
int nsteps;
int xstep;
int ystep;
@ -429,8 +429,8 @@ int main(int argc, FAR char *argv[])
* address mapping to make the memory accessible to the application.
*/
state.fbmem = mmap(NULL, state.pinfo.fblen, PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FILE, state.fd, 0);
state.fbmem = mmap(NULL, state.pinfo.fblen, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FILE, state.fd, 0);
if (state.fbmem == MAP_FAILED)
{
int errcode = errno;
@ -454,16 +454,16 @@ int main(int argc, FAR char *argv[])
color < NCOLORS;
x += xstep, y += ystep, color++)
{
rect.pt1.x = x;
rect.pt1.y = y;
rect.pt2.x = x + width - 1;
rect.pt2.y = y + height - 1;
area.x = x;
area.y = y;
area.w = width;
area.h = height;
printf("%2d: (%3d,%3d) (%3d,%3d)\n",
color, rect.pt1.x, rect.pt1.y, rect.pt2.x, rect.pt2.y);
color, area.x, area.y, area.w, area.h);
draw_rect(&state, &rect, color);
usleep(500*1000);
draw_rect(&state, &area, color);
usleep(500 * 1000);
width -= (2 * xstep);
height -= (2 * ystep);

View File

@ -49,8 +49,6 @@
#include <fcntl.h>
#include <errno.h>
#include <nuttx/nx/nx.h>
#include <nuttx/nx/nxglib.h>
#include <nuttx/video/fb.h>
#include <nuttx/video/rgbcolors.h>
@ -208,8 +206,8 @@ int fbdev_init(void)
void fbdev_flush(struct _disp_drv_t *disp_drv, const lv_area_t *area,
lv_color_t *color_p)
{
#ifdef CONFIG_LCD_UPDATE
struct nxgl_rect_s rect;
#ifdef CONFIG_FB_UPDATE
struct fb_area_s area;
#endif
int32_t x1 = area->x1;
int32_t y1 = area->y1;
@ -312,12 +310,12 @@ void fbdev_flush(struct _disp_drv_t *disp_drv, const lv_area_t *area,
}
}
#ifdef CONFIG_LCD_UPDATE
rect.pt1.x = act_x1;
rect.pt1.y = act_y1;
rect.pt2.x = act_x2;
rect.pt2.y = act_y2;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&rect));
#ifdef CONFIG_FB_UPDATE
area.x = act_x1;
area.y = act_y1;
area.w = act_x2 - act_x1 + 1;
area.h = act_y2 - cat_y1 + 1;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&area));
#endif
/* Tell the flushing is ready */
@ -346,8 +344,8 @@ void fbdev_flush(struct _disp_drv_t *disp_drv, const lv_area_t *area,
void fbdev_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
lv_color_t color)
{
#ifdef CONFIG_LCD_UPDATE
struct nxgl_rect_s rect;
#ifdef CONFIG_FB_UPDATE
struct fb_area_s area;
#endif
int32_t act_x1;
int32_t act_y1;
@ -437,12 +435,12 @@ void fbdev_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
}
}
#ifdef CONFIG_LCD_UPDATE
rect.pt1.x = act_x1;
rect.pt1.y = act_y1;
rect.pt2.x = act_x2;
rect.pt2.y = act_y2;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&rect));
#ifdef CONFIG_FB_UPDATE
area.x = act_x1;
area.y = act_y1;
area.w = act_x2 - act_x1 + 1;
area.h = act_y2 - act_y1 + 1;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&area));
#endif
}
@ -467,8 +465,8 @@ void fbdev_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
void fbdev_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
FAR const lv_color_t *color_p)
{
#ifdef CONFIG_LCD_UPDATE
struct nxgl_rect_s rect;
#ifdef CONFIG_FB_UPDATE
struct fb_area_s area;
#endif
int32_t act_x1;
int32_t act_y1;
@ -567,11 +565,11 @@ void fbdev_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2,
}
}
#ifdef CONFIG_LCD_UPDATE
rect.pt1.x = act_x1;
rect.pt1.y = act_y1;
rect.pt2.x = act_x2;
rect.pt2.y = act_y2;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&rect));
#ifdef CONFIG_FB_UPDATE
area.x = act_x1;
area.y = act_y1;
area.w = act_x2 - act_x1 + 1;
area.h = act_y2 - act_y1 + 1;
ioctl(state.fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&area));
#endif
}

View File

@ -508,26 +508,26 @@ static inline void PDC_copy_glyph(FAR struct pdc_fbstate_s *fbstate,
*
****************************************************************************/
#ifdef CONFIG_LCD_UPDATE
#ifdef CONFIG_FB_UPDATE
static void PDC_update(FAR struct pdc_fbstate_s *fbstate, int row, int col,
int nchars)
{
struct nxgl_rect_s rect;
struct fb_area_s area;
int ret;
if (nchars > 0)
{
/* Setup the bounding rectangle */
rect.pt1.x = PDC_pixel_x(fbstate, col);
rect.pt1.y = PDC_pixel_y(fbstate, row);
rect.pt2.x = rect.pt1.x + nchars * fbstate->fwidth - 1;
rect.pt2.y = rect.pt1.y + fbstate->fheight - 1;
area.x = PDC_pixel_x(fbstate, col);
area.y = PDC_pixel_y(fbstate, row);
area.w = nchars * fbstate->fwidth;
area.h = fbstate->fheight;
/* Then perform the update via IOCTL */
ret = ioctl(fbstate->fbfd, FBIO_UPDATE,
(unsigned long)((uintptr_t)&rect));
(unsigned long)((uintptr_t)&area));
if (ret < 0)
{
PDC_LOG(("ERROR: ioctl(FBIO_UPDATE) failed: %d\n", errno));
@ -569,20 +569,20 @@ static void PDC_putc(FAR struct pdc_fbstate_s *fbstate, int row, int col,
return;
}
/* Get the foreground and background colors of the character */
/* Get the foreground and background colors of the character */
PDC_pair_content(PAIR_NUMBER(ch), &fg, &bg);
PDC_pair_content(PAIR_NUMBER(ch), &fg, &bg);
/* Handle the A_REVERSE attribute. */
/* Handle the A_REVERSE attribute. */
if ((ch & A_REVERSE) != 0)
{
/* Swap the foreground and background colors if reversed */
if ((ch & A_REVERSE) != 0)
{
/* Swap the foreground and background colors if reversed */
short tmp = fg;
fg = bg;
bg = tmp;
}
short tmp = fg;
fg = bg;
bg = tmp;
}
#ifdef CONFIG_PDCURSES_CHTYPE_LONG
/* Translate characters 0-127 via acs_map[], if they're flagged with
@ -668,9 +668,9 @@ static void PDC_putc(FAR struct pdc_fbstate_s *fbstate, int row, int col,
****************************************************************************/
#ifdef CONFIG_SYSTEM_TERMCURSES
static void PDC_gotoyx_term(FAR SCREEN *sp, int row, int col)
static void PDC_gotoyx_term(FAR SCREEN *s, int row, int col)
{
FAR struct pdc_termscreen_s *termscreen = (FAR struct pdc_termscreen_s *)sp;
FAR struct pdc_termscreen_s *termscreen = (FAR struct pdc_termscreen_s *)s;
FAR struct pdc_termstate_s *termstate;
termstate = &termscreen->termstate;
@ -741,16 +741,16 @@ static void PDC_set_char_attrib_term(FAR struct pdc_termscreen_s *termscreen,
PDC_pair_content(PAIR_NUMBER(ch), &fg, &bg);
/* Handle the A_REVERSE attribute. */
/* Handle the A_REVERSE attribute. */
if ((ch & A_REVERSE) != 0)
{
/* Swap the foreground and background colors if reversed */
if ((ch & A_REVERSE) != 0)
{
/* Swap the foreground and background colors if reversed */
short tmp = fg;
fg = bg;
bg = tmp;
}
short tmp = fg;
fg = bg;
bg = tmp;
}
/* Set the color */
@ -809,7 +809,6 @@ static void PDC_set_char_attrib_term(FAR struct pdc_termscreen_s *termscreen,
termstate->bg_green = termstate->rgbcolor[bg].green;
termstate->bg_blue = termstate->rgbcolor[bg].blue;
}
}
#endif /* CONFIG_SYSTEM_TERMCURSES */
@ -819,17 +818,17 @@ static void PDC_set_char_attrib_term(FAR struct pdc_termscreen_s *termscreen,
* Description:
* The core output routine. It takes len chtype entities from srcp (a
* pointer into curscr) and renders them to the physical screen at line
* lineno, column x. It must also translate characters 0-127 via acs_map[],
* lineno, column x. It must also translate characters 0-127 via acs_map[],
* if they're flagged with A_ALTCHARSET in the attribute portion of the
* chtype.
*
****************************************************************************/
#ifdef CONFIG_SYSTEM_TERMCURSES
static void PDC_transform_line_term(FAR SCREEN *sp, int lineno, int x,
static void PDC_transform_line_term(FAR SCREEN *s, int lineno, int x,
int len, FAR const chtype *srcp)
{
FAR struct pdc_termscreen_s *termscreen = (FAR struct pdc_termscreen_s *)sp;
FAR struct pdc_termscreen_s *termscreen = (FAR struct pdc_termscreen_s *)s;
FAR struct pdc_termstate_s *termstate = &termscreen->termstate;
int c;
int i;
@ -842,7 +841,7 @@ static void PDC_transform_line_term(FAR SCREEN *sp, int lineno, int x,
/* Loop through all characters to be displayed */
for (c = 0; c < len;)
for (c = 0; c < len; )
{
/* Get the foreground and background colors of the character */
@ -850,10 +849,10 @@ static void PDC_transform_line_term(FAR SCREEN *sp, int lineno, int x,
/* Write next character(s) */
ch = *srcp & 0x7F;
ch = *srcp & 0x7f;
buffer[0] = ch;
for (i = 1; i < sizeof(buffer) && c+i < len; i++)
for (i = 1; i < sizeof(buffer) && c + i < len; i++)
{
/* Break if the attributes change */
@ -862,7 +861,7 @@ static void PDC_transform_line_term(FAR SCREEN *sp, int lineno, int x,
break;
}
ch = *(srcp + i) & 0x7F;
ch = *(srcp + i) & 0x7f;
buffer[i] = ch;
}
@ -950,7 +949,7 @@ void PDC_gotoyx(int row, int col)
* Description:
* The core output routine. It takes len chtype entities from srcp (a
* pointer into curscr) and renders them to the physical screen at line
* lineno, column x. It must also translate characters 0-127 via acs_map[],
* lineno, column x. It must also translate characters 0-127 via acs_map[],
* if they're flagged with A_ALTCHARSET in the attribute portion of the
* chtype.
*
@ -1019,8 +1018,8 @@ void PDC_clear_screen(FAR struct pdc_fbstate_s *fbstate)
int row;
int col;
#ifdef CONFIG_LCD_UPDATE
struct nxgl_rect_s rect;
#ifdef CONFIG_FB_UPDATE
struct fb_area_s area;
int ret;
#endif
@ -1057,26 +1056,27 @@ void PDC_clear_screen(FAR struct pdc_fbstate_s *fbstate)
row < fbstate->yres;
row++, line += fbstate->stride)
{
for (col = 0, dest = (FAR pdc_color_t *)line;
for (col = 0, dest = (FAR pdc_color_t *)line;
col < width;
col++)
{
*dest++ = bgcolor;
}
{
*dest++ = bgcolor;
}
}
#ifdef CONFIG_LCD_UPDATE
#ifdef CONFIG_FB_UPDATE
/* Update the entire display */
/* Setup the bounding rectangle */
rect.pt1.x = 0;
rect.pt1.y = 0;
rect.pt2.x = fbstate->xres - 1;
rect.pt2.y = fbstate->yres - 1;
area.x = 0;
area.y = 0;
area.w = fbstate->xres;
area.h = fbstate->yres;
/* Then perform the update via IOCTL */
ret = ioctl(fbstate->fbfd, FBIO_UPDATE, (unsigned long)((uintptr_t)&rect));
ret = ioctl(fbstate->fbfd, FBIO_UPDATE, (unsigned long)((uintptr_t)&area));
if (ret < 0)
{
PDC_LOG(("ERROR: ioctl(FBIO_UPDATE) failed: %d\n", errno));