diff --git a/graphics/Kconfig b/graphics/Kconfig index 3e95c2b6bd..4f81aab3f8 100644 --- a/graphics/Kconfig +++ b/graphics/Kconfig @@ -56,6 +56,30 @@ config NX_WRITEONLY Automatically defined if NX_LCDDRIVER and LCD_NOGETRUN are defined. +config NX_UPDATE + bool "Display update hooks' + default n + ---help--- + Enable a 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: + + void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, + FAR const struct nxgl_rect_s *rect); + + That is the function that will handle the notification. It + receives the rectangular region that was updated in the provided + plane. + menu "Supported Pixel Depths" config NX_DISABLE_1BPP diff --git a/graphics/nxbe/nxbe_bitmap.c b/graphics/nxbe/nxbe_bitmap.c index fdaa2e50bc..c4d29681a2 100644 --- a/graphics/nxbe/nxbe_bitmap.c +++ b/graphics/nxbe/nxbe_bitmap.c @@ -1,7 +1,7 @@ /**************************************************************************** * graphics/nxbe/nxbe_bitmap.c * - * Copyright (C) 2008-2009, 2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009, 2012, 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -75,8 +75,17 @@ static void nxs_clipcopy(FAR struct nxbe_clipops_s *cops, FAR const struct nxgl_rect_s *rect) { struct nx_bitmap_s *bminfo = (struct nx_bitmap_s *)cops; + + /* Copy the rectangular region */ + plane->copyrectangle(&plane->pinfo, rect, bminfo->src, &bminfo->origin, bminfo->stride); + +#ifdef CONFIG_NX_UPDATE + /* Notify external logic that the display has been updated */ + + nx_notify_rectangle(&plane->pinfo, rect); +#endif } /**************************************************************************** @@ -106,8 +115,8 @@ static void nxs_clipcopy(FAR struct nxbe_clipops_s *cops, ****************************************************************************/ void nxbe_bitmap(FAR struct nxbe_window_s *wnd, FAR const struct nxgl_rect_s *dest, - FAR const void *src[CONFIG_NX_NPLANES], - FAR const struct nxgl_point_s *origin, unsigned int stride) + FAR const void *src[CONFIG_NX_NPLANES], + FAR const struct nxgl_point_s *origin, unsigned int stride) { struct nx_bitmap_s info; struct nxgl_rect_s bounds; @@ -153,6 +162,7 @@ void nxbe_bitmap(FAR struct nxbe_window_s *wnd, FAR const struct nxgl_rect_s *de nxgl_rectintersect(&remaining, &bounds, &wnd->bounds); nxgl_rectintersect(&remaining, &remaining, &wnd->be->bkgd.bounds); + if (nxgl_nullrect(&remaining)) { return; @@ -177,4 +187,3 @@ void nxbe_bitmap(FAR struct nxbe_window_s *wnd, FAR const struct nxgl_rect_s *de &info.cops, &wnd->be->plane[i]); } } - diff --git a/graphics/nxbe/nxbe_fill.c b/graphics/nxbe/nxbe_fill.c index dfad22b197..c87992052e 100644 --- a/graphics/nxbe/nxbe_fill.c +++ b/graphics/nxbe/nxbe_fill.c @@ -1,7 +1,7 @@ /**************************************************************************** * graphics/nxbe/nxbe_fill.c * - * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009, 2011, 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -40,6 +40,7 @@ #include #include +#include #include "nxbe.h" @@ -71,7 +72,16 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, FAR const struct nxgl_rect_s *rect) { struct nxbe_fill_s *fillinfo = (struct nxbe_fill_s *)cops; + + /* Draw the rectangle */ + plane->fillrectangle(&plane->pinfo, rect, fillinfo->color); + +#ifdef CONFIG_NX_UPDATE + /* Notify external logic that the display has been updated */ + + nx_notify_rectangle(&plane->pinfo, rect); +#endif } /**************************************************************************** diff --git a/graphics/nxbe/nxbe_filltrapezoid.c b/graphics/nxbe/nxbe_filltrapezoid.c index 550be6c175..eb369d75cf 100644 --- a/graphics/nxbe/nxbe_filltrapezoid.c +++ b/graphics/nxbe/nxbe_filltrapezoid.c @@ -1,7 +1,7 @@ /**************************************************************************** * graphics/nxbe/nxbe_filltrapezoid.c * - * Copyright (C) 2008-2009, 2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009, 2012, 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -44,6 +44,18 @@ #include "nxbe.h" +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef MIN +# define MIN(a,b) (((a) < (b)) ? (a) : (b) +#endif + +#ifndef MAX +# define MAX(a,b) (((a) > (b)) ? (a) : (b) +#endif + /**************************************************************************** * Private Types ****************************************************************************/ @@ -73,7 +85,26 @@ static void nxbe_clipfilltrapezoid(FAR struct nxbe_clipops_s *cops, FAR const struct nxgl_rect_s *rect) { struct nxbe_filltrap_s *fillinfo = (struct nxbe_filltrap_s *)cops; +#ifdef CONFIG_NX_UPDATE + FAR const struct nxgl_rect_s *update; +#endif + + /* Draw the trapezond */ + plane->filltrapezoid(&plane->pinfo, &fillinfo->trap, rect, fillinfo->color); + +#ifdef CONFIG_NX_UPDATE + /* Notify external logic that the display has been updated */ + + update.pt1.x = MIN(MAX(fillinfo->trap.top.x1, rect->pt1.x), + MAX(fillinfo->trap.bot.x1, rect->pt1.x)); + update.pt1.y = MAX(fillinfo->trap.top.y, rect->pt1.y); + update.pt2.x = MAX(MIN(fillinfo->trap.top.x2, rect->pt2.x), + 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); +#endif } /**************************************************************************** diff --git a/graphics/nxbe/nxbe_move.c b/graphics/nxbe/nxbe_move.c index 5f142bc11d..32360866c5 100644 --- a/graphics/nxbe/nxbe_move.c +++ b/graphics/nxbe/nxbe_move.c @@ -1,7 +1,7 @@ /**************************************************************************** * graphics/nxbe/nxbe_move.c * - * Copyright (C) 2008-2009, 2011-2012 Gregory Nutt. All rights reserved. + * Copyright (C) 2008-2009, 2011-2012, 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -78,6 +78,9 @@ static void nxbe_clipmovesrc(FAR struct nxbe_clipops_s *cops, { struct nxbe_move_s *info = (struct nxbe_move_s *)cops; struct nxgl_point_s offset; +#ifdef CONFIG_NX_UPDATE + FAR const struct nxgl_rect_s *update; +#endif if (info->offset.x != 0 || info->offset.y != 0) { @@ -86,7 +89,20 @@ 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 */ + plane->moverectangle(&plane->pinfo, rect, &offset); + +#ifdef CONFIG_NX_UPDATE + /* Notify external logic that the display has been updated */ + + update.pt1.x = offset.x; + update.pt1.y = offset.y; + update.pt2.x = rect->pt2.x + info->offset.x; + update.pt2.y = rect->pt2.y + info->offset.y; + + nx_notify_rectangle(&plane->pinfo, &update); +#endif } } diff --git a/graphics/nxbe/nxbe_setpixel.c b/graphics/nxbe/nxbe_setpixel.c index 90cacf629a..81627f0608 100644 --- a/graphics/nxbe/nxbe_setpixel.c +++ b/graphics/nxbe/nxbe_setpixel.c @@ -1,7 +1,7 @@ /**************************************************************************** * graphics/nxbe/nxbe_setpixel.c * - * Copyright (C) 2011 Gregory Nutt. All rights reserved. + * Copyright (C) 2011, 2016 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -40,6 +40,7 @@ #include #include +#include #include "nxbe.h" @@ -71,7 +72,16 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, FAR const struct nxgl_rect_s *rect) { struct nxbe_setpixel_s *fillinfo = (struct nxbe_setpixel_s *)cops; + + /* Set the pixel */ + plane->setpixel(&plane->pinfo, &rect->pt1, fillinfo->color); + +#ifdef CONFIG_NX_UPDATE + /* Notify external logic that the display has been updated */ + + nx_notify_rectangle(&plane->pinfo, rect); +#endif } /**************************************************************************** @@ -79,7 +89,7 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, ****************************************************************************/ /**************************************************************************** - * Name: nxbe_fill + * Name: nxbe_setpixel * * Description: * Fill the specified rectangle in the window with the specified color @@ -95,8 +105,8 @@ static void nxbe_clipfill(FAR struct nxbe_clipops_s *cops, ****************************************************************************/ void nxbe_setpixel(FAR struct nxbe_window_s *wnd, - FAR const struct nxgl_point_s *pos, - nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) + FAR const struct nxgl_point_s *pos, + nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) { struct nxbe_setpixel_s info; struct nxgl_rect_s rect; diff --git a/include/nuttx/nx/nx.h b/include/nuttx/nx/nx.h index feaa67feee..5f6c02a481 100644 --- a/include/nuttx/nx/nx.h +++ b/include/nuttx/nx/nx.h @@ -901,6 +901,32 @@ 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. + * + ****************************************************************************/ + +#ifdef CONFIG_NX_UPDATE +void nx_notify_rectangle(FAR NX_PLANEINFOTYPE *pinfo, + FAR const struct nxgl_rect_s *rect); +#endif + /**************************************************************************** * Name: nx_kbdin *