home *** CD-ROM | disk | FTP | other *** search
- #include "functions.h"
- #include "exec/types.h" /*Needed for SOFFSET macro*/
- #include "exec/execbase.h"
- #include "exec/tasks.h"
- #include "exec/memory.h"
- #include "exec/ports.h"
- #include "clib/graphics_protos.h"
- #include "graphics/view.h"
- #include "graphics/gfx.h"
- #include "graphics/gfxbase.h"
- #include "graphics/gfxmacros.h"
- #include "graphics/rastport.h"
- #include "intuition/intuitionbase.h"
- #include "intuition/intuition.h"
- #include "intuition/preferences.h"
- #include "libraries/dos.h"
- #include "libraries/dosextens.h"
- #include "stdio.h"
- #include "exec/io.h"
- #include "iff/iff.h"
- #include "iff/ilbm.h"
-
- double XWidth,XHeight,XCenter,YCenter,HWidth,HHeight,Factor;
- double LastX,LastY,LastFactor;
- LONG xtemp,ytemp,MaxCnt,CurCnt,XC,YC,LeftEdge,RightEdge,NearEdge,FarEdge;
- LONG S1Height,S1Width,MltPlr;
- ULONG *PlnPtr;
-
- BPTR FileHandle;
- #define Pf_Size 0xe8
- #define ScnFlg 0x1;
- #define LacFlg 0x2;
- #define ChdFlg DefFlg | CHECKIT | CHECKED
- #define ChkFlg DefFlg | CHECKIT
-
- CmpFlg = MOUSEBUTTONS | MENUPICK;
- MyFlag = NOCAREREFRESH|REPORTMOUSE|BORDERLESS;
- MenFlg = MENUENABLED | MIDRAWN;
- DefFlg = ITEMTEXT|COMMSEQ|ITEMENABLED|HIGHCOMP;
-
-
- struct Library *DOSBase;
- struct GfxBase *GfxBase;
- struct IntuitionBase *IntuitionBase;
- struct ExecBase *SysBase;
- struct Gadget *GadStuff;
- struct NewScreen ns;
- struct NewWindow nw;
- BYTE CurrentXOffset;
- BYTE CurrentYOffset;
- UBYTE Title[] = " Julian Explorer";
- UBYTE *WindowName;
- SHORT SWidth,SHeight;
- USHORT MyView,SUFlag,SysFlag,ScnSts,OvsChk,LacChk,LacMod,NLcChk,MenVal,NrmChk;
- struct Screen *IntScreen;
- struct Screen *WBScreen;
- struct Window *InfoWindow;
- struct Window *IntWindow;
- struct MsgPort *MyPort,*IntPort;
- struct RastPort *MyRasta,*WBRast,*CWRast;
- struct ViewPort VPorta,VPortb;
- struct Preferences MyNewPrefs,*CurPrefs;
- struct Menu Menu1,Menu2,Menu3,Menu4;
- struct MenuItem *MIStruct;
- struct IntuiText *ITStruct;
-
- struct MenuItem MI11,MI12,MI13,MI14;
- struct MenuItem MI21,MI22,MI23,MI24;
- struct MenuItem MI31,MI32,MI33,MI34;
- struct MenuItem MI41,MI42,MI43,MI44;
- struct IntuiText IT11,IT12,IT13,IT14;
- struct IntuiText IT21,IT22,IT23,IT24;
- struct IntuiText IT31,IT32,IT33,IT34;
- struct IntuiText IT41,IT42,IT43,IT44;
-
- struct PLANEPTR *PlanePtrA,*PlanePtrB;
- static char Message[] = "by David M. McKinstry";
- static char Mesag2[] = "Copyright ";
- UBYTE Mesag2b[] = 0xa9;
- UBYTE Comma[] = 0x2c;
- static char Mesag2c[] = " 1989-91";
- static char Mesag3[] = "System Hardware: ";
- static char Mesag4[] = "Use the menu options on the Custom Screen to change the following parameters!";
- static char Mesag5[] = "Click on the Close Gadget to bring the Custom Screen forward!";
- static char Mesag6[] = "(Note: This window won't be closed, just hidden.)";
- static char Mesag7[] = "To return to this WorkBench Screen, select 'About' from the SManCP menu!";
- static char ScrMsg[] = "Screen center is at ";
- static char ChpMsg[] = "Chip Memory Free = ";
- static char ChpEnd[] = " ";
- static char FstMsg[] = "Fast Memory Free = ";
- static char FstEnd[] = " ";
- static char WdtMsg[] = "Screen Width = ";
- static char WdtEnd[] = " ";
- static char HgtMsg[] = "Screen Height = ";
- static char HgtEnd[] = " ";
- static char MagMsg[] = "Magnification = ";
- static char MagEnd[] = " ";
- static char XPos[] = "x = ";
- static char XPsEnd[] = " ";
- static char YPos[] = "y = ";
- static char YPsEnd[] = " ";
- static char CntMsg[] = "Maximum Count = ";
- static char CntEnd[] = " ";
-
- static char StrngBuffer[200];
- SHORT VertPos;
- USHORT CTable[] = {0,0xf00,0xff0,0x3f8,0x5ea,0xf3a,0x0de,0xf80,0x9f0,0x7df,0x69f,
- 0x00f,0xf2e,0xc0e,0x60e,0x607};
-
- SHORT PolyTab[10];
- SHORT *PolyPnt;
- SHORT DeltaX,DeltaY;
- SHORT x1,y1,x2,y2;
- ULONG IMClass;
-
- ScanOn()
- {
- NrmChk = ChkFlg;
- OvsChk = ChdFlg;
- SWidth = 704;
- SHeight = 478;
- S1Width = 703;
- S1Height = 477;
- XC = 352;
- YC = 239;
- NearEdge = 0;
- LeftEdge = 0;
- RightEdge = 704;
- FarEdge = 478;
- ScnSts = 1; /* Indicate overscan on */
- }
-
- ScnOff()
- {
- NrmChk = ChdFlg;
- OvsChk = ChkFlg;
- SWidth = 640;
- SHeight = 400;
- S1Width = 639;
- S1Height = 399;
- XC = 320;
- YC = 199;
- NearEdge = 0;
- LeftEdge = 0;
- RightEdge = 640;
- FarEdge = 400;
- ScnSts = 0; /* Change to no overscan */
- }
-
- LaceOff()
- {
- MyView = HIRES;
- LacChk = ChkFlg;
- NLcChk = ChdFlg;
- LacMod = 0;
- SHeight = SHeight/2;
- S1Height = SHeight;
- --S1Height;
- FarEdge = FarEdge/2;
- }
-
- LaceOn()
- {
- MyView = HIRES | LACE;
- LacChk = ChdFlg;
- NLcChk = ChkFlg;
- LacMod = 1;
- }
- ScnSet()
- {
- if (SUFlag & 0x2) {
- LaceOn();
- }
- else LaceOff();
- }
-
- ViewSet()
- {
- if (SUFlag & 0x1) { /* See if Overscan flag set */
- ScanOn();
- ScnSet();
- }
- else {
- ScnOff();
- ScnSet();
- }
- }
-
-
- void ITInit(Item,NamePtr)
- struct IntuiText *Item;
- UBYTE *NamePtr;
- {
- Item -> IText = NamePtr;
- Item -> BackPen = 3;
- Item -> FrontPen = 5;
- Item -> DrawMode = JAM1;
- }
- MIInit(Item,NxtItem,TEdge,Cmd,ITItem,Width)
- struct MenuItem *Item,*NxtItem;
- APTR ITItem;
- SHORT TEdge,Width;
- BYTE Cmd;
- {
- Item -> Command = Cmd;
- Item -> TopEdge = TEdge;
- Item -> NextItem = NxtItem;
- Item -> ItemFill = (APTR)ITItem;
- Item -> Flags = (USHORT)DefFlg;
- Item -> Height = 9;
- Item -> Width = Width;
- }
-
- void MenuInit(MenuStruct,NxtMenu,NamePtr,LEdge,MWidth)
- struct Menu *MenuStruct,*NxtMenu;
- SHORT LEdge,MWidth;
- BYTE *NamePtr;
- {
- MenuStruct -> NextMenu = NxtMenu;
- MenuStruct -> Width = MWidth;
- MenuStruct -> Height = 9;
- MenuStruct -> LeftEdge = LEdge;
- MenuStruct -> TopEdge = 0;
- MenuStruct -> MenuName = NamePtr;
- MenuStruct -> Flags = MenFlg;
-
- }
-
- void ScreenSet()
- {
- SHORT MWidth,MHeight,LEdge,TEdge;
- UBYTE MICommand;
- struct Menu *MenStrct;
- BOOL Test;
- ns.LeftEdge = 0;
- ns.TopEdge = 0; /*Was 20 */
- ns.Width = SWidth;
- ns.Height = SHeight;
- ns.DetailPen = 0;
- ns.BlockPen = 1;
- ns.Depth = 4;
- ns.ViewModes = MyView;
-
- IntScreen = (struct Screen *)OpenScreen( &ns );
- PlanePtrA = (struct PLANEPTR *)(IntScreen -> BitMap.Planes);
- MyRasta = &(IntScreen -> RastPort);
- VPorta = IntScreen -> ViewPort;
- LoadRGB4(&VPorta,&CTable[0],16);
- if (ScnSts) {
- /* MyNewPrefs.ViewXOffset = 0xdc;
- MyNewPrefs.ViewYOffset = 0xe9;*/
- MyNewPrefs.ViewXOffset = 0xde;
- MyNewPrefs.ViewYOffset = 0xed;
- }
- else {
- MyNewPrefs.ViewXOffset = CurrentXOffset;
- MyNewPrefs.ViewYOffset = CurrentYOffset;
- }
- SetPrefs(&MyNewPrefs,Pf_Size,FALSE);
-
- nw.Title = NULL;
- nw.LeftEdge = 0;
- nw.TopEdge = 0;
- nw.Width = SWidth;
- nw.Height = SHeight;
- nw.DetailPen = 5;
- nw.BlockPen = 2;
- /*nw.IDCMPFlags = GADGETUP | MENUPICK;*/
- nw.IDCMPFlags = CmpFlg;
- nw.Type = CUSTOMSCREEN;
- nw.Flags = MyFlag; ACTIVATE | SMART_REFRESH;
- nw.FirstGadget = NULL;
- nw.CheckMark = NULL;
- nw.Screen = IntScreen;
- nw.BitMap = NULL;
- nw.MinWidth = 320;
- nw.MinHeight = 100;
- nw.MaxWidth = SWidth;
- nw.MaxHeight = SHeight;
-
- IntWindow = (struct Window *)OpenWindow( &nw );
-
- /* Get associated information about Int window */
- /* GadStuff = IntWindow -> FirstGadget;*/
- CWRast = IntWindow -> RPort;
- SetRast(CWRast,0);
- IntPort = IntWindow -> UserPort;
-
- /* Template is
- MenuInit(&Menu1,&Menu2,"Strng",LEdge,MWidth);
- */
-
- MenuInit(&Menu1,&Menu2,"SManCP",20,100);
- Menu1.FirstItem = &MI11;
- MIInit(&MI11,&MI12,0,0x41,&IT11,150);
- MIInit(&MI12,&MI13,9,0x52,&IT12,150);
- MIInit(&MI13,&MI14,18,0x53,&IT13,150);
- MIInit(&MI14,0,27,0x51,&IT14,150);
-
- ITInit(&IT11,"About");
- ITInit(&IT12,"Redraw(Same P)");
- ITInit(&IT13,"Save");
- ITInit(&IT14,"Quit");
-
- MenuInit(&Menu2,&Menu3,"View Mode",180,130);
- Menu2.FirstItem = &MI21;
- MIInit(&MI21,&MI22,0,0x4c,&IT21,150);
- MIInit(&MI22,&MI23,9,0x43,&IT22,150);
- MIInit(&MI23,&MI24,18,0x4d,&IT23,150);
- MIInit(&MI24,0,27,0x4e,&IT24,150);
-
- ITInit(&IT21," Lace On");
- ITInit(&IT22," Lace Off");
- ITInit(&IT23," Overscan");
- ITInit(&IT24," Normal");
-
- MenuInit(&Menu3,&Menu4,"Maximum Count",350,130);
- Menu3.FirstItem = &MI31;
- MIInit(&MI31,&MI32,0,43,&IT31,150);
- MIInit(&MI32,&MI33,9,45,&IT32,150);
- MIInit(&MI33,&MI34,18,0x44,&IT33,150);
- MIInit(&MI34,0,27,0x48,&IT34,150);
-
- ITInit(&IT31,"Increase by 10");
- ITInit(&IT32,"Decrease by 10");
- ITInit(&IT33,"Double");
- ITInit(&IT34,"Halve");
-
-
- MenuInit(&Menu4,0,"Zoom",505,100);
- Menu4.FirstItem = &MI41;
- MIInit(&MI41,&MI42,0,0x5a,&IT41,140);
- MIInit(&MI42,0,9,0x49,&IT42,140);
-
- ITInit(&IT41,"Select");
- ITInit(&IT42,"Restore");
-
- MI21.Flags = LacChk;
- MI22.Flags = NLcChk;
- MI23.Flags = OvsChk;
- MI24.Flags = NrmChk;
- /* Test = SetMenuStrip(IntWindow,&Menu1);*/
- SetMenuStrip(IntWindow,&Menu1);
-
- ActivateWindow(InfoWindow);
- }
-
- void ScreensClose()
- {
- if(InfoWindow) CloseWindow(InfoWindow);
- if(IntWindow) CloseWindow(IntWindow);
- if(IntScreen) CloseScreen(IntScreen);
- }
- void ScreenClose()
- {
- if(IntWindow) ClearMenuStrip(IntWindow);
- if(IntWindow) CloseWindow(IntWindow);
- if(IntScreen) CloseScreen(IntScreen);
- }
-
-
- OpenWrite()
- {
- FileHandle = Open((UBYTE *)"Mand.iff",MODE_NEWFILE);
- if (!FileHandle) return(-1);
- return(0);
- }
-
- WriteFile(Source,FileLength)
- char *Source;
- ULONG FileLength;
- {
- ULONG Count,*Destination;
- ULONG ReadLength;
- Write(FileHandle,(char *)Source,FileLength);
- return(0);
- }
- CloseWrite()
- {
- Close(FileHandle);
- }
-
- ULONG WritePlanes()
- {
- USHORT PlnCnt,LineCount;
-
- ULONG Count,*Source1,*Source2,*Source3,*Source4;
- ULONG FileLength,LineLength;
- FileLength = 32000;
- Source1 = (ULONG *)*PlnPtr++;
- Source2 = (ULONG *)*PlnPtr++;
- Source3 = (ULONG *)*PlnPtr++;
- Source4 = (ULONG *)*PlnPtr++;
- LineCount = ns.Height;
- FileLength = ns.Width >> 3;
- LineLength = FileLength >> 2; /* # of long words on line */
- while (LineCount) {
- FileLength = Write(FileHandle,(char *)Source1,FileLength);
- Source1 = Source1 + LineLength;
- FileLength = Write(FileHandle,(char *)Source2,FileLength);
- Source2 = Source2 + LineLength;
- FileLength = Write(FileHandle,(char *)Source3,FileLength);
- Source3 = Source3 + LineLength;
- FileLength = Write(FileHandle,(char *)Source4,FileLength);
- Source4 = Source4 + LineLength;
- --LineCount;
- }
- return(0);
- }
-
-
- Save()
- {
- ULONG *HdrSize,*HdrTop,*HdrBottom;
- UBYTE *MyColors;
- USHORT *CurrentColor,Red,Green,Blue;
- /*static char MandName[] = "Mand.iff";*/
- ChunkHeader *Chunk3D;
- BitMapHeader *MyHeader;
-
- typedef struct {
- ID ckID;
- } sChunk;
-
- sChunk *ChunkID;
- char *HdrBuffer;
-
- ULONG CTSize,CTCount,FileLength,BodyLength,Depth;
- HdrBuffer = AllocMem(160,MEMF_PUBLIC|MEMF_CLEAR);
- Chunk3D = (ChunkHeader *) HdrBuffer;
- Chunk3D -> ckID = FORM;
- Chunk3D++;
- ChunkID = (sChunk *) Chunk3D;
- ChunkID -> ckID = ID_ILBM;
- ChunkID++;
- ChunkID -> ckID = ID_BMHD;
- ChunkID++;
- HdrSize = (ULONG *)ChunkID;
- *HdrSize++ = 20;
- MyHeader = (BitMapHeader *)HdrSize;
- MyHeader -> w = ns.Width;
- MyHeader -> h = ns.Height;
- CTCount = ns.Depth;
- MyHeader -> nPlanes = CTCount;
- MyHeader -> xAspect = 1;
- MyHeader -> yAspect = 1;
- MyHeader -> pageWidth = ns.Width;
- MyHeader -> pageHeight = ns.Height;
- MyHeader++;
- Chunk3D = (ChunkHeader *)MyHeader;
- Chunk3D -> ckID = ID_CMAP;
- CTSize = 1;
- while (CTCount) {
- CTSize <<= 1;
- --CTCount;
- }
- Chunk3D -> ckSize = 3*CTSize;
- Chunk3D++;
- MyColors = (UBYTE *)Chunk3D;
- CTCount = ns.Depth;
- CurrentColor = &CTable[0];
- while (CTSize) {
- Red = *CurrentColor;
- Red = 0xf00 & Red;
- Red >>= 4;
- *MyColors++ = (UBYTE)Red;
- Green = *CurrentColor;
- Green = 0xf0 & Green;
- *MyColors++ = (UBYTE)Green;
- Blue = *CurrentColor++;
- Blue = 0xf & Blue;
- Blue <<= 4;
- *MyColors++ = (UBYTE)Blue;
- --CTSize;
- }
- Chunk3D = (ChunkHeader *)MyColors;
- Chunk3D -> ckID = ID_BODY;
- CTCount = ns.Width;
- CTCount >>= 3;
- CTCount = CTCount*ns.Height;
- CTCount = CTCount*ns.Depth;
- Chunk3D -> ckSize = CTCount;
- BodyLength = CTCount;
- Chunk3D++;
- HdrTop = (ULONG *)Chunk3D;
- HdrBottom = (ULONG *)HdrBuffer;
- FileLength = HdrTop - HdrBottom;
- FileLength <<= 2; /* Get # bytes */
- Chunk3D = (ChunkHeader *)HdrBuffer;
- CTCount = CTCount + FileLength;
- Chunk3D -> ckSize = CTCount - 8;
- OpenWrite();
- WriteFile(HdrBuffer,FileLength);
- PlnPtr = (ULONG *) PlanePtrA;
- WritePlanes();
- CloseWrite();
- if (HdrBuffer) FreeMem(HdrBuffer,160);
- return(0);
- }
-
- void WindowSet()
- {
-
- nw.LeftEdge = 0;
- nw.TopEdge = 0; /* Expose screen drag bar */
- nw.Width = 640;
- nw.Height = 200;
- nw.DetailPen = 5;
- nw.BlockPen = 2;
- nw.IDCMPFlags = CLOSEWINDOW;
- nw.Type = WBENCHSCREEN;
- nw.Flags = WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|SMART_REFRESH|ACTIVATE|REPORTMOUSE;
- nw.FirstGadget = NULL;
- nw.CheckMark = NULL;
- nw.Screen = 0;
- WindowName = &Title[0];
- nw.Title = (UBYTE *)WindowName;
- nw.BitMap = NULL;
- nw.MinWidth = 320;
- nw.MinHeight = 100;
- nw.MaxWidth = SWidth+20;
- nw.MaxHeight = SHeight+20;
-
- InfoWindow = (struct Window *)OpenWindow( &nw );
- WBRast = InfoWindow -> RPort;
- MyPort = InfoWindow -> UserPort;
- WBScreen = InfoWindow -> WScreen;
- }
-
- void DescribeSystem()
- {
- if (SysFlag & AFB_68030) Text(WBRast,(STRPTR)" 68030",6);
- else if (SysFlag & AFB_68020) Text(WBRast,(STRPTR)" 68020",6);
- Text(WBRast,(STRPTR)Comma,1);
- if (SysFlag & AFB_68882) Text(WBRast,(STRPTR)" 68882",6);
- else if (SysFlag & AFB_68881) Text(WBRast,(STRPTR)" 68881",6);
- }
-
- void WriteStuff()
- {
- ULONG MemSize;
- char *TmpPtr;
- SetAPen(WBRast,1);
- Move(WBRast,0xd0,20);
- Text(WBRast,(STRPTR)Message,strlen(Message));
- SetAPen(WBRast,3);
- Move(WBRast,0xd8,30);
- Text(WBRast,(STRPTR)Mesag2,strlen(Mesag2));
- Text(WBRast,(STRPTR)Mesag2b,1);
- Text(WBRast,(STRPTR)Mesag2c,strlen(Mesag2c));
- Move(WBRast,0xe0,128);
- Text(WBRast,(STRPTR)ScrMsg,strlen(ScrMsg));
- SetAPen(WBRast,1);
- Move(WBRast,0x90,48);
- Text(WBRast,(STRPTR)Mesag3,strlen(Mesag3));
- DescribeSystem();
- SetAPen(WBRast,2);
- Move(WBRast,8,78);
- Text(WBRast,(STRPTR)Mesag4,strlen(Mesag4));
- Move(WBRast,0x40,152);
- Text(WBRast,(STRPTR)Mesag5,strlen(Mesag5));
- Move(WBRast,0x60,162);
- Text(WBRast,(STRPTR)Mesag6,strlen(Mesag6));
- Move(WBRast,0x18,172);
- Text(WBRast,(STRPTR)Mesag7,strlen(Mesag7));
- SetAPen(WBRast,1);
- TmpPtr = &CntEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%d",MaxCnt);
- Move(WBRast,400,108);
- Text(WBRast,(STRPTR)CntMsg,strlen(CntMsg));
- Move(WBRast,0x28,60);
- MemSize = AvailMem(MEMF_CHIP);
- TmpPtr = &ChpEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%d",MemSize);
- Text(WBRast,(STRPTR)ChpMsg,strlen(ChpMsg));
- Move(WBRast,400,60);
- MemSize = AvailMem(MEMF_FAST);
- TmpPtr = &FstEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%d",MemSize);
- Text(WBRast,(STRPTR)FstMsg,strlen(FstMsg));
- Move(WBRast,0x28,94);
- TmpPtr = &WdtEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%d",SWidth);
- Text(WBRast,(STRPTR)WdtMsg,strlen(WdtMsg));
- Move(WBRast,400,94);
- TmpPtr = &HgtEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%d",SHeight);
- Text(WBRast,(STRPTR)HgtMsg,strlen(HgtMsg));
- Move(WBRast,0x28,108);
- TmpPtr = &MagEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%e",Factor);
-
- Text(WBRast,(STRPTR)MagMsg,strlen(MagMsg));
- Move(WBRast,0x28,136);
- TmpPtr = &XPsEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%e",(HWidth-XCenter)/Factor);
- Text(WBRast,(STRPTR)XPos,strlen(XPos));
- Move(WBRast,400,136);
- TmpPtr = &YPsEnd[0];
- --TmpPtr;
- sprintf(TmpPtr,"%e",(HHeight-YCenter)/Factor);
- Text(WBRast,(STRPTR)YPos,strlen(YPos));
- }
-
-
- void LibsOpen()
- {
- if (!DOSBase) {
- DOSBase = (struct Library *)OpenLibrary((UBYTE *)"dos.library",0L);
- }
-
- GfxBase = (struct GfxBase *)OpenLibrary((UBYTE *)"graphics.library",0L);
- IntuitionBase = (struct IntuitionBase *)OpenLibrary((UBYTE *)"intuition.library",0L);
- }
-
- void LibsClose()
- {
- if(GfxBase) CloseLibrary((struct Library *)GfxBase);
- if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
- }
-
- CheckMsg()
- {
- struct IntuiMessage *MyMsg;
-
- IMClass = 0;
- MyMsg = (struct IntuiMessage*) GetMsg(MyPort);
- if (MyMsg != NULL) {
- IMClass = MyMsg -> Class;
- ReplyMsg((struct Message *)MyMsg);
- }
- }
-
- CheckIntMsg()
- {
- struct IntuiMessage *MyMsg;
- MenVal = 0;
- MyMsg = (struct IntuiMessage*) GetMsg(IntPort);
- if (MyMsg != NULL) {
- MenVal = MyMsg -> Code;
- ReplyMsg((struct Message *)MyMsg);
- }
- }
-
- void ErrorDisplay()
- {
- static char Err020[] = "Sorry, but this Mandelbrot Generator requires a minimum configuration";
- static char Err021[] = "of a 68881 and a 68020!";
- static char Err022[] = "Use SManLb as a slow alternative!";
- static char Err023[] = "Use the Close Gadget to Terminate.";
- SetAPen(WBRast,1);
- Move(WBRast,40,80);
- Text(WBRast,(STRPTR)Err020,strlen(Err020));
- Move(WBRast,40,95);
- Text(WBRast,(STRPTR)Err021,strlen(Err021));
- Move(WBRast,40,125);
- Text(WBRast,(STRPTR)Err022,strlen(Err022));
- SetAPen(WBRast,3);
- Move(WBRast,40,155);
- Text(WBRast,(STRPTR)Err023,strlen(Err023));
- IMClass = 0;
- while (IMClass != CLOSEWINDOW) {
- CheckMsg();
- Delay(1);
- }
- }
-
- MakeLace()
- {
- ScreenClose();
- SUFlag = SUFlag | 0x2;
- ViewSet();
- ScreenSet();
- }
-
- UnLace()
- {
- ScreenClose();
- SUFlag = SUFlag & 0xfffd;
- ViewSet();
- ScreenSet();
- }
-
- MakeOver()
- {
- ScreenClose();
- SUFlag = SUFlag | 0x1;
- ViewSet();
- ScreenSet();
- }
-
- MakeNorm()
- {
- ScreenClose();
- SUFlag = SUFlag & 0xfffe;
- ViewSet();
- ScreenSet();
- }
-
- CountChange()
- {
- if((MenVal & 0xff) == 2) MaxCnt = MaxCnt + 10;
- if((MenVal & 0xff) == 0x22) MaxCnt = MaxCnt - 10;
- if((MenVal & 0xff) == 0x42) MaxCnt = 2*MaxCnt;
- if((MenVal & 0xff) == 0x62) MaxCnt = MaxCnt/2;
- if (MaxCnt < 10) MaxCnt = 10;
- WriteStuff();
- ActivateWindow(IntWindow);
- }
-
- ScreenChange()
- {
- if((MenVal & 0xff) == 1) MakeLace();
- if((MenVal & 0xff) == 0x21) UnLace();
- if((MenVal & 0xff) == 0x41) MakeOver();
- if((MenVal & 0xff) == 0x61) MakeNorm();
- WriteStuff();
- ActivateWindow(IntWindow);
- }
-
- void Restore()
- {
- Factor = LastFactor;
- XCenter = LastX;
- YCenter = LastY;
- }
-
- void PolyUpDate()
- {
- PolyPnt = &PolyTab[0];
- x2 = IntWindow -> MouseX;
- *PolyPnt++ = x1; /* Upper-Left Corner */
- *PolyPnt++ = y1;
- *PolyPnt++ = x2; /* Upper-Right Corner */
- *PolyPnt++ = y1;
- DeltaX = x2 - x1;
- DeltaY = SHeight*DeltaX/SWidth;
- y2 = y1 + DeltaY;
- *PolyPnt++ = x2; /* Lower-Right Corner */
- *PolyPnt++ = y2;
- *PolyPnt++ = x1; /* Lower-Left Corner */
- *PolyPnt++ = y2;
- *PolyPnt++ = x1; /* Upper-Left Corner */
- *PolyPnt++ = y1;
- Move(CWRast,x1,y1);
- PolyPnt = &PolyTab[0];
- PolyDraw(CWRast,4,PolyPnt);
- }
-
- /* Clear by reversing again */
- void PolyClear()
- {
- PolyPnt = &PolyTab[0];
- PolyDraw(CWRast,4,PolyPnt);
- }
- /*WaitChg will wait until there is at least a difference of 10 between
- the original MouseX value and the new. */
-
- void WaitChg()
- {
- while ((x2 - x1) < 5) {
- x2 = IntWindow -> MouseX;
- Delay(1);
- }
- }
-
- DoZoom()
- {
- double Ratio;
- x1 = 0;
- y1 = 0;
- x2 = 0;
- y2 = 0;
- while (MenVal != SELECTDOWN) {
- CheckIntMsg();
- }
- x1 = IntWindow -> MouseX;
- y1 = IntWindow -> MouseY;
-
- /* Now prep for complementary polygon (i.e. rectangle) */
- SetDrMd(CWRast,2);
- WaitChg();
- PolyUpDate();
- while (MenVal != SELECTUP) {
- CheckIntMsg();
- PolyClear();
- PolyUpDate();
- Delay(1);
- }
- /* Clear Polygon and restore drawing mode */
- PolyClear();
- SetDrMd(CWRast,0);
- if (LacMod == 0) {
- y1 = 2*y1; /* Double y1 if not interlace */
- }
- LastFactor = Factor;
- LastX = XCenter;
- LastY = YCenter;
-
- Ratio = XWidth/DeltaX;
- Factor = Ratio*Factor;
-
- XCenter = XCenter - (double)x1;
- XCenter = Ratio*XCenter;
- YCenter = YCenter - (double)y1;
- YCenter = Ratio*YCenter;
- MenVal = 0xf803;
- }
-
- void Zoom()
- {
- if((MenVal & 0xf0) == 0x00) DoZoom();
- if((MenVal & 0xf0) == 0x20) Restore();
- }
-
- SManMen()
- {
- if (MenVal == 0xf800) {
- WriteStuff();
- WBenchToFront();
- WindowToFront(InfoWindow);
- ActivateWindow(InfoWindow);
- }
- if (MenVal == 0xf840) Save();
- }
-
- void SingleLine()
- {
-
- xtemp = 0;
-
- while (xtemp < RightEdge) {
- FuncFind();
- xtemp++;
- CheckMsg();
- if (IMClass == CLOSEWINDOW) {
- ScreenToFront(IntScreen);
- ActivateWindow(IntWindow);
- }
- CheckIntMsg();
- if (MenVal) {
- if ((MenVal & 0xf) == 2) CountChange();
- if (MenVal == 0xf860) return;
- if ((MenVal & 0xf) == 1) return;
- if ((MenVal & 0xf) == 3) {
- Zoom();
- return;
- }
- if ((MenVal & 0xf) == 0) {
- SManMen();
- if((MenVal & 0xff) == 0x20) return;
- }
- }
- }
- }
-
- FullSurface()
- {
- SetRast(CWRast,0);
- /* Execute((UBYTE *)"Date",0,0);*/
- ytemp = NearEdge;
- /* Now convert appropriate values to extended precision. */
- ConExt();
- while (ytemp < FarEdge) {
- SingleLine(); /*Draw next line*/
- Delay(1);
- if (MenVal) {
- if (MenVal == 0xf860) return;
- if ((MenVal & 0xf) == 1) return;
- if ((MenVal & 0xf) == 3) return;
- if ((MenVal & 0xff) == 0x20) return;
- }
- ytemp++;
- }
- /* Execute((UBYTE *)"Date",0,0);*/
- }
-
- Status()
- {
- while (!MenVal) {
- Delay(1);
- CheckMsg();
- if (IMClass == CLOSEWINDOW) {
- ScreenToFront(IntScreen);
- ActivateWindow(IntWindow);
- MenVal = 0;
- }
- CheckIntMsg();
- if (MenVal) {
- if (MenVal == -1) MenVal = 0;
- if ((MenVal & 0xf) == 0) {
- SManMen();
- if (MenVal == 0xf800) MenVal = 0;
- }
- if ((MenVal & 0xf) == 1) ScreenChange();
- if ((MenVal & 0xf) == 2) CountChange();
- if ((MenVal & 0xf) == 3) Zoom();
- }
- }
- }
-
- void main()
- {
-
- MltPlr = 0xa0;
- MaxCnt = 31;
- LibsOpen();
- WindowSet();
- CurPrefs = GetPrefs(&MyNewPrefs,Pf_Size);
- CurrentXOffset = CurPrefs -> ViewXOffset;
- CurrentYOffset = CurPrefs -> ViewYOffset;
- SysFlag = SysBase -> AttnFlags;
- if (((SysFlag & AFB_68881)||(SysFlag & AFB_68882))&&((SysFlag & AFB_68020)||(SysFlag & AFB_68030))) {
- SUFlag = SUFlag & 0xfffe; /*Clear ScnFlg*/
- SUFlag = SUFlag & 0xfffd; /*Clear LacFlg*/
- ViewSet();
- Factor = MltPlr;
- XWidth = SWidth;
- XHeight = SHeight;
- HWidth = XC;
- XCenter = XC;
- HHeight = YC;
- YCenter = YC;
- /* CurPrefs = GetPrefs(&MyNewPrefs,Pf_Size);
- CurrentXOffset = CurPrefs -> ViewXOffset;
- CurrentYOffset = CurPrefs -> ViewYOffset;*/
- ns.Type = CUSTOMSCREEN|SCREENBEHIND;
- ScreenSet();
- ns.Type = CUSTOMSCREEN;
- WriteStuff();
- ActivateWindow(InfoWindow);
- MenVal = 0xf801;
- while (MenVal != 0xf860) {
- FullSurface();
- if ((MenVal & 0xf) == 1) ScreenChange();
- Status();
- }
- }
-
- else {
- ErrorDisplay();
- }
- MyNewPrefs.ViewXOffset = CurrentXOffset;
- MyNewPrefs.ViewYOffset = CurrentYOffset;
- SetPrefs(&MyNewPrefs,Pf_Size,FALSE);
- ScreensClose();
- LibsClose();
- }
-