Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!seismo!rutgers!mit-eddie!genrad!decvax!tektronix!uw-beaver!uw-june!geops!uw-atm!james
From: james@uw-atm.UUCP (James M Synge)
Newsgroups: comp.sys.amiga
Subject: Functions for using Area routines
Message-ID: <72@uw-atm.UUCP>
Date: Fri, 19-Dec-86 02:11:43 EST
Article-I.D.: uw-atm.72
Posted: Fri Dec 19 02:11:43 1986
Date-Received: Fri, 19-Dec-86 20:11:02 EST
Organization: Dept. of Atmospheric Sciences, U. of Washington
Lines: 406
I'm posting this for a friend of mine who doesn't have access to the net.
#! /bin/sh
# This is a shell archive.
#
echo extracting README
cat <README
AllocArea, DrawArea, and FreeArea: Three functions to simplify using
the area drawing functions in the Amiga ROM Kernal.
Copyright (c) 1986 Robert W. Albrecht All Rights Reserved.
425 Bellevue Way, #22
Bellevue, WA 98004
These functions may be used in your programs and freely distributed.
This is FREEWARE. Just don't put them in your book or floppy disk for
sale without getting my permission first. I'll get pretty hacked off if
you do!
These three functions are designed to solve everyone's problems with the
Amiga area fill functions. They are so easy to use even a beginner could
be area filling away in no time!
I hear there has been alot of bitching about the ROM Kernel
documentation. The problem is where else do you go? I purchased a book
which claimed to be a handbook for programming on the Amiga, but the
author had obviously not even tried many of the functions. Always believe
your header files and the ".doc" section of the ROM Kernel Manual. Please
don't write about it unless you try it first! P.S. remember your +Cdb
Linker option!
***************************************************************************
A key component of the way these functions work is:
THE Area STRUCTURE
LeftEdge, TopEdge - Offsets from the upper right corner of your RastPort.
Outline - The AREA OUTLINE pen for your drawing. If the Outline
variable is set to NO_OUTLINE no outline is used.
FrontPen, BackPen - The foreground and background pens for your drawing.
DrawMode - The Draw Mode ( JAM1, JAM2 etc. ).
Count - The Number of verticies in your area.
Points - A pointer to the first element in an array of short
that is at least as long as Count * 2. The values are
set equal to the x,y values for the verticies of the
area drawing. The values are read as XY XY XY XY...
next - A pointer to the next in a linked list of Area
structures. If this is the last Area structure in
the list or you are only drawing one Area, set this
variable to NULL (0L). If you don't do this you are
likely to get some very suprising results.
***************************************************************************
/* An example program fragment
*
* This is by no means a complete program!
* It will draw a lightning bolt on a HIRES RastPort.
*/
#include
#include
extern struct AreaMem *AllocArea();
struct AreaMem *am;
struct RastPort *rp;
/****** THE DATA ******/
short Bolt_Points[] =
{ 150, 56, 318, 143, 308, 116, 464, 190, 293, 95, 304, 122, };
struct Area Bolt =
{
0, 0,
(unsigned char) 1,
(unsigned char) 1,
(unsigned char) 1,
(unsigned char) JAM1,
6,
&Bolt_Points[0],
0L,
};
/****** THE CODE ******/
if( am = AllocArea(rp, 640, 200, 10) )
{
DrawArea(rp, &Bolt, 0, 0);
FreeArea(am);
}
SHAR_EOF
echo extracting AreaFunctions.c
cat <AreaFunctions.c
/**********************************************/
/* DrawArea.c */
/* AllocArea.c */
/* FreeArea.c */
/* */
/* Written with */
/* Manx C for Amiga */
/* */
/* Copyright 1986 */
/* Robert W. Albrecht */
/* 425 Bellevue Wy #22 */
/* Bellevue WA 98004 */
/* */
/**********************************************/
/* Will Probably work with Lettuce (no int) */
#include
#include
#include
#define ALLOC(X) ((X *)AllocMem((long)sizeof(X),(long)MEMF_CLEAR))
#define CALLOC(X,Y) ((X *)AllocMem((long)Y,(long)MEMF_CLEAR))
#define FREE(X,Y) (FreeMem(X,(long)Y))
extern unsigned char *AllocMem();
extern char *AllocRaster();
extern struct TmpRas *InitTmpRas();
extern void FreeMem();
void FreeArea(a)
struct AreaMem *a;
{
if( !a ) return;
if( a->BitPlane )
FreeRaster(a->BitPlane, (long) a->Width, (long) a->Height);
if( a->tr )
FREE(a->tr, sizeof(struct TmpRas) );
if( a->AreaBuffer )
FREE(a->AreaBuffer, a->BuffSize );
if( a->Info )
FREE(a->Info, sizeof(struct AreaInfo) );
FREE(a, sizeof(struct AreaMem) );
return;
}
struct AreaMem *AllocArea(rp, Width, Height, Count)
struct RastPort *rp;
unsigned short Width, Height, Count;
{
struct AreaMem *a;
if( !( a = ALLOC(struct AreaMem) ) ) return(a);
a->BuffSize = 5 * Count;
if( !( a->Info = ALLOC(struct AreaInfo) ) )
goto abort;
if( !( a->AreaBuffer = CALLOC(WORD, a->BuffSize) ) )
goto abort;
if( !( a->tr = ALLOC(struct TmpRas) ) )
goto abort;
if( !( a->BitPlane = AllocRaster((long) Width, (long) Height) ) )
goto abort;
a->Width = Width;
a->Height = Height;
InitArea(a->Info, a->AreaBuffer, (long) Count );
rp->AreaInfo = a->Info;
rp->TmpRas = a->tr =
InitTmpRas(a->tr, a->BitPlane, (long) RASSIZE(Width, Height) );
return(a);
abort:
FreeArea(a);
return(0L);
}
void DrawArea(rp, area, LeftOffset, TopOffset)
struct RastPort *rp;
struct Area *area;
short LeftOffset, TopOffset;
{
register short i;
BYTE FgPen, BgPen, AOlPen, DrawMode;
USHORT Flags;
FgPen = rp->FgPen;
BgPen = rp->BgPen;
AOlPen = rp->AOlPen;
DrawMode = rp->DrawMode;
Flags = rp->Flags;
while( area )
{
SetAPen(rp, (long) area->FrontPen);
SetBPen(rp, (long) area->BackPen);
SetDrMd(rp, (long) area->DrawMode);
if( area->Outline == (unsigned char)NO_OUTLINE )
rp->Flags &= ~AREAOUTLINE;
else
{
rp->Flags |= AREAOUTLINE;
rp->AOlPen = area->Outline;
}
AreaMove(rp, (long) (area->Points[0] + area->LeftEdge + LeftOffset),
(long) (area->Points[1] + area->TopEdge + TopOffset) );
for(i = 2; i < (area->Count * 2); i += 2)
AreaDraw(rp, (long) (area->Points[i] + area->LeftEdge + LeftOffset),
(long) (area->Points[i+1] + area->TopEdge + TopOffset) );
AreaEnd(rp);
area = area->next;
}
SetAPen(rp, (long) FgPen);
SetBPen(rp, (long) BgPen);
SetDrMd(rp, (long) DrawMode);
rp->AOlPen = AOlPen;
rp->Flags = Flags;
return;
}
SHAR_EOF
echo extracting AllocArea.doc
cat <AllocArea.doc
NAME
AllocArea -- Allocate area fill stuff and attach it to the RastPort
SYNOPSIS
AllocArea(rp, Width, Height, Count)
FUNCTION
Allocates memory for:
AreaMem structure,
AreaInfo structure and it's AreaBuffer,
TmpRas structure and it's bit plane.
Calls InitArea() and InitTmpRas().
Attaches AreaInfo and TmpRas structures to your RastPort.
INPUTS
rp pointer to your valid RastPort structure.
( Can be obtained by rp = Window->RPort; )
Width (unsigned short) The maximum width of your area fill.
I suggest that you make this the same size as your
RastPort, unless you are low on RAM.
Height (unsigned short) The maximum hieght of your area fill.
I suggest that you make this the same size as your
RastPort, unless you are low on RAM.
Count (unsigned short) The maximum number of verticies you will
use in your area fill.
RESULTS
A pointer to an AreaMem structure. Returns 0L if not enough memory
is available.
BUGS
Hope Not!
SEE ALSO
DrawArea()
FreeArea()
area.h
AUTHOR
Copyright (c) 1986 Robert W. Albrecht. All Rights Reserved.
425 Bellevue Way, #22
Bellevue, WA 98004
SHAR_EOF
echo extracting FreeArea.doc
cat <FreeArea.doc
NAME
FreeArea - Free memory allocated by AllocArea
SYNOPSIS
FreeArea(area_mem)
FUNCTION
Frees all of the memory allocated by AllocArea()
This function is also used by AllocArea() in case of an abortion.
INPUTS
area_mem A pointer to an AreaMem structure obtained from
AllocArea().
RESULTS
memory returned to memory manager
BUGS
Hope Not!
SEE ALSO
AllocArea()
DrawArea()
area.h
AUTHOR
Copyright (c) 1986 Robert W. Albrecht. All Rights Reserved.
425 Bellevue Way, #22
Bellevue, WA 98004
SHAR_EOF
echo extracting DrawArea.doc
cat <DrawArea.doc
NAME
DrawArea - Draws one or more area drawings
SYNOPSIS
DrawArea(rp, area, Left_Offset, Top_Offset)
FUNCTION
Draws your area drawing whith a left offset and a top offset.
INPUTS
rp a pointer to your valid RastPort structure.
(can be obtained from rp = Window->RPort; )
area a pointer to your filled in Area structure.
Left_Offset (short) the left offset to your drawing.
Top_Offset (short) the top offset to your drawing.
RESULTS
If you have done everything properly you should be able to see
the drawing.
BUGS
Hope Not!
SEE ALSO
AllocArea()
FreeArea()
area.h
AUTHOR
Copyright (c) 1986 Robert W. Albrecht. All Rights Reserved.
425 Bellevue Way, #22
Bellevue, WA 98004
SHAR_EOF
echo extracting area.h
cat <area.h
/**********************************************/
/* */
/* AREA.H */
/* */
/* C header file for Amiga. */
/* */
/* Copyright 1986 */
/* Robert W. Albrecht */
/* 425 Bellevue Wy #22 */
/* Bellevue WA 98004 */
/* */
/**********************************************/
/* Will Probably work with Lettuce (no int) */
#ifndef AREA
struct Area
{
short LeftEdge, TopEdge;
unsigned char Outline, FrontPen, BackPen, DrawMode;
unsigned short Count;
short *Points;
struct Area *next;
};
struct AreaMem
{
char *BitPlane;
unsigned short Width;
unsigned short Height;
short *AreaBuffer;
unsigned short BuffSize;
struct AreaInfo *Info;
struct TmpRas *tr;
};
#define NO_OUTLINE ((unsigned char)100)
#define AREA
#endif
SHAR_EOF
exit(0)