/* DrawText.c © Paweî Marciniak <pmarciniak@lodz.home.pl>*/
#include <string.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <graphics/text.h>
#include <utility/tagitem.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/utility.h>

#include "/include/libraries/image.h"


/**DrawText*************************************************************/


/* DrawText() (c) 1997 Paweî Marciniak
  Modify date  |  Version  |  Comment
---------------+-----------+------------------------------
06-07-97 10:37 |  1.0      |
14-08-97 15:30 |   2.0     |
*/
LONG __saveds __asm DrawTextA( register __a0 struct TagItem * Tags )
{
  struct TagItem *ti, *TagsTmp=Tags;

  STRPTR texts=0;
  struct TextFont *TxFontA=0, *TxFontB=0;
  struct RastPort *RastPort=0;
  UWORD Top=0, Left=0, Width=0, Height=0; 

  STRPTR text=NULL;
  STRPTR memory=NULL;

  char *TextTab[20];
  struct TextFont *TabFont[20];
  int TabStyle[20];

  int licznik=0;
  int loop=0, High=0;

/* Tags */
  while ( ti = NextTagItem( &TagsTmp ) )
  {
    switch ( ti->ti_Tag )
    {
      case DT_FontA:
        TxFontA = ( struct TextFont * )ti->ti_Data;
      break;
      
      case DT_FontB:
        TxFontB = ( struct TextFont * )ti->ti_Data;
      break;

      case DT_Texts:
        texts = ( STRPTR )ti->ti_Data;
      break;

      case DT_Top:
        Top = ti->ti_Data;
      break;

      case DT_Left:
        Left = ti->ti_Data;
      break;

      case DT_Width:
        Width = ti->ti_Data;
      break;

      case DT_Height:
        Height = ti->ti_Data;
      break;

      case DT_RastPort:
        RastPort = (struct RastPort *)ti->ti_Data;
      break;
      
      default:
      break;
    }
  }

/* Alokujemy pamiëê dla tekstu */
  if(!(memory=AllocVec( (strlen(texts)+1), MEMF_PUBLIC )))
    return FALSE;
  text=memory;

/* Kopiujemy "texts" do naszej pamiëci "text" */
  strcpy(text, texts);

/* Wpisujemy adres pierwszego tekstu do tablicy */
  if(*text == '1')
  {
    TabFont[licznik]=TxFontB;
    text++;
  }
  else
    TabFont[licznik]=TxFontA;

  switch(*text)
  {
    case 'b':

      TabStyle[licznik]=FSF_BOLD;
      text++;
    break;

    case 'i':

      TabStyle[licznik]=FSF_ITALIC;
      text++;
    break;

    case 'u':

      TabStyle[licznik]=FSF_UNDERLINED;
      text++;
    break;

    default:

      TabStyle[licznik]=FS_NORMAL;
    break;
  }
  TextTab[licznik]=text;

/* Zamieniamy wszystkie znaki "\n" na "\0", */
/* i wpisujemy ich adresy do tablicy adresy */
/* Jeôli po '\n' wystâpi znak '1' to ta linia */
/* tekstu zastanie narysowana czcionkâ TxFontB */
/* w przeciwnym przeciwny przypadku TxFontA */

  while(*text != '\0')
  {
    if(*text == '\n')
      {
        *text='\0';
        licznik++;
        text++;
        if(*text == '1')
        {
          TabFont[licznik]=TxFontB;
          text++;
        }
        else
          TabFont[licznik]=TxFontA;

        switch(*text)
        {
          case 'b':
            TabStyle[licznik]=FSF_BOLD;
            text++;
          break;

          case 'i':
            TabStyle[licznik]=FSF_ITALIC;
            text++;
          break;

          case 'u':
            TabStyle[licznik]=FSF_UNDERLINED;
            text++;
          break;

          default:
            TabStyle[licznik]=FS_NORMAL;
          break;
        }
        TextTab[licznik]=text;
      }
    else
      text++;
  }


  SetDrMd( RastPort, JAM1 );
  while(loop <= licznik)
  {
    SetFont( RastPort, TabFont[loop] );
    SetSoftStyle( RastPort, TabStyle[loop], FSF_BOLD | FSF_ITALIC | FSF_UNDERLINED );
    Move( RastPort, Left+(Width-(TextLength(RastPort, TextTab[loop], strlen(TextTab[loop]))))/2,
          Top+( RastPort->TxBaseline+loop)+High );
    Text( RastPort, TextTab[loop], strlen(TextTab[loop]) );

    High+=(RastPort->TxHeight);
    loop++;
  }

  if(memory)
    FreeVec(memory);
  memory=NULL;

  return TRUE;
}
