diff options
Diffstat (limited to 'nuttx/graphics/nxbe')
-rw-r--r-- | nuttx/graphics/nxbe/Make.defs | 2 | ||||
-rw-r--r-- | nuttx/graphics/nxbe/nxbe.h | 11 | ||||
-rw-r--r-- | nuttx/graphics/nxbe/nxbe_fbconfigure.c | 7 | ||||
-rw-r--r-- | nuttx/graphics/nxbe/nxbe_fill.c | 14 | ||||
-rw-r--r-- | nuttx/graphics/nxbe/nxbe_filltrapezoid.c | 162 |
5 files changed, 185 insertions, 11 deletions
diff --git a/nuttx/graphics/nxbe/Make.defs b/nuttx/graphics/nxbe/Make.defs index 034aa8824..647b074c4 100644 --- a/nuttx/graphics/nxbe/Make.defs +++ b/nuttx/graphics/nxbe/Make.defs @@ -37,5 +37,5 @@ NXBE_ASRCS = NXBE_CSRCS = nxbe_fbconfigure.c nxbe_colormap.c nxbe_clipper.c \ nxbe_closewindow.c \ nxbe_setposition.c nxbe_setsize.c nxbe_raise.c nxbe_lower.c \ - nxbe_fill.c nxbe_move.c nxbe_bitmap.c \ + nxbe_fill.c nxbe_filltrapezoid.c nxbe_move.c nxbe_bitmap.c \ nxbe_redraw.c nxbe_redrawbelow.c diff --git a/nuttx/graphics/nxbe/nxbe.h b/nuttx/graphics/nxbe/nxbe.h index f6825a969..958ea9f35 100644 --- a/nuttx/graphics/nxbe/nxbe.h +++ b/nuttx/graphics/nxbe/nxbe.h @@ -55,13 +55,6 @@ # define CONFIG_NX_NPLANES 1 /* Max number of color planes supported */ #endif -/* Mnemonics for indices */ - -#define NX_TOP_NDX (0) -#define NX_LEFT_NDX (1) -#define NX_RIGHT_NDX (2) -#define NX_BOTTOM_NDX (3) - /* These are the values for the clipping order provided to nx_clipper */ #define NX_CLIPORDER_TLRB (0) /* Top-left-right-bottom */ @@ -87,6 +80,10 @@ struct nxbe_plane_s void (*fillrectangle)(FAR struct fb_planeinfo_s *pinfo, FAR const struct nxgl_rect_s *rect, nxgl_mxpixel_t color); + void (*filltrapezoid)(FAR struct fb_planeinfo_s *pinfo, + FAR const struct nxgl_trapezoid_s *trap, + FAR const struct nxgl_rect_s *bounds, + nxgl_mxpixel_t color); void (*moverectangle)(FAR struct fb_planeinfo_s *pinfo, FAR const struct nxgl_rect_s *rect, FAR struct nxgl_point_s *offset); diff --git a/nuttx/graphics/nxbe/nxbe_fbconfigure.c b/nuttx/graphics/nxbe/nxbe_fbconfigure.c index 2e98d4463..0cf41cd27 100644 --- a/nuttx/graphics/nxbe/nxbe_fbconfigure.c +++ b/nuttx/graphics/nxbe/nxbe_fbconfigure.c @@ -128,6 +128,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 1) { be->plane[i].fillrectangle = nxgl_fillrectangle_1bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_1bpp; be->plane[i].moverectangle = nxgl_moverectangle_1bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_1bpp; } @@ -137,6 +138,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 2) { be->plane[i].fillrectangle = nxgl_fillrectangle_2bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_2bpp; be->plane[i].moverectangle = nxgl_moverectangle_2bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_2bpp; } @@ -146,6 +148,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 4) { be->plane[i].fillrectangle = nxgl_fillrectangle_4bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_4bpp; be->plane[i].moverectangle = nxgl_moverectangle_4bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_4bpp; } @@ -155,6 +158,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 8) { be->plane[i].fillrectangle = nxgl_fillrectangle_8bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_8bpp; be->plane[i].moverectangle = nxgl_moverectangle_8bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_8bpp; } @@ -164,6 +168,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 16) { be->plane[i].fillrectangle = nxgl_fillrectangle_16bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_16bpp; be->plane[i].moverectangle = nxgl_moverectangle_16bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_16bpp; } @@ -173,6 +178,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 24) { be->plane[i].fillrectangle = nxgl_fillrectangle_24bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_24bpp; be->plane[i].moverectangle = nxgl_moverectangle_24bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_24bpp; } @@ -182,6 +188,7 @@ int nxbe_fbconfigure(FAR struct fb_vtable_s *fb, FAR struct nxbe_state_s *be) if (be->plane[i].pinfo.bpp == 32) { be->plane[i].fillrectangle = nxgl_fillrectangle_32bpp; + be->plane[i].filltrapezoid = nxgl_filltrapezoid_32bpp; be->plane[i].moverectangle = nxgl_moverectangle_32bpp; be->plane[i].copyrectangle = nxgl_copyrectangle_32bpp; } diff --git a/nuttx/graphics/nxbe/nxbe_fill.c b/nuttx/graphics/nxbe/nxbe_fill.c index e92b21b10..d175d64fc 100644 --- a/nuttx/graphics/nxbe/nxbe_fill.c +++ b/nuttx/graphics/nxbe/nxbe_fill.c @@ -121,15 +121,23 @@ void nxbe_fill(FAR struct nxbe_window_s *wnd, } #endif - /* Offset the rectangle by the window origin to convert it into a bounding box */ + /* Offset the rectangle by the window origin to convert it into a + * bounding box + */ nxgl_rectoffset(&remaining, rect, wnd->origin.x, wnd->origin.y); - /* Clip to the limits of the window and of the background screen */ + /* Clip to the bounding box to the limits of the window and of the + * background screen + */ nxgl_rectintersect(&remaining, &remaining, &wnd->bounds); nxgl_rectintersect(&remaining, &remaining, &wnd->be->bkgd.bounds); + /* Then clip the bounding box due to other windows above this one. + * Render the portions of the trapezoid exposed in visible regions. + */ + if (!nxgl_nullrect(&remaining)) { #if CONFIG_NX_NPLANES > 1 @@ -143,7 +151,7 @@ void nxbe_fill(FAR struct nxbe_window_s *wnd, info.color = color[i]; nxbe_clipper(wnd->above, &remaining, NX_CLIPORDER_DEFAULT, - &info.cops, &wnd->be->plane[0]); + &info.cops, &wnd->be->plane[i]); } } } diff --git a/nuttx/graphics/nxbe/nxbe_filltrapezoid.c b/nuttx/graphics/nxbe/nxbe_filltrapezoid.c new file mode 100644 index 000000000..78445e7f9 --- /dev/null +++ b/nuttx/graphics/nxbe/nxbe_filltrapezoid.c @@ -0,0 +1,162 @@ +/**************************************************************************** + * graphics/nxbe/nxbe_filltrapezoid.c + * + * Copyright (C) 2008 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/types.h> +#include <fixedmath.h> +#include <nuttx/nxglib.h> + +#include "nxbe.h" + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct nxbe_filltrap_s +{ + struct nxbe_clipops_s cops; + struct nxgl_trapezoid_s trap; + nxgl_mxpixel_t color; +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nxbe_clipfilltrapezoid + * + * Description: + * Called from nxbe_clipper() to performed the fill operation on visible portions + * of the rectangle. + * + ****************************************************************************/ + +static void nxbe_clipfilltrapezoid(FAR struct nxbe_clipops_s *cops, + FAR struct nxbe_plane_s *plane, + FAR const struct nxgl_rect_s *rect) +{ + struct nxbe_filltrap_s *fillinfo = (struct nxbe_filltrap_s *)cops; + plane->filltrapezoid(&plane->pinfo, &fillinfo->trap, rect, fillinfo->color); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nxbe_filltrapezoid + * + * Description: + * Fill the specified rectangle in the window with the specified color + * + * Input Parameters: + * wnd - The window structure reference + * rect - The location to be filled + * col - The color to use in the fill + * + * Return: + * None + * + ****************************************************************************/ + +void nxbe_filltrapezoid(FAR struct nxbe_window_s *wnd, + FAR const struct nxgl_trapezoid_s *trap, + nxgl_mxpixel_t color[CONFIG_NX_NPLANES]) +{ + struct nxbe_filltrap_s info; + struct nxgl_rect_s bounds; + struct nxgl_rect_s remaining; + int i; + +#ifdef CONFIG_DEBUG + if (!wnd || !trap) + { + return; + } +#endif + + /* Offset the trapezoid by the window origin to position it within + * the framebuffer region + */ + + nxgl_trapoffset(&info.trap, trap, wnd->origin.x, wnd->origin.y); + + /* Now create a bounding box that contains the trapezoid */ + + bounds.pt1.x = b16toi(ngl_min(info.trap.top.x1, info.trap.bot.x1)); + bounds.pt1.y = b16toi(info.trap.top.y); + bounds.pt2.x = b16toi(ngl_max(info.trap.top.x2, info.trap.bot.x2)); + bounds.pt2.y = b16toi(info.trap.bot.y); + + /* Clip to the limits of the window and of the background screen */ + + nxgl_rectintersect(&remaining, &bounds, &wnd->bounds); + nxgl_rectintersect(&remaining, &remaining, &wnd->be->bkgd.bounds); + + if (!nxgl_nullrect(&remaining)) + { +#if CONFIG_NX_NPLANES > 1 + for (i = 0; i < wnd->be->vinfo.nplanes; i++) +#else + i = 0; +#endif + { + info.cops.visible = nxbe_clipfilltrapezoid; + info.cops.obscured = nxbe_clipnull; + info.color = color[i]; + + nxbe_clipper(wnd->above, &remaining, NX_CLIPORDER_DEFAULT, + &info.cops, &wnd->be->plane[i]); + } + } +} |