
#include "image.h"



//---- IMAGE CLASS -----------------------------------------------------------//

//---- Image

Image::Image( int w, int h )
{
  this->w = w;
  this->h = h;
  buf = new int[ size = w*h ];
}

//---- ~Image

Image::~Image()
{
  delete[] this->buf;
}

//---- clear

void Image::clear( int col )
{
  for( int i=0; i<size; i++ ) buf[i] = col;
}

//---- checks

void Image::checks( )
{
  int i, j;

  int *p = buf;

  for(j=0; j<h; j++) for(i=0; i<w; i++)
  {
    *p++ = (((i>>4)^(j>>4))&1) * 0x222222 + 0xDDDDDD;
  }
}

//---- fillPolygon

void Image::fillPolygon( Poly *p, int col )
{
  Scanline sl;

  //  Render each scanline

  for( int i=0; i<h; i++ )
  {
    p->getScanline( &sl, i );
    fillScanline( i, &sl, col );
  }
}

//---- fillScanline

void Image::fillScanline( int y, Scanline *sl, int col )
{
  float x1, x2;

  sl->firstPair();

  while( sl->nextPair( &x1, &x2 ) )
  {
    if( x1 < 0 ) x1 = 0;
    if( x2 > w ) x2 = w;

    for( int i=x1+0.9999; i<x2; i++ )
    {
      buf[ y*w + i ] = col;
    }
  }
}

//---- drawPolygon

void Image::drawPolygon( Poly *p, int col )
{
  Scanline sl;

  int i;

  //  Render each scanline

  for( i=0; i<h; i++ )
  {
    p->getScanline( &sl, i );
    drawScanline( i, &sl, col );
  }

  //  Render each vertical scanline

  for( i=0; i<w; i++ )
  {
    p->getVScanline( &sl, i );
    drawVScanline( i, &sl, col );
  }
}

//---- drawScanline

void Image::drawScanline( int y, Scanline *sl, int col )
{
  float x1, x2;

  sl->firstPair();

  while( sl->nextPair( &x1, &x2 ) )
  {
    if( x1 < 0 ) x1 = 0;
    if( x2 > w ) x2 = w;

    buf[ y*w + (int)x1 ] = col;
    buf[ y*w + (int)x2 ] = col;
  }
}

//---- drawVScanline

void Image::drawVScanline( int x, Scanline *sl, int col )
{
  float y1, y2;

  sl->firstPair();

  while( sl->nextPair( &y1, &y2 ) )
  {
    if( y1 < 0 ) y1 = 0;
    if( y2 > h ) y2 = h;

    buf[ ((int)y1)*w + x ] = col;
    buf[ ((int)y2)*w + x ] = col;
  }
}

