/* * MandelVroom 2.0 * * (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA * * All rights reserved. * * Permission is hereby granted to distribute this program's source * executable, and documentation for non-comercial purposes, so long as the * copyright notices are not removed from the sources, executable or * documentation. This program may not be distributed for a profit without * the express written consent of the author Kevin L. Clague. * * This program is not in the public domain. * * Fred Fish is expressly granted permission to distribute this program's * source and executable as part of the "Fred Fish freely redistributable * Amiga software library." * * Permission is expressly granted for this program and it's source to be * distributed as part of the Amicus Amiga software disks, and the * First Amiga User Group's Hot Mix disks. * * contents: this file contains tools to allocate and free gadgets and * gadget imagery for MandelVroom. */ #include "mandp.h" #define TOP 1 #define BOT 2 /************************************************************************* * * Allocate and ititialize gadget tools * ************************************************************************/ /* * Make a generic boolean gadget */ struct Gadget *MakeBool(x,y,xd,yd,c,id, flags) SHORT x,y,xd,yd; UBYTE c; USHORT id; USHORT flags; { register struct Gadget *NewGadget; register struct Image *NewImage,*ShadowImage; NewGadget = (struct Gadget *) safeAllocMem( (ULONG) sizeof(struct Gadget), (LONG) MEMF_CLEAR ); if (NewGadget == NULL) return( NewGadget ); if ( flags & GADGIMAGE ) { NewImage = (struct Image *) safeAllocMem( (ULONG) sizeof(struct Image), (LONG) MEMF_CLEAR ); if ( NewImage == NULL ) { FreeMem( (char *) NewGadget, (LONG) sizeof(struct Gadget)); return( NULL ); } ShadowImage = (struct Image *) safeAllocMem( (ULONG) sizeof(struct Image), (LONG) MEMF_CLEAR ); if ( ShadowImage == NULL ) { FreeImage( NewImage ); FreeMem( (char *) NewGadget, (LONG) sizeof(struct Gadget)); return( NULL ); } NewImage->Width = xd; NewImage->Height = yd; NewImage->PlaneOnOff = c; ShadowImage->LeftEdge = 1 + XScale; ShadowImage->TopEdge = 1 + YScale; ShadowImage->Width = xd; ShadowImage->Height = yd; ShadowImage->PlaneOnOff = SHADOWPEN; ShadowImage->NextImage = NewImage; NewGadget->GadgetRender = (APTR) ShadowImage; } else { NewGadget->GadgetRender = (APTR) ShadowBorder( BEVELEDUP, 1, 1, xd-1, yd-1 ); } NewGadget->LeftEdge = x; NewGadget->TopEdge = y; NewGadget->Width = xd; NewGadget->Height = yd; NewGadget->Flags = GADGHCOMP | flags; NewGadget->Activation = GADGIMMEDIATE; NewGadget->GadgetType = BOOLGADGET; NewGadget->GadgetID = id; return(NewGadget); } /* MakeBool */ /* * Make a generic potentiometer gadget */ struct Gadget *MakePot(x, y, xd, yd, id, cnt) SHORT x,y,xd,yd; USHORT id; USHORT cnt; { register struct Gadget *NewGadget; register struct Image *NewImage; register struct PropInfo *NewInfo; NewGadget = (struct Gadget *) safeAllocMem( (ULONG) sizeof(struct Gadget), MEMF_CLEAR ); if (NewGadget == NULL) goto nogadget; NewImage = (struct Image *) safeAllocMem( (ULONG) sizeof(struct Image), MEMF_CLEAR ); if (NewImage == NULL) goto noimage; NewInfo = (struct PropInfo *) safeAllocMem( (ULONG) sizeof(struct PropInfo), MEMF_CLEAR ); if (NewInfo == NULL) goto noinfo; NewGadget->LeftEdge = x; NewGadget->TopEdge = y; NewGadget->Width = xd; NewGadget->Height = yd; NewGadget->Flags = GADGHIMAGE | GADGIMAGE; NewGadget->Activation = RELVERIFY; NewGadget->GadgetType = PROPGADGET; NewGadget->GadgetRender = (APTR) NewImage; NewGadget->SpecialInfo = (APTR) NewInfo; NewGadget->GadgetID = id; NewImage->PlaneOnOff = SHADOWPEN; NewImage->Width = 4 << XScale; NewImage->Height = 3 << YScale; NewInfo->Flags = PROPBORDERLESS | FREEVERT; NewInfo->VertBody = 1; return(NewGadget); noinfo: FreeMem( (char *) NewImage, (LONG) sizeof(struct Image)); noimage: FreeMem( (char *) NewGadget, (LONG) sizeof(struct Gadget)); nogadget: return( NULL ); } /* MakePot */ /* * Make a generic string gadget */ struct Gadget *MakeString( x, y, length, id, String ) SHORT x,y,length; USHORT id; char *String; { register struct Gadget *NewGadget; register struct StringInfo *NewString; register struct Border *Border; register char *NewBuffer; NewGadget = (struct Gadget *) safeAllocMem( (ULONG) sizeof(struct Gadget), (LONG) MEMF_CLEAR ); if ( NewGadget == NULL ) goto nogadget; NewString = (struct StringInfo *) safeAllocMem( (ULONG) sizeof(struct StringInfo), (LONG) MEMF_CLEAR ); if (NewString == NULL) goto nostring; NewBuffer = (char *) safeAllocMem( (ULONG) length + 1, (LONG) MEMF_CLEAR ); if (NewBuffer == NULL) goto nobuffer; Border = ShadowBorder( BEVELEDDOWN, -1, -1, length * 8 + 1, 9 ); NewGadget->LeftEdge = x; NewGadget->TopEdge = y; NewGadget->Width = length * 8; NewGadget->Height = 8; NewGadget->Flags = GADGHCOMP; NewGadget->Activation = STRINGRIGHT; NewGadget->GadgetType = STRGADGET; NewGadget->GadgetID = id; NewGadget->GadgetRender = (APTR) Border; NewGadget->SpecialInfo = (APTR) NewString; NewString->MaxChars = length + 1; NewString->BufferPos = 0; NewString->DispPos = 0; NewString->Buffer = (UBYTE *) NewBuffer; strcpy( NewBuffer, String ); return(NewGadget); nobuffer: FreeMem( (char *) NewString, (long) sizeof( struct StringInfo ) ); nostring: FreeMem( (char *) NewGadget, (long) sizeof( struct Gadget ) ); nogadget: return( NULL ); } /* MakeString */ /* * Free a string of gadgets */ FreeGadgets(FirstGadget) struct Gadget *FirstGadget; { register struct Gadget *NextGadget; register struct StringInfo *String; register struct Border *Render; while (FirstGadget) { Render = (struct Border *) FirstGadget->GadgetRender; if ( Render ) { if (FirstGadget->Flags & GADGIMAGE) { FreeImage( (struct Inage *) Render ); } else { FreeBorder( Render ); } } Render = (struct Border *) FirstGadget->SelectRender; if ( Render ) { if (FirstGadget->Flags & GADGIMAGE) { FreeImage( (struct Inage *) Render ); } else { FreeBorder( Render ); } } if (FirstGadget->SpecialInfo) { switch( FirstGadget->GadgetType ) { case PROPGADGET: FreeMem( (char *) FirstGadget->SpecialInfo, (LONG) sizeof(struct PropInfo)); break; case STRGADGET: String = (struct StringInfo *) FirstGadget->SpecialInfo; FreeMem( (char *) String->Buffer, (LONG) String->MaxChars ); FreeMem( (char *) String, (LONG) sizeof(struct StringInfo)); break; } } FreeIntui( FirstGadget->GadgetText ); NextGadget = FirstGadget->NextGadget; FreeMem( (char *) FirstGadget, (LONG) sizeof(struct Gadget)); FirstGadget = NextGadget; } } /* FreeGadgets */ FreeImage( Image ) struct Image *Image; { register struct Image *image, *next; next = Image; while ( image = next ) { next = image->NextImage; FreeMem( (char *) image, (LONG) sizeof(struct Image)); } } struct Border * MakeShadow( pen, numverts ) LONG pen; int numverts; { register struct Border *NewBorder; register SHORT *NewCounts; NewBorder = (struct Border *) safeAllocMem( (ULONG) sizeof(struct Border), (LONG) MEMF_CLEAR ); if (NewBorder == NULL) return( NULL ); NewCounts = (SHORT *) safeAllocMem( (ULONG) sizeof(SHORT) * 2 * numverts, (LONG) MEMF_CLEAR ); if (NewCounts == NULL) { FreeMem( (char *) NewBorder, (LONG) sizeof(struct Border) ); return( NULL ); } NewBorder->FrontPen = pen; NewBorder->DrawMode = JAM1; NewBorder->XY = NewCounts; NewBorder->Count = numverts; return( NewBorder ); } /* * Make an Border structure */ static struct Border * MakeCornerShadow( Type, left, top, Width, Height, pen ) LONG Type; register LONG left, top; LONG Width, Height; LONG pen; { register struct Border *NewBorder; register SHORT *NewCounts; register LONG right = left + Width; register LONG bot = top + Height; LONG cornerx; LONG cornery; LONG direction; #define NUMVERTS 6 NewBorder = MakeShadow( pen, NUMVERTS ); if (NewBorder == NULL) return( NewBorder ); if ( Type == TOP ) { cornerx = left; cornery = top; direction = -1; } else { cornerx = right; cornery = bot; direction = 1; } NewCounts = NewBorder->XY; *NewCounts++ = left; *NewCounts++ = bot; *NewCounts++ = cornerx; *NewCounts++ = cornery; *NewCounts++ = right; *NewCounts++ = top; left--; top--; bot++; right++; cornerx += direction; cornery += direction; *NewCounts++ = right; *NewCounts++ = top; *NewCounts++ = cornerx; *NewCounts++ = cornery; *NewCounts++ = left; *NewCounts++ = bot; return( NewBorder ); } /* MakeCornerShadow */ struct Border * ShadowBorder( Type, left, top, xdim, ydim ) int Type; int left, top; int xdim, ydim; { register struct Border *Border1, *Border2; register int Pen1, Pen2; if (Type == BEVELEDUP) { Pen1 = HIGHLIGHTPEN; Pen2 = SHADOWPEN; } else { Pen2 = HIGHLIGHTPEN; Pen1 = SHADOWPEN; } Border1 = MakeCornerShadow( (long) TOP, (long) left, (long) top, (long) xdim, (long) ydim, (long) Pen1 ); if ( Border1 ) { Border2 = MakeCornerShadow( (long) BOT, (long) left, (long) top, (long) xdim, (long) ydim, (long) Pen2 ); Border1->NextBorder = Border2; } return( Border1 ); } FreeBorder( Border ) struct Border *Border; { register struct Border *border, *next; next = Border; while ( border = next ) { next = border->NextBorder; FreeMem( (char *) border->XY, (LONG) sizeof(SHORT) * border->Count * 2); FreeMem( (char *) border, (LONG) sizeof(struct Border)); } } /* * Make an IntuiText structure */ struct IntuiText *MakeIntui(str, x, y, frontpen, backpen, drawmode ) char *str; LONG x, y; LONG frontpen, backpen; LONG drawmode; { register struct IntuiText *NewIntui; register char *NewString; NewIntui = (struct IntuiText *) safeAllocMem( (ULONG) sizeof(struct IntuiText), (LONG) MEMF_CLEAR ); if ( NewIntui == NULL ) return( NULL ); NewString = (char *) safeAllocMem( (ULONG) strlen( str ) + 1, (LONG) MEMF_CLEAR ); if ( NewString == NULL ) { FreeMem( (char *) NewIntui, (long) sizeof(struct IntuiText) ); return( NULL ); } NewIntui->FrontPen = frontpen; NewIntui->BackPen = backpen; NewIntui->DrawMode = drawmode; NewIntui->LeftEdge = x; NewIntui->TopEdge = y; NewIntui->IText = (UBYTE *) NewString; strcpy( NewString, str ); return(NewIntui); } /* MakeIntui */ struct IntuiText * ShadowIntui( str, x, y ) char *str; LONG x,y; { register struct IntuiText *Intui1, *Intui2, *Intui3; Intui1 = MakeIntui( str, x, y, NORMALPEN, NORMALPEN, JAM2 ); Intui2 = MakeIntui( str, x + 1, y + 1, SHADOWPEN, NORMALPEN, JAM2 ); Intui3 = MakeIntui( str, x, y, MEDIUMPEN, (long) 0, JAM1 ); Intui1->NextText = Intui2; Intui2->NextText = Intui3; return( Intui1 ); } FreeIntui( Intui ) struct IntuiText *Intui; { register struct IntuiText *intui, *next; next = Intui; while ( intui = next ) { next = intui->NextText; FreeMem( (char *) intui->IText, (long) strlen((char *)intui->IText) + 1); FreeMem( (char *) intui, (LONG) sizeof(struct IntuiText)); } } #if 0 struct Border * MakeWindowBorder( NewWindow ) register struct NewWindow *NewWindow; { register struct Border *Border1,*Border2; register SHORT *Verts; register SHORT Bottom, Right; Border1 = MakeShadow( HIGHLIGHTPEN, 2 ); if (Border1 == NULL) return NULL; Border2 = MakeShadow( SHADOWPEN, 3 ); if (Border2 == NULL) { FreeBorder( Border1 ); return NULL; } Bottom = NewWindow->Height - 1; Right = NewWindow->Width - 1; Verts = Border1->XY; /* Vertex.X Vertext.Y */ *Verts++ = 0; *Verts++ = TOPMARG; *Verts++ = 0; *Verts++ = Bottom; Verts = Border2->XY; /* Vertex.X Vertext.Y */ *Verts++ = 0; *Verts++ = Bottom; *Verts++ = Right; *Verts++ = Bottom; *Verts++ = Right; *Verts++ = TOPMARG - 1; Border1->NextBorder = Border2; return( Border1 ); } #endif