home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of A1200
/
World_Of_A1200.iso
/
programs
/
monitors
/
rsys
/
source.lha
/
src
/
RSysGfxCtrl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-09
|
3KB
|
142 lines
/*
***************************************************************************
*
* Datei:
* RSysGfxCtrl.c
*
* Inhalt:
* int TextLen(struct TextFont *tf, struct RastPort *RP, char *text);
* short compute(unsigned short offset, unsigned short xy, int measure);
* unsigned short ComputeX(unsigned short value);
* unsigned short ComputeY(unsigned short value);
* void ComputeFont(struct Screen *wndscr, unsigned short width, unsigned short height);
*
* 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 "RSysDebug.h"
#include "RSysFunc.h"
/*
* TextLen() berechnet die Länge eines Strings in einem gewählten
* RastPort bezüglich des verwendeten TextFonts. Dabei werden
* auch proportionale Schriften und das Kerning berücksichtigt
*/
int
TextLen(struct TextFont *tf, struct RastPort *RP, char *text)
{
int retlen = 0,
slen = strlen(text),
i;
WORD *charspace = (WORD *) tf->tf_CharSpace;
DPOS;
if (tf->tf_CharSpace == NULL)
retlen = TextLength(RP, (UBYTE *) text, strlen(text));
else
for (i = 0; i < slen; i++)
retlen += charspace[(int)text[i]];
return (retlen);
}
/*
* compute() berechnet die fontsensitiven Abmessungen von
* Intuition-Objekten
*/
WORD
compute(UWORD offset, UWORD xy, int measure)
{
return (offset + ((xy * (measure * FRAC)) / FULL));
}
/*
* 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(struct Screen *wndscr, UWORD width, UWORD height)
{
char *test = "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"1234567890"
",.-;:!()=?[]{} ";
DPOS;
if (Flags.sysfont)
{
Font = &Topaz80;
FontX = 8;
/* FontY = ((wndscr->Font->ta_YSize > 8) ? wndscr->Font->ta_YSize : 8);*/
FontY = 8;
}
else
{
Font = wndscr->Font;
Forbid();
FontX = (TextLen(GfxBase->DefaultFont, &wndscr->RastPort, test) + 4) / strlen(test);
Permit();
FontY = Font->ta_YSize;
}
OffX = wndscr->WBorLeft;
OffY = wndscr->RastPort.TxHeight + Scr->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(FONT_ERR, SIZE_FAIL, NO_KILL);
Font = &Topaz80;
FontX = 8;
FontY = 8;
Font->ta_YSize = 8;
Flags.sysfont = 1;
return;
}