	/************************************************/
	/* drawtxt.cpp : trace des textes de composants */
	/************************************************/

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "plot_common.h"

#include "trigo.h"
#include "macros.h"

#ifndef DEFAULT_SIZE_TEXT
#define DEFAULT_SIZE_TEXT 50
#endif

#define EDA_DRAWBASE
#include "grfonte.h"

/* fonctions locales : */


/****************************************************************************/
void DrawGraphicText(WinEDA_DrawPanel * panel, wxDC * DC,
			const wxPoint & Pos, int gcolor, const wxString & Text,
			int orient, const wxSize & Size, int h_justify, int v_justify, int width)
/*****************************************************************************/
/* Draw a graphic text (like module texts)
	Text = text to draw
	Pos = text position (according to h_justify, v_justify)
	Size = text size (size.x or size.y can be < 0 for mirrored texts) 
	orient = angle in 0.1 degree
	mode_color = GR_OR, GR_XOR..
	h_justify = horizontal justification (Left, center, right)
	v_justify = vertical justification (bottom, center, top)
	width = line width (pen width) (default = 0)
		if width < 0 : draw segments in sketch mode, width = abs(width)
*/
{
int ii, kk,nbchar, AsciiCode, endcar;
int k1 , k2, x0, y0;
int zoom;
int size_h , size_v , espacement ;
SH_CODE f_cod , plume = 'U';
const SH_CODE * ptcar;
int ptr;
int ux0, uy0, dx, dy;	// Coord de trace des segments de texte & variables de calcul */
int cX, cY;				// Centre du texte
int ox, oy;				// coord de trace du caractere courant
int coord[100];			// liste des coord des segments a tracer
bool sketch_mode = FALSE;
	
	zoom = panel->GetZoom();

	size_h = Size.x;
	size_v = Size.y;

	if ( width < 0 )
	{
		width = - width;
		sketch_mode = TRUE;
	}
	kk = 0 ; ptr = 0;	/* ptr = text index */

	/* calcul de la position du debut des textes: ox et oy */
	nbchar = Text.Len();
	if ( nbchar == 0 ) return;

	espacement = (10 * size_h ) / 9;
	ox = cX = Pos.x; oy = cY = Pos.y;

	/* Si le texte est totalement hors fenetre d'affichage, terminé! */
	if ( panel )
	{
		int xm, ym, ll, xc, yc;
		int textsize = ABS(espacement);
		ll = (textsize * nbchar) / zoom;
		xc = GRMapX(cX);
		yc = GRMapY(cY);
		x0 = panel->m_ClipBox.GetX() - ll;
		y0 = panel->m_ClipBox.GetY() -ll ;
		xm = panel->m_ClipBox.GetRight() + ll;
		ym = panel->m_ClipBox.GetBottom() + ll;
		if ( xc < x0 ) return;
		if ( yc < y0 ) return;
		if ( xc > xm ) return;
		if ( yc > ym ) return;
	}


	/* Calcul du cadrage du texte */
	dx = (espacement * nbchar) / 2;
	dy = size_v / 2;	/* Decalage du debut du texte / centre */

	ux0 = uy0 = 0;  /* Decalage du centre du texte / coord de ref */

	if( (orient == 0) || (orient == 1800) ) /* Texte Horizontal */
		{
		switch(h_justify)
			{
			case GR_TEXT_HJUSTIFY_CENTER:
				break;

			case GR_TEXT_HJUSTIFY_RIGHT:
				ux0 = - dx;
				break;

			case GR_TEXT_HJUSTIFY_LEFT:
				ux0 = dx;
				break;
			}

		switch(v_justify)
			{
			case GR_TEXT_VJUSTIFY_CENTER:
				break;

			case GR_TEXT_VJUSTIFY_TOP:
				uy0 = dy;
				break;

			case GR_TEXT_VJUSTIFY_BOTTOM:
				uy0 = -dy;
				break;
			}
		}

	else	/* Texte Vertical */
		{
		switch(h_justify)
			{
			case GR_TEXT_HJUSTIFY_CENTER:
				break;

			case GR_TEXT_HJUSTIFY_RIGHT:
				ux0 = - dy;
				break;

			case GR_TEXT_HJUSTIFY_LEFT:
				ux0 = dy;
				break;
			}

		switch(v_justify)
			{
			case GR_TEXT_VJUSTIFY_CENTER:
				break;

			case GR_TEXT_VJUSTIFY_TOP:
				uy0 = dx;
				break;

			case GR_TEXT_VJUSTIFY_BOTTOM:
				uy0 = -dx;
				break;
			}
		}
	cX += ux0; cY += uy0;
	ox = cX - dx; ; oy = cY + dy;

	if( (Size.x/zoom) == 0 ) return;

	if( ABS((Size.x/zoom)) < 3) /* chars trop petits pour etre dessines */
	{	/* le texte est symbolise par une barre */
		dx = (espacement * nbchar) / 2;
		dy = size_v / 2;	 /* Decalage du debut du texte / centre */

		ux0 = cX - dx; uy0 = cY;
		dx += cX; dy = cY;
		RotatePoint(&ux0, &uy0, cX, cY, orient);
		RotatePoint(&dx, &dy, cX, cY, orient);
		GRLine(&panel->m_ClipBox, DC, ux0, uy0, dx, dy, gcolor);

		return;
	}

#if 0
dx = (espacement * nbchar) / 2;
dy = size_v / 2;	 /* Decalage du debut du texte / centre */
ux0 = cX - dx; uy0 = cY;
dx += cX; dy = cY;
RotatePoint(&ux0, &uy0, cX, cY, orient);
RotatePoint(&dx, &dy, cX, cY, orient);
DC->SetTextForeground( wxColour(
						ColorRefs[gcolor].r,
						ColorRefs[gcolor].g,
						ColorRefs[gcolor].b) );
DC->DrawRotatedText(Text, GRMapX(ux0), GRMapY(uy0), (double) orient / 10.0);
return;
#endif

	while(kk++ < nbchar)
		{
		x0 = 0 ; y0 = 0 ;
		AsciiCode = Text.GetChar(ptr) & 255;
		ptcar = graphic_fonte_shape[AsciiCode] ; /* ptcar pointe la description
						du caractere a dessiner */

		for(ii = 0, endcar = FALSE; ! endcar; ptcar++)
			{
			 f_cod = *ptcar ; /* get code n de la forme selectionnee */
			 switch(f_cod)
				 {
				 case 'X' :
					endcar = TRUE;/* fin du caractere */
					break;

				 case 'U' :
						if(ii && (plume == 'D' ) )
							{
							if ( width <= 1 )
								GRPoly(&panel->m_ClipBox, DC, ii /2, coord, 0,
									gcolor, gcolor);
							else if ( sketch_mode )
							{
								int ik, * coordptr;
								coordptr = coord;
								for ( ik = 0; ik < (ii-2); ik += 2,  coordptr+= 2)
									GRCSegm(&panel->m_ClipBox, DC, *coordptr, *(coordptr+1),
											*(coordptr+2), *(coordptr+3), width, gcolor) ;
							}
								
							else
								GRPolyLines(&panel->m_ClipBox, DC, ii /2, coord,
									gcolor, gcolor, width);
							}
						plume = f_cod; ii = 0;
						break;

				 case 'D' : plume = f_cod ; break ;

				 default  :
					{
					k1 = f_cod; /* trace sur axe V */
					k1 = - ((k1 * size_v) / 9) ;
					ptcar++ ;
					f_cod = *ptcar  ;
					k2 = f_cod; /* trace sur axe H */
					k2 = (k2 * size_h) / 9 ;
					dx = k2 + ox; dy = k1 + oy;
					RotatePoint(&dx, &dy, cX, cY, orient);
					coord[ii] = dx;  ii++; coord[ii] = dy; ii++;
					break ;
					}
				 } /* end switch */
			} /* end boucle for = end trace de 1 caractere */

		ptr++; ox += espacement;
		} /* end trace du texte */

}


/******************************************************************************************/
void PlotGraphicText(int format_plot, const wxPoint & Pos, int gcolor,
				 const wxString & Text,
				int orient, const wxSize & Size, int h_justify, int v_justify)
/******************************************************************************************/
/*
 id DrawGraphicText, for plot graphic text
*/
{
int kk, nbchar, end, AsciiCode;
int k1 , k2 , x0 , y0, ox, oy ;
int size_h , size_v , espacement ;
SH_CODE f_cod , plume = 'U';
const SH_CODE * ptcar;
int ptr;
int ux0, uy0, dx, dy;	// Coord de trace des segments de texte & variables de calcul */
int cX, cY;				// Centre du texte
void (*FctPlume)(wxPoint pos, int state);
	
	switch ( format_plot)
	{
		case PLOT_FORMAT_POST:
			FctPlume = LineTo_PS;
			break;

		case PLOT_FORMAT_HPGL:
			FctPlume = Move_Plume_HPGL;
			break;

		case PLOT_FORMAT_GERBER:
		default:
			return;
	}

	if ( (gcolor >= 0) && (format_plot == PLOT_FORMAT_POST) )
		SetColorMapPS ( gcolor );

	size_h = Size.x;
	size_v = Size.y;
	if(size_h == 0) size_h = DEFAULT_SIZE_TEXT;
	if(size_v == 0) size_v = DEFAULT_SIZE_TEXT;

	kk = 0 ; ptr = 0; /* ptr = text index */

	/* calcul de la position du debut des textes: ox et oy */
	nbchar = Text.Len();

	espacement = (10 * size_h ) / 9;
	ox = cX = Pos.x; oy = cY = Pos.y;

	/* Calcul du cadrage du texte */
	dx = (espacement * nbchar) / 2;
	dy = size_v / 2;	/* Decalage du debut du texte / centre */

	ux0 = uy0 = 0;  /* Decalage du centre du texte / ccord de ref */

	if( (orient == 0) || (orient == 1800) ) /* Texte Horizontal */
	{
		switch(h_justify)
		{
			case GR_TEXT_HJUSTIFY_CENTER:
				break;

			case GR_TEXT_HJUSTIFY_RIGHT:
				ux0 = - dx;
				break;

			case GR_TEXT_HJUSTIFY_LEFT:
				ux0 = dx;
				break;
		}

		switch(v_justify)
		{
			case GR_TEXT_VJUSTIFY_CENTER:
				break;

			case GR_TEXT_VJUSTIFY_TOP:
				uy0 = dy;
				break;

			case GR_TEXT_VJUSTIFY_BOTTOM:
				uy0 = -dy;
				break;
		}
	}

	else	/* Texte Vertical */
	{
		switch(h_justify)
		{
			case GR_TEXT_HJUSTIFY_CENTER:
				break;

			case GR_TEXT_HJUSTIFY_RIGHT:
				ux0 = -dy;
				break;

			case GR_TEXT_HJUSTIFY_LEFT:
				ux0 = dy;
				break;
		}

		switch(v_justify)
		{
			case GR_TEXT_VJUSTIFY_CENTER:
				break;

			case GR_TEXT_VJUSTIFY_TOP:
				uy0 = dx;
				break;

			case GR_TEXT_VJUSTIFY_BOTTOM:
				uy0 = -dx;
				break;
		}
	}
	cX += ux0; cY += uy0;	/* cX, cY = coord du centre du texte */
	ox = -dx; oy = +dy; /* ox, oy = coord debut texte, relativement au centre */

	FctPlume(wxPoint(0,0), 'Z');

	while(kk++ < nbchar)
		{
		AsciiCode = Text.GetChar(ptr) & 255;
		ptcar = graphic_fonte_shape[AsciiCode] ; /* ptcar pointe la description
						du caractere a dessiner */

		for(end = 0 ; end == 0; ptcar++)
			{
			 f_cod = *ptcar ; /* get code n de la forme selectionnee */
			 switch(f_cod)
				{
				case 'X' : end = 1 ;/* fin du caractere */

				case 'U' :
				case 'D' : plume = f_cod ; break ;

				default  :
					k1 = f_cod ; /* trace sur axe V */
					k1 = -(k1 * size_v) / 9 ;
					ptcar++ ;
					f_cod = *ptcar;
					k2 = f_cod; /* trace sur axe H */
					k2 = (k2 * size_h) / 9 ;
					dx = k2 + ox; dy = k1 + oy;
					RotatePoint(&dx, &dy, orient);
					FctPlume(wxPoint(cX + dx, cY + dy), plume);
					x0 = k2 ; y0 = k1 ;
					break ;
				} /* end switch */
			} /* end boucle for = end trace de 1 caractere */

		FctPlume(wxPoint(0,0), 'Z');
		ptr++; ox += espacement;
		} /* end trace du texte */
	FctPlume(wxPoint(0,0), 'Z');
}

