		/******************************************/
		/* Kicad: Common plot HPGL Routines */
		/******************************************/

#include "fctsys.h"
#include "gr_basic.h"
#include "trigo.h"
#include "wxstruct.h"
#include "base_struct.h"
#include "common.h"
#include "plot_common.h"
#include "macros.h"

/* parametre HPGL pour trace de cercle: */
#define CHORD_ANGLE 10

// Variables partagees avec Common plot Postscript Routines
extern wxPoint LastPenPosition;
extern wxPoint PlotOffset;
extern FILE * PlotOutputFile;
extern double XScale, YScale;
extern int g_DefaultPenWidth, g_CurrentPenWidth;
extern int PlotOrientOptions, etat_plume;

//Variables locales
void Move_Plume_HPGL( wxPoint pos, int plume );
void Plume_HPGL( int plume );


/***********************************************************************************/
void InitPlotParametresHPGL(wxPoint offset, double xscale, double yscale, int orient)
/***********************************************************************************/
/* Set the plot offset for the current plotting
 xscale,yscale = coordinate scale (scale coefficient for coordinates)
 device_xscale,device_yscale = device coordinate scale (i.e scale used by plot device)
*/
{
	PlotOffset = offset;
	XScale = xscale;
	YScale = yscale;
	g_DefaultPenWidth = 6;			/* epaisseur du trait standard en 1/1000 pouce */
	PlotOrientOptions = orient;
	g_CurrentPenWidth = -1;
}



/*****************************************************************/
bool PrintHeaderHPGL(FILE * plot_file, int pen_speed, int pen_num)
/*****************************************************************/
{
char Line[256];

	PlotOutputFile = plot_file;
	etat_plume = 'U';
	sprintf(Line,"IN;VS%d;PU;PA;SP%d;\n",pen_speed,pen_num);
	fputs(Line,plot_file);
	return TRUE;
}

/**********************************/
bool CloseFileHPGL(FILE * plot_file)
/**********************************/
{
	fputs("PU;PA;SP0;\n",plot_file);
	fclose(plot_file);
	return TRUE;
}


/************************************************************/
void PlotCircle_HPGL(wxPoint centre, int diameter, int width)
/************************************************************/
{
int rayon;
char Line[256];

	UserToDeviceCoordinate(centre);
	rayon = (int)(diameter / 2 * XScale);

	if(rayon < 0 ) rayon = 0 ;

	Plume_HPGL('U');
	sprintf(Line,"PA %d,%d;CI %d,%d;\n", centre.x, centre.y, rayon , CHORD_ANGLE);
	fputs(Line,PlotOutputFile) ;

	Plume_HPGL('U'); return ;
}


/********************************************************************/
void PlotArcHPGL(wxPoint centre, int StAngle, int EndAngle, int rayon, int width)
/********************************************************************/
/* trace d'un arc de cercle:
	centre = coord du centre
	StAngle, EndAngle = angle de debut et fin
	rayon = rayon de l'arc
	commande
		PU;PA x,y;PD;AA start_arc_X, start_arc_Y, angle, NbSegm; PU;
	ou	PU;PA x,y;PD;AA start_arc_X, start_arc_Y, angle; PU;
*/
{
char Line[256];
wxPoint cmap;			/* point de depart */
wxPoint cpos;				/* centre */
float angle;			/* angle de l'arc*/

	if(rayon <= 0 ) return ;

	cpos = centre; UserToDeviceCoordinate(cpos);

	if( PlotOrientOptions == PLOT_MIROIR)
	{
		EndAngle = - EndAngle;
		StAngle = - StAngle;
		EXCHG (StAngle, EndAngle);
	}
	angle = (EndAngle - StAngle) /10.0;
	/* Calcul des coord du point de depart : */
	cmap.x = (int)( centre.x + ( rayon * cos(StAngle * M_PI / 1800 ) ) );
	cmap.y = (int)(centre.y + ( rayon * sin(StAngle * M_PI / 1800 ) ) );
	UserToDeviceCoordinate(cmap);

	Plume_HPGL('U');
	sprintf(Line,"PU;PA %d,%d;PD;AA %d,%d, ", cmap.x, cmap.y, cpos.x, cpos.y);
	fputs(Line,PlotOutputFile) ;
	sprintf(Line,"%f", - angle); to_point(Line); // Transforme , et . du separateur
	fputs(Line,PlotOutputFile) ;
	sprintf(Line,", %d", CHORD_ANGLE); fputs(Line,PlotOutputFile) ;
	sprintf(Line,";PU;\n"); fputs(Line,PlotOutputFile) ;
	Plume_HPGL('U');
}


/*****************************************************/
void PlotPolyHPGL( int nb, int * coord, int fill, int width)
/*****************************************************/
/* Trace un polygone (ferme si rempli) en format HPGL
	coord = tableau des coord des sommets
	nb = nombre de coord ( 1 coord = 2 elements: X et Y du tableau )
	fill : si != 0 polygone rempli
*/
{
int ii;
	if( nb <= 1 ) return;

	Move_Plume_HPGL( wxPoint(coord[0],coord[1]), 'U');
	for( ii = 1; ii < nb  ; ii ++ )
		{
		Move_Plume_HPGL( wxPoint(coord[ii * 2],coord[(ii*2) +1]), 'D');
		}

	/* Fermeture eventuelle du polygone */
	if ( fill )
		{
		ii = (nb - 1) * 2;
		if( (coord[ii] != coord[0] ) || (coord[ii+1] != coord[0]) )
				 Move_Plume_HPGL( wxPoint(coord[0],coord[1]), 'D');
		}
	Plume_HPGL('U');
}


/**********************************************/
void Move_Plume_HPGL( wxPoint pos, int plume )
/**********************************************/
/*
	deplace la plume levee (plume = 'U') ou baissee (plume = 'D')
	en position x,y
	Unites en Unites DESSIN
	Si plume = 'Z' lever de plume sans deplacement
*/
{
char Line[256];

	if ( plume == 'Z')
	{
		Plume_HPGL('U');
		return;
	}
	Plume_HPGL(plume);
	UserToDeviceCoordinate(pos);

	sprintf(Line,"PA %d,%d;\n",pos.x,pos.y) ; fputs(Line,PlotOutputFile) ;
}


/***************************/
void Plume_HPGL( int plume )
/***************************/
/* leve (plume = 'U') ou baisse (plume = 'D') la plume
*/
{
	if ( plume == 'U')
		{
		if(etat_plume != 'U' ) fputs("PU;",PlotOutputFile) ;
		etat_plume = 'U';
		}
	else
		{
		if(etat_plume != 'D' )fputs("PD;",PlotOutputFile) ;
		etat_plume = 'D';
		}
}



