mirror of
https://github.com/apache/nuttx.git
synced 2025-01-13 10:58:49 +08:00
Add more rasterizers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1316 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
9a4ef7992f
commit
076808fec7
6 changed files with 469 additions and 28 deletions
|
@ -35,14 +35,23 @@
|
|||
|
||||
NXGLIB_ASRCS =
|
||||
|
||||
#FILL1_CSRCS = nxglib_fillrectangle_1bpp.c nxglib_fillrectangle_2bpp.c \
|
||||
#RFILL1_CSRCS = nxglib_fillrectangle_1bpp.c nxglib_fillrectangle_2bpp.c \
|
||||
# nxglib_fillrectangle_4bpp.c
|
||||
FILL2_CSRCS = nxglib_fillrectangle_8bpp.c nxglib_fillrectangle_16bpp.c \
|
||||
RFILL2_CSRCS = nxglib_fillrectangle_8bpp.c nxglib_fillrectangle_16bpp.c \
|
||||
nxglib_fillrectangle_24bpp.c nxglib_fillrectangle_32bpp.c
|
||||
#MOVE1_CSRCS = nxglib_moverectangle_1bpp.c nxglib_moverectangle_2bpp.c \
|
||||
#TFILL1_CSRCS = nxglib_filltrapezoid_1bpp.c nxglib_filltrapezoid_2bpp.c \
|
||||
# nxglib_filltrapezoid_4bpp.c
|
||||
TFILL2_CSRCS = nxglib_filltrapezoid_8bpp.c nxglib_filltrapezoid_16bpp.c \
|
||||
nxglib_filltrapezoid_24bpp.c nxglib_filltrapezoid_32bpp.c
|
||||
#RMOVE1_CSRCS = nxglib_moverectangle_1bpp.c nxglib_moverectangle_2bpp.c \
|
||||
# nxglib_moverectangle_4bpp.c
|
||||
MOVE2_CSRCS = nxglib_moverectangle_8bpp.c nxglib_moverectangle_16bpp.c \
|
||||
RMOVE2_CSRCS = nxglib_moverectangle_8bpp.c nxglib_moverectangle_16bpp.c \
|
||||
nxglib_moverectangle_24bpp.c nxglib_moverectangle_32bpp.c
|
||||
#RCOPY1_CSRCS = nxglib_copyrectangle_1bpp.c nxglib_copyrectangle_2bpp.c \
|
||||
# nxglib_copyrectangle_4bpp.c
|
||||
RCOPY2_CSRCS = nxglib_copyrectangle_8bpp.c nxglib_copyrectangle_16bpp.c \
|
||||
nxglib_copyrectangle_24bpp.c nxglib_copyrectangle_32bpp.c
|
||||
NXGLIB_CSRCS = nxglib_rgb2yuv.c nxglib_yuv2rgb.c \
|
||||
$(FILL1_CSRCS) $(FILL2_CSRCS) $(MOVE1_CSRCS) $(MOVE2_CSRCS)
|
||||
$(RFILL1_CSRCS) $(RFILL2_CSRCS) $(TFILL1_CSRCS) $(TFILL2_CSRCS) \
|
||||
$(RMOVE1_CSRCS) $(RMOVE2_CSRCS) $(RCOPY1_CSRCS) $(RCOPY2_CSRCS)
|
||||
|
||||
|
|
|
@ -61,42 +61,73 @@ endif
|
|||
CPPFLAGS += -DNXGLIB_BITSPERPIXEL=$(NXGLIB_BITSPERPIXEL)
|
||||
CPPFLAGS += -DNXGLIB_SUFFIX=$(NXGLIB_SUFFIX)
|
||||
|
||||
FILL1_CSRCS = nxglib_fillrectangle_1bpp.c nxglib_fillrectangle_2bpp.c \
|
||||
RFILL1_CSRCS = nxglib_fillrectangle_1bpp.c nxglib_fillrectangle_2bpp.c \
|
||||
nxglib_fillrectangle_4bpp.c
|
||||
FILL2_CSRCS = nxglib_fillrectangle_8bpp.c nxglib_fillrectangle_16bpp.c \
|
||||
RFILL2_CSRCS = nxglib_fillrectangle_8bpp.c nxglib_fillrectangle_16bpp.c \
|
||||
nxglib_fillrectangle_24bpp.c nxglib_fillrectangle_32bpp.c
|
||||
MOVE1_CSRCS = nxglib_moverectangle_1bpp.c nxglib_moverectangle_2bpp.c \
|
||||
TFILL1_CSRCS = nxglib_filltrapezoid_1bpp.c nxglib_filltrapezoid_2bpp.c \
|
||||
nxglib_filltrapezoid_4bpp.c
|
||||
TFILL2_CSRCS = nxglib_filltrapezoid_8bpp.c nxglib_filltrapezoid_16bpp.c \
|
||||
nxglib_filltrapezoid_24bpp.c nxglib_filltrapezoid_32bpp.c
|
||||
RMOVE1_CSRCS = nxglib_moverectangle_1bpp.c nxglib_moverectangle_2bpp.c \
|
||||
nxglib_moverectangle_4bpp.c
|
||||
MOVE2_CSRCS = nxglib_moverectangle_8bpp.c nxglib_moverectangle_16bpp.c \
|
||||
RMOVE2_CSRCS = nxglib_moverectangle_8bpp.c nxglib_moverectangle_16bpp.c \
|
||||
nxglib_moverectangle_24bpp.c nxglib_moverectangle_32bpp.c
|
||||
RCOPY1_CSRCS = nxglib_copyrectangle_1bpp.c nxglib_copyrectangle_2bpp.c \
|
||||
nxglib_copyrectangle_4bpp.c
|
||||
RCOPY2_CSRCS = nxglib_copyrectangle_8bpp.c nxglib_copyrectangle_16bpp.c \
|
||||
nxglib_copyrectangle_24bpp.c nxglib_copyrectangle_32bpp.c
|
||||
|
||||
GEN_CSRCS = $(FILL1_CSRCS) $(FILL2_CSRCS) $(MOVE1_CSRCS) $(MOVE2_CSRCS)
|
||||
GEN_CSRCS = $(RFILL1_CSRCS) $(RFILL2_CSRCS) $(TFILL1_CSRCS) $(TFILL2_CSRCS) \
|
||||
$(RMOVE1_CSRCS) $(RMOVE2_CSRCS) $(RCOPY1_CSRCS) $(RCOPY2_CSRCS)
|
||||
|
||||
all: $(GEN_CSRCS)
|
||||
.PHONY : clean distclean
|
||||
|
||||
$(FILL1_CSRCS) : nxglib_fillrectangle.c nxglib_bitblit.h
|
||||
$(RFILL1_CSRCS) : nxglib_fillrectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_fillrectangle.c, $@)
|
||||
endif
|
||||
|
||||
$(FILL2_CSRCS) : nxglib_fillrectangle.c nxglib_bitblit.h
|
||||
$(RFILL2_CSRCS) : nxglib_fillrectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_fillrectangle.c, $@)
|
||||
endif
|
||||
|
||||
$(MOVE1_CSRCS) : nxglib_moverectangle.c nxglib_bitblit.h
|
||||
$(TFILL1_CSRCS) : nxglib_filltrapezoid.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_filltrapezoid.c, $@)
|
||||
endif
|
||||
|
||||
$(TFILL2_CSRCS) : nxglib_filltrapezoid.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_filltrapezoid.c, $@)
|
||||
endif
|
||||
|
||||
$(RMOVE1_CSRCS) : nxglib_moverectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_moverectangle.c, $@)
|
||||
endif
|
||||
|
||||
$(MOVE2_CSRCS) : nxglib_moverectangle.c nxglib_bitblit.h
|
||||
$(RMOVE2_CSRCS) : nxglib_moverectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_moverectangle.c, $@)
|
||||
endif
|
||||
|
||||
$(RCOPY1_CSRCS) : nxglib_copyrectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_copyrectangle.c, $@)
|
||||
endif
|
||||
|
||||
$(RCOPY2_CSRCS) : nxglib_copyrectangle.c nxglib_bitblit.h
|
||||
ifneq ($(NXGLIB_BITSPERPIXEL),)
|
||||
$(call PREPROCESS, nxglib_copyrectangle.c, $@)
|
||||
endif
|
||||
|
||||
clean:
|
||||
@rm -f *~ .*.swp
|
||||
|
||||
distclean: clean
|
||||
@rm -f nxglib_fillrectangle_*bpp.c nxglib_moverectangle_*bpp.c
|
||||
@rm -f nxglib_fillrectangle_*bpp.c nxglib_filltrapezoid_*bpp.c
|
||||
@rm -f nxglib_moverectangle_*bpp.c nxglib_copyrectangle_*bpp.c
|
||||
|
||||
|
|
|
@ -123,8 +123,8 @@
|
|||
# define NXGL_MEMSET(dest,value,width) \
|
||||
{ \
|
||||
FAR ubyte *_ptr = (FAR ubyte*)dest; \
|
||||
int nbytes = NXGL_SCALEX(width); \
|
||||
while (nbytes--) \
|
||||
int _nby = NXGL_SCALEX(width); \
|
||||
while (_nby--) \
|
||||
{ \
|
||||
*_ptr++ = value; \
|
||||
} \
|
||||
|
@ -133,8 +133,8 @@
|
|||
{ \
|
||||
FAR ubyte *_dptr = (FAR ubyte*)dest; \
|
||||
FAR ubyte *_sptr = (FAR ubyte*)src; \
|
||||
int nbytes = NXGL_SCALEX(width); \
|
||||
while (nbytes--) \
|
||||
int _nby = NXGL_SCALEX(width); \
|
||||
while (_nby--) \
|
||||
{ \
|
||||
*_dptr++ = *_sptr++; \
|
||||
} \
|
||||
|
@ -143,8 +143,9 @@
|
|||
#elif NXGLIB_BITSPERPIXEL == 24
|
||||
# define NXGL_MEMSET(dest,value,width) \
|
||||
{ \
|
||||
FAR ubyte *_ptr = (FAR ubyte*)dest; \
|
||||
while (width--) \
|
||||
FAR ubyte *_ptr = (FAR ubyte*)dest; \
|
||||
nxgl_coord_t _npix = width; \
|
||||
while (_npix--) \
|
||||
{ \
|
||||
*_ptr++ = value; \
|
||||
*_ptr++ = value >> 8; \
|
||||
|
@ -153,9 +154,10 @@
|
|||
}
|
||||
# define NXGL_MEMCPY(dest,src,width) \
|
||||
{ \
|
||||
FAR ubyte *_dptr = (FAR ubyte*)dest; \
|
||||
FAR ubyte *_sptr = (FAR ubyte*)src; \
|
||||
while (width--) \
|
||||
FAR ubyte *_dptr = (FAR ubyte*)dest; \
|
||||
FAR ubyte *_sptr = (FAR ubyte*)src; \
|
||||
nxgl_coord_t _npix = width; \
|
||||
while (_npix--) \
|
||||
{ \
|
||||
*_dptr++ = *_sptr++; \
|
||||
*_dptr++ = *_sptr++; \
|
||||
|
@ -166,7 +168,8 @@
|
|||
# define NXGL_MEMSET(dest,value,width) \
|
||||
{ \
|
||||
FAR nx_pixel_t *_ptr = (FAR ubyte*)dest; \
|
||||
while (width--) \
|
||||
nxgl_coord_t _npix = width; \
|
||||
while (_npix--) \
|
||||
{ \
|
||||
*_ptr++ = value; \
|
||||
} \
|
||||
|
@ -175,7 +178,8 @@
|
|||
{ \
|
||||
FAR nx_pixel_t *_dptr = (FAR ubyte*)dest; \
|
||||
FAR nx_pixel_t *_sptr = (FAR ubyte*)src; \
|
||||
while (width--) \
|
||||
nxgl_coord_t _npix = width; \
|
||||
while (_npix--) \
|
||||
{ \
|
||||
*_dptr++ = *_sptr++; \
|
||||
} \
|
||||
|
|
112
graphics/nxglib/nxglib_copyrectangle.c
Normal file
112
graphics/nxglib/nxglib_copyrectangle.c
Normal file
|
@ -0,0 +1,112 @@
|
|||
/****************************************************************************
|
||||
* graphics/nxglib/nxsglib_copyrectangle.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 <nuttx/fb.h>
|
||||
#include <nuttx/nxglib.h>
|
||||
|
||||
#include "nxglib_bitblit.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-Processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nxs_copyrectangle_*bpp
|
||||
*
|
||||
* Descripton:
|
||||
* Copy a rectangular bitmap image into the specific position in the
|
||||
* framebuffer memory.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void NXGL_FUNCNAME(nxs_copyrectangle,NXGLIB_SUFFIX)
|
||||
(FAR struct fb_planeinfo_s *pinfo, FAR const struct nxgl_rect_s *dest,
|
||||
FAR const NXGL_PIXEL_T *src, FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride)
|
||||
{
|
||||
const ubyte *sptr;
|
||||
ubyte *dptr;
|
||||
unsigned int width;
|
||||
unsigned int deststride;
|
||||
unsigned int rows;
|
||||
|
||||
/* Get the width of the framebuffer in bytes */
|
||||
|
||||
deststride = pinfo->stride;
|
||||
|
||||
/* Get the dimensions of the rectange to fill: height in rows and width in bytes */
|
||||
|
||||
width = NXGL_SCALEX(dest->pt2.x - dest->pt1.x);
|
||||
rows = dest->pt2.y - dest->pt1.y;
|
||||
|
||||
/* Then copy the image */
|
||||
|
||||
sptr = (const ubyte*)src + NXGL_SCALEX(dest->pt1.x - origin->x) + (dest->pt1.y - origin->y) * srcstride;
|
||||
dptr = pinfo->fbmem + dest->pt1.y * deststride + NXGL_SCALEX(dest->pt1.x);
|
||||
|
||||
while (rows--)
|
||||
{
|
||||
NXGL_MEMCPY(dest, sptr, width);
|
||||
dptr += deststride;
|
||||
sptr += srcstride;
|
||||
}
|
||||
}
|
167
graphics/nxglib/nxglib_filltrapezoid.c
Normal file
167
graphics/nxglib/nxglib_filltrapezoid.c
Normal file
|
@ -0,0 +1,167 @@
|
|||
/****************************************************************************
|
||||
* graphics/nxglib/nxglib_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/fb.h>
|
||||
#include <nuttx/nxglib.h>
|
||||
|
||||
#include "nxglib_bitblit.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-Processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef NXGLIB_SUFFIX
|
||||
# error "NXGLIB_SUFFIX must be defined before including this header file"
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nxglib_filltrapezoid_*bpp
|
||||
*
|
||||
* Descripton:
|
||||
* Fill a trapezoidal region in the framebuffer memory with a fixed color.
|
||||
* This is useful for drawing complex shape -- (most) complex shapes can be
|
||||
* broken into a set of trapezoids.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void NXGL_FUNCNAME(nxglib_filltrapezoid,NXGLIB_SUFFIX)
|
||||
(FAR struct fb_videoinfo_s *vinfo, FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap, NXGL_PIXEL_T color)
|
||||
{
|
||||
unsigned int stride;
|
||||
ubyte *line;
|
||||
int nrows;
|
||||
b16_t x1;
|
||||
b16_t x2;
|
||||
b16_t dx1dy;
|
||||
b16_t dx2dy;
|
||||
|
||||
/* Get the width of the framebuffer in bytes */
|
||||
|
||||
stride = pinfo->stride;
|
||||
|
||||
/* Get the top run position and the number of rows to draw */
|
||||
|
||||
x1 = trap->top.x1;
|
||||
x2 = trap->top.x2;
|
||||
nrows = trap->bot.y - trap->top.y + 1;
|
||||
|
||||
/* Get the address of the first byte on the first line */
|
||||
|
||||
line = pinfo->fbmem + trap->top.y * stride ;
|
||||
|
||||
/* Calculate the slope of the left and right side of the trapezoid */
|
||||
|
||||
dx1dy = b16divi((trap->bot.x1 - x1), nrows);
|
||||
dx2dy = b16divi((trap->bot.x2 - x2), nrows);
|
||||
|
||||
/* Then fill the trapezoid line-by-line */
|
||||
|
||||
while (nrows--)
|
||||
{
|
||||
int ix1;
|
||||
int ix2;
|
||||
|
||||
/* Handle the special case where the sides cross (as in an hourglass) */
|
||||
|
||||
if (x1 > x2)
|
||||
{
|
||||
b16_t tmp;
|
||||
ngl_swap(x1, x2, tmp);
|
||||
ngl_swap(dx1dy, dx2dy, tmp);
|
||||
}
|
||||
|
||||
/* Convert the positions to integer */
|
||||
|
||||
ix1 = b16toi(x1);
|
||||
ix2 = b16toi(x2);
|
||||
|
||||
/* Handle some corner cases where we draw nothing. Otherwise, we will
|
||||
* always draw at least one pixel.
|
||||
*/
|
||||
|
||||
if (x1 > x2 || ix2 < 0 || ix1 > vinfo->yres)
|
||||
{
|
||||
/* Get a clipped copies of the startingand ending X positions. This
|
||||
* clipped truncates "down" and gives the quantized pixel holding the
|
||||
* fractional X position
|
||||
*/
|
||||
|
||||
ix1 = ngl_clipl(ix1, 0);
|
||||
ix2 = ngl_clipr(ix2, vinfo->yres);
|
||||
|
||||
/* Then draw the run from (line + clipx1) to (line + clipx2) */
|
||||
|
||||
NXGL_MEMSET(line + NXGL_SCALEX(ix1), color, ix2 - ix1 + 1);
|
||||
}
|
||||
|
||||
/* Move to the start of the next line */
|
||||
|
||||
line += stride;
|
||||
|
||||
/* Add the dx/dy value to get the run positions on the next row */
|
||||
|
||||
x1 += dx1dy;
|
||||
x2 += dx2dy;
|
||||
}
|
||||
}
|
|
@ -42,6 +42,18 @@
|
|||
|
||||
#include <nuttx/config.h>
|
||||
#include <sys/types.h>
|
||||
#include <fixedmath.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define ngl_min(a,b) ((a) < (b) ? (a) : (b))
|
||||
#define ngl_max(a,b) ((a) > (b) ? (a) : (b))
|
||||
#define ngl_swap(a,b,t) do { t = a; a = b; b = t; } while (0);
|
||||
#define ngl_clipl(a,mn) ((a) < (mn) ? (mn) : (a))
|
||||
#define ngl_clipr(a,mx) ((a) > (mx) ? (mx) : (a))
|
||||
#define ngl_clip(a,mx,mn) ((a) < (mn) ? (mn) : (a) > (mx) ? (mx) : (a))
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
|
@ -60,8 +72,8 @@ typedef sint16 nxgl_coord_t;
|
|||
|
||||
struct nxgl_point_s
|
||||
{
|
||||
nxgl_coord_t x; /* Range: 0 to screen width - 1 */
|
||||
nxgl_coord_t y; /* Rnage: 0 to screen height - 1*/
|
||||
nxgl_coord_t x; /* X position, range: 0 to screen width - 1 */
|
||||
nxgl_coord_t y; /* Y position, range: 0 to screen height - 1 */
|
||||
};
|
||||
|
||||
/* Describes a rectangle on the display */
|
||||
|
@ -72,6 +84,28 @@ struct nxgl_rect_s
|
|||
struct nxgl_point_s pt2; /* Lower, right-hand corner */
|
||||
};
|
||||
|
||||
/* Describes a run, i.e., a horizontal line. Note that the start/end positions
|
||||
* have fractional precision. This is necessary for good joining of trapezoids
|
||||
* when a more complex shape is decomposed into trapezoids
|
||||
*/
|
||||
|
||||
struct nxgl_run_s
|
||||
{
|
||||
b16_t x1; /* Left X position, range: 0 to x2 */
|
||||
b16_t x2; /* Right X position, range: x1 to screen width - 1 */
|
||||
nxgl_coord_t y; /* Top Y position, range: 0 to screen height - 1 */
|
||||
};
|
||||
|
||||
/* Describes a horizontal trapezoid on the display in terms the run at the
|
||||
* top of the trapezoid and the run at the bottom
|
||||
*/
|
||||
|
||||
struct nxgl_trapezoid_s
|
||||
{
|
||||
struct nxgl_run_s top; /* Top run */
|
||||
struct nxgl_run_s bot; /* bottom run */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
@ -142,6 +176,45 @@ EXTERN void nxgl_fillrectangle_32bpp(FAR struct fb_planeinfo_s *pinfo,
|
|||
FAR const struct nxgl_rect_s *rect,
|
||||
uint32 color);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nxglib_filltrapezoid_*bpp
|
||||
*
|
||||
* Descripton:
|
||||
* Fill a trapezoidal region in the framebuffer memory with a fixed color.
|
||||
* This is useful for drawing complex shape -- (most) complex shapes can be
|
||||
* broken into a set of trapezoids.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
EXTERN void nxglib_filltrapezoid_1bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
ubyte color);
|
||||
EXTERN void nxglib_filltrapezoid_2bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
ubyte color);
|
||||
EXTERN void nxglib_filltrapezoid_4bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
ubyte color);
|
||||
EXTERN void nxglib_filltrapezoid_8bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
ubyte color);
|
||||
EXTERN void nxglib_filltrapezoid_16bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
uint16 color);
|
||||
EXTERN void nxglib_filltrapezoid_24bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
uint32 color);
|
||||
EXTERN void nxglib_filltrapezoid_32bpp(FAR struct fb_videoinfo_s *vinfo,
|
||||
FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_trapezoid_s *trap,
|
||||
uint32 color);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nxgl_moverectangle_*bpp
|
||||
*
|
||||
|
@ -173,6 +246,51 @@ EXTERN void nxgl_moverectangle_32bpp(FAR struct fb_planeinfo_s *pinfo,
|
|||
FAR const struct nxgl_rect_s *rect,
|
||||
FAR struct nxgl_point_s *offset);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nxs_copyrectangle_*bpp
|
||||
*
|
||||
* Descripton:
|
||||
* Copy a rectangular bitmap image into the specific position in the
|
||||
* framebuffer memory.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
EXTERN void nxs_copyrectangle_1bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const ubyte *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_2bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const ubyte *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_4bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const ubyte *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_8bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const ubyte *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_16bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const uint16 *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_24bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const uint32 *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
EXTERN void nxs_copyrectangle_32bpp(FAR struct fb_planeinfo_s *pinfo,
|
||||
FAR const struct nxgl_rect_s *dest,
|
||||
FAR const uint32 *src,
|
||||
FAR const struct nxgl_point_s *origin,
|
||||
unsigned int srcstride);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue