diff --git a/arch/sim/src/sim/up_framebuffer.c b/arch/sim/src/sim/up_framebuffer.c index 2457bcc44a..cdfaf19c77 100644 --- a/arch/sim/src/sim/up_framebuffer.c +++ b/arch/sim/src/sim/up_framebuffer.c @@ -46,8 +46,6 @@ #include #include -#include -#include #include #include "up_internal.h" @@ -461,25 +459,3 @@ FAR struct fb_vtable_s *up_fbgetvplane(int display, int vplane) void up_fbuninitialize(int display) { } - -/**************************************************************************** - * Name: nx_notify_rectangle - * - * Description: - * Must be provided if CONFIG_NX_UPDATE is enabled - * - * Input Parameters: - * display - In the case of hardware with multiple displays, this - * specifies the display. Normally this is zero. - * - * Returned Value: - * None - * - ****************************************************************************/ - -#ifdef CONFIG_NX_UPDATE -void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, - FAR const struct nxgl_rect_s *rect) -{ -} -#endif diff --git a/drivers/lcd/Kconfig b/drivers/lcd/Kconfig index abaf28110c..cb4912f559 100644 --- a/drivers/lcd/Kconfig +++ b/drivers/lcd/Kconfig @@ -22,17 +22,12 @@ config LCD_PACKEDMSFIRST bool default n -config LCD_UPDATE - bool - default n - select NX_UPDATE if NX - comment "Common Graphic LCD Settings" config LCD_FRAMEBUFFER bool "LCD framebuffer front end" default n - select LCD_UPDATE + select FB_UPDATE ---help--- Enable a "front end" that converts an sequential LCD driver into a standard, NuttX frame buffer driver. diff --git a/drivers/lcd/lcd_framebuffer.c b/drivers/lcd/lcd_framebuffer.c index fc00ff959b..e049e6fa85 100644 --- a/drivers/lcd/lcd_framebuffer.c +++ b/drivers/lcd/lcd_framebuffer.c @@ -47,8 +47,6 @@ #include #include -#include -#include #include #include @@ -88,8 +86,8 @@ struct lcdfb_dev_s /* Update the LCD when there is a change to the framebuffer */ -static int lcdfb_update(FAR struct lcdfb_dev_s *priv, - FAR const struct nxgl_rect_s *rect); +static int lcdfb_updateearea(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area); /* Get information about the video controller configuration and the * configuration of each color plane. @@ -167,16 +165,17 @@ static FAR struct lcdfb_dev_s *lcdfb_find(int display) } /**************************************************************************** - * Name: lcdfb_update + * Name: lcdfb_updateearea * * Description: * Update the LCD when there is a change to the framebuffer. * ****************************************************************************/ -static int lcdfb_update(FAR struct lcdfb_dev_s *priv, - FAR const struct nxgl_rect_s *rect) +static int lcdfb_updateearea(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area) { + FAR struct lcdfb_dev_s *priv = (FAR struct lcdfb_dev_s *)vtable; FAR struct lcd_planeinfo_s *pinfo = &priv->pinfo; FAR uint8_t *run; fb_coord_t row; @@ -187,27 +186,31 @@ static int lcdfb_update(FAR struct lcdfb_dev_s *priv, fb_coord_t endy; int ret; + DEBUGASSERT(area != NULL); + DEBUGASSERT(area->w >= 1); + DEBUGASSERT(area->h >= 1); + /* Clip to fit in the framebuffer */ - startx = rect->pt1.x; + startx = area->x; if (startx < 0) { startx = 0; } - endx = rect->pt2.x; + endx = startx + area->w - 1; if (endx >= priv->xres) { endx = priv->xres - 1; } - starty = rect->pt1.y; + starty = area->y; if (starty < 0) { starty = 0; } - endy = rect->pt2.y; + endy = starty + area->h - 1; if (endy >= priv->yres) { endy = priv->yres - 1; @@ -473,7 +476,7 @@ int up_fbinitialize(int display) FAR struct lcdfb_dev_s *priv; FAR struct lcd_dev_s *lcd; struct fb_videoinfo_s vinfo; - struct nxgl_rect_s rect; + struct fb_area_s area; int ret; lcdinfo("display=%d\n", display); @@ -502,6 +505,7 @@ int up_fbinitialize(int display) priv->vtable.getcursor = lcdfb_getcursor, priv->vtable.setcursor = lcdfb_setcursor, #endif + priv->vtable.updatearea = lcdfb_updateearea, #ifdef CONFIG_LCD_EXTERNINIT /* Use external graphics driver initialization */ @@ -577,12 +581,12 @@ int up_fbinitialize(int display) /* Write the entire framebuffer to the LCD */ - rect.pt1.x = 0; - rect.pt1.y = 0; - rect.pt2.x = priv->xres - 1; - rect.pt2.y = priv->yres - 1; + area.x = 0; + area.y = 0; + area.w = priv->xres; + area.h = priv->yres; - ret = lcdfb_update(priv, &rect); + ret = lcdfb_updateearea(&priv->vtable, &area); if (ret < 0) { lcderr("FB update failed: %d\n", ret); @@ -700,57 +704,4 @@ void up_fbuninitialize(int display) } } -/**************************************************************************** - * Name: nx_notify_rectangle - * - * Description: - * When CONFIG_LCD_UPDATE=y, then the graphics system will callout to - * inform some external module that the display has been updated. This - * would be useful in a couple for cases. - * - * - When a serial LCD is used, but a framebuffer is used to access the - * LCD. In this case, the update callout can be used to refresh the - * affected region of the display. - * - * - When VNC is enabled. This is case, this callout is necessary to - * update the remote frame buffer to match the local framebuffer. - * - * When this feature is enabled, some external logic must provide this - * interface. This is the function that will handle the notification. It - * receives the rectangular region that was updated on the provided plane. - * - * NOTE: This function is also required for use with the LCD framebuffer - * driver front end when CONFIG_LCD_UPDATE=y, although that use does not - * depend on CONFIG_NX (and this function seems misnamed in that case). - * - ****************************************************************************/ - -#if defined(CONFIG_LCD_UPDATE) || defined(CONFIG_NX_UPDATE) -void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, - FAR const struct nxgl_rect_s *rect) -{ - FAR struct fb_planeinfo_s *fpinfo = (FAR struct fb_planeinfo_s *)pinfo; - FAR struct lcdfb_dev_s *priv; - int ret; - - DEBUGASSERT(fpinfo != NULL && rect != NULL); - - /* Look up the LCD framebuffer state structure for this display. - * - * REVISIT: If many LCD framebuffers are used, then this lookup would be - * a performance issue. - */ - - priv = lcdfb_find(fpinfo->display); - if (priv != NULL) - { - ret = lcdfb_update(priv, rect); - if (ret < 0) - { - lcderr("FB update failed: %d\n", ret); - } - } -} -#endif - #endif /* CONFIG_LCD_FRAMEBUFFER */ diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index e7c0bcbedc..f0af427442 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -3,6 +3,37 @@ # see the file kconfig-language.txt in the NuttX tools repository. # +config FB_CMAP + bool + default n + ---help--- + Set by driver-specific configuration to indicate support for color + mapping. Not directly user selectable. + +config FB_TRANSPARENCY + bool + default n + ---help--- + Set by driver-specific configuration to indicate support for color + transparency. Not directly user selectable. + +config FB_UPDATE + bool + default n + +config FB_SYNC + bool "Hardware signals vertical sync" + default n + +config FB_OVERLAY + bool "Framebuffer overlay support" + default n + +config FB_OVERLAY_BLIT + bool "Framebuffer overlay blit support" + depends on FB_OVERLAY + default n + menuconfig DRIVERS_VIDEO bool "Video Device Support" default n @@ -15,37 +46,6 @@ config VIDEO_FB bool "Framebuffer character driver" default n -config FB_CMAP - bool - depends on VIDEO_FB - default n - ---help--- - Set by driver-specific configuration to indicate support for color - mapping. Not directly user selectable. - -config FB_TRANSPARENCY - bool - depends on VIDEO_FB - default n - ---help--- - Set by driver-specific configuration to indicate support for color - transparency. Not directly user selectable. - -config FB_SYNC - bool "Hardware signals vertical sync" - depends on VIDEO_FB - default n - -config FB_OVERLAY - bool "Framebuffer overlay support" - depends on VIDEO_FB - default n - -config FB_OVERLAY_BLIT - bool "Framebuffer overlay blit support" - depends on FB_OVERLAY - default n - config VIDEO_STREAM bool "Video Stream Support" default n diff --git a/drivers/video/fb.c b/drivers/video/fb.c index fecf0aa594..a1423a84d4 100644 --- a/drivers/video/fb.c +++ b/drivers/video/fb.c @@ -49,8 +49,6 @@ #include #include #include -#include -#include #include /**************************************************************************** @@ -402,20 +400,13 @@ static int fb_ioctl(FAR struct file *filep, int cmd, unsigned long arg) break; #endif -#ifdef CONFIG_LCD_UPDATE - case FBIO_UPDATE: /* Update the LCD with the modified framebuffer data */ +#ifdef CONFIG_FB_UPDATE + case FBIO_UPDATE: /* Update the modified framebuffer data */ { - FAR struct nxgl_rect_s *rect = - (FAR struct nxgl_rect_s *)((uintptr_t)arg); - struct fb_planeinfo_s pinfo; + struct fb_area_s *area = (FAR struct fb_area_s *)((uintptr_t)arg); - DEBUGASSERT(fb->vtable != NULL && - fb->vtable->getplaneinfo != NULL); - ret = fb->vtable->getplaneinfo(fb->vtable, fb->plane, &pinfo); - if (ret >= 0) - { - nx_notify_rectangle((FAR NX_PLANEINFOTYPE *)&pinfo, rect); - } + DEBUGASSERT(fb->vtable != NULL && fb->vtable->updatearea != NULL); + ret = fb->vtable->updatearea(fb->vtable, area); } break; #endif diff --git a/graphics/Kconfig b/graphics/Kconfig index 0e243f5d56..aa7ccf82d9 100644 --- a/graphics/Kconfig +++ b/graphics/Kconfig @@ -143,7 +143,7 @@ config NX_WRITEONLY config NX_UPDATE bool "Display update hooks" - default n + default FB_UPDATE && !NX_LCDDRIVER ---help--- Enable a callout to inform some external module that the display has been updated. This would be useful in a couple for cases. @@ -158,8 +158,11 @@ config NX_UPDATE When this feature is enabled, some external logic must provide this interface: - void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, - FAR const struct nxgl_rect_s *rect); + fb_vtable_s + { + int (*updatearea)(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area); + }; That is the function that will handle the notification. It receives the rectangular region that was updated in the provided diff --git a/graphics/nxbe/Make.defs b/graphics/nxbe/Make.defs index e6f9ff751d..c2ae20adf7 100644 --- a/graphics/nxbe/Make.defs +++ b/graphics/nxbe/Make.defs @@ -50,6 +50,10 @@ else ifeq ($(CONFIG_NX_HWCURSOR),y) CSRCS += nxbe_cursor.c endif +ifeq ($(CONFIG_NX_UPDATE),y) +CSRCS += nxbe_notify_rectangle.c +endif + DEPPATH += --dep-path nxbe CFLAGS += ${shell $(INCDIR) "$(CC)" $(TOPDIR)/graphics/nxbe} VPATH += :nxbe diff --git a/graphics/nxbe/nxbe.h b/graphics/nxbe/nxbe.h index ecea23c7e1..e56ba0c87c 100644 --- a/graphics/nxbe/nxbe.h +++ b/graphics/nxbe/nxbe.h @@ -189,6 +189,7 @@ struct nxbe_plane_s /* Framebuffer plane info describing destination video plane */ + NX_DRIVERTYPE *driver; NX_PLANEINFOTYPE pinfo; }; @@ -216,14 +217,14 @@ struct nxbe_clipops_s #if defined(CONFIG_NX_SWCURSOR) struct nxbe_cursor_s { - bool visible; /* True: the cursor is visible */ - struct nxgl_rect_s bounds; /* Cursor image bounding box */ + bool visible; /* True: the cursor is visible */ + struct nxgl_rect_s bounds; /* Cursor image bounding box */ nxgl_mxpixel_t color1[CONFIG_NX_NPLANES]; /* Color1 is main color of the cursor */ nxgl_mxpixel_t color2[CONFIG_NX_NPLANES]; /* Color2 is color of any border */ nxgl_mxpixel_t color3[CONFIG_NX_NPLANES]; /* Color3 is the blended color */ - size_t allocsize; /* Size of the background allocation */ - FAR const uint8_t *image; /* Cursor image at 2-bits/pixel */ - FAR nxgl_mxpixel_t *bkgd; /* Cursor background in device pixels */ + size_t allocsize; /* Size of the background allocation */ + FAR const uint8_t *image; /* Cursor image at 2-bits/pixel */ + FAR nxgl_mxpixel_t *bkgd; /* Cursor background in device pixels */ }; #elif defined(CONFIG_NX_HWCURSOR) struct nxbe_cursor_s @@ -252,9 +253,9 @@ struct nxbe_state_s FAR struct nxbe_window_s *topwnd; /* The window at the top of the display */ struct nxbe_window_s bkgd; /* The background window is always at the bottom */ - /* At present, only a solid colored background is supported for refills. The - * following provides the background color. It would be nice to support - * background bitmap images as well. + /* At present, only a solid colored background is supported for refills. + * The following provides the background color. It would be nice to + * support background bitmap images as well. */ nxgl_mxpixel_t bgcolor[CONFIG_NX_NPLANES]; @@ -279,13 +280,14 @@ struct nxbe_state_s #undef EXTERN #if defined(__cplusplus) #define EXTERN extern "C" -extern "C" { +extern "C" +{ #else #define EXTERN extern #endif /**************************************************************************** - * Public Functions + * Public Function Prototypes ****************************************************************************/ /**************************************************************************** @@ -300,6 +302,32 @@ extern "C" { int nxbe_colormap(FAR NX_DRIVERTYPE *dev); #endif +/**************************************************************************** + * Name: nxbe_notify_rectangle + * + * Description: + * When CONFIG_NX_UPDATE=y, then the graphics system will callout to + * inform some external module that the display has been updated. This + * would be useful in a couple for cases. + * + * - When a serial LCD is used, but a framebuffer is used to access the + * LCD. In this case, the update callout can be used to refresh the + * affected region of the display. + * + * - When VNC is enabled. This is case, this callout is necessary to + * update the remote frame buffer to match the local framebuffer. + * + * When this feature is enabled, some external logic must provide this + * interface. This is the function that will handle the notification. It + * receives the rectangular region that was updated on the provided plane. + * + ****************************************************************************/ + +#ifdef CONFIG_NX_UPDATE +void nxbe_notify_rectangle(FAR NX_DRIVERTYPE *dev, + FAR const struct nxgl_rect_s *rect); +#endif + /**************************************************************************** * Name: nx_configure * @@ -523,8 +551,8 @@ void nxbe_setvisibility(FAR struct nxbe_window_s *wnd, bool hide); * Name: nxbe_setpixel * * Description: - * Set a single pixel in the window to the specified color. This is simply - * a degenerate case of nxbe_fill(), but may be optimized in some architectures. + * Set a single pixel in the window to the specified color. This is simply a + * degenerate case of nxbe_fill, but may be optimized in some architectures. * * Input Parameters: * wnd - The window structure reference diff --git a/graphics/nxbe/nxbe_bitmap.c b/graphics/nxbe/nxbe_bitmap.c index b93899e5f7..0b76d34b27 100644 --- a/graphics/nxbe/nxbe_bitmap.c +++ b/graphics/nxbe/nxbe_bitmap.c @@ -67,8 +67,8 @@ struct nx_bitmap_s * Name: bitmap_clipcopy * * Description: - * Called from nxbe_clipper() to performed the fill operation on visible portions - * of the rectangle. + * Called from nxbe_clipper() to performed the fill operation on visible + * portions of the rectangle. * ****************************************************************************/ @@ -86,7 +86,7 @@ static void bitmap_clipcopy(FAR struct nxbe_clipops_s *cops, #ifdef CONFIG_NX_UPDATE /* Notify external logic that the display has been updated */ - nx_notify_rectangle(&plane->pinfo, rect); + nxbe_notify_rectangle(plane->driver, rect); #endif } @@ -340,8 +340,8 @@ void nxbe_bitmap(FAR struct nxbe_window_s *wnd, nxbe_bitmap_dev(wnd, dest, src, origin, stride); #ifdef CONFIG_NX_SWCURSOR - /* Update cursor backup memory and redraw the cursor in the modified window - * region. + /* Update cursor backup memory and redraw the cursor in the modified + * window region. */ nxbe_cursor_backupdraw_all(wnd, dest); diff --git a/graphics/nxbe/nxbe_configure.c b/graphics/nxbe/nxbe_configure.c index 5178e81762..802012f1ae 100644 --- a/graphics/nxbe/nxbe_configure.c +++ b/graphics/nxbe/nxbe_configure.c @@ -107,11 +107,6 @@ int nxbe_configure(FAR NX_DRIVERTYPE *dev, FAR struct nxbe_state_s *be) CONFIG_NX_NPLANES, be->vinfo.nplanes); return -E2BIG; } - else if (be->vinfo.nplanes < CONFIG_NX_NPLANES) - { - gwarn("WARNING: NX configured for %d planes, controller only needs %d\n", - CONFIG_NX_NPLANES, be->vinfo.nplanes); - } #endif /* Then get information about each color plane */ @@ -125,6 +120,8 @@ int nxbe_configure(FAR NX_DRIVERTYPE *dev, FAR struct nxbe_state_s *be) return ret; } + be->plane[i].driver = dev; + /* Select rasterizers to match the BPP reported for this plane. * NOTE that there are configuration options to eliminate support * for unused BPP values. If the unused BPP values are not suppressed @@ -309,5 +306,6 @@ int nxbe_configure(FAR NX_DRIVERTYPE *dev, FAR struct nxbe_state_s *be) return -ENOSYS; } } + return OK; } diff --git a/graphics/nxbe/nxbe_fill.c b/graphics/nxbe/nxbe_fill.c index 8f941b1e1e..94052bd69b 100644 --- a/graphics/nxbe/nxbe_fill.c +++ b/graphics/nxbe/nxbe_fill.c @@ -83,7 +83,7 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, #ifdef CONFIG_NX_UPDATE /* Notify external logic that the display has been updated */ - nx_notify_rectangle(&plane->pinfo, rect); + nxbe_notify_rectangle(plane->driver, rect); #endif } @@ -168,8 +168,8 @@ static inline void nxbe_fill_pwfb(FAR struct nxbe_window_s *wnd, DEBUGASSERT(wnd->be->plane[0].pwfb.fillrectangle != NULL); - /* The rectangle that we receive here is in absolute device coordinates. We - * need to restore this to windows relative coordinates. + /* The rectangle that we receive here is in absolute device coordinates. + * We need to restore this to windows relative coordinates. */ nxgl_rectoffset(&relrect, rect, -wnd->bounds.pt1.x, -wnd->bounds.pt1.y); diff --git a/graphics/nxbe/nxbe_filltrapezoid.c b/graphics/nxbe/nxbe_filltrapezoid.c index e15063638e..62a455d4f5 100644 --- a/graphics/nxbe/nxbe_filltrapezoid.c +++ b/graphics/nxbe/nxbe_filltrapezoid.c @@ -78,8 +78,8 @@ struct nxbe_filltrap_s * Name: nxbe_clipfilltrapezoid * * Description: - * Called from nxbe_clipper() to performed the fill operation on visible portions - * of the rectangle. + * Called from nxbe_clipper() to performed the fill operation on visible + * portions of the rectangle. * ****************************************************************************/ @@ -107,7 +107,7 @@ static void nxbe_clipfilltrapezoid(FAR struct nxbe_clipops_s *cops, MIN(fillinfo->trap.bot.x2, rect->pt2.x)); update.pt2.y = MIN(fillinfo->trap.bot.y, rect->pt2.y); - nx_notify_rectangle(&plane->pinfo, &update); + nxbe_notify_rectangle(plane->driver, &update); #endif } @@ -129,10 +129,11 @@ static void nxbe_clipfilltrapezoid(FAR struct nxbe_clipops_s *cops, * ****************************************************************************/ -static inline void nxbe_filltrapezoid_dev(FAR struct nxbe_window_s *wnd, - FAR const struct nxgl_rect_s *bounds, - FAR const struct nxgl_trapezoid_s *trap, - nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) +static inline void +nxbe_filltrapezoid_dev(FAR struct nxbe_window_s *wnd, + FAR const struct nxgl_rect_s *bounds, + FAR const struct nxgl_trapezoid_s *trap, + nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) { struct nxbe_filltrap_s info; int i; @@ -190,10 +191,11 @@ static inline void nxbe_filltrapezoid_dev(FAR struct nxbe_window_s *wnd, ****************************************************************************/ #ifdef CONFIG_NX_RAMBACKED -static inline void nxbe_filltrapezoid_pwfb(FAR struct nxbe_window_s *wnd, - FAR const struct nxgl_rect_s *bounds, - FAR const struct nxgl_trapezoid_s *trap, - nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) +static inline void +nxbe_filltrapezoid_pwfb(FAR struct nxbe_window_s *wnd, + FAR const struct nxgl_rect_s *bounds, + FAR const struct nxgl_trapezoid_s *trap, + nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) { FAR const void *src[CONFIG_NX_NPLANES]; struct nxgl_trapezoid_s reltrap; @@ -214,9 +216,9 @@ static inline void nxbe_filltrapezoid_pwfb(FAR struct nxbe_window_s *wnd, * REVISIT: Assumes a single color plane. */ - DEBUGASSERT(wnd->be->plane[0].pwfb.filltrapezoid != NULL); - wnd->be->plane[0].pwfb.filltrapezoid(wnd, &reltrap, &relbounds, - color[0]); + DEBUGASSERT(wnd->be->plane[0].pwfb.filltrapezoid != NULL); + wnd->be->plane[0].pwfb.filltrapezoid(wnd, &reltrap, &relbounds, + color[0]); /* Get the source of address of the trapezoid bounding box in the * framebuffer. diff --git a/graphics/nxbe/nxbe_move.c b/graphics/nxbe/nxbe_move.c index 94051e7994..a512980d1a 100644 --- a/graphics/nxbe/nxbe_move.c +++ b/graphics/nxbe/nxbe_move.c @@ -69,8 +69,8 @@ struct nxbe_move_s * Name: nxbe_clipmovesrc * * Description: - * Called from nxbe_clipper() to performed the move operation on visible regions - * of the rectangle. + * Called from nxbe_clipper() to performed the move operation on visible + * regions of the rectangle. * ****************************************************************************/ @@ -92,7 +92,9 @@ static void nxbe_clipmovesrc(FAR struct nxbe_clipops_s *cops, offset.x = rect->pt1.x + info->offset.x; offset.y = rect->pt1.y + info->offset.y; - /* Move the source rectangle to the destination position in the device */ + /* Move the source rectangle to the destination position in the + * device + */ plane->dev.moverectangle(&plane->pinfo, rect, &offset); @@ -109,7 +111,7 @@ static void nxbe_clipmovesrc(FAR struct nxbe_clipops_s *cops, * rectangle has changed. */ - nx_notify_rectangle(&plane->pinfo, &update); + nxbe_notify_rectangle(plane->driver, &update); #endif } } @@ -118,8 +120,8 @@ static void nxbe_clipmovesrc(FAR struct nxbe_clipops_s *cops, * Name: nxbe_clipmoveobscured * * Description: - * Called from nxbe_clipper() to performed the move operation on obsrured regions - * of the rectangle. + * Called from nxbe_clipper() to performed the move operation on obsrured + * regions of the rectangle. * ****************************************************************************/ @@ -189,7 +191,7 @@ static void nxbe_clipmovedest(FAR struct nxbe_clipops_s *cops, nxbe_clipper(dstdata->wnd->above, &src, dstdata->order, &srcinfo.cops, plane); - } + } } /**************************************************************************** @@ -336,8 +338,8 @@ static inline void nxbe_move_pwfb(FAR struct nxbe_window_s *wnd, struct nxgl_rect_s destrect; unsigned int bpp; - /* The rectangle that we receive here is in absolute device coordinates. We - * need to restore this to windows relative coordinates. + /* The rectangle that we receive here is in absolute device coordinates. + * We need to restore this to windows relative coordinates. */ nxgl_rectoffset(&srcrect, rect, -wnd->bounds.pt1.x, -wnd->bounds.pt1.y); @@ -457,7 +459,9 @@ void nxbe_move(FAR struct nxbe_window_s *wnd, if (!nxgl_nullrect(&srcrect)) { #ifdef CONFIG_NX_RAMBACKED - /* Update the pre-window framebuffer first, then the device memory. */ + /* Update the pre-window framebuffer first, then the device + * memory. + */ if (NXBE_ISRAMBACKED(wnd)) { diff --git a/graphics/nxbe/nxbe_notify_rectangle.c b/graphics/nxbe/nxbe_notify_rectangle.c new file mode 100644 index 0000000000..62bd3fae91 --- /dev/null +++ b/graphics/nxbe/nxbe_notify_rectangle.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * graphics/nxbe/nxbe_notify_rectangle.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "nxbe.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nxbe_notify_rectangle + * + * Description: + * When CONFIG_NX_UPDATE=y, then the graphics system will callout to + * inform some external module that the display has been updated. This + * would be useful in a couple for cases. + * + * - When a serial LCD is used, but a framebuffer is used to access the + * LCD. In this case, the update callout can be used to refresh the + * affected region of the display. + * + * - When VNC is enabled. This is case, this callout is necessary to + * update the remote frame buffer to match the local framebuffer. + * + * When this feature is enabled, some external logic must provide this + * interface. This is the function that will handle the notification. It + * receives the rectangular region that was updated on the provided plane. + * + ****************************************************************************/ + +#ifdef CONFIG_NX_UPDATE +void nxbe_notify_rectangle(FAR NX_DRIVERTYPE *dev, + FAR const struct nxgl_rect_s *rect) +{ + struct fb_area_s area; + + nxgl_rect2area(&area, rect); + dev->updatearea(dev, &area); +} +#endif diff --git a/graphics/nxbe/nxbe_setpixel.c b/graphics/nxbe/nxbe_setpixel.c index 97562b93bc..a11877220d 100644 --- a/graphics/nxbe/nxbe_setpixel.c +++ b/graphics/nxbe/nxbe_setpixel.c @@ -64,8 +64,8 @@ struct nxbe_setpixel_s * Name: nxbe_clipfill * * Description: - * Called from nxbe_clipper() to performed the fill operation on visible portions - * of the rectangle. + * Called from nxbe_clipper() to performed the fill operation on visible + * portions of the rectangle. * ****************************************************************************/ @@ -82,7 +82,7 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, #ifdef CONFIG_NX_UPDATE /* Notify external logic that the display has been updated */ - nx_notify_rectangle(&plane->pinfo, rect); + nxbe_notify_rectangle(plane->driver, rect); #endif } @@ -189,7 +189,8 @@ void nxbe_setpixel(FAR struct nxbe_window_s *wnd, #ifdef CONFIG_NX_RAMBACKED /* If this window supports a pre-window frame buffer then shadow the full, * unclipped bitmap in that framebuffer. - * REVISIT: The logic to set a pixel in the per-window frame buffer is missing + * REVISIT: The logic to set a pixel in the per-window frame buffer is + * missing */ DEBUGASSERT(!NXBE_ISRAMBACKED(wnd)); diff --git a/graphics/vnc/server/Kconfig b/graphics/vnc/server/Kconfig index 1b9aec02f3..53d186239a 100644 --- a/graphics/vnc/server/Kconfig +++ b/graphics/vnc/server/Kconfig @@ -7,7 +7,7 @@ menuconfig VNCSERVER bool "VNC server" default n depends on NET_TCP && !NX_LCDDRIVER - select NX_UPDATE + select FB_UPDATE ---help--- Enable support for a VNC Remote Frame Buffer (RFB) server. diff --git a/graphics/vnc/server/vnc_fbdev.c b/graphics/vnc/server/vnc_fbdev.c index 5983a08a15..74ae166744 100644 --- a/graphics/vnc/server/vnc_fbdev.c +++ b/graphics/vnc/server/vnc_fbdev.c @@ -109,6 +109,11 @@ static int up_setcursor(FAR struct fb_vtable_s *vtable, FAR struct fb_setcursor_s *settings); #endif +/* Update the host window when there is a change to the framebuffer */ + +static int up_updateearea(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area); + /**************************************************************************** * Private Data ****************************************************************************/ @@ -403,6 +408,44 @@ static int up_setcursor(FAR struct fb_vtable_s *vtable, } #endif +/**************************************************************************** + * Name: up_updateearea + ****************************************************************************/ + +static int up_updateearea(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area) +{ + FAR struct vnc_fbinfo_s *fbinfo = (FAR struct vnc_fbinfo_s *)vtable; + FAR struct vnc_session_s *session; + struct nxgl_rect_s rect; + int ret = OK; + + DEBUGASSERT(fbinfo != NULL && area != NULL); + + /* Recover the session information from the display number in the planeinfo + * structure. + */ + + DEBUGASSERT(fbinfo->display >= 0 && fbinfo->display < RFB_MAX_DISPLAYS); + session = g_vnc_sessions[fbinfo->display]; + + /* Verify that the session is still valid */ + + if (session != NULL && session->state == VNCSERVER_RUNNING) + { + /* Queue the rectangular update */ + + nxgl_area2rect(&rect, area); + ret = vnc_update_rectangle(session, &rect, true); + if (ret < 0) + { + gerr("ERROR: vnc_update_rectangle failed: %d\n", ret); + } + } + + return ret; +} + /**************************************************************************** * Name: vnc_start_server * @@ -774,6 +817,7 @@ FAR struct fb_vtable_s *up_fbgetvplane(int display, int vplane) fbinfo->vtable.getcursor = up_getcursor, fbinfo->vtable.setcursor = up_setcursor, #endif + fbinfo->vtable.updatearea = up_updateearea, fbinfo->display = display; fbinfo->initialized = true; } @@ -821,55 +865,3 @@ void up_fbuninitialize(int display) } #endif } - -/**************************************************************************** - * Name: nx_notify_rectangle - * - * Description: - * When CONFIG_NX_UPDATE=y, then the graphics system will callout to - * inform some external module that the display has been updated. This - * would be useful in a couple for cases. - * - * - When a serial LCD is used, but a framebuffer is used to access the - * LCD. In this case, the update callout can be used to refresh the - * affected region of the display. - * - * - When VNC is enabled. This is case, this callout is necessary to - * update the remote frame buffer to match the local framebuffer. - * - * When this feature is enabled, some external logic must provide this - * interface. This is the function that will handle the notification. It - * receives the rectangular region that was updated on the provided plane. - * - ****************************************************************************/ - -#ifdef CONFIG_NX_UPDATE -void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, - FAR const struct nxgl_rect_s *rect) -{ - FAR struct vnc_session_s *session; - int ret; - - DEBUGASSERT(pinfo != NULL && rect != NULL); - - /* Recover the session information from the display number in the planeinfo - * structure. - */ - - DEBUGASSERT(pinfo->display >= 0 && pinfo->display < RFB_MAX_DISPLAYS); - session = g_vnc_sessions[pinfo->display]; - - /* Verify that the session is still valid */ - - if (session != NULL && session->state == VNCSERVER_RUNNING) - { - /* Queue the rectangular update */ - - ret = vnc_update_rectangle(session, rect, true); - if (ret < 0) - { - gerr("ERROR: vnc_update_rectangle failed: %d\n", ret); - } - } -} -#endif diff --git a/graphics/vnc/server/vnc_server.h b/graphics/vnc/server/vnc_server.h index d341066f34..379649b3ae 100644 --- a/graphics/vnc/server/vnc_server.h +++ b/graphics/vnc/server/vnc_server.h @@ -60,10 +60,6 @@ /* Configuration */ -#ifndef CONFIG_NX_UPDATE -# error CONFIG_NX_UPDATE must be set to use VNC -#endif - #if !defined(CONFIG_VNCSERVER_PROTO3p3) && !defined(CONFIG_VNCSERVER_PROTO3p8) # error No VNC protocol selected #endif diff --git a/include/nuttx/nx/nx.h b/include/nuttx/nx/nx.h index fa3cc1310e..69f3273b4e 100644 --- a/include/nuttx/nx/nx.h +++ b/include/nuttx/nx/nx.h @@ -205,7 +205,8 @@ struct nx_callback_s **************************************************************************/ #ifdef CONFIG_NX_KBD - void (*kbdin)(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch, FAR void *arg); + void (*kbdin)(NXWINDOW hwnd, uint8_t nch, + FAR const uint8_t *ch, FAR void *arg); #endif /************************************************************************** @@ -270,7 +271,7 @@ extern "C" #endif /**************************************************************************** - * Public Functions + * Public Function Prototypes ****************************************************************************/ /**************************************************************************** @@ -383,8 +384,8 @@ int nx_eventhandler(NXHANDLE handle); * client can then call nv_eventhandler() only when incoming events are * available. * - * Only one such event is issued. Upon receipt of the signal, if the client - * wishes further notifications, it must call nx_eventnotify again. + * Only one such event is issued. Upon receipt of the signal, if the + * client wishes further notifications, it must call nx_eventnotify again. * * Input Parameters: * handle - the handle returned by nx_connect @@ -726,7 +727,7 @@ bool nx_ishidden(NXWINDOW hwnd); * * Description: * Set a single pixel in the window to the specified color. This is simply - * a degenerate case of nx_fill(), but may be optimized in some architectures. + * a degenerate case of nx_fill but may be optimized in some architectures. * * Input Parameters: * wnd - The window structure reference @@ -794,7 +795,8 @@ int nx_getrectangle(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect, * Name: nx_filltrapezoid * * Description: - * Fill the specified trapezoidal region in the window with the specified color + * Fill the specified trapezoidal region in the window with the specified + * color * * Input Parameters: * hwnd - The window handle @@ -943,36 +945,6 @@ int nx_bitmap(NXWINDOW hwnd, FAR const struct nxgl_rect_s *dest, FAR const void *src[CONFIG_NX_NPLANES], FAR const struct nxgl_point_s *origin, unsigned int stride); -/**************************************************************************** - * Name: nx_notify_rectangle - * - * Description: - * When CONFIG_NX_UPDATE=y, then the graphics system will callout to - * inform some external module that the display has been updated. This - * would be useful in a couple for cases. - * - * - When a serial LCD is used, but a framebuffer is used to access the - * LCD. In this case, the update callout can be used to refresh the - * affected region of the display. - * - * - When VNC is enabled. This is case, this callout is necessary to - * update the remote frame buffer to match the local framebuffer. - * - * When this feature is enabled, some external logic must provide this - * interface. This is the function that will handle the notification. It - * receives the rectangular region that was updated on the provided plane. - * - * NOTE: This function is also required for use with the LCD framebuffer - * driver front end when CONFIG_LCD_UPDATE=y, although that use does not - * depend on CONFIG_NX (and this function seems misnamed in that case). - * - ****************************************************************************/ - -#if defined(CONFIG_NX_UPDATE) || defined(CONFIG_LCD_UPDATE) -void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, - FAR const struct nxgl_rect_s *rect); -#endif - /**************************************************************************** * Name: nx_kbdin * @@ -993,13 +965,14 @@ int nx_kbdin(NXHANDLE handle, uint8_t nch, FAR const uint8_t *ch); * * Description: * Used by a thread or interrupt handler that manages some kind of pointing - * hardware to report new positional data to the NX server. That positional + * hardware to report new positional data to the NX server. That positional * data will be routed by the NX server to the appropriate window client. * ****************************************************************************/ #ifdef CONFIG_NX_XYINPUT -int nx_mousein(NXHANDLE handle, nxgl_coord_t x, nxgl_coord_t y, uint8_t buttons); +int nx_mousein(NXHANDLE handle, nxgl_coord_t x, + nxgl_coord_t y, uint8_t buttons); #endif /**************************************************************************** @@ -1033,7 +1006,7 @@ void nx_redrawreq(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect); * Name: nx_constructwindow * * Description: - * This function is the same a nx_openwindow EXCEPT that the client provides + * This function is the same as nx_openwindow EXCEPT the client provides * the window structure instance. nx_constructwindow will initialize the * the pre-allocated window structure for use by NX. This function is * provided in addition to nx_openwindow in order to support a kind of @@ -1041,7 +1014,7 @@ void nx_redrawreq(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect); * are not visible to NX. * * NOTE: hwnd must have been allocated using a user-space allocator that - * permits user access to the window. Once provided to nx_constructwindow() + * permits user access to the window. Once provided to nx_constructwindow * that memory is owned and managed by NX. On certain error conditions or * when the window is closed, NX will free the window. * diff --git a/include/nuttx/nx/nxglib.h b/include/nuttx/nx/nxglib.h index 25a630eaf4..58dccfae93 100644 --- a/include/nuttx/nx/nxglib.h +++ b/include/nuttx/nx/nxglib.h @@ -65,6 +65,7 @@ #endif /* Driver Selection *********************************************************/ + /* NX_DRIVERTYPE selects either the framebuffer or LCD driver; * NX_PLANINFO_TYPE hides the difference in the framebuffer and LCD driver * plane types. defines are used instead of a typedefs to avoid type @@ -80,6 +81,7 @@ #endif /* NXGL Macros **************************************************************/ + /* Mnemonics for indices */ #define NX_TOP_NDX (0) @@ -144,6 +146,28 @@ void nxgl_rgb2yuv(uint8_t r, uint8_t g, uint8_t b, void nxgl_yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b); +/**************************************************************************** + * Name: nxgl_area2rect + * + * Description: + * Convert nxgl_rect_s to fb_area_s. + * + ****************************************************************************/ + +void nxgl_area2rect(FAR struct nxgl_rect_s *dest, + FAR const struct fb_area_s *src); + +/**************************************************************************** + * Name: nxgl_rect2area + * + * Description: + * Convert nxgl_rect_s to fb_area_s. + * + ****************************************************************************/ + +void nxgl_rect2area(FAR struct fb_area_s *dest, + FAR const struct nxgl_rect_s *src); + /**************************************************************************** * Name: nxgl_rectcopy * @@ -184,7 +208,8 @@ void nxgl_vectoradd(FAR struct nxgl_point_s *dest, * Name: nxgl_vectsubtract * * Description: - * Add subtract vector v2 from vector v1 and return the result in vector dest + * Add subtract vector v2 from vector v1 and return the result in vector + * dest * ****************************************************************************/ @@ -196,7 +221,7 @@ void nxgl_vectsubtract(FAR struct nxgl_point_s *dest, * Name: nxgl_rectintersect * * Description: - * Return the rectangle representing the intersection of the two rectangles. + * Return the rectangle representing the intersection of the two rectangles * ****************************************************************************/ diff --git a/include/nuttx/video/fb.h b/include/nuttx/video/fb.h index 51fbf1e9d4..36924066e5 100644 --- a/include/nuttx/video/fb.h +++ b/include/nuttx/video/fb.h @@ -245,11 +245,11 @@ * fb_setcursor_s */ #endif -#ifdef CONFIG_LCD_UPDATE +#ifdef CONFIG_FB_UPDATE # define FBIO_UPDATE _FBIOC(0x0007) /* Update a rectangular region in * the framebuffer * Argument: read-only struct - * nxgl_rect_s */ + * fb_area_s */ #endif #ifdef CONFIG_FB_SYNC @@ -324,15 +324,6 @@ struct fb_planeinfo_s uint8_t bpp; /* Bits per pixel */ }; -#ifdef CONFIG_FB_OVERLAY -/* This structure describes the transparency. */ - -struct fb_transp_s -{ - uint8_t transp; /* Transparency */ - uint8_t transp_mode; /* Transparency mode */ -}; - /* This structure describes an area. */ struct fb_area_s @@ -343,6 +334,15 @@ struct fb_area_s fb_coord_t h; /* Height of the area */ }; +#ifdef CONFIG_FB_OVERLAY +/* This structure describes the transparency. */ + +struct fb_transp_s +{ + uint8_t transp; /* Transparency */ + uint8_t transp_mode; /* Transparency mode */ +}; + /* This structure describes one overlay. */ struct fb_overlayinfo_s @@ -511,6 +511,15 @@ struct fb_vtable_s FAR struct fb_setcursor_s *settings); #endif +#ifdef CONFIG_FB_UPDATE + /* The following are provided only if the video hardware need extera + * notification to update display content. + */ + + int (*updatearea)(FAR struct fb_vtable_s *vtable, + FAR const struct fb_area_s *area); +#endif + #ifdef CONFIG_FB_SYNC /* The following are provided only if the video hardware signals * vertical sync. diff --git a/libs/libnx/nxglib/Make.defs b/libs/libnx/nxglib/Make.defs index dee47b8ef3..a293c7847f 100644 --- a/libs/libnx/nxglib/Make.defs +++ b/libs/libnx/nxglib/Make.defs @@ -44,11 +44,11 @@ CSRCS += nxglib_rgbblend.c # Files needed only by NX ifeq ($(CONFIG_NX),y) -CSRCS += nxglib_circlepts.c nxglib_circletraps.c nxglib_intersecting.c -CSRCS += nxglib_nonintersecting.c nxglib_nullrect.c nxglib_rectadd.c -CSRCS += nxglib_rectcopy.c nxglib_rectinside.c nxglib_rectintersect.c -CSRCS += nxglib_rectoffset.c nxglib_rectoverlap.c nxglib_rectsize.c -CSRCS += nxglib_rectunion.c nxglib_rgb2yuv.c +CSRCS += nxgl_area2rect.c nxglib_circlepts.c nxglib_circletraps.c +CSRCS += nxglib_intersecting.c nxglib_nonintersecting.c nxglib_nullrect.c +CSRCS += nxgl_rect2area.c nxglib_rectadd.c nxglib_rectcopy.c nxglib_rectinside.c +CSRCS += nxglib_rectintersect.c nxglib_rectoffset.c nxglib_rectoverlap.c +CSRCS += nxglib_rectsize.c nxglib_rectunion.c nxglib_rgb2yuv.c CSRCS += nxglib_runcopy.c nxglib_runoffset.c nxglib_splitline.c CSRCS += nxglib_trapcopy.c nxglib_trapoffset.c nxglib_vectoradd.c CSRCS += nxglib_vectsubtract.c nxglib_yuv2rgb.c diff --git a/libs/libnx/nxglib/nxgl_area2rect.c b/libs/libnx/nxglib/nxgl_area2rect.c new file mode 100644 index 0000000000..66246418cb --- /dev/null +++ b/libs/libnx/nxglib/nxgl_area2rect.c @@ -0,0 +1,48 @@ +/**************************************************************************** + * libs/libnx/nxglib/nxgl_area2rect.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nxgl_area2rect + * + * Description: + * Convert fb_area_s to nxgl_rect_s. + * + ****************************************************************************/ + +void nxgl_area2rect(FAR struct nxgl_rect_s *dest, + FAR const struct fb_area_s *src) +{ + dest->pt1.x = src->x; + dest->pt1.y = src->y; + dest->pt2.x = src->x + src->w - 1; + dest->pt2.y = src->y + src->h - 1; +} diff --git a/libs/libnx/nxglib/nxgl_rect2area.c b/libs/libnx/nxglib/nxgl_rect2area.c new file mode 100644 index 0000000000..1374d623b5 --- /dev/null +++ b/libs/libnx/nxglib/nxgl_rect2area.c @@ -0,0 +1,48 @@ +/**************************************************************************** + * libs/libnx/nxglib/nxgl_rect2area.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nxgl_rect2area + * + * Description: + * Convert nxgl_rect_s to fb_area_s. + * + ****************************************************************************/ + +void nxgl_rect2area(FAR struct fb_area_s *dest, + FAR const struct nxgl_rect_s *src) +{ + dest->x = src->pt1.x; + dest->y = src->pt1.y; + dest->w = src->pt2.x - src->pt1.x + 1; + dest->h = src->pt2.y - src->pt1.y + 1; +}