Exemplo n.º 1
0
void
draw_line_rgb(int x0, int y0, int x1, int y1,
        DrawColor color, DrawImage* img)
{
  int xs;
  int ys;

  int dx = x1-x0;
  if (dx < 0)
  {
    dx = -dx;
    xs = -1;
  }
  else
    xs = 1;

  int dy = y1-y0;
  if (dy < 0)
  {
    dy = -dy;
    ys = -1;
  }
  else
    ys = 1;

  int n = (dx > dy) ? dx : dy;

  if (dx == 0) {
    for (int i = 0; i < dy; i++) {
      draw_point_rgb(x0, y0, color, img);
      y0 += ys;
    }
  } else if (dy == 0) {
    draw_hline_rgb(x0, y0, x1, color, img);
  } else if (dx > dy) {
    n = dx;
    dy += dy;
    int e = dy - dx;
    dx += dx;

    for(int i = 0; i < n; i++) {
      draw_point_rgb(x0, y0, color, img);
      if (e >= 0) {
        y0 += ys;
        e -= dx;
      }
      e += dy;
      x0 += xs;
    }
  } else {
    n = dy;
    dx += dx;
    int e = dx - dy;
    dy += dy;

    for(int i = 0; i < n; i++) {
      draw_point_rgb(x0, y0, color, img);
      if (e >= 0) {
        x0 += xs;
        e -= dy;
      }
      e += dx;
      y0 += ys;
    }
  }
}
Exemplo n.º 2
0
void 
draw_line_rgb(uint8_t *img, int x0, int y0, int x1, int y1, 
        uint32_t color,
        int w, int h, int rowstride)
{
    int i, n, e;
    int dx, dy;
    int xs, ys;

    /* normalize coordinates */
    dx = x1-x0;
    if (dx < 0) dx = -dx, xs = -1;
    else xs = 1;
    dy = y1-y0;
    if (dy < 0) dy = -dy, ys = -1;
    else ys = 1;

    n = (dx > dy) ? dx : dy;

    if (dx == 0) {
        /* vertical */
        for (i = 0; i < dy; i++) {
            draw_point_rgb(img, x0, y0, color, w, h, rowstride);
            y0 += ys;
        }
    } else if (dy == 0) {
        /* horizontal */
        draw_hline_rgb(img, x0, y0, x1, color, w, h, rowstride);
    } else if (dx > dy) {
        /* bresenham, horizontal slope */
        n = dx;
        dy += dy;
        e = dy - dx;
        dx += dx;

        for (i = 0; i < n; i++) {
            draw_point_rgb(img, x0, y0, color, w, h, rowstride);
            if (e >= 0) {
                y0 += ys;
                e -= dx;
            }
            e += dy;
            x0 += xs;
        }
    } else {
        /* bresenham, vertical slope */
        n = dy;
        dx += dx;
        e = dx - dy;
        dy += dy;

        for (i = 0; i < n; i++) {
            draw_point_rgb(img, x0, y0, color, w, h, rowstride);
            if (e >= 0) {
                x0 += xs;
                e -= dy;
            }
            e += dx;
            y0 += ys;
        }

    }
}