
#include "ORPoly.h"


ORPoly::ORPoly( Poly *a, Poly *b )
{
  Poly();

  this->a = a;
  this->b = b;
}

void ORPoly::getScanline( Scanline *sl, int y )
{
  Scanline sla, slb;

  sl->clear( );

  a->getScanline( &sla, y );
  b->getScanline( &slb, y );

  mergeScanlines( sl, &sla, &slb );
}

void ORPoly::getVScanline( Scanline *sl, int x )
{
  Scanline sla, slb;

  sl->clear( );

  a->getVScanline( &sla, x );
  b->getVScanline( &slb, x );

  mergeScanlines( sl, &sla, &slb );
}

void ORPoly::mergeScanlines( Scanline *sl, Scanline *sla, Scanline *slb )
{
  sla->firstPoint();
  slb->firstPoint();

  float p, pa, pb;
  int w = 0;

  bool oka, okb;

  oka = sla->peekPoint( &pa );
  okb = slb->peekPoint( &pb );

  bool in = false;

  while( oka || okb )
  {
    if( oka && ((!okb) || pa < pb ) )
    {
      sla->nextPoint( &p );
      w ^= 1;
    }
    else
    {
      slb->nextPoint( &p );
      w ^= 2;
    }

    if( (w != 0 && !in) || (w == 0 && in) )
    {
      sl->addPoint( p );
      in = !in;
    }

    oka = sla->peekPoint( &pa );
    okb = slb->peekPoint( &pb );
  }
}

/*
void ORPoly::render( Image *im, int col )
{
  Scanline sl;

  for( int i=0; i<im->h; i++ )
  {
    getScanline( &sl, i );
    im->drawScanline( i, &sl, col );
  }
}
*/

