/*
   ***************************************************************************
   *
   * Datei:
   *      RSysGfxCtrl.c
   *
   * Inhalt:
   *
   *      --- Globale Routinen ---
   *
   *    UWORD ComputeX ( UWORD value );
   *    UWORD ComputeY ( UWORD value );
   *    void ComputeFont ( SCREEN *wndscr , UWORD width , UWORD height );
   *    WORD compute ( UWORD offset , UWORD xy , int measure );
   *
   *      --- Lokale  Routinen ---
   *
   *
   * Bemerkungen:
   *      Graphics-Routinen für die Unterstützung fontsensitiver
   *      Benutzeroberflächen.
   *
   * Erstellungsdatum:
   *      25-Jun-93     Rolf Böhme
   *
   * Änderungen:
   *      25-Jun-93     Rolf Böhme        Erstellung
   *
   ***************************************************************************
 */

#include "RSys.h"
#include "protos.h"

/*
   * compute() berechnet die fontsensitiven Abmessungen von
   * Intuition-Objekten
 */
WORD
compute (UWORD offset, UWORD xy, int measure)
{
  return (WORD) (offset + ((xy * (measure * FRAC)) / FULL));	/* GMD */
}

/*
   * computeX() berechnet einen Wert bezüglich der
   * Fontbreite
 */
UWORD
ComputeX (UWORD value)
{
  return ((UWORD) (((FontX * value) + 4) / 8));
}

/*
   * computeY() berechnet einen Wert bezüglich der
   * Fonthöhe
 */
UWORD
ComputeY (UWORD value)
{
  return ((UWORD) (((FontY * value) + 4) / 8));
}


/*
   * ComputeFont() berechnet die korrekte Breite und Höhe eines
   * Fonts. Passen Höhe und Breite eines Abschnittes, verknüpft
   * mit den Fontdaten nicht auf den angegebenen Screen, wird der
   * System-Standard-Font topaz in der Größe 8 verwendet
 */
void
ComputeFont (SCREEN * wndscr, UWORD width, UWORD height)
{

  DPOS;

  if (Flags.sysfont)
    {
      Font = &Topaz80;
      FontX = 8;
      FontY = 8;
      Font->ta_YSize = 8;
    }
  else
    {
      Forbid ();
      Font = &TAttr;
      Font->ta_Name = (STRPTR) GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name;
      Font->ta_YSize = FontY = GfxBase->DefaultFont->tf_YSize;
      FontX = GfxBase->DefaultFont->tf_XSize;
      Permit ();
    }

  OffX = wndscr->WBorLeft;
  OffY = wndscr->RastPort.TxHeight + wndscr->WBorTop + 1;

  if (width && height)
    {
      if ((ComputeX (width) + OffX + wndscr->WBorRight) > wndscr->Width)
	goto UseTopaz;
      if ((ComputeY (height) + OffY + wndscr->WBorBottom) > wndscr->Height)
	goto UseTopaz;
    }

  return;

UseTopaz:
  ErrorHandle ((char *) Font->ta_Name, FONT_ERR, SIZE_FAIL, NO_KILL);

  Font = &Topaz80;
  FontX = 8;
  FontY = 8;
  Font->ta_YSize = 8;

  Flags.sysfont = 1;

  return;
}
