/* * 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 is the include file for MandelVroom standard includes. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /************************************************************************** * * color cycling stuff * *************************************************************************/ #define EXDepth 6 /* Maximum depth (6=HAM) */ #define maxColorReg 32 #define maxCycles 4 #define RNG_NORATE 36 /* Dpaint uses this rate to mean non-active */ #define REVERSE 0x2 typedef struct { WORD pad1; /* future exp - store 0 here */ WORD rate; /* 60/sec=16384, 30/sec=8192, 1/sec=16384/60=273 */ WORD active; /* lo bit 0=no cycle, 1=yes; next bit 1=rvs */ UBYTE low; /* range lower */ UBYTE high; /* range upper */ } CrngChunk; /* * Mandelvroom uses the gadget ID's to decode the meaning of * gadget related messages. It uses a special encoding to indicate * what window, and function this gadget is associated with. * * I split the gadget id into three fields: * * window type - indicates how the window is being used (e.g. * contour or palette) * * gadget type - general classification of gadget within the window * * gadget number - in the case of an array of gadgets (like the pens * in the color palette) this is the array index. */ /* * This defines the bit positions of the fields within the gadget ID */ #define WINDTYPEBITS 11 #define TYPEBITS 6 /* * These masks are used for extracting the fields from gadgetIDs * when messages are received. */ #define WINDMASK 0xffff #define TYPEMASK 0xf #define NUMMASK 0x3f #define WIND_TYPE(g) ((g) >> WINDTYPEBITS & WINDMASK) #define GADG_TYPE(g) ((g) >> TYPEBITS & TYPEMASK) #define GADG_NUM(g) ((g) & NUMMASK) #define CNT_NUM(a) ((a)==CONTLAST ? NUMCONTS-1 : (a)+FirstContour) /* * These are the window types */ #define PALTYPE 0 /* gadgetID indicates palette gadget */ #define CONTYPE 1 /* gadgetID indicates contour gadget */ #define PICTTYPE 2 /* gadgetID indicates picture gadget */ #define HELPTYPE 3 /* gadgetID indicates help gadget */ #define CYCTYPE 4 /* gadgetID indicates color cycling gadget */ #define ORBTTYPE 5 /* gadgetID indicates orbit gadget */ /* * These are the general classifications for palette gadgets */ #define PALPENS 0 /* pen gadget in the palette */ #define PALPOTS 1 /* Red, Green, Blue potentiometer gadgets */ #define PALCNTLS 2 /* Controls (commands like copy, blend, exchange) */ /* * Basis for individual ID expansion */ #define PALPEN (PALTYPE << WINDTYPEBITS | PALPENS << TYPEBITS) #define PALPOT (PALTYPE << WINDTYPEBITS | PALPOTS << TYPEBITS) #define PALCNTL (PALTYPE << WINDTYPEBITS | PALCNTLS << TYPEBITS) /* * These are the IDs for the command gadgets */ #define PALCOPY (PALCNTL | 0) #define PALRANGE (PALCNTL | 1) #define PALEXCG (PALCNTL | 2) /* * Now we define the contour gadget IDs * * Start with the gadget types */ #define CONTSELS 0 /* Contour window Pens */ #define CONTUPS 1 /* Contour window increment gadget */ #define CONTDOWNS 2 /* Contour window decrement gadget */ #define CONTPOTS 3 /* Contour window potentiometer gadget */ #define CONTCNTLS 4 /* Contour window controls */ /* * Shift everything over so we can or in the specifics */ #define CONTSEL (CONTYPE << WINDTYPEBITS | CONTSELS << TYPEBITS) #define CONTUP (CONTYPE << WINDTYPEBITS | CONTUPS << TYPEBITS) #define CONTDOWN (CONTYPE << WINDTYPEBITS | CONTDOWNS << TYPEBITS) #define CONTPOT (CONTYPE << WINDTYPEBITS | CONTPOTS << TYPEBITS) #define CONTCNTL (CONTYPE << WINDTYPEBITS | CONTCNTLS << TYPEBITS) #define CONTLAST (CONTSEL | 32) /* * Make up the command gadgets IDs for the contour window */ #define CONTRECOL (CONTCNTL | 0) #define CONTSET (CONTCNTL | 1) #define CONTSMTH (CONTCNTL | 2) #define CONTCUT (CONTCNTL | 3) #define CONTCOPY (CONTCNTL | 4) #define CONTPASTE (CONTCNTL | 5) #define CONTCEIL (CONTCNTL | 9) #define CONTBAR (CONTCNTL | 10) /* * Shift everything over so we can or in the specifics */ #define PICTCUR (PICTTYPE << WINDTYPEBITS | 0) #define PICTGEN (PICTTYPE << WINDTYPEBITS | 1) #define PICTIN (PICTTYPE << WINDTYPEBITS | 2) #define PICTOUT (PICTTYPE << WINDTYPEBITS | 3) #define PICTJULIA (PICTTYPE << WINDTYPEBITS | 4) #define HELPUP (HELPTYPE << WINDTYPEBITS | 0) #define HELPDOWN (HELPTYPE << WINDTYPEBITS | 1) #define HELPSCROLL (HELPTYPE << WINDTYPEBITS | 2) /* * These are the general classifications for cycle gadgets */ #define CYCRNUMS 0 /* cycle range indicators */ #define CYCCNTLS 1 /* Controls (Range changer, direction, and speed) */ /* * Basis for individual ID expansion */ #define CYCRNUM (CYCTYPE << WINDTYPEBITS | CYCRNUMS << TYPEBITS) #define CYCCNTL (CYCTYPE << WINDTYPEBITS | CYCCNTLS << TYPEBITS) /* * These are the IDs for the command gadgets */ #define CYCRANGE (CYCCNTL | 0) #define CYCDIR (CYCCNTL | 1) #define CYCSPEED (CYCCNTL | 2) #define CYCON (CYCCNTL | 3) #define ORBTCNTLS 0 /* controls (go into orbit mode) */ #define ORBTMODE (ORBTCNTLS | 0) /* * Now for some miscelaneous definitions * * Define the number of contours the system allows. */ #define NUMCONTS 256 /* This is total number of contours */ #define DISPCONTS 32 /* This is how many are displayable */ #define VERSION 200 /* * These definitions help us identify menu item selections. */ /* Menu Project's, Items */ #define NEWITEM 0 #define CURITEM 1 #define LOADITEM 2 #define SAVEPROJ 3 #define CLOSEPROJ 4 #define SAVEILBM 5 #define HELPITEM 6 #define CANCELITEM 7 #define QUITITEM 8 /* Display Menu's Items */ #define COLORITEM 0 #define CYCLEITEM 1 #define CONTOURITEM 2 #define AUTOCNTRITEM 3 #define HISTOGRAMITEM 4 #define BORDERITEM 5 #define DEPTHITEM 6 #define VIEWMODEITEM 7 #define SCREENITEM 8 /* Menu: Edit, Item: ViewMode's, SubItems */ #define HIRESSUB 0 #define INTERLACESUB 1 #define HALFBRITESUB 2 /* Menu: Edit, Item: Depth's, SubItems */ #define BITPLANE1SUB 0 #define BITPLANES2SUB 1 #define BITPLANES3SUB 2 #define BITPLANES4SUB 3 #define BITPLANES5SUB 4 #define BITPLANES6SUB 5 /* Menu: Edit, Item: Screen's SubItem */ #define WBENCHSUB 0 #define STANDARD 1 /* Calculate Menu's Items */ #define GENERATEITEM 0 #define ZOOMITEM 1 #define SCROLLITEM 2 #define LENSITEM 3 #define GENERATORITEM 4 #define COUNTITEM 5 #define STATSITEM 6 /* Menu: Edit, Item: ZoomIn's, SubItems */ #define ZOOMIN 0 #define ZOOMOUT 1 #define ZOOMOFF 2 #define ZOOMJULIA 3 /* Menu: Project, Item: Generate SubItems */ #define STARTGEN 0 #define STOPGEN 1 #define CONTGEN 2 /* Menu: Project, Item: Scroll SubItems */ #define SETSCROLL 0 #define GENSCROLL 1 #define CANCELSCROLL 2 /* Menu: Edit, Item: Generator, SubItems */ #define INTGENERATOR 0 #define FLOATGENERATOR 1 #define IEEEGENERATOR 2 #define INTIIGENERATOR 3 #define _81GENERATOR 4 /* Special Menu's Items */ #define PRESETITEM 0 #define ORBITITEM 1 #define ORBITMATHITEM 2 #define MAXORBITEM 3 /* Menu: Special, Item: OrbitMode, subitems */ #define INTORBIT 0 #define FFPORBIT 1 #define IEEEORBIT 2 /* Menu Entries */ #define PROJECTMENU 0 #define DISPLAYMENU 1 #define CALCULATEMENU 2 #define SPECIALMENU 3 #define TOGGLED11 0x0200 /* State definitions */ #define COPYRIGHTSTATE 0 #define IDLESTATE 1 #define COPYRGBSTATE 2 #define SPREADRGBSTATE 3 #define XCHGRGBSTATE 4 #define SLIDERGBSTATE 5 #define SETHEIGHTSTATE 6 #define SETCONTSTATE 7 #define SMOOTHCONTSTATE 8 #define CUTCONTSTATE 9 #define COPYCONTSTATE 10 #define PASTECONTSTATE 11 #define CEILINGSTATE 12 #define SLIDEBARSTATE 13 #define ORBITSTATE 14 #define ZOOMINSTATE 15 #define RESIZEZOOMSTATE 16 #define PROPRESIZESTATE 17 #define ZOOMDRAGSTATE 18 #define QUERYHEIGHTSTATE 19 #define SETJULIASTATE 20 #define SLIDESPEEDSTATE 21 #define CYCLERANGESTATE 22 #define HELPSTATE 23 #define SCROLLHELPSTATE 24 #define SCROLLPICTSTATE 25 #define PARSEOK 0 #define PARSEBAD 1 #define ZOOMCLOSEHIT 0 #define ZOOMDRAGHIT 1 #define ZOOMRESIZEHIT 2 #define PROPRESIZEHIT 3 #define NOTHINGHIT 4 /*************************************************************************** * * Structure for Mandelbrot and Julia Pictures * **************************************************************************/ struct Rect { int Left, Top, Right, Bot; }; struct Picture { struct Node pNode; /* for a linked list of pictures */ struct List zList; /* Pictures that have zoom */ /* open in this picture */ struct Node zNode; /* Used to maintain the above */ struct Picture *DrawPict; /* Picture that zoom box is in */ UBYTE ZoomType; /* Zoom In or Out */ int NavTop, NavBot; /* Zoom box location and size */ int NavLeft, NavRight; struct NewWindow *NewWind; /* NewWindow structure */ struct Window *Window; /* Open Intuition window */ struct RastPort ScrollRp; /* rastport for saved image during scroll */ struct BitMap ScrollBitMap; /* bitmap for saved image */ /* Window origin for scroll*/ struct Rect ImageLoc; /* Scroll's image location in Pict->Window*/ struct Rect ClipImage; /* location after clipping to Window */ struct Rect DataClip; /* clipping also reflected in data */ struct Gadget *SizingGadget; /* sizing place */ /* Sempahore for window */ struct SignalSemaphore WindowSemi; struct Gadget *Gadgets; char Title[40]; /* Window Title */ SHORT *Counts; /* Pointer to data area. One */ LONG CountsSize; /* SHORT per pixel. */ /* CountX * CountY * sizeof( SHORT ) */ ULONG Flags; /* Flags regarding Picture specifics */ int LeftMarg, TopMarg; int RightMarg, BotMarg; struct Task *gTask; /* Task that generates this */ LONG gSigBit, gSigMask; /* Signal to free up paused tasks */ UBYTE GenState; /* Task state */ UBYTE GenChildState; /* Task state */ int CurLine; /* Index of Line generator is on */ struct Task *cTask; /* Task for Recolor Slow */ UBYTE ColorState; /* Task state */ UBYTE ColorChildState; /* Task state */ struct Histogram *Hist; /* Projects Histogram structure */ SHORT OldMaxIter; /* used for recalc */ LONG TimeStamp[3]; /* Time stamp for calculation */ /***********************************************************/ double Real, Imag; /* For Julia only (Julia Seed) */ /* Set it to 0.0 for Mand */ double RealLow, ImagLow; /* Screen Boundaries for Julia */ double RealHigh, ImagHigh; /* Complex Plane Origin for Mand */ double RealGap, ImagGap; /* Real and Imaginary parts of */ SHORT LeftEdge, TopEdge; /* Window position on screen */ SHORT CountX, CountY; /* Picture dimensions */ SHORT MaxIteration; UBYTE MathMode; /* Int32, FFP, IEEE */ SHORT Heights[256]; /* Contours' heights and pens */ UBYTE Pens[256]; UBYTE ClrXlate[1024]; /* There are MaxIteration entries */ SHORT RGBs[32]; /* Red, Green, Blue values */ USHORT ViewModes; SHORT Depth; SHORT CycleOn; /* Color Cycling stuff */ CrngChunk Crngs[maxCycles]; }; /* Picture.Types */ #define JULIAPICT 1 #define MANDPICT 2 /* Picture Flags */ #define NO_RAM_GENERATE 0x00000001 #define LENS_DISPLAYED 0x00000002 #define ZOOM_BOX_OPEN 0x00000004 #define SCROLL_HAPPENED 0x00000008 #define PROJECT_CHANGED 0x00000010 #define BORDERLESS_PROJ 0x00000020 #define GENPENDSTATE 1 #define CONTINUESTATE 2 #define GENERATESTATE 3 #define PAUSESTATE 4 #define FINISHEDSTATE 5 #define KILLSTATE 6 #define RECOLORINCOMPLETE 0 #define RECOLORCOMPLETE 1 #define GENINCOMPLETE 0 #define GENCOMPLETE 1 #define NOSIGSTATE 2 #define INT1632MATH 0 #define FFPMATH 1 #define IEEEMATH 2 #define INT3232MATH 3 #define M68881MATH 4 #define INTORBMATH 0 #define FFPORBMATH 1 #define IEEEORBMATH 2 /*************************************************************************** * * External variables * **************************************************************************/ /* These are global system variables */ extern struct Picture *CurPict; extern int CurContour; extern SHORT NumContours; extern LONG TopMarg, BotMarg, LeftMarg, RightMarg; extern struct Screen *screen; extern struct ViewPort *vp; extern int Num_vp_Colors; extern struct Window *PalWind, *ContWind, *StatsWind, *HelpWind; extern struct Window *HistWind,*CycWind, *OrbitWind; extern struct Window *CurWind, *CurPlot, *ClosedWind, *BackWind; extern struct Menu Menu[]; extern SHORT XScale, YScale; extern SHORT MouseX, MouseY; extern LONG CurPen; extern UBYTE ClosePlot; extern UBYTE QuitScreen; extern LONG mSigBit,mSigMask; extern struct Task *mTask; extern BYTE FromWB; extern BYTE State, SubState, Parse_rc; struct Window *OpenMyWind(); struct Gadget *MakeBool(), *MakePot(), *MakeString(); struct IntuiText *MakeIntui(), *ShadowIntui(); struct Border *ShadowBorder(); #define AddSemaphore myAddSemaphore /* * Picture window ( Julia and Mandlebrot windows ) margins */ #define TOPMARG TopMarg #define BOTMARG BotMarg #define LEFTMARG LeftMarg #define RIGHTMARG RightMarg #define SUCCESSFUL 0 #define UNSUCCESSFUL -1 #define ChildPause(Pict) {if(Pict->GenState==PAUSESTATE)ChildSignal(Pict);} /************************************************************************** * * Histogram stuff * *************************************************************************/ struct Histogram { int *Table; int TableSize; }; #define AllocHistStruct() (struct Histogram *)safeAllocMem(sizeof(struct Histogram), MEMF_CLEAR) #define FreeHistStruct(p) FreeMem(p,sizeof(struct Histogram)) #define AllocHistTable(s) (int *)safeAllocMem(s*sizeof(int), MEMF_CLEAR) #define FreeHistTable(p) FreeMem(p->Table,p->TableSize*sizeof(int)) #define AddHead(List,Node) safeAddHead(List,Node,__FILE__,__LINE__,__FUNC__) #define Remove(Node) safeRemove(Node,__FILE__,__LINE__,__FUNC__) /************************************************************************** * * standard stuff * *************************************************************************/ #define BEVELEDUP 0 #define BEVELEDDOWN 1 #define NORMALPEN 1 #define SHADOWPEN 3 #define MEDIUMPEN 2 #define HIGHLIGHTPEN 2 #define POTPEN 3 #ifdef MEM_DEBUG #include "safeallocmem.h" #else APTR safeAllocMem(); #endif