Logo Search packages:      
Sourcecode: xaos version File versions  Download package

grlibd.c

#ifndef UNSUPPORTED
static inline void
drawchar (struct image *img, int x, int y, int fgcolor, unsigned char letter)
{
  int fontwidth = (RWIDTH (letter) + 7) / 8;
  CONST unsigned char *bitmap = &DATA[letter * HEIGHT * fontwidth];
  cpixel_t *current;
  int yend = y + HEIGHT;
  if (y < 0)
    bitmap -= y, y = 0;
  if (yend > img->height)
    yend = img->height;
  for (; y < yend; y++)
    {
      int b = *(bitmap++);
      int i = (1 << (RWIDTH (letter) - 1));
      if (fontwidth == 2)
      {
        b <<= 8;
        b |= *bitmap++;
      }
      current = (cpixel_t *) img->currlines[y];
      p_inc (current, x);
      while (i)
      {
        if (i & b)
          {
            p_set (current, fgcolor);
          }
        i >>= 1;
        p_inc (current, 1);
      }
    }
}
static inline void
hline (struct image *img, int x, int y, int length, int fgcolor)
{
  cpixel_t *current = (cpixel_t *) img->currlines[y], *end =
    (cpixel_t *) img->currlines[y];
  p_inc (current, x);
  p_inc (end, x + length);
#ifdef bpp1
  memset (current, fgcolor, end - current + 1);
#else
  while (current <= end)
    {
      p_set (current, fgcolor);
      p_inc (current, 1);
    }
#endif
}
static inline void
vline (struct image *img, int x, int y, int length, int fgcolor)
{
  length += y;
  while (y <= length)
    {
      cpixel_t *current = (cpixel_t *) img->currlines[y];
      p_inc (current, x);
      p_set (current, fgcolor);
      y++;
    }
}
static inline void
rectangle (struct image *img, int x, int y, int width, int height,
         int fgcolor)
{
  height += y;
  while (y < height)
    hline (img, x, y, width - 1, fgcolor), y++;
}
static inline char *
savevline (struct image *img, int x, int y, int length)
{
  cpixel_t *saved = (cpixel_t *) malloc (length * bpp + bpp), *s = saved;
  length += y;
  while (y <= length)
    {
      cpixel_t *current = (cpixel_t *) img->currlines[y];
      p_copy (s, 0, current, x);
      p_inc (s, 1);
      y++;
    }
  return (char *) saved;
}
static inline void
restorevline (struct image *img, char *saved, int x, int y, int length)
{
  cpixel_t *s = (cpixel_t *) saved;
  length += y;
  while (y <= length)
    {
      cpixel_t *current = (cpixel_t *) img->currlines[y];
      p_copy (current, x, s, 0);
      p_inc (s, 1);
      y++;
    }
}

static inline char *
saveline (struct image *img, int x, int y, int x2, int y2)
{
  int dx = x2 - x;
  int dy = y2 - y;
  int ady = abs (dy);
  if (dx < ady)
    {
      cpixel_t *saved = (cpixel_t *) malloc ((ady + 1) * bpp * 2), *s = saved;
      int plus = (dx << 16) / ady;
      if (dy < 0)
      {
        int dy = (x << 16) /*| (65536 / 2) */ ;
        ady = y;
        while (ady >= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_copy (s, 0, current, 0);
            p_copy (s, 1, current, 1);
            p_inc (s, 2);
            dy += plus;
            ady--;
          }
      }
      else
      {
        int dy = (x << 16) /*| (65536 / 2) */ ;
        ady = y;
        while (ady <= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_copy (s, 0, current, 0);
            p_copy (s, 1, current, 1);
            p_inc (s, 2);
            dy += plus;
            ady++;
          }
      }
      return ((char *) saved);
    }
  else
    {
      cpixel_t *saved = (cpixel_t *) malloc ((dx + 1) * bpp * 2), *s = saved;
      int plus = (dy << 16) / dx;
      ady = x;
      dy = (y << 16);
      while (ady <= x2)
      {
        cpixel_t *current = (cpixel_t *) img->currlines[dy >> 16];
        p_copy (s, 0, current, ady);
        current = (cpixel_t *) img->currlines[(dy >> 16) + 1];
        p_copy (s, 1, current, ady);
        p_inc (s, 2);
        dy += plus;
        ady++;
      }
      return ((char *) saved);
    }
}
static inline void
restoreline (struct image *img, char *saved, int x, int y, int x2, int y2)
{
  int dx = x2 - x;
  int dy = y2 - y;
  int ady = abs (dy);
  if (dx < ady)
    {
      cpixel_t *s = (cpixel_t *) saved;
      int plus = (dx << 16) / ady;
      if (dy < 0)
      {
        int dy = (x << 16) /*| (65536 / 2) */ ;
        ady = y;
        while (ady >= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_copy (current, 0, s, 0);
            p_copy (current, 1, s, 1);
            p_inc (s, 2);
            dy += plus;
            ady--;
          }
      }
      else
      {
        int dy = (x << 16) /*| (65536 / 2) */ ;
        ady = y;
        while (ady <= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_copy (current, 0, s, 0);
            p_copy (current, 1, s, 1);
            p_inc (s, 2);
            dy += plus;
            ady++;
          }
      }
    }
  else
    {
      cpixel_t *s = (cpixel_t *) saved;
      int plus = (dy << 16) / dx;
      ady = x;
      dy = (y << 16);
      while (ady <= x2)
      {
        cpixel_t *current = (cpixel_t *) img->currlines[dy >> 16];
        p_copy (current, ady, s, 0);
        current = (cpixel_t *) img->currlines[(dy >> 16) + 1];
        p_copy (current, ady, s, 1);
        p_inc (s, 2);
        dy += plus;
        ady++;
      }
    }
}

#ifdef bpp1
#define myinterpol(a,b,n) intergray(a,b,n)
#else
#define myinterpol(a,b,n) interpol(a,b,n,rmask,gmask,bmask)
#endif
static inline void
line (struct image *img, int x, int y, int x2, int y2, int color)
{
  int dx = x2 - x;
  int dy = y2 - y;
  int ady = abs (dy);
#ifndef bpp1
  int rmask = img->palette->info.truec.rmask;
  int gmask = img->palette->info.truec.gmask;
  int bmask = img->palette->info.truec.bmask;
#endif
#ifdef bpp1
  if (img->palette->type &= (C256 | FIXEDCOLOR))
    {
      if (dx < ady)
      {
        int plus = (dx << 16) / ady;
        if (dy < 0)
          {
            int dy = (x << 16) | (65536 / 2);
            ady = y;
            while (ady >= y2)
            {
              cpixel_t *current = (cpixel_t *) img->currlines[ady];
              p_inc (current, (dy >> 16));
              p_set (current, color);
              dy += plus;
              ady--;
            }
          }
        else
          {
            int dy = (x << 16) | (65536 / 2);
            ady = y;
            while (ady <= y2)
            {
              cpixel_t *current = (cpixel_t *) img->currlines[ady];
              p_inc (current, (dy >> 16));
              p_set (current, color);
              dy += plus;
              ady++;
            }
          }
      }
      else
      {
        int plus = (dy << 16) / dx;
        ady = x;
        dy = (y << 16) | (65536 / 2);
        while (ady <= x2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[dy >> 16];
            p_setp (current, ady, color);
            dy += plus;
            ady++;
          }
      }
      return;
    }
#endif

  if (dx < ady)
    {
      int plus = (dx << 16) / ady;
      if (dy < 0)
      {
        int dy = (x << 16);
        ady = y;
        while (ady >= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_set (current,
                 myinterpol (p_get (current), color,
                         ((dy & 65535) >> 8)));
            p_setp (current, 1,
                  myinterpol (color, p_getp (current, 1),
                          ((dy & 65535) >> 8)));
            dy += plus;
            ady--;
          }
      }
      else
      {
        int dy = (x << 16);
        ady = y;
        while (ady <= y2)
          {
            cpixel_t *current = (cpixel_t *) img->currlines[ady];
            p_inc (current, (dy >> 16));
            p_set (current,
                 myinterpol (p_get (current), color,
                         ((dy & 65535) >> 8)));
            p_setp (current, 1,
                  myinterpol (color, p_getp (current, 1),
                          ((dy & 65535) >> 8)));
            dy += plus;
            ady++;
          }
      }
    }
  else
    {
      int plus = (dy << 16) / dx;
      ady = x;
      dy = (y << 16);
      while (ady <= x2)
      {
        cpixel_t *current = (cpixel_t *) img->currlines[dy >> 16];
        p_setp (current, ady,
              myinterpol (p_getp (current, ady), color,
                        ((dy & 65535) >> 8)));
        current = (cpixel_t *) img->currlines[(dy >> 16) + 1];
        p_setp (current, ady,
              myinterpol (color, p_getp (current, ady),
                        ((dy & 65535) >> 8)));
        dy += plus;
        ady++;
      }
    }
}

#undef myinterpol
#endif

#undef drawchar
#undef hline
#undef vline
#undef rectangle
#undef line
#undef restoreline
#undef saveline
#undef savevline
#undef restorevline

Generated by  Doxygen 1.6.0   Back to index