
#include <exec/types.h>
#include <exec/memory.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <intuition/intuition.h>

#define __USE_SYSBASE
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>



void PrintUText(struct RastPort *rp, struct IntuiText *itext, WORD x, WORD y)
{
	struct RastPort *tmprp;
	struct IntuiText *tmpit;
	struct TextFont *font;
	UBYTE	 txtbuf[80],
			 c, opened;
	WORD	 upos = -1, i, *charspc, ux, uy, ux2;
	STRPTR s, s2;

	if (!(tmprp = AllocMem(sizeof(struct RastPort), MEMF_ANY)))
		return;

	CopyMem(rp, tmprp, sizeof(struct RastPort));

	/*------------------------------------------------*/

	while (itext)
	{
		ux = x + itext->LeftEdge; uy = y + itext->TopEdge + 1;

		s = itext->IText;
		s2 = txtbuf;
		i = 0;
		do 
		{
			c = *s++;
			if (c == '_')
			{
				upos = i;
				do ; while (*s2++ = *s++);
				break;		
			}
			*s2++ = c;
			i++;
		} while (c);

		if (upos != -1)
		{
			if (font = OpenFont(itext->ITextFont))
				opened = TRUE;
			else
			{
				opened = FALSE;
				if (!(font = rp->Font))
					font = GfxBase->DefaultFont;
			}

			if (font->tf_Flags & FPF_PROPORTIONAL)
			{
				s = txtbuf;
				charspc = font->tf_CharSpace;
				for (i=0; i <= upos; i++) 
				{
					c = *s++ - font->tf_LoChar;

					if (i == upos)
						ux2 = ux + charspc[c] - 1;
					else
						ux += charspc[c];
				}
			}
			else
			{
				ux += upos * font->tf_XSize;
				ux2 = ux + font->tf_XSize - 1;
				uy++;
			}
			uy += font->tf_Baseline;

			SetAPen(tmprp, itext->FrontPen);
			SetBPen(tmprp, itext->BackPen);
			SetDrMd(tmprp, itext->DrawMode);

			Move(tmprp, ux, uy); Draw(tmprp, ux2, uy);

			if (opened)
				CloseFont(font);
		}

		tmpit = itext->NextText;
		itext->NextText = NULL;

		s = itext->IText;		
		itext->IText = txtbuf;

		PrintIText(rp, itext, x, y);

		itext->IText = s;
		itext->NextText = tmpit;

		itext = tmpit;
	}

	FreeMem(tmprp, sizeof(struct RastPort));
}

