Newer
Older
ubScopin / src / line.cpp
#include <inttypes.h>
#include <stdlib.h>

#include "dac.h"
#include "line.h"

Tracer trazador;

#define SWAP(a,b) {(a)^=(b);(b)^=(a);(a)^=(b);}

int Tracer::clamp(int *x) const
{
  if (*x < 0) {
    *x = 0;
  }
  else if (*x > 255) {
    *x = 255;
  }

  return 0;
}

int Tracer::MoveTo(int x, int y)
{
  X = x;
  Y = y;
  clamp(&x);
  clamp(&y);
  xyz.SetXY(x, y);

  return 0;
}

void Tracer::LineTo(int x1, int y1)
{
  int x0 = X;
  int y0 = Y;
  int Dx = x1 - x0;
  int Dy = y1 - y0;
  int steep = abs(Dy) >= abs(Dx);
  int xstep, ystep;
  int twoDy, twoDyTwoDx, E, x, y, xend;


  if ((x1 > 255 || x1 < 0 || y1 > 255 || y1 < 0) &&
      (X  > 255 || X  < 0 || Y  > 255 || Y  < 0))  {
    X = x1;
    Y = y1;
    return;
  }

  if (steep) {
    SWAP(x0, y0);
    SWAP(x1, y1);
    Dx = x1 - x0;
    Dy = y1 - y0;
  }

  xstep = 1;
  if (Dx < 0) {
    xstep = -1;
    Dx = -Dx;
  }

  ystep = 1;
  if (Dy < 0) {
    ystep = -1;
    Dy = -Dy;
  }

  twoDy = Dy << 1;
  twoDyTwoDx = twoDy - (Dx << 1);
  E = twoDy - Dx;
  y = y0;
  x = x0;
  xend = x1;

  for (; x != xend;) {
    if (E > 0) {
      E += twoDyTwoDx;
      y += ystep;
    } else {
      E += twoDy;
    }
    x += xstep;

    if (steep) {
      MoveTo(y, x);
    } else {
      MoveTo(x, y);
    }
    makePace();
  }
}