// $Source: /local/data/cvs/yellowbank/tile/qstset.cc,v $
// $Revision: 1.2 $
// $State: Exp $
// $Date: 2004/07/19 03:54:07 $
// $Author: yrp001 $
// $Locker:  $

#include "qstset.h"

int
qstset::
findpoint( const qpoint& pi, qpoint* po ) {
  *po = pi;
  int n = 0;
  qstransform* st;
  int s = _stq.size();
  int i;

  for( i = 1; i < s; i++ ) {
    st = _stq.dequeue();
    n += st->findreal( *po, po );
    _stq.enqueue( st );
  }
  st = _stq.dequeue();
  n = st->findreal( *po, po );
  _stq.enqueue( st );

  return n;
}

qstset::
~qstset() {
  while( _stq.size() > 0 )
    delete _stq.dequeue();
}

//std::ostream&
//operator<<( std::ostream& os, qstset& st ) {
//  return os;
//}

std::istream&
operator>>( std::istream& is, qstset& sts ) {
  char stype;
  int side;
  int mtype;
  qpoint p1;
  qpoint p2;
  double angle;
  //  double length;
  double scale;
  uint32_t sections;
  qstack<qstransform*> ststack;

  while( is >> stype ) {
    switch( stype ) {
    case 'm': // mirror symetry input
      is >> p1; // from
      is >> p2;
      is >> side; // -1:left 0:on 1:right
      ststack.push( new qstmirror( p1, p2, side ) );
      break;
    case 'p': // point symetry input
      is >> p1; // center
      is >> angle; // start angle in degrees
      is >> sections; // number of sections
      angle *= (2 * M_PI) / 360;
      ststack.push( new qstpoint( p1, angle, sections ) );
      break;
    case 'g': // glide symetry input
      is >> p1; // from
      is >> p2; // to
      is >> mtype; // 0:nomirror 1:mirror
      ststack.push( new qstglide( p1, p2, mtype ) );
      break;
    case 'd': // displacment input
      is >> p1; // displacement
      ststack.push( new qsttranslate( p1 ) );
      break;
    case 'r': // rotate input
      is >> p1; // rotate about this point
      is >> angle;
      angle *= (-2 * M_PI) / 360;
      ststack.push( new qstrotate( p1, angle ) );
      break;
    case 's': // scale input
      is >> scale;
      ststack.push( new qstscale( scale ) );
      break;
    default:
      std::cerr << "Error: qstset: unrecogized input." << std::endl;
    }
  }

  while( ststack.top() )
    sts._stq.enqueue( ststack.pop() );

  return is;
}


