home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
prog_oth
/
rkrmlib2.lha
/
RKRM_Lib2.lha
/
Graphics_Libraries
/
Text
/
cliptext.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-03
|
15KB
|
310 lines
;/* cliptext.c - Execute me to compile me with Lattice 5.10a
LC -cfistq -v -y -j73 cliptext.c
Blink FROM LIB:c.o,cliptext.o TO cliptext LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit ;*/
#include <exec/types.h>
#include <dos/rdargs.h>
#include <dos/dosextens.h>
#include <intuition/intuition.h>
#include <graphics/text.h>
#include <graphics/displayinfo.h>
#include <graphics/regions.h>
#include <graphics/gfx.h>
#include <libraries/diskfont.h>
#include <libraries/diskfonttag.h>
#include <utility/tagitem.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/layers_protos.h>
#include <clib/alib_stdio_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/diskfont_protos.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }
#endif
UBYTE *vers = "\0$VER: cliptext 37.2";
#define BUFSIZE 4096
#define FONT_NAME 0
#define FONT_SIZE 1
#define FILE_NAME 2
#define JAM_MODE 3
#define XASP 4
#define YASP 5
#define NUM_ARGS 6
#define DEFAULTFONTSIZE 11L
#define DEFAULTJAMMODE 0L
#define DEFAULTXASP 0L
#define DEFAULTYASP 0L
void MainLoop(void);
LONG args[NUM_ARGS];
struct TagItem tagitem[2];
UBYTE buffer[BUFSIZE];
BPTR myfile;
struct Library *DiskfontBase, *IntuitionBase, *LayersBase, *GfxBase;
struct IntuiMessage *mymsg;
struct DrawInfo *mydrawinfo;
struct Window *mywin;
struct RastPort *myrp;
struct TTextAttr myta;
struct TextFont *myfont;
struct Rectangle myrectangle;
struct Region *new_region;
void main(int argc, char **argv)
{
extern struct Library *DOSBase;
struct RDArgs *myrda;
struct DisplayInfo mydi;
ULONG mymodeid;
LONG mydefaultfontsize = DEFAULTFONTSIZE;
LONG mydefaultJAMMode = DEFAULTJAMMODE;
LONG mydefaultXASP = 0L;
LONG mydefaultYASP = 0L;
args[FONT_NAME] = (LONG)"topaz.font";
args[FONT_SIZE] = (LONG)&mydefaultfontsize;
args[FILE_NAME] = (LONG)"s:startup-sequence";
args[JAM_MODE] = (LONG)&mydefaultJAMMode;
args[XASP] = (LONG)&mydefaultXASP;
args[YASP] = (LONG)&mydefaultYASP;
if (DOSBase->lib_Version >35) /* Run only on 2.0 machines */
{
/* dos.library standard command line parsing--See the dos.library Autodoc for details */
if (myrda = ReadArgs("FontName,FontSize/N,FileName,Jam/N,XASP/N,YASP/N\n", args, NULL))
{
if (myfile = Open((UBYTE *)args[FILE_NAME], MODE_OLDFILE) ) /* Open the file to display. */
{
if (DiskfontBase = OpenLibrary("diskfont.library", 36L)) /* Open the libraries. */
{
if (IntuitionBase = OpenLibrary("intuition.library", 36L))
{
if (GfxBase = OpenLibrary("graphics.library", 36L))
{
if (LayersBase = OpenLibrary("layers.library", 36L))
{
if (mywin = OpenWindowTags(NULL, /* Open that window. */
WA_MinWidth, 100, /* This application wants to hear about three */
WA_MinHeight, 100, /* things: 1) When the user clicks the window's */
WA_SmartRefresh, TRUE, /* close gadget, 2) when the user starts to */
WA_SizeGadget, TRUE, /* resize the window, 3) and when the user has */
WA_CloseGadget, TRUE, /* finished resizing the window. */
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_NEWSIZE | IDCMP_SIZEVERIFY,
WA_DragBar, TRUE,
WA_DepthGadget, TRUE,
WA_Title, (ULONG)args[FILE_NAME],
TAG_END))
{
tagitem[0].ti_Tag = OT_DeviceDPI;
/* see if there is a non-zero value in the XASP or YASP fields. Diskfont.library */
/* will get a divide by zero GURU if you give it a zero XDPI or YDPI value. */
/* if there is a zero value in one of them... */
if ( ( (*(ULONG *)args[XASP]) == 0) || ( (*(ULONG *)args[YASP]) == 0) )
{
/* ...use the aspect ratio of the current display as a default... */
mymodeid = GetVPModeID(&(mywin->WScreen->ViewPort));
if (GetDisplayInfoData( NULL, (UBYTE *)&mydi,
sizeof(struct DisplayInfo), DTAG_DISP, mymodeid))
{
mydefaultXASP = mydi.Resolution.x;
mydefaultYASP = mydi.Resolution.y;
printf("XAsp = %ld YAsp = %ld\n", mydefaultXASP, mydefaultYASP);
/* notice that the X and Y get _swapped_ to keep the look of
the font glyphs the same using screens with different
aspect ratios.
*/
args[YASP] = (LONG)&mydefaultXASP;
args[XASP] = (LONG)&mydefaultYASP;
}
else /* ...unless something is preventing us from getting the */
/* screens resolution. In that case, forget about the DPI tag. */
tagitem[0].ti_Tag = TAG_END;
}
/* Here we have to put the X and Y DPI into the OT_DeviceDPI tags data field. */
/* THESE ARE NOT REAL X AND Y DPI VALUES FOR THIS FONT OR THE DISPLAY. They only */
/* serve to supply the diskfont.library with values to calculate the aspect */
/* ratio. The X value gets stored in the upper word of the tag value and the Y */
/* DPI gets stored in the lower word. Because ReadArgs() stores the _address_ */
/* of integers it gets from the command line, you have to dereference the */
/* pointer it puts into the argument array, which results in some ugly casting. */
tagitem[0].ti_Data = (ULONG)( ( (UWORD) *( (ULONG *)args[XASP] ) << 16) |
((UWORD) *( (ULONG *)args[YASP]) ) );
tagitem[1].ti_Tag = TAG_END;
myta.tta_Name = (STRPTR)args[FONT_NAME]; /* Set up the TTextAttr */
myta.tta_YSize = *((LONG *)args[FONT_SIZE]); /* structure to match the */
myta.tta_Style = FSF_TAGGED; /* font the user requested. */
myta.tta_Flags = 0L;
myta.tta_Tags = tagitem;
if (myfont = OpenDiskFont(&myta)) /* open that font */
{
/* This is for the layers.library */
/* clipping region that gets attached to */
/* the window. This prevents the */
/* application from unnecessarily */
myrectangle.MinX = mywin->BorderLeft; /* rendering beyond the bounds of the */
myrectangle.MinY = mywin->BorderTop; /* inner part of the window. For now, */
myrectangle.MaxX = mywin->Width - /* you can ignore the layers stuff if you */
(mywin->BorderRight + 1); /* are just interested in learning about */
myrectangle.MaxY = mywin->Height - /* using text. For more information on */
(mywin->BorderBottom + 1); /* clipping regions and layers, see the */
/* Layers chapter of this manual. */
if (new_region = NewRegion()) /* more layers stuff */
{
if (OrRectRegion(new_region, &myrectangle)); /* Even more layers stuff */
{
InstallClipRegion(mywin->WLayer, new_region);
/* obtain a pointer to the window's rastport and */
myrp = mywin->RPort; /* set up some of the rastport attributes. This */
SetFont(myrp, myfont); /* example obtains the text pen for the window's */
if (mydrawinfo = GetScreenDrawInfo(mywin->WScreen)) /* screen using */
{ /* GetScreenDrawInfo() */
SetAPen(myrp, mydrawinfo->dri_Pens[TEXTPEN]);
FreeScreenDrawInfo(mywin->WScreen, mydrawinfo);
}
SetDrMd(myrp, (BYTE)(*((LONG *)args[JAM_MODE])));
MainLoop();
}
DisposeRegion(new_region);
}
CloseFont(myfont);
}
CloseWindow(mywin);
}
CloseLibrary(LayersBase);
}
CloseLibrary(GfxBase);
}
CloseLibrary(IntuitionBase);
}
CloseLibrary(DiskfontBase);
}
Close(myfile);
}
FreeArgs(myrda);
}
else VPrintf("Error parsing arguments\n", NULL);
}
}
void MainLoop(void)
{
LONG count, actual, position;
BOOL aok = TRUE, waitfornewsize = FALSE;
struct Task *mytask;
mytask = FindTask(NULL);
Move(myrp, mywin->BorderLeft + 1, mywin->BorderTop + myfont->tf_YSize + 1);
while (((actual = Read(myfile, buffer, BUFSIZE)) > 0) && aok) /* While there's something */
{ /* to read, fill the buffer. */
position = 0;
count = 0;
while (position <= actual)
{
if (!(waitfornewsize))
{
while ( ((buffer[count] >= myfont->tf_LoChar) &&
(buffer[count] <= myfont->tf_HiChar)) && (count <= actual) )
count++;
Text(myrp, &(buffer[position]), (count)-position);
while ( ((buffer[count] < myfont->tf_LoChar) ||
(buffer[count] > myfont->tf_HiChar)) && (count <= actual) )
{
if (buffer[count] == 0x0A)
Move(myrp, mywin->BorderLeft, myrp->cp_y + myfont->tf_YSize + 1);
count++;
}
position = count;
}
else WaitPort(mywin->UserPort);
while (mymsg = (struct IntuiMessage *)GetMsg(mywin->UserPort))
{
if (mymsg->Class == IDCMP_CLOSEWINDOW) /* The user clicked the close gadget */
{
aok = FALSE;
position = actual + 1;
ReplyMsg((struct Message *)mymsg);
} /* The user picked up the */
else if (mymsg->Class == IDCMP_SIZEVERIFY) /* window's sizing gadget */
{
/* When the user has picked up the window's sizing gadget when the */
/* IDCMP_SIZEVERIFY flag is set, the application has to reply to this message */
/* to tell Intuition to allow the user to move the sizing gadget and resize */
/* the window. The reason for using this here is because the user can resize */
/* the window while cliptext.c is rendering text to the window. Cliptext.c has */
/* to stop rendering text when it receives an IDCMP_SIZEVERIFY message. */
/* */
/* if this example had instead asked to hear about IDCMP events that could */
/* take place between SIZEVERIFY and NEWSIZE events (especially INTUITICKS), */
/* it should turn off those events here using ModifyIDCMP(). */
/* */
/* After we allow the user to resize the window, we cannot write into the */
/* window until the user has finished resizing it because we need the */
/* window's new size to adjust the clipping area. Specifically, we have */
/* to wait for an IDCMP_NEWSIZE message which Intuition will send when the */
/* user lets go of the resize gadget. For now, we set the waitfornewsize */
/* flag to stop rendering until we get that NEWSIZE message. */
waitfornewsize = TRUE;
WaitBlit();
ReplyMsg((struct Message *)mymsg); /* The blitter is done, let the */
} /* user resize the window. */
else
{
ReplyMsg((struct Message *)mymsg);
waitfornewsize = FALSE;
/* The user has resized the window, so get the new window dimensions */
myrectangle.MinX = mywin->BorderLeft; /* and readjust the layers */
myrectangle.MinY = mywin->BorderTop; /* clipping region accordingly. */
myrectangle.MaxX = mywin->Width - (mywin->BorderRight + 1);
myrectangle.MaxY = mywin->Height - (mywin->BorderBottom + 1);
InstallClipRegion(mywin->WLayer, NULL);
ClearRegion(new_region);
if (OrRectRegion(new_region, &myrectangle))
InstallClipRegion(mywin->WLayer, new_region);
else
{
aok = FALSE;
position = actual + 1;
}
}
}
if (mytask->tc_SigRecvd & SIGBREAKF_CTRL_C) /* Check for user break. */
{
aok = FALSE;
position = actual + 1;
}
if (myrp->cp_y > (mywin->Height - (mywin->BorderBottom + 2))) /* if we reached the */
{ /* bottom of the page, clear the */
Delay(25); /* rastport and move back to the top */
SetRast(myrp, 0); /* Set the entire rastport to color zero. This will not */
Move(myrp, /* the window borders because of the layers clipping. */
mywin->BorderLeft + 1,
mywin->BorderTop + myfont->tf_YSize + 1);
}
}
}
if (actual < 0) VPrintf("Error while reading\n", NULL);
}