Ejemplo n.º 1
0
void NXGL_FUNCNAME(nxgl_fillrectangle, NXGLIB_SUFFIX)
  (FAR struct lcd_planeinfo_s *pinfo,
   FAR const struct nxgl_rect_s *rect,
   NXGL_PIXEL_T color)
{
  unsigned int ncols;
  unsigned int row;

  /* Get the dimensions of the rectange to fill in pixels */

  ncols  = rect->pt2.x - rect->pt1.x + 1;

  /* Fill the run buffer with the selected color */

  NXGL_FUNCNAME(nxgl_fillrun, NXGLIB_SUFFIX)((NXGLIB_RUNTYPE *)pinfo->buffer, color, ncols);

  /* Then fill the rectangle line-by-line */

  for (row = rect->pt1.y; row <= rect->pt2.y; row++)
    {
      /* Draw the raster line at this row */

      (void)pinfo->putrun(row, rect->pt1.x, pinfo->buffer, ncols);
    }
}
Ejemplo n.º 2
0
void NXGL_FUNCNAME(nxgl_copyrectangle, NXGLIB_SUFFIX)
(FAR struct lcd_planeinfo_s *pinfo, FAR const struct nxgl_rect_s *dest,
 FAR const void *src, FAR const struct nxgl_point_s *origin,
 unsigned int srcstride)
{
  FAR const uint8_t *sline;
  unsigned int ncols;
  unsigned int row;
  unsigned int xoffset;
#if NXGLIB_BITSPERPIXEL < 8
  unsigned int remainder;
#endif

  /* Get the dimensions of the rectange to fill: width in pixels,
   * height in rows
   */

  ncols = dest->pt2.x - dest->pt1.x + 1;

  /* Set up to copy the image */

  xoffset = dest->pt1.x - origin->x;
  sline = (FAR const uint8_t *)src + NXGL_SCALEX(xoffset) + (dest->pt1.y - origin->y) * srcstride;
#if NXGLIB_BITSPERPIXEL < 8
  remainder = NXGL_REMAINDERX(xoffset);
#endif

  /* Copy the image, one row at a time */

  for (row = dest->pt1.y; row <= dest->pt2.y; row++)
    {
#if NXGLIB_BITSPERPIXEL < 8
      /* if the source pixel is not aligned with a byte boundary, then we will
       * need to copy the image data to the run buffer first.
       */

      if (remainder != 0)
        {
          NXGL_FUNCNAME(nxgl_copyrun, NXGLIB_SUFFIX)(sline, pinfo->buffer, remainder, ncols);
          (void)pinfo->putrun(row, dest->pt1.x, pinfo->buffer, ncols);
        }
      else
#endif
        {
          /* The pixel data is byte aligned.  Copy the image data directly from
           * the image memory.
           */

          (void)pinfo->putrun(row, dest->pt1.x, sline, ncols);
        }

      /* Then adjust the source pointer to refer to the next line in the source
       * image.
       */

      sline += srcstride;
    }
}
Ejemplo n.º 3
0
void NXGL_FUNCNAME(nxgl_filltrapezoid,NXGLIB_SUFFIX)
(FAR struct lcd_planeinfo_s *pinfo,
 FAR const struct nxgl_trapezoid_s *trap,
 FAR const struct nxgl_rect_s *bounds,
 NXGL_PIXEL_T color)
{
    unsigned int ncols;
    unsigned int topy;
    unsigned int boty;
    unsigned int row;
    unsigned int botw;
    b16_t        topx1;
    b16_t        topx2;
    b16_t        botx1;
    b16_t        botx2;
    b16_t        dx1dy;
    b16_t        dx2dy;
    int          dy;
    int          ix1;
    int          ix2;

    /* Get the top run endpoints */

    topx1 = trap->top.x1;
    topx2 = trap->top.x2;

    /* Calculate the number of rows to render */

    topy  = trap->top.y;
    boty  = trap->bot.y;

    /* Get the bottom run endpoints */

    botx1  = trap->bot.x1;
    botx2  = trap->bot.x2;

    /* Calculate the slope of the left and right side of the trapezoid */

    dy     = boty - topy;
    dx1dy  = b16divi((botx1 - topx1), dy);
    dx2dy  = b16divi((botx2 - topx2), dy);

    /* Perform vertical clipping */

    if (topy < bounds->pt1.y)
    {
        /* Is the entire trapezoid "above" the clipping window? */

        if (boty < bounds->pt1.y)
        {
            /* Yes.. then do nothing */

            return;
        }

        /* Calculate the x values for the new top run */

        dy      = bounds->pt1.y - topy;
        topx1  += dy * dx1dy;
        topx2  += dy * dx2dy;

        /* Clip the top row to render */

        topy    = bounds->pt1.y;
    }

    if (boty > bounds->pt2.y)
    {
        /* Is the entire trapezoid "below" the clipping window? */

        if (topy > bounds->pt2.y)
        {
            /* Yes.. then do nothing */

            return;
        }

        /* Calculate the x values for the new bottom run */

        dy      = boty - bounds->pt2.y;
        botx1  -= dy * dx1dy;
        botx2  -= dy * dx2dy;

        /* Clip the bottom row to render */

        boty    = bounds->pt2.y;
    }

    /* Handle the special case where the sides cross (as in an hourglass) */

    if (botx1 > botx2)
    {
        b16_t tmp;
        ngl_swap(botx1, botx2, tmp);
    }

    /* Fill the run buffer for the maximum run that we will need */

    ix1    = b16toi(topx1);
    ix1    = ngl_clipl(ix1, bounds->pt1.x);
    ix2    = b16toi(topx2);
    ix2    = ngl_clipr(ix2, bounds->pt2.x);
    ncols  = ix2 - ix1 + 1;

    ix1    = b16toi(botx1);
    ix1    = ngl_clipl(ix1, bounds->pt1.x);
    ix2    = b16toi(botx2);
    ix2    = ngl_clipr(ix2, bounds->pt2.x);
    botw   = ix2 - ix1 + 1;

    if (ncols < botw)
    {
        ncols = botw;
    }

    NXGL_FUNCNAME(nxgl_fillrun,NXGLIB_SUFFIX)((NXGLIB_RUNTYPE*)pinfo->buffer, color, ncols);

    /* Then fill the trapezoid row-by-row */

    for (row = topy; row <= boty; row++)
    {
        /* Handle the special case where the sides cross (as in an hourglass) */

        if (topx1 > topx2)
        {
            b16_t tmp;
            ngl_swap(topx1, topx2, tmp);
            ngl_swap(dx1dy, dx2dy, tmp);
        }

        /* Convert the positions to integer and get the run width, clipping to
         * fit within the bounding box.
         */

        ix1 = b16toi(topx1);
        ix1 = ngl_clipl(ix1, bounds->pt1.x);
        ix2 = b16toi(topx2);
        ix2 = ngl_clipr(ix2, bounds->pt2.x);

        /* Handle some corner cases where we draw nothing.  Otherwise, we will
         * always draw at least one pixel.
         */

        if (ix1 <= ix2)
        {
            /* Then draw the run from ix1 to ix2 at row */

            ncols = ix2 - ix1 + 1;
            (void)pinfo->putrun(row, ix1, pinfo->buffer, ncols);
        }

        /* Add the dx/dy value to get the run positions on the next row */

        topx1 += dx1dy;
        topx2 += dx2dy;
    }
}