home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Programming
/
Triton
/
Source
/
src
/
text_prim.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-23
|
11KB
|
388 lines
/*
* OpenTriton -- A free release of the triton.library source code
* Copyright (C) 1993-1998 Stefan Zeiger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* text_prim.c - Text Primitives
*
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define INTUI_V36_NAMES_ONLY
#define TR_NOSUPPORT
#define TR_THIS_IS_TRITON
#define TR_EXTERNAL_ONLY
#include "include/libraries/triton.h"
#include "include/clib/triton_protos.h"
#include "prefs/Triton.h"
#include "/internal.h"
#include "parts/define_classes.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////// Text Primitives //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
ULONG __regargs TR_SimplifyTextFlags(struct TR_Project *project, ULONG flags)
{
if(flags&TRTX_TITLE)
{
flags&=(~TRTX_TITLE);
switch(((struct TR_AppPrefs *)(project->trp_App->tra_Prefs))->frames_title)
{
case 1: /* Highlight */
flags|=TRTX_HIGHLIGHT;
break;
case 2: /* Shadow */
flags|=TRTX_3D;
}
}
return flags;
}
/****** triton.library/TR_TextWidth ******
*
* NAME
* TR_TextWidth -- Returns text width. (V6)
*
* SYNOPSIS
* Width = TR_TextWidth(Project, Text, Flags)
* A0 A2 D0
*
* ULONG TR_TextWidth(struct TR_Project *, STRPTR, ULONG);
*
* FUNCTION
* Returns the width of a text string with the specified
* TRTX_* flags in the given project.
*
* RESULT
* Width - The width of the text in pixels
*
* SEE ALSO
* TR_TextHeight(), TR_PrintText()
*
******/
ULONG __saveds __asm TR_TextWidth(register __a0 struct TR_Project *project,
register __a2 STRPTR text,
register __d0 ULONG flags)
{
struct IntuiText itext;
ULONG width,linewidth,start,stop;
UBYTE underscore[2],sep;
if(!text) return 0;
flags=TR_SimplifyTextFlags(project,flags);
itext.ITextFont=project->trp_PropAttr;
if(flags&TRTX_MULTILINE)
{
width=0;
for(start=0,stop=0;;stop++)
{
if(text[stop]=='\n' || text[stop]=='\r' || text[stop]=='\t' || text[stop]==0)
{
if(text[start]=='%') start+=2;
itext.IText=&(text[start]);
sep=text[stop];
text[stop]=0;
linewidth=(ULONG)IntuiTextLength(&itext);
width=max(width,linewidth);
text[stop]=sep;
start=stop+1;
}
if(!(text[stop])) break;
}
}
else
{
itext.IText=text;
width=(ULONG)IntuiTextLength(&itext);
if((!(flags&TRTX_NOUNDERSCORE))&&(TR_FirstOccurance(project->trp_Underscore,text)!=-1))
{
underscore[0]=project->trp_Underscore;
underscore[1]=0;
itext.IText=underscore;
width-=(ULONG)IntuiTextLength(&itext);
}
if(flags&(TRTX_3D|TRTX_BOLD)) width++;
}
return width;
}
/****** triton.library/TR_TextHeight ******
*
* NAME
* TR_TextWidth -- Returns text height. (V6)
*
* SYNOPSIS
* Height = TR_TextHeight(Project, Text, Flags)
* A0 A2 D0
*
* ULONG TR_TextHeight(struct TR_Project *, STRPTR, ULONG);
*
* FUNCTION
* Returns the height of a text string with the specified
* TRTX_* flags in the given project.
*
* RESULT
* Height - The height of the text in pixels
*
* SEE ALSO
* TR_TextWidth(), TR_PrintText()
*
******/
ULONG __saveds __asm TR_TextHeight(register __a0 struct TR_Project *project,
register __a2 STRPTR text,
register __d0 ULONG flags)
{
ULONG height;
if(flags&TRTX_MULTILINE)
{
height=project->trp_TotalPropFontHeight
+TR_NumOccurances('\n',text) /* Small space */
*(project->trp_TotalPropFontHeight+((project->trp_PropFont->tf_YSize)/4))
+TR_NumOccurances('\r',text) /* Normal space */
*(project->trp_TotalPropFontHeight+((project->trp_PropFont->tf_YSize)/2))
+TR_NumOccurances('\t',text) /* Normal space + separator + normal space */
*(project->trp_TotalPropFontHeight
+((project->trp_PropFont->tf_YSize)/2)
+2
+((project->trp_PropFont->tf_YSize)/2));
}
else
{
flags=TR_SimplifyTextFlags(project,flags);
height=project->trp_TotalPropFontHeight;
if(flags&TRTX_3D) height++;
}
return height;
}
VOID __regargs TR_PrintSimpleText(struct TR_Project *project, struct RastPort *rp,
STRPTR text, ULONG textlength,
ULONG x, ULONG y, ULONG color,
ULONG uscorecolor, LONG underscore_pos)
{
WORD underx1,underx2;
Move(rp,x,y+project->trp_PropFont->tf_Baseline);
SetAPen(rp,color);
if(underscore_pos==-1)
{
Text(rp,text,textlength);
}
else
{
Text(rp,text,underscore_pos);
underx1=rp->cp_x;
Text(rp,text+underscore_pos+1,1);
underx2=rp->cp_x-1;
Text(rp,text+underscore_pos+2,textlength-underscore_pos-2);
SetAPen(rp,uscorecolor);
Move(rp,underx1,y+project->trp_PropFont->tf_Baseline+2);
Draw(rp,underx2,y+project->trp_PropFont->tf_Baseline+2);
}
}
/****** triton.library/TR_PrintText ******
*
* NAME
* TR_PrintText -- Prints a line of text. (V6)
*
* SYNOPSIS
* TR_PrintText(Project, RastPort, Text, X, Y, Width, Flags)
* A0 A1 A2 D1 D2 D3 D0
*
* VOID TR_PrintText(struct TR_Project *,
* struct RastPort *, STRPTR,
* ULONG, ULONG, ULONG, ULONG);
*
* FUNCTION
* Prints a text into the specified RastPort (or into
* the project's default RastPort if the supplied RastPort
* is NULL.
*
* If you specify TRTX_MULTILINE some formatting sequences
* may appear in the text:
* - A <newline> (\n) will start a new line with a small
* space above it.
* - A <return> (\r) will add a normal space instead.
* - A <tab> (\t) will add a normal space, then a 3D separator
* line and again a normal space.
*
* The following sequences are allowed at the beginning of
* a line only:
* - '%b' switches to boldface,
* - '%3' and '%s' (V2+) to 3D text,
* - '%h' to highlight
* - and '%n' to normal style.
* - '%%' inserts a '%' character.
*
* SEE ALSO
* TR_TextWidth()
*
******/
VOID __asm TR_InternalPrintText(register __a0 struct TR_Project *project,
register __a1 struct RastPort *rp,
register __a2 STRPTR text,
register __d1 ULONG x, register __d2 ULONG y,
register __d3 width, register __d0 ULONG flags)
{
ULONG textlength=TR_FirstOccurance(0,text);
LONG underscore_pos=-1;
ULONG color,uscorecolor,start,stop,ynow;
UBYTE sep;
if(!rp) rp=project->trp_Window->RPort;
flags=TR_SimplifyTextFlags(project,flags);
if(!width) width=TR_TextWidth(project,text,flags);
if(flags&TRTX_MULTILINE)
{
for(start=0,stop=0,ynow=y;;stop++)
{
if(text[stop]=='\n' || text[stop]=='\r' || text[stop]=='\t' || text[stop]==0)
{
if(text[start]=='%')
{
flags&=~(TRTX_3D|TRTX_BOLD|TRTX_HIGHLIGHT);
switch(text[start+1])
{
case '3':
case 's':
flags|=TRTX_3D;
break;
case 'b':
flags|=TRTX_BOLD;
break;
case 'h':
flags|=TRTX_HIGHLIGHT;
break;
case '%':
start--;
}
start+=2;
}
sep=text[stop];
text[stop]=0;
TR_InternalPrintText(project,rp,&(text[start]),x,ynow,width,flags&(~TRTX_MULTILINE));
text[stop]=sep;
start=stop+1;
ynow+=project->trp_TotalPropFontHeight;
switch(sep)
{
case '\n':
ynow+=(project->trp_PropFont->tf_YSize)/4;
break;
case '\r':
ynow+=(project->trp_PropFont->tf_YSize)/2;
break;
case '\t':
ynow+=((project->trp_PropFont->tf_YSize)/2);
SetAPen(rp,project->trp_DrawInfo->dri_Pens[SHADOWPEN]);
Move(rp,x,ynow);
Draw(rp,x+width-1,ynow);
SetAPen(rp,project->trp_DrawInfo->dri_Pens[SHINEPEN]);
Move(rp,x,ynow+1);
Draw(rp,x+width-1,ynow+1);
Draw(rp,x+width-1,ynow);
SetAPen(rp,project->trp_DrawInfo->dri_Pens[SHADOWPEN]);
Move(rp,x,ynow);
Draw(rp,x,ynow+1);
ynow+=2+((project->trp_PropFont->tf_YSize)/2);
}
}
if(!(text[stop])) break;
}
}
else /* not TRTX_MULTILINE */
{
SetFont(rp,project->trp_PropFont);
SetDrMd(rp,JAM1);
if(flags&TRTX_BOLD) SetSoftStyle(rp,FSF_BOLD,FSF_BOLD);
if(!(flags&TRTX_NOUNDERSCORE)) underscore_pos=TR_FirstOccurance(project->trp_Underscore,text);
if(flags&TRTX_RIGHTALIGN) x=x+width-TR_TextWidth(project,text,flags);
else if(flags&TRTX_CENTER) x=x+((width-TR_TextWidth(project,text,flags))/2);
if(flags&TRTX_3D)
{
TR_PrintSimpleText(project, rp, text, textlength, x+1, y+1,
TR_GetPen(project,TRPT_SYSTEMPEN,SHADOWPEN),
TR_GetPen(project,TRPT_SYSTEMPEN,SHADOWPEN), underscore_pos);
TR_PrintSimpleText(project, rp, text, textlength, x, y,
TR_GetPen(project,TRPT_SYSTEMPEN,HIGHLIGHTTEXTPEN),
TR_GetPen(project,TRPT_SYSTEMPEN,HIGHLIGHTTEXTPEN), underscore_pos);
}
else
{
if(flags&TRTX_HIGHLIGHT)
{
color=TR_GetPen(project,TRPT_SYSTEMPEN,HIGHLIGHTTEXTPEN);
uscorecolor=TR_GetPen(project,TRPT_TRITONPEN,TRTP_HIGHUSCORE);
}
else if(flags&TRTX_SELECTED)
{
color=TR_GetPen(project,TRPT_SYSTEMPEN,FILLTEXTPEN);
uscorecolor=color;
}
else
{
color=TR_GetPen(project,TRPT_SYSTEMPEN,TEXTPEN);
uscorecolor=TR_GetPen(project,TRPT_TRITONPEN,TRTP_NORMUSCORE);
}
TR_PrintSimpleText(project, rp, text, textlength, x, y, color, uscorecolor, underscore_pos);
}
}
}
VOID __saveds __asm TR_PrintText(register __a0 struct TR_Project *project,
register __a1 struct RastPort *rp,
register __a2 STRPTR text,
register __d1 ULONG x, register __d2 ULONG y,
register __d3 ULONG width, register __d0 ULONG flags)
{
TR_InternalPrintText(project,rp,text,x,y,width,flags);
}