コード例 #1
0
void CRoundRect::InitDragging(CPointF point)
{
	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	DrawRoundRectXY(&dc,m_rc.left,m_rc.top,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_fXEllipse,m_fYEllipse);
	DrawRoundRectXY(&dc,m_rc.left,m_rc.top,point.x,point.y,m_fXEllipse,m_fYEllipse);
}
コード例 #2
0
BOOL CGauge::OnDragStart(int nHitTest,CPointF point)
{
	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;

	CRectF rc;
	GetBoundsRect(rc);
	rc.OffsetRect(-dx,-dy);

	BOOL bRet = FALSE;

	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	CPoints pts;

	switch (nHitTest)
	{
	case TopLeft:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,point.y,rc.right,rc.bottom),m_pts,pts);
		break;
	case Top:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,point.y,rc.right,rc.bottom),m_pts,pts);
		break;
	case TopRight:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,point.y,point.x,rc.bottom),m_pts,pts);
		break; 
	case Right:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,point.x,rc.bottom),m_pts,pts);
		break;
	case BottomRight:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,point.x,point.y),m_pts,pts);
		break;
	case Bottom:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,rc.right,point.y),m_pts,pts);
		break;
	case BottomLeft:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,rc.top,rc.right,point.y),m_pts,pts);
		break;
	case Left:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,rc.top,rc.right,rc.bottom),m_pts,pts);
		break;
	case Body: 
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,rc.right,rc.bottom),m_pts,pts);
		bRet = TRUE;
		break;
	default:
		GetPoints(pts);
		PointHelper::OffsetPoints(pts,-dx,-dy);
		pts[nHitTest-HtIndex] = CPoint((int)point.x,(int)point.y);
		break;
	} 

	dc.Polyline(pts.GetData(),(int)pts.GetCount());

	return bRet;
}
コード例 #3
0
void CPie::InitDragging(CPointF point)
{
	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	DrawPieSEA(&dc,m_rc.left,m_rc.top,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_fStartAngel,m_fEndAngel);
	DrawPieSEA(&dc,m_rc.left,m_rc.top,point.x,point.y,m_fStartAngel,m_fEndAngel);

}
コード例 #4
0
void CGauge::InitDragging(CPointF point)
{
	CPointF ptStart = m_pts[m_pts.GetCount()-1] ;

	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	dc.MoveTo((int)ptStart.x,(int)ptStart.y);
	dc.LineTo((int)m_pWnd->GetCapturePos().x,(int)m_pWnd->GetCapturePos().y);
	dc.MoveTo((int)ptStart.x,(int)ptStart.y);
	dc.LineTo((int)point.x,(int)point.y);
}
コード例 #5
0
void CRoundRect::InitDrag(CPointF point)
{
	m_rc.left = point.x;
	m_rc.top = point.y;
	m_fXEllipse = m_fYEllipse = 0.5;

	CClientDC dc(m_pWnd);

	CPen pen(PS_DOT,1,RGB(0,0,0));
	CElastic elastic(&dc,this);

	DrawRoundRectXY(&dc,m_rc.left,m_rc.top,m_rc.left,m_rc.top,m_fXEllipse,m_fYEllipse);
}
コード例 #6
0
BOOL CRoundRect::OnDragStart(int nHitTest,CPointF point)
{
	BOOL bRet = FALSE;

	CClientDC dc(m_pWnd);	
	CElastic elastic(&dc,this);

	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;

	switch (nHitTest)
	{
	case TopLeft:
		DrawRoundRectXY(&dc,point.x,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case Top:
		DrawRoundRectXY(&dc,m_rc.left-dx,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case TopRight:
		DrawRoundRectXY(&dc,m_rc.left-dx,point.y,point.x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break; 
	case Right:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,point.x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case BottomRight:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,point.x,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case Bottom:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case BottomLeft:
		DrawRoundRectXY(&dc,point.x,m_rc.top-dy,m_rc.right-dx,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case Left:
		DrawRoundRectXY(&dc,point.x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case Ellipse:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		bRet = TRUE;
		break;
	case Body:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		bRet = TRUE;
		break;
	default:
		ASSERT(FALSE);
	}
 
	return bRet;
}
コード例 #7
0
void CPie::InitDrag(CPointF point)
{
	m_rc.left = point.x;
	m_rc.top = point.y;

	const REAL DEF_Start_ANGLE = 0.0;
	const REAL DEF_End_ANGLE = M_PI/2;

	m_fStartAngel = DEF_Start_ANGLE;
	m_fEndAngel = DEF_End_ANGLE;

	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	DrawPieSEA(&dc,m_rc.left,m_rc.top,m_rc.left,m_rc.top,m_fStartAngel,m_fEndAngel);

}
コード例 #8
0
BOOL CPie::OnDragStart(int nHitTest,CPointF point)
{
	BOOL bRet = TRUE;

	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;

	switch (nHitTest)
	{	
	case TopLeft:
		DrawPieSEA(&dc,point.x,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case Top:
		DrawPieSEA(&dc,m_rc.left-dx,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case TopRight:
		DrawPieSEA(&dc,m_rc.left-dx,point.y,point.x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break; 
	case Right:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,point.x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case BottomRight:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,point.x,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case Bottom:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case BottomLeft:
		DrawPieSEA(&dc,point.x,m_rc.top-dy,m_rc.right-dx,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case Left:
		DrawPieSEA(&dc,point.x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case Start:
	case End:
	case Body:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	}

	return bRet;
}
コード例 #9
0
void CRoundRect::OnDrag(int nHitTest,CPointF point)
{
	REAL x,y;
	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;

	switch (nHitTest)
	{
	case TopLeft:
		DrawRoundRectXY(&dc,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,point.x,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case Top:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_pWnd->GetCapturePos().y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,m_rc.left-dx,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case TopRight:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_pWnd->GetCapturePos().y,m_pWnd->GetCapturePos().x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,m_rc.left-dx,point.y,point.x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break; 
	case Right:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_pWnd->GetCapturePos().x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,point.x,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case BottomRight:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,point.x,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case Bottom:
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_pWnd->GetCapturePos().y,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case BottomLeft:
		DrawRoundRectXY(&dc,m_pWnd->GetCapturePos().x,m_rc.top-dy,m_rc.right-dx,m_pWnd->GetCapturePos().y,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,point.x,m_rc.top-dy,m_rc.right-dx,point.y,m_fXEllipse,m_fYEllipse);
		break;
	case Left:
		DrawRoundRectXY(&dc,m_pWnd->GetCapturePos().x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		DrawRoundRectXY(&dc,point.x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fXEllipse,m_fYEllipse);
		break;
	case Ellipse:
		{
			REAL fWidth = m_rc.Width()*m_fXEllipse;
			REAL fHeight = m_rc.Height()*m_fYEllipse;

			x = m_pWnd->GetCapturePos().x-m_pWnd->GetMarkPos().x;
			y = m_pWnd->GetCapturePos().y-m_pWnd->GetMarkPos().y;
			DrawRoundRect(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,fWidth+x*2,fHeight+y*2);

			x = point.x-m_pWnd->GetMarkPos().x;
			y = point.y-m_pWnd->GetMarkPos().y;
			DrawRoundRect(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,fWidth+x*2,fHeight+y*2);
		}
		break;
	case Body: 
		x = m_pWnd->GetCapturePos().x-m_pWnd->GetMarkPos().x-dx;
		y = m_pWnd->GetCapturePos().y-m_pWnd->GetMarkPos().y-dy;
		DrawRoundRectXY(&dc,m_rc.left+x,m_rc.top+y,m_rc.right+x,m_rc.bottom+y,m_fXEllipse,m_fYEllipse);

		x = point.x-m_pWnd->GetMarkPos().x-dx;
		y = point.y-m_pWnd->GetMarkPos().y-dy;
		DrawRoundRectXY(&dc,m_rc.left+x,m_rc.top+y,m_rc.right+x,m_rc.bottom+y,m_fXEllipse,m_fYEllipse);
		break;
	default:
		ASSERT(FALSE);
		break;
	}
}
コード例 #10
0
void CGauge::OnDrag(int nHitTest,CPointF point)
{
	CRectF rc;
	GetBoundsRect(rc);

	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;
	rc.OffsetRect(-dx,-dy);

	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	CPoints pts1,pts2;

	switch (nHitTest)
	{
	case TopLeft:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,rc.right,rc.bottom),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,point.y,rc.right,rc.bottom),m_pts,pts2);
		break;
	case Top:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,m_pWnd->GetCapturePos().y,rc.right,rc.bottom),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,point.y,rc.right,rc.bottom),m_pts,pts2);
		break;
	case TopRight:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,m_pWnd->GetCapturePos().y,m_pWnd->GetCapturePos().x,rc.bottom),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,point.y,point.x,rc.bottom),m_pts,pts2);
		break; 
	case Right:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,m_pWnd->GetCapturePos().x,rc.bottom),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,point.x,rc.bottom),m_pts,pts2);
		break;
	case BottomRight:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y),m_pts,pts1); 
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,point.x,point.y),m_pts,pts2); 
		break;
	case Bottom:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,rc.right,m_pWnd->GetCapturePos().y),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left,rc.top,rc.right,point.y),m_pts,pts2);
		break;
	case BottomLeft:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(m_pWnd->GetCapturePos().x,rc.top,rc.right,m_pWnd->GetCapturePos().y),m_pts,pts1);
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,rc.top,rc.right,point.y),m_pts,pts2); 
		break;
	case Left:
		PointHelper::RecalcPoints(m_rcBounds,CRectF(m_pWnd->GetCapturePos().x,rc.top,rc.right,rc.bottom),m_pts,pts1); 
		PointHelper::RecalcPoints(m_rcBounds,CRectF(point.x,rc.top,rc.right,rc.bottom),m_pts,pts2); 
		break;
	case Body: 
		{
			REAL x = m_pWnd->GetCapturePos().x-m_pWnd->GetMarkPos().x;
			REAL y = m_pWnd->GetCapturePos().y-m_pWnd->GetMarkPos().y;

			PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left+x,rc.top+y,rc.right+x,rc.bottom+y),m_pts,pts1);

			x = point.x-m_pWnd->GetMarkPos().x;
			y = point.y-m_pWnd->GetMarkPos().y;
			PointHelper::RecalcPoints(m_rcBounds,CRectF(rc.left+x,rc.top+y,rc.right+x,rc.bottom+y),m_pts,pts2);
		}
		break;
	default:
		{
			GetPoints(pts1);
			PointHelper::OffsetPoints(pts1,-dx,-dy);
			pts1[nHitTest-HtIndex] = CPoint((int)m_pWnd->GetCapturePos().x,(int)m_pWnd->GetCapturePos().y);	
			pts2.Copy(pts1);
			pts2[nHitTest-HtIndex] = CPoint((int)point.x,(int)point.y);
		}
		break;
	}

	dc.Polyline(pts1.GetData(),(int)pts1.GetCount()); 
	dc.Polyline(pts2.GetData(),(int)pts2.GetCount()); 
}
コード例 #11
0
void CPie::OnDrag(int nHitTest,CPointF point)
{
	CClientDC dc(m_pWnd);
	CElastic elastic(&dc,this);

	REAL dx = m_pWnd->GetStartPos().x;
	REAL dy = m_pWnd->GetStartPos().y;

	REAL x = m_pWnd->GetCapturePos().x - m_pWnd->GetMarkPos().x - dx;
	REAL y = m_pWnd->GetCapturePos().y - m_pWnd->GetMarkPos().y - dy;
	REAL x1 = point.x-m_pWnd->GetMarkPos().x - x -dx;
	REAL y1 = point.y-m_pWnd->GetMarkPos().y - y - dy;

	switch (nHitTest)
	{ 
	case TopLeft:
		DrawPieSEA(&dc,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,point.x,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case Top:
		DrawPieSEA(&dc,m_rc.left-dx,m_pWnd->GetCapturePos().y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,m_rc.left-dx,point.y,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case TopRight:
		DrawPieSEA(&dc,m_rc.left-dx,m_pWnd->GetCapturePos().y,m_pWnd->GetCapturePos().x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,m_rc.left-dx,point.y,point.x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break; 
	case Right:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,m_pWnd->GetCapturePos().x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,point.x,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case BottomRight:
		DrawPieSEA(&dc,m_rc.left,m_rc.top,m_pWnd->GetCapturePos().x,m_pWnd->GetCapturePos().y,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,m_rc.left,m_rc.top,point.x,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case Bottom:
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_pWnd->GetCapturePos().y,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case BottomLeft:
		DrawPieSEA(&dc,m_pWnd->GetCapturePos().x,m_rc.top-dy,m_rc.right-dx,m_pWnd->GetCapturePos().y,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,point.x,m_rc.top-dy,m_rc.right-dx,point.y,m_fStartAngel,m_fEndAngel);
		break;
	case Left:
		DrawPieSEA(&dc,m_pWnd->GetCapturePos().x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		DrawPieSEA(&dc,point.x,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,m_fEndAngel);
		break;
	case Start:
		{
			CPointF pt = GetStartPoint();
			pt.Offset(x,y);
			DrawPieEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,pt.x,pt.y,m_fEndAngel);
			pt.Offset(x1,y1);
			DrawPieEA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,pt.x,pt.y,m_fEndAngel);
		}
		break;
	case End: 
		{
			CPointF pt(GetEndPoint());
			pt.Offset(x,y);
			DrawPieSA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,pt.x,pt.y);
			pt.Offset(x1,y1);
			DrawPieSA(&dc,m_rc.left-dx,m_rc.top-dy,m_rc.right-dx,m_rc.bottom-dy,m_fStartAngel,pt.x,pt.y);	
		}	
		break;
	case Body:
		{
			CRectF rc(m_rc);
			rc.OffsetRect(x,y);
			DrawPieSEA(&dc,rc.left,rc.top,rc.right,rc.bottom,m_fStartAngel,m_fEndAngel);
			rc.OffsetRect(x1,y1);		
			DrawPieSEA(&dc,rc.left,rc.top,rc.right,rc.bottom,m_fStartAngel,m_fEndAngel);
		}

		break;
	default:
		ASSERT(FALSE);
		break;
	} 
}
コード例 #12
0
ファイル: chain.C プロジェクト: ptkila/cowichan
int
main(
  int		argc,			/* arg count */
  char	      * argv[]			/* arg vector */
){
  static char * context = "main(chain)";
  char	      * stem = NULL;		/* dump filename stem */
  char	      * suffix = NULL;		/* dump filename suffix */
  char	      * suff2 = NULL;		/* last half of suffix */
  int		nr, nc;			/* integer matrix sizes */
  int		n;			/* square matrix/vector size */
  real		base_x, base_y;		/* base of Mandelbrot */
  real		ext_x, ext_y;		/* extent of Mandelbrot */
  int		limit, seed;		/* randmat controls */
  real		fraction;		/* invperc/thresh filling */
  int		itersLife;		/* life iterations */
  int		itersElastic, relax;	/* elastic controls */
  int2D		i2D;			/* integer matrix */
  bool2D	b2D;			/* boolean matrix */
  pt1D		cities;			/* cities point vector */
  int		n_cities;		/* number of cities */
  pt1D		net;			/* net point vector */
  int		n_net;			/* number of net points */
  real2D	r2D_gauss;		/* real matrix for Gaussian */
  real2D	r2D_sor;		/* real matrix for SOR */
  real1D	r1D_gauss_v;		/* real vector input for Gaussian */
  real1D	r1D_sor_v;		/* real vector input for SOR */
  real1D	r1D_gauss_a;		/* real vector answer for Gaussian */
  real1D	r1D_sor_a;		/* real vector answer for SOR */
  real1D	r1D_gauss_c;		/* real vector check for Gaussian */
  real1D	r1D_sor_c;		/* real vector check for SOR */
  real		tol;			/* SOR tolerance */
  real		realDiff;		/* vector difference */
  bool		choicesSet = FALSE;	/* path choices set? */
  bool		doMandel = TRUE;	/* mandel vs. randmat */
  bool		doInvperc = TRUE;	/* invperc vs. thresholding */
  bool		doDump = FALSE;		/* dump intermediate results? */
  int		argd = 1;		/* argument index */

  /* arguments */
#if NUMA
  MAIN_INITENV(,32000000)
#endif
  while (argd < argc){
    CHECK(argv[argd][0] == '-',
	  fail(context, "bad argument", "index", "%d", argd, NULL));
    switch(argv[argd][1]){
     case 'E' :				/* elastic */
      itersElastic = arg_int(context, argc, argv, argd+1, argv[argd]);
      relax = arg_int(context, argc, argv, argd+2, argv[argd]);
      argd += 3;
      break;
     case 'F' :				/* fraction (invperc/thresh) */
      fraction = arg_real(context, argc, argv, argd+1, argv[argd]);
      argd += 2;
      break;
     case 'L' :				/* life */
      itersLife = arg_int(context, argc, argv, argd+1, argv[argd]);
      argd += 2;
      break;
     case 'M' :				/* mandel */
      base_x = arg_real(context, argc, argv, argd+1, argv[argd]);
      base_y = arg_real(context, argc, argv, argd+2, argv[argd]);
      ext_x  = arg_real(context, argc, argv, argd+3, argv[argd]);
      ext_y  = arg_real(context, argc, argv, argd+4, argv[argd]);
      argd += 5;
      break;
     case 'N' :				/* winnow */
      n_cities = arg_int(context, argc, argv, argd+1, argv[argd]);
      argd += 2;
      break;
     case 'R' :				/* randmat */
      limit = arg_int(context, argc, argv, argd+1, argv[argd]);
      seed  = arg_int(context, argc, argv, argd+2, argv[argd]);
      argd += 3;
      break;
     case 'S' :				/* matrix size */
      nr = arg_int(context, argc, argv, argd+1, argv[argd]);
      nc = arg_int(context, argc, argv, argd+2, argv[argd]);
      argd += 3;
      break;
     case 'T' :				/* SOR tolerance */
      tol = arg_real(context, argc, argv, argd+1, argv[argd]);
      argd += 2;
      break;
     case 'c' :				/* choice */
      CHECK(!choicesSet,
	    fail(context, "choices already set", NULL));
      suffix = arg_str(context, argc, argv, argd+1, argv[argd]);
      argd += 2;
      switch(suffix[0]){
       case 'i' :	doInvperc = TRUE;	break;
       case 't' :	doInvperc = FALSE;	break;
       default :
	fail(context, "unknown choice(s)", "choice", "%s", suffix, NULL);
      }
      switch(suffix[1]){
       case 'm' :	doMandel = TRUE;	break;
       case 'r' :	doMandel = FALSE;	break;
       default :
	fail(context, "unknown choice(s)", "choice", "%s", suffix, NULL);
      }
      suff2 = suffix+1;
      choicesSet = TRUE;
      break;
     case 'd' :				/* dump */
      doDump = TRUE;
      argd += 1;
      if ((argd < argc) && (argv[argd][0] != '-')){
        stem = arg_str(context, argc, argv, argd, argv[argd-1]);
        argd += 1;
      }
      break;
#if GRAPHICS
     case 'g' :
      gfx_open(app_chain, arg_gfxCtrl(context, argc, argv, argd+1, argv[argd]));
      argd += 2;
      break;
#endif
#if MIMD
     case 'p' :
      DataDist = arg_dataDist(context, argc, argv, argd+1, argv[argd]);
      ParWidth = arg_int(context, argc, argv, argd+2, argv[argd]);
      argd += 3;
      break;
#endif
     case 'u' :
      io_init(FALSE);
      argd += 1;
      break;
     default :
      fail(context, "unknown flag", "flag", "%s", argv[argd], NULL);
      break;
    }
  }
  CHECK(choicesSet,
	fail("context", "choices not set using -c flag", NULL));

  /* initialize */
#if MIMD
  sch_init(DataDist);
#endif

  /* mandel vs. randmat */
  if (doMandel){
    mandel(i2D, nr, nc, base_x, base_y, ext_x, ext_y);
    if (doDump) io_wrInt2D(context, mkfname(stem, NULL, suff2, "i2"), i2D, nr, nc);
  } else {
    randmat(i2D, nr, nc, limit, seed);
    if (doDump) io_wrInt2D(context, mkfname(stem, NULL, suff2, "i2"), i2D, nr, nc);
  }

  /* half */
  half(i2D, nr, nc);
  if (doDump) io_wrInt2D(context, mkfname(stem, "h", suff2, "i2"), i2D, nr, nc);

  /* invperc vs. thresh */
  if (doInvperc){
    invperc(i2D, b2D, nr, nc, fraction);
    if (doDump) io_wrBool2D(context, mkfname(stem, NULL, suffix, "b2"), b2D, nr, nc);
  } else {
    thresh(i2D, b2D, nr, nc, fraction);
    if (doDump) io_wrBool2D(context, mkfname(stem, NULL, suffix, "b2"), b2D, nr, nc);
  }

  /* life */
  life(b2D, nr, nc, itersLife);
  if (doDump) io_wrBool2D(context, mkfname(stem, "l", suffix, "b2"), b2D, nr, nc);

  /* winnow */
  winnow(i2D, b2D, nr, nc, cities, n_cities);
  if (doDump) io_wrPt1D(context, mkfname(stem, "w", suffix, "p1"), cities, n_cities);

  /* norm */
  norm(cities, n_cities);
  if (doDump) io_wrPt1D(context, mkfname(stem, "n", suffix, "p1"), cities, n_cities);

  /* elastic */
  n_net = (int)(ELASTIC_RATIO * n_cities);
  CHECK(n_net <= MAXEXT,
	fail(context, "too many net points required",
	     "number of net points", "%d", n_net, NULL));
  elastic(cities, n_cities, net, n_net, itersElastic, relax);
  if (doDump) io_wrPt1D(context, mkfname(stem, "e", suffix, "p1"), net, n_net);

  /* outer */
  n = n_net;
  outer(net, r2D_gauss, r1D_gauss_v, n);
  if (doDump){
    io_wrReal2D(context, mkfname(stem, "o", suffix, "r2"), r2D_gauss, n, n);
    io_wrReal1D(context, mkfname(stem, "o", suffix, "r1"), r1D_gauss_v, n);
  }

  cpReal2D(r2D_gauss, r2D_sor, n, n);
  cpReal1D(r1D_gauss_v, r1D_sor_v, n);

  /* gauss */
  gauss(r2D_gauss, r1D_gauss_v, r1D_gauss_a, n);
  if (doDump) io_wrReal1D(context, mkfname(stem, "g", suffix, "r1"), r1D_gauss_a, n);

  /* product (gauss) */
  product(r2D_gauss, r1D_gauss_a, r1D_gauss_c, n, n);
  if (doDump) io_wrReal1D(context, mkfname(stem, "pg", suffix, "r1"), r1D_gauss_c, n);

  /* sor */
  sor(r2D_sor, r1D_sor_v, r1D_sor_a, n, tol);
  if (doDump) io_wrReal1D(context, mkfname(stem, "s", suffix, "r1"), r1D_gauss_a, n);

  /* product (sor) */
  product(r2D_sor, r1D_sor_a, r1D_sor_c, n, n);
  if (doDump) io_wrReal1D(context, mkfname(stem, "ps", suffix, "r1"), r1D_gauss_c, n);

  /* difference */
  vecdiff(r1D_gauss_a, r1D_sor_a, n, &realDiff);
  if (doDump) io_wrReal0D(context, mkfname(stem, "v", suffix, "r0"), realDiff);

#if IEEE
  ieee_retrospective(stderr);
#endif
#if NUMA
  MAIN_END;
#endif

  return 0;
}