home *** CD-ROM | disk | FTP | other *** search
Wrap
/******************************************************************************* ** ** Coded by Dino Papararo LAST MODIFIED 23-Apr-2001 ** *******************************************************************************/ //#define STORMAMIGA //#define STORMAMIGA_OS3 //#include <stormamiga.h> #include <stdio.h> #include <string.h> #include <math.h> #include <exec/exec.h> #include <powerpc/powerpc.h> #include <powerpc/memoryPPC.h> #include <clib/alib_protos.h> #include <clib/powerpc_protos.h> #include <intuition/intuition.h> #include <intuition/gadgetclass.h> #include <graphics/gfxbase.h> #include <graphics/scale.h> #include <devices/printer.h> #include <workbench/workbench.h> #include <iffp/ilbmapp.h> #include <proto/exec.h> #include <proto/dos.h> #include <proto/intuition.h> #include <proto/diskfont.h> #include <proto/graphics.h> #include <proto/gadtools.h> #include <proto/utility.h> #include <proto/iffparse.h> #include <proto/icon.h> #include <proto/asl.h> #include <proto/wb.h> #include "flashmandel.h" struct Library *PowerPCBase = NULL; struct MandelChunk MANDChunk = {0}; struct RastPort TempRP; struct BitMap *TempBM; UBYTE *PixelLine; UBYTE *GfxPpcMem; TEXT MYFILE [MAX_FILELEN],PICTURESDIR [MAX_DIRLEN],PALETTESDIR [MAX_DIRLEN],MYPATH [MAX_PATHLEN],BAR_STRING [BARLEN],MYFONT [MAX_FILELEN],USERNAME [MAX_FILELEN]; TEXT CPU68K_STR [10],FPU68K_STR [10],CPUPPC_STR [10],FPUPPC_STR [10]; TEXT *MYDIR = NULL; BOOL DEPTH_CHANGED; WORD ZOOMLINE [PAIRS << 1] , MAX_ITERATIONS = 319,RETURNVALUE = 0; LONG PRIORITY = DEF_STARTPRI,DELAY = 5L,__oslibversion = Lib_Version; ULONG MASK = TMASK; ULONG ELAPSEDTIME = NULL,COLORS,CPUINFO,UFLAGS = NULL, UITERATIONS = NULL; LDouble RMIN=INIT_DEF_RMIN,RMAX=INIT_DEF_RMAX,IMIN=INIT_DEF_IMIN,IMAX=INIT_DEF_IMAX; LDouble DEF_RMIN,DEF_RMAX,DEF_IMIN,DEF_IMAX,DEF_JKRE=INIT_DEF_JKRE,DEF_JKIM=INIT_DEF_JKIM,URMIN=0.0,URMAX=0.0,UIMIN=0.0,UIMAX=0.0,UJKRE=0.0,UJKIM=0.0; LDouble INCREMREAL=0.0,INCREMIMAG=0.0,CRE=0.0,CIM=0.0,JKRE=0.0,JKIM=0.0; ULONG *PALETTE; CPTR *VINFO = NULL; UBYTE (*COLORREMAP) (const LDouble,const LDouble,const LDouble); VOID (*V_LINE) (struct RastPort *,const WORD,const WORD,const WORD); VOID (*H_LINE) (struct RastPort *,const WORD,const WORD,const WORD); UBYTE *DiskFontLibraryError = "I need at least DiskFontLibrary v39 or better, sorry !"; UBYTE *IconLibraryError = "I need at least IconLibrary v39 or better, sorry !"; UBYTE *GadToolsLibraryError = "I need at least GadToolsibrary v39 or better, sorry !"; UBYTE *AslLibraryError = "I need at least AslLibrary v39 or better, sorry !"; UBYTE *UtilityLibraryError = "I need at least UtilityLibrary v39 or better, sorry !"; UBYTE *IFFParseLibraryError = "I need at least IFFParseLibrary v39 or better, sorry !"; UBYTE *OpenDisplayError = "I need at least 8 colors, sorry."; UBYTE *NoMemForTempRastPort = "No mem for temp RastPort"; UBYTE *FontError = "Font failed"; UBYTE *NoMonitor = "No monitor"; UBYTE *NoChips = "No chips"; UBYTE *NoMem = "No mem"; UBYTE *NoChipMem = "No chipmem"; UBYTE *PubNotUnique = "Pub not unique"; UBYTE *UnknownMode = "Unknown mode"; UBYTE *ScreenTooDeep = "Screen too deep"; UBYTE *AttachScreen = "Attach screen failed"; UBYTE *ModeNotAvailableError = "Mode not available"; UBYTE *UnknownScrError = "Unknown screen error"; UBYTE *VisualInfoError = "Visualinfo failed"; UBYTE *WindowError = "Openwindow failed"; UBYTE *MenuError = "Menu failed"; UBYTE *GadgetError = "Gadget error"; UBYTE *WindowGadgetError = "Window gadget error"; UBYTE *PreviewWindowError = "Preview window failed"; UBYTE *CreateDisplayError = "Createdisplay error"; UBYTE *DimensionInfoError = "Dimensioninfo error"; UBYTE *DisplayInfoError = "Displayinfo error"; UBYTE *PaletteRequesterError = "Palette requester error"; UBYTE *MakeDisplayError = "Display error"; UBYTE *QueryMandPicError = "Not a FlashMandel picture !"; UBYTE *LoadMandPicError = "Load picture error"; UBYTE *SaveMandPicError = "Save picture error"; UBYTE *LoadMandPalError = "Load palette error"; UBYTE *SaveMandPalError = "Save palette error"; UBYTE *NoMemForPPC = "No mem for memory buffer, only Mc 68k rendering allowed"; ULONG CheckCPU (ULONG CpuFlags); void FreeBitMapSafety (struct BitMap *); BOOL AllocTempRast (struct BitMap *,UWORD,UBYTE); void PutPointer (struct Window *,UWORD *,LONG,LONG,LONG,LONG,UBYTE); VOID ClipIt (WORD,WORD,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,BOOL); ULONG ModeFallBack (ULONG,WORD,WORD,WORD); void SystemInfo (struct Window *Win); LONG About (struct Window *); LONG Choice (struct Window *,TEXT *,TEXT *); LONG CheckGFX (VOID); UBYTE GetMaxPlanes (ULONG); void AdjustRatio (LDouble *,LDouble *,LDouble *,LDouble *,WORD,WORD,BOOL); VOID ShowTime (struct Window *,TEXT *,ULONG); ULONG IntegerGad (struct Window *,TEXT *,TEXT *,TEXT *,ULONG); VOID CloseDisplay (struct ILBMInfo *,CPTR *); LONG MakeDisplay (struct ILBMInfo *); BOOL NewCoords (struct Window *,const WORD,const WORD,const WORD,const WORD); BOOL DrawFrame (struct Window *,const WORD,const WORD,const WORD,const WORD); ULONG DrawFractal (struct Window *,const WORD,const WORD,const WORD,const WORD); BOOL Preview (struct Window *,LONG,LONG); BOOL ShowCoords (struct Window *); void RestoreCoords (struct Window *); void SaveCoords (struct Window *,BOOL); BOOL FileRequest (struct Window *,TEXT *,TEXT *,BOOL,BOOL); BOOL FontRequest (struct Window *); BOOL SMRequest (struct ILBMInfo *); VOID SetMenuStart (struct Window *); VOID SetMenuStop (struct Window *); ULONG ProcessMenu (struct Window *,UWORD); BOOL PickJuliaK (struct Window *); void CheckMenu (struct Window *); void ProcessMouse (struct Window *,WORD,WORD); ULONG HandleEvents (struct ILBMInfo *); LONG WinDump (struct Window *); ULONG Fail (UBYTE *,ULONG); BOOL PasteBitMap (struct BitMap *,struct Window *,WORD,WORD); void wbmain (struct WBStartup *ArgMsg); LONG main (LONG,CONST_STRPTR *); LONG MainProg (VOID); UBYTE LinearRemap (const LDouble,const LDouble,const LDouble); UBYTE LogRemap (const LDouble,const LDouble,const LDouble); UBYTE RepeatedRemap (const LDouble,const LDouble,const LDouble); UBYTE SquareRootRemap (const LDouble,const LDouble,const LDouble); UBYTE OneRemap (const LDouble,const LDouble,const LDouble); UBYTE TwoRemap (const LDouble,const LDouble,const LDouble); UBYTE ThreeRemap (const LDouble,const LDouble,const LDouble); UBYTE FourRemap (const LDouble,const LDouble,const LDouble); static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *),REG (a2,struct ScreenModeRequester *),REG (a1,ULONG)); struct Screen *OpenIdScreen (struct ILBMInfo *,WORD,WORD,WORD,ULONG); struct Window *OpenDisplay (struct ILBMInfo *,WORD,WORD,WORD,ULONG); struct BitMap *CopyBitMap (struct Window *,WORD,WORD,WORD,WORD); struct Hook SMFILTERHOOK = {NULL,NULL,(VOID *) SMFilterFunc,NULL}; struct Border MYBORDER = {0,0,0,0,COMPLEMENT,PAIRS,ZOOMLINE,0}; struct TextAttr MYFONTSTRUCT = {DEF_FONTNAMESTR,DEF_FONTSIZE,FS_NORMAL,FPF_DISKFONT}; struct NewGadget TEXTGAD = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0}; struct NewGadget BUTTONGAD = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0}; struct NewGadget CHECKBOXGAD = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0}; struct BitScaleArgs BSA = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL}; struct Chunk COPYRIGHT_CHUNK = {NULL,ID_ILBM,ID_Copyright,sizeof (UBYTE) * strlen (VERSION "by " AUTHOR " " COPYRIGHT_DATE),VERSION "by " AUTHOR " " COPYRIGHT_DATE}; struct Chunk USERNAME_CHUNK = {©RIGHT_CHUNK,ID_ILBM,ID_AUTH,sizeof (UBYTE) * MAX_FILELEN,USERNAME}; struct Chunk SPECIAL_CHUNK = {NULL,ID_ILBM,ID_MAND,sizeof (struct MandelChunk),NULL}; UWORD PENS [] = {BLACK,DARK_GREY,WHITE,WHITE,DARK_GREY,LIGHT_GREY,DARK_GREY,LIGHT_GREY,DARK_GREY,WHITE,LIGHT_GREY,DARK_GREY,(UWORD) ~0}; /* 01 0 DETAILPEN SFONDO 02 1 BLOCKPEN TESTO 03 1 TEXTPEN TESTO EVIDENZIATO 04 2 SHINEPEN BORDI CHIARI 05 1 SHADOWPEN BORDI SCURI 06 3 FILLPEN BARRA TITOLO FINESTRE ATTIVE 07 1 FILLTEXTPEN TITOLO FINESTRE ATTIVE 08 0 BACKGROUNDPEN 09 2 HIGHLIGHTTEXTPEN 10 1 BARDETAILPEN TESTO NEI MENU 11 2 BARBLOCKPEN SFONDO NEI MENU 12 1 BARTRIMPEN */ ULONG COLORS_ECS [] = {32L << 16, 0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB, 0x77777777,0x77777777,0x77777777, 0x33333333,0x33333333,0x33333333, 0x33333333,0x33333333,0x00000000, 0x77777777,0x77777777,0x00000000, 0xBBBBBBBB,0xBBBBBBBB,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0x00000000, 0x00000000,0xFFFFFFFF,0x00000000, 0x00000000,0xBBBBBBBB,0x00000000, 0x00000000,0x77777777,0x00000000, 0x00000000,0x33333333,0x00000000, 0x33333333,0x00000000,0x33333333, 0x77777777,0x00000000,0x77777777, 0xBBBBBBBB,0x00000000,0xBBBBBBBB, 0xFFFFFFFF,0x00000000,0xFFFFFFFF, 0xFFFFFFFF,0x00000000,0x00000000, 0xBBBBBBBB,0x00000000,0x00000000, 0x77777777,0x00000000,0x00000000, 0x33333333,0x00000000,0x00000000, 0x00000000,0x33333333,0x33333333, 0x00000000,0x77777777,0x77777777, 0x00000000,0xBBBBBBBB,0xBBBBBBBB, 0x00000000,0xFFFFFFFF,0xFFFFFFFF, 0x00000000,0x00000000,0xFFFFFFFF, 0x00000000,0x00000000,0xBBBBBBBB, 0x00000000,0x00000000,0x77777777, 0x00000000,0x00000000,0x33333333, NULL}; ULONG COLORS_AGA [] = {256L << 16, 0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666, 0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f, 0xafafafaf,0xafafafaf,0xafafafaf, 0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf, 0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf, 0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf, 0xefefefef,0xefefefef,0xefefefef, 0xdfdfdfdf,0xefefefef,0xffffffff, 0xcfcfcfcf,0xdfdfdfdf,0xefefefef, 0xbfbfbfbf,0xcfcfcfcf,0xdfdfdfdf, 0xafafafaf,0xbfbfbfbf,0xcfcfcfcf, 0x9f9f9f9f,0xafafafaf,0xbfbfbfbf, 0x8f8f8f8f,0x9f9f9f9f,0xafafafaf, 0x7f7f7f7f,0x8f8f8f8f,0x9f9f9f9f, 0x6f6f6f6f,0x7f7f7f7f,0x8f8f8f8f, 0x5f5f5f5f,0x6f6f6f6f,0x7f7f7f7f, 0x4f4f4f4f,0x5f5f5f5f,0x6f6f6f6f, 0x3f3f3f3f,0x4f4f4f4f,0x5f5f5f5f, 0x2f2f2f2f,0x3f3f3f3f,0x4f4f4f4f, 0x1f1f1f1f,0x2f2f2f2f,0x3f3f3f3f, 0x0f0f0f0f,0x1f1f1f1f,0x2f2f2f2f, 0x00000000,0x0f0f0f0f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x1f1f1f1f, 0x2f2f2f2f,0x1f1f1f1f,0x2f2f2f2f, 0x3f3f3f3f,0x2f2f2f2f,0x3f3f3f3f, 0x4f4f4f4f,0x3f3f3f3f,0x4f4f4f4f, 0x5f5f5f5f,0x4f4f4f4f,0x5f5f5f5f, 0x6f6f6f6f,0x5f5f5f5f,0x6f6f6f6f, 0x7f7f7f7f,0x6f6f6f6f,0x7f7f7f7f, 0x8f8f8f8f,0x7f7f7f7f,0x8f8f8f8f, 0x9f9f9f9f,0x8f8f8f8f,0x9f9f9f9f, 0xafafafaf,0x9f9f9f9f,0xafafafaf, 0xbfbfbfbf,0xafafafaf,0xbfbfbfbf, 0xcfcfcfcf,0xbfbfbfbf,0xcfcfcfcf, 0xdfdfdfdf,0xcfcfcfcf,0xdfdfdfdf, 0xefefefef,0xdfdfdfdf,0xefefefef, 0xffffffff,0xefefefef,0xffffffff, 0xefefefef,0xffffffff,0xefefefef, 0xdfdfdfdf,0xefefefef,0xdfdfdfdf, 0xcfcfcfcf,0xdfdfdfdf,0xcfcfcfcf, 0xbfbfbfbf,0xcfcfcfcf,0xbfbfbfbf, 0xafafafaf,0xbfbfbfbf,0xafafafaf, 0x9f9f9f9f,0xafafafaf,0x9f9f9f9f, 0x8f8f8f8f,0x9f9f9f9f,0x8f8f8f8f, 0x7f7f7f7f,0x8f8f8f8f,0x7f7f7f7f, 0x6f6f6f6f,0x7f7f7f7f,0x6f6f6f6f, 0x5f5f5f5f,0x6f6f6f6f,0x5f5f5f5f, 0x4f4f4f4f,0x5f5f5f5f,0x4f4f4f4f, 0x3f3f3f3f,0x4f4f4f4f,0x3f3f3f3f, 0x2f2f2f2f,0x3f3f3f3f,0x2f2f2f2f, 0x1f1f1f1f,0x2f2f2f2f,0x1f1f1f1f, 0x0f0f0f0f,0x1f1f1f1f,0x0f0f0f0f, 0x0f0f0f0f,0x1f1f1f1f,0x1f1f1f1f, 0x1f1f1f1f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x5f5f5f5f,0x5f5f5f5f, 0x5f5f5f5f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x9f9f9f9f,0x9f9f9f9f, 0x9f9f9f9f,0xafafafaf,0xafafafaf, 0xafafafaf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xdfdfdfdf,0xdfdfdfdf, 0xdfdfdfdf,0xefefefef,0xefefefef, 0xefefefef,0xffffffff,0xffffffff, 0xffffffff,0xefefefef,0xefefefef, 0xefefefef,0xdfdfdfdf,0xdfdfdfdf, 0xdfdfdfdf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xafafafaf,0xafafafaf, 0xafafafaf,0x9f9f9f9f,0x9f9f9f9f, 0x9f9f9f9f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x5f5f5f5f,0x5f5f5f5f, 0x5f5f5f5f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x1f1f1f1f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x0f0f0f0f, 0x1f1f1f1f,0x1f1f1f1f,0x0f0f0f0f, 0x2f2f2f2f,0x2f2f2f2f,0x1f1f1f1f, 0x3f3f3f3f,0x3f3f3f3f,0x2f2f2f2f, 0x4f4f4f4f,0x4f4f4f4f,0x3f3f3f3f, 0x5f5f5f5f,0x5f5f5f5f,0x4f4f4f4f, 0x6f6f6f6f,0x6f6f6f6f,0x5f5f5f5f, 0x7f7f7f7f,0x7f7f7f7f,0x6f6f6f6f, 0x8f8f8f8f,0x8f8f8f8f,0x7f7f7f7f, 0x9f9f9f9f,0x9f9f9f9f,0x8f8f8f8f, 0xafafafaf,0xafafafaf,0x9f9f9f9f, 0xbfbfbfbf,0xbfbfbfbf,0xafafafaf, 0xcfcfcfcf,0xcfcfcfcf,0xbfbfbfbf, 0xdfdfdfdf,0xdfdfdfdf,0xcfcfcfcf, 0xefefefef,0xefefefef,0xdfdfdfdf, 0xffffffff,0xffffffff,0xefefefef, 0xefefefef,0xefefefef,0xffffffff, 0xdfdfdfdf,0xdfdfdfdf,0xefefefef, 0xcfcfcfcf,0xcfcfcfcf,0xdfdfdfdf, 0xbfbfbfbf,0xbfbfbfbf,0xcfcfcfcf, 0xafafafaf,0xafafafaf,0xbfbfbfbf, 0x9f9f9f9f,0x9f9f9f9f,0xafafafaf, 0x8f8f8f8f,0x8f8f8f8f,0x9f9f9f9f, 0x7f7f7f7f,0x7f7f7f7f,0x8f8f8f8f, 0x6f6f6f6f,0x6f6f6f6f,0x7f7f7f7f, 0x5f5f5f5f,0x5f5f5f5f,0x6f6f6f6f, 0x4f4f4f4f,0x4f4f4f4f,0x5f5f5f5f, 0x3f3f3f3f,0x3f3f3f3f,0x4f4f4f4f, 0x2f2f2f2f,0x2f2f2f2f,0x3f3f3f3f, 0x1f1f1f1f,0x1f1f1f1f,0x2f2f2f2f, 0x0f0f0f0f,0x0f0f0f0f,0x1f1f1f1f, 0x0f0f0f0f,0x0f0f0f0f,0x00000000, 0x1f1f1f1f,0x1f1f1f1f,0x00000000, 0x2f2f2f2f,0x2f2f2f2f,0x00000000, 0x3f3f3f3f,0x3f3f3f3f,0x00000000, 0x4f4f4f4f,0x4f4f4f4f,0x00000000, 0x5f5f5f5f,0x5f5f5f5f,0x00000000, 0x6f6f6f6f,0x6f6f6f6f,0x00000000, 0x7f7f7f7f,0x7f7f7f7f,0x00000000, 0x8f8f8f8f,0x8f8f8f8f,0x00000000, 0x9f9f9f9f,0x9f9f9f9f,0x00000000, 0xafafafaf,0xafafafaf,0x00000000, 0xbfbfbfbf,0xbfbfbfbf,0x00000000, 0xcfcfcfcf,0xcfcfcfcf,0x00000000, 0xdfdfdfdf,0xdfdfdfdf,0x00000000, 0xefefefef,0xefefefef,0x00000000, 0xffffffff,0xffffffff,0x00000000, 0xefefefef,0xffffffff,0x00000000, 0xdfdfdfdf,0xffffffff,0x00000000, 0xcfcfcfcf,0xffffffff,0x00000000, 0xbfbfbfbf,0xffffffff,0x00000000, 0xafafafaf,0xffffffff,0x00000000, 0x9f9f9f9f,0xffffffff,0x00000000, 0x8f8f8f8f,0xffffffff,0x00000000, 0x7f7f7f7f,0xffffffff,0x00000000, 0x6f6f6f6f,0xffffffff,0x00000000, 0x5f5f5f5f,0xffffffff,0x00000000, 0x4f4f4f4f,0xffffffff,0x00000000, 0x3f3f3f3f,0xffffffff,0x00000000, 0x2f2f2f2f,0xffffffff,0x00000000, 0x1f1f1f1f,0xffffffff,0x00000000, 0x0f0f0f0f,0xffffffff,0x00000000, 0x00000000,0xffffffff,0x00000000, 0x00000000,0xefefefef,0x00000000, 0x00000000,0xdfdfdfdf,0x00000000, 0x00000000,0xcfcfcfcf,0x00000000, 0x00000000,0xbfbfbfbf,0x00000000, 0x00000000,0xafafafaf,0x00000000, 0x00000000,0x9f9f9f9f,0x00000000, 0x00000000,0x8f8f8f8f,0x00000000, 0x00000000,0x7f7f7f7f,0x00000000, 0x00000000,0x6f6f6f6f,0x00000000, 0x00000000,0x5f5f5f5f,0x00000000, 0x00000000,0x4f4f4f4f,0x00000000, 0x00000000,0x3f3f3f3f,0x00000000, 0x00000000,0x2f2f2f2f,0x00000000, 0x00000000,0x1f1f1f1f,0x00000000, 0x00000000,0x0f0f0f0f,0x00000000, 0x0f0f0f0f,0x00000000,0x0f0f0f0f, 0x1f1f1f1f,0x00000000,0x1f1f1f1f, 0x2f2f2f2f,0x00000000,0x2f2f2f2f, 0x3f3f3f3f,0x00000000,0x3f3f3f3f, 0x4f4f4f4f,0x00000000,0x4f4f4f4f, 0x5f5f5f5f,0x00000000,0x5f5f5f5f, 0x6f6f6f6f,0x00000000,0x6f6f6f6f, 0x7f7f7f7f,0x00000000,0x7f7f7f7f, 0x8f8f8f8f,0x00000000,0x8f8f8f8f, 0x9f9f9f9f,0x00000000,0x9f9f9f9f, 0xafafafaf,0x00000000,0xafafafaf, 0xbfbfbfbf,0x00000000,0xbfbfbfbf, 0xcfcfcfcf,0x00000000,0xcfcfcfcf, 0xdfdfdfdf,0x00000000,0xdfdfdfdf, 0xefefefef,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xffffffff, 0xffffffff,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xdfdfdfdf, 0xffffffff,0x00000000,0xcfcfcfcf, 0xffffffff,0x00000000,0xbfbfbfbf, 0xffffffff,0x00000000,0xafafafaf, 0xffffffff,0x00000000,0x9f9f9f9f, 0xffffffff,0x00000000,0x8f8f8f8f, 0xffffffff,0x00000000,0x7f7f7f7f, 0xffffffff,0x00000000,0x6f6f6f6f, 0xffffffff,0x00000000,0x5f5f5f5f, 0xffffffff,0x00000000,0x4f4f4f4f, 0xffffffff,0x00000000,0x3f3f3f3f, 0xffffffff,0x00000000,0x2f2f2f2f, 0xffffffff,0x00000000,0x1f1f1f1f, 0xffffffff,0x00000000,0x0f0f0f0f, 0xffffffff,0x00000000,0x00000000, 0xefefefef,0x00000000,0x00000000, 0xdfdfdfdf,0x00000000,0x00000000, 0xcfcfcfcf,0x00000000,0x00000000, 0xbfbfbfbf,0x00000000,0x00000000, 0xafafafaf,0x00000000,0x00000000, 0x9f9f9f9f,0x00000000,0x00000000, 0x8f8f8f8f,0x00000000,0x00000000, 0x7f7f7f7f,0x00000000,0x00000000, 0x6f6f6f6f,0x00000000,0x00000000, 0x5f5f5f5f,0x00000000,0x00000000, 0x4f4f4f4f,0x00000000,0x00000000, 0x3f3f3f3f,0x00000000,0x00000000, 0x2f2f2f2f,0x00000000,0x00000000, 0x1f1f1f1f,0x00000000,0x00000000, 0x0f0f0f0f,0x00000000,0x00000000, 0x00000000,0x0f0f0f0f,0x0f0f0f0f, 0x00000000,0x1f1f1f1f,0x1f1f1f1f, 0x00000000,0x2f2f2f2f,0x2f2f2f2f, 0x00000000,0x3f3f3f3f,0x3f3f3f3f, 0x00000000,0x4f4f4f4f,0x4f4f4f4f, 0x00000000,0x5f5f5f5f,0x5f5f5f5f, 0x00000000,0x6f6f6f6f,0x6f6f6f6f, 0x00000000,0x7f7f7f7f,0x7f7f7f7f, 0x00000000,0x8f8f8f8f,0x8f8f8f8f, 0x00000000,0x9f9f9f9f,0x9f9f9f9f, 0x00000000,0xafafafaf,0xafafafaf, 0x00000000,0xbfbfbfbf,0xbfbfbfbf, 0x00000000,0xcfcfcfcf,0xcfcfcfcf, 0x00000000,0xdfdfdfdf,0xdfdfdfdf, 0x00000000,0xefefefef,0xefefefef, 0x00000000,0xffffffff,0xffffffff, 0x00000000,0xefefefef,0xffffffff, 0x00000000,0xdfdfdfdf,0xffffffff, 0x00000000,0xcfcfcfcf,0xffffffff, 0x00000000,0xbfbfbfbf,0xffffffff, 0x00000000,0xafafafaf,0xffffffff, 0x00000000,0x9f9f9f9f,0xffffffff, 0x00000000,0x8f8f8f8f,0xffffffff, 0x00000000,0x7f7f7f7f,0xffffffff, 0x00000000,0x6f6f6f6f,0xffffffff, 0x00000000,0x5f5f5f5f,0xffffffff, 0x00000000,0x4f4f4f4f,0xffffffff, 0x00000000,0x3f3f3f3f,0xffffffff, 0x00000000,0x2f2f2f2f,0xffffffff, 0x00000000,0x1f1f1f1f,0xffffffff, 0x00000000,0x0f0f0f0f,0xffffffff, 0x00000000,0x00000000,0xffffffff, 0x00000000,0x00000000,0xefefefef, 0x00000000,0x00000000,0xdfdfdfdf, 0x00000000,0x00000000,0xcfcfcfcf, 0x00000000,0x00000000,0xbfbfbfbf, 0x00000000,0x00000000,0xafafafaf, 0x00000000,0x00000000,0x9f9f9f9f, 0x00000000,0x00000000,0x8f8f8f8f, 0x00000000,0x00000000,0x7f7f7f7f, 0x00000000,0x00000000,0x6f6f6f6f, 0x00000000,0x00000000,0x5f5f5f5f, 0x00000000,0x00000000,0x4f4f4f4f, 0x00000000,0x00000000,0x3f3f3f3f, 0x00000000,0x00000000,0x2f2f2f2f, 0x00000000,0x00000000,0x1f1f1f1f, 0x00000000,0x00000000,0x0f0f0f0f, NULL}; CHIP UWORD ZoomPointer[] = {0x0000,0x0000,0x0100,0x0000,0x0100,0x0000,0x0000,0x0100, 0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000, 0xCC66,0x3C78,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100, 0x0000,0x0100,0x0000,0x0100,0x0100,0x0000,0x0100,0x0000, 0x0000,0x0000}; struct NewMenu ProgMenu[] = { NM_TITLE,"Project",0,0,0,0, NM_ITEM,"About...","A",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"System info...","N",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Help...","H",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Load picture...","L",NM_ITEMDISABLED,0,0, NM_ITEM,"Save picture...","S",NM_ITEMDISABLED,0,0, NM_ITEM,"Load palette...","Y",NM_ITEMDISABLED,0,0, NM_ITEM,"Save palette...","E",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Print...","D",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Quit...","Q",NM_ITEMDISABLED,0,0, /***************************************************************************************/ NM_TITLE,"Options",0,0,0,0, NM_ITEM,"Title",0,NM_ITEMDISABLED,0,0, NM_SUB,"Title bar","O",CHECKIT|MENUTOGGLE|CHECKED,0,0, NM_SUB,NM_BARLABEL,0,0,0,0, NM_SUB,"Last time","T",0,0,0, NM_ITEM,"Limits...","C",NM_ITEMDISABLED,0,0, NM_ITEM,"Iterations",0,NM_ITEMDISABLED,0,0, NM_SUB,"256",0,CHECKIT,~(1<<0),0, NM_SUB,"320",0,CHECKIT|CHECKED,~(1<<1),0, NM_SUB,"512",0,CHECKIT,~(1<<2),0, NM_SUB,"1024",0,CHECKIT,~(1<<3),0, NM_SUB,"2048",0,CHECKIT,~(1<<4),0, NM_SUB,"4096",0,CHECKIT,~(1<<5),0, NM_SUB,"8192",0,CHECKIT,~(1<<6),0, NM_SUB,"16384",0,CHECKIT,~(1<<7),0, NM_SUB,"32768",0,CHECKIT,~(1<<8),0, NM_SUB,NM_BARLABEL,0,0,0,0, NM_SUB,"Custom...","I",CHECKIT,~(1<<10),0, NM_ITEM,"Priority",0,0,0,0, NM_SUB,"-5","%",CHECKIT,~(1<<0),0, NM_SUB,"-4","$",CHECKIT,~(1<<1),0, NM_SUB,"-3","£",CHECKIT,~(1<<2),0, NM_SUB,"-2","\"",CHECKIT,~(1<<3),0, NM_SUB,"-1","!",CHECKIT,~(1<<4),0, NM_SUB,NM_BARLABEL,0,0,0,0, NM_SUB," 0","0",CHECKIT,~(1<<6),0, NM_SUB,NM_BARLABEL,0,0,0,0, NM_SUB,"+1","1",CHECKIT,~(1<<8),0, NM_SUB,"+2","2",CHECKIT,~(1<<9),0, NM_SUB,"+3","3",CHECKIT,~(1<<10),0, NM_SUB,"+4","4",CHECKIT,~(1<<11),0, NM_SUB,"+5","5",CHECKIT,~(1<<12),0, NM_ITEM,"Color remap",0,0,0,0, NM_SUB,"Linerar","6",CHECKIT,~(1<<0),0, NM_SUB,"Ln (x)","7",CHECKIT,~(1<<1),0, NM_SUB,"Repeated","8",CHECKIT,~(1<<2),0, NM_SUB,"Sqrt (x)","9",CHECKIT,~(1<<3),0, NM_SUB,"x²-x","&",CHECKIT,~(1<<4),0, NM_SUB,"Sqrt (x³-x²-x)","/",CHECKIT,~(1<<5),0, NM_SUB,"Sinh (Ln (x³))","(",CHECKIT,~(1<<6),0, NM_SUB,"Cosh (Log (x³))",")",CHECKIT,~(1<<7),0, NM_ITEM,"Fractal type",0,0,0,0, NM_SUB,"Julia","J",CHECKIT,~(1<<0),0, NM_SUB,"Mandelbrot","M",CHECKIT,~(1<<1),0, NM_ITEM,"Processor",0,0,0,0, NM_SUB,"68k","-",CHECKIT,~(1<<0),0, NM_SUB,"Ppc","+",CHECKIT,~(1<<1),0, /***************************************************************************************/ NM_TITLE,"Calculate",0,0,0,0, NM_ITEM,"Preview","W",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Recalculate","R",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Undo","U",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Zoom","Z",NM_ITEMDISABLED,0,0, NM_ITEM,"Stop","X",0,0,0, /***************************************************************************************/ NM_TITLE,"Video",0,0,0,0, NM_ITEM,"Cycle",0,NM_ITEMDISABLED,0,0, NM_SUB,"Forward",">",0,0,0, NM_SUB,"Backward","<",0,0,0, NM_SUB,NM_BARLABEL,0,0,0,0, NM_SUB,"Delay...",".",0,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Palette...","P",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Screen mode...","V",NM_ITEMDISABLED,0,0, NM_ITEM,NM_BARLABEL,0,0,0,0, NM_ITEM,"Font settings...","F",NM_ITEMDISABLED,0,0, NM_END,0,0,0,0,0 }; struct Menu *MAINMENU = NULL; struct BitMap *MYBITMAP = NULL; struct Task *THISTASK = NULL; struct TextFont *NEWFONT = NULL; struct ILBMInfo MYILBM = {0}; LONG IlbmProps[] = { ID_ILBM, ID_BMHD, ID_ILBM, ID_CMAP, ID_ILBM, ID_CAMG, ID_ILBM, ID_MAND, ID_ILBM, ID_AUTH, ID_ILBM, ID_Copyright, TAG_DONE }; LONG IlbmCollects[] = { TAG_DONE }; LONG IlbmStops[] = { ID_ILBM, ID_BODY, TAG_DONE }; IMPORT void SAVEDS CalcFractalPPC (struct MandelChunk *,UBYTE *); IMPORT WORD ASMCALL Mandel68K (REG (d0,WORD),REG (fp0,long long double),REG (fp1,long long double)); IMPORT WORD ASMCALL Julia68K (REG (d0,WORD),REG (fp0,long long double),REG (fp1,long long double),REG (fp2,long long double),REG (fp3,long long double)); IMPORT BOOL ModifyPalette (struct Window *,WORD,WORD,ULONG *); IMPORT BOOL ScalePalette (struct Window *,ULONG *,ULONG,ULONG); IMPORT BOOL Fade (struct Window *,ULONG *,ULONG,ULONG,BOOL); IMPORT BOOL Cycle (struct Window *,ULONG,BOOL); IMPORT LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk *,UBYTE *); IMPORT LONG LoadMandPic (struct ILBMInfo *,UBYTE *); IMPORT LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *); IMPORT LONG LoadPalette (struct ILBMInfo *,UBYTE *); IMPORT LONG SavePalette (struct ILBMInfo *,struct Chunk *,UBYTE *); /**************************************************************************************************************/ void wbmain (struct WBStartup *ArgMsg) { LONG ReturnCode; CONST_STRPTR *IconToolTypes; BPTR OldDir = NULL; struct WBArg *Wb_Arg = NULL; struct DiskObject *ActDiskObject = NULL; PowerPCBase = OpenLibrary (POWERPCNAME,14); Wb_Arg = ArgMsg->sm_ArgList; /* Get first WB-Message */ if (ArgMsg->sm_NumArgs) { if (Wb_Arg->wa_Lock) { OldDir = CurrentDir (Wb_Arg->wa_Lock); if (ActDiskObject = GetDiskObject (Wb_Arg->wa_Name)) { IconToolTypes = (CONST_STRPTR *) ActDiskObject->do_ToolTypes; MYILBM.Bmhd.w = ArgInt (IconToolTypes,"SCREENWIDTH",DEF_WIDTH); MYILBM.Bmhd.h = ArgInt (IconToolTypes,"SCREENHEIGHT",DEF_HEIGHT); MYILBM.Bmhd.nPlanes = ArgInt (IconToolTypes,"SCREENDEPTH",MAX_DEPTH); sscanf (ArgString (IconToolTypes,"SCREENMODE",DEF_MONITORSTR),"%lx",&MYILBM.camg); RMIN = strtod (ArgString (IconToolTypes,"REALMIN",INIT_DEF_RMINSTR),NULL); RMAX = strtod (ArgString (IconToolTypes,"REALMAX",INIT_DEF_RMAXSTR),NULL); IMIN = strtod (ArgString (IconToolTypes,"IMAGMIN",INIT_DEF_IMINSTR),NULL); IMAX = strtod (ArgString (IconToolTypes,"IMAGMAX",INIT_DEF_IMAXSTR),NULL); if (ArgInt (IconToolTypes,"USEPPC",FALSE)) MANDChunk.Flags |= PPC_BIT; else MANDChunk.Flags |= MC68K_BIT; if (ArgInt (IconToolTypes,"STARTWITHJULIA",FALSE)) MANDChunk.Flags |= JULIA_BIT; else MANDChunk.Flags |= MANDEL_BIT; switch (ArgInt (IconToolTypes,"COLORSREMAP",FALSE)) { case 0: MANDChunk.Flags |= LINEAR_BIT; break; case 1: MANDChunk.Flags |= LOG_BIT; break; case 2: MANDChunk.Flags |= REPEATED_BIT; break; case 3: MANDChunk.Flags |= SQUARE_BIT; break; case 4: MANDChunk.Flags |= ONE_BIT; break; case 5: MANDChunk.Flags |= TWO_BIT; break; case 6: MANDChunk.Flags |= THREE_BIT; break; case 7: MANDChunk.Flags |= FOUR_BIT; break; default: MANDChunk.Flags |= LINEAR_BIT; break; } JKRE = strtod (ArgString (IconToolTypes,"JULIACONSTREAL",INIT_DEF_JKRESTR),NULL); JKIM = strtod (ArgString (IconToolTypes,"JULIACONSTIMAG",INIT_DEF_JKIMSTR),NULL); strncpy (USERNAME,ArgString (IconToolTypes,"USERNAME",DEF_USERNAMESTR),MAX_FILELEN); MYFONTSTRUCT.ta_Name = strncpy (MYFONT,ArgString (IconToolTypes,"FONTNAME",DEF_FONTNAMESTR),MAX_FILELEN); MYFONTSTRUCT.ta_YSize = ArgInt (IconToolTypes,"FONTSIZE",DEF_FONTSIZE); PRIORITY = ArgInt (IconToolTypes,"STARTPRI",DEF_STARTPRI); FreeDiskObject (ActDiskObject); MYILBM.Bmhd.w = MIN (MAX_WIDTH,MAX (MYILBM.Bmhd.w,DEF_WIDTH)); MYILBM.Bmhd.h = MIN (MAX_HEIGHT,MAX (MYILBM.Bmhd.h,DEF_HEIGHT)); MYILBM.Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MYILBM.Bmhd.nPlanes,MIN_DEPTH)); MYFONTSTRUCT.ta_YSize = MIN (MAX_FONTSIZE,MAX (MYFONTSTRUCT.ta_YSize,MIN_FONTSIZE)); PRIORITY = MIN (5,MAX (PRIORITY,-5)); ReturnCode = MainProg (); } CurrentDir (OldDir); } else goto defaults; } else goto defaults; if (PowerPCBase) CloseLibrary (PowerPCBase); exit (ReturnCode); defaults: MYILBM.camg = DEF_MONITOR; MYILBM.Bmhd.w = DEF_WIDTH; MYILBM.Bmhd.h = DEF_HEIGHT; MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH); MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT); strcpy (USERNAME,DEF_USERNAMESTR); ReturnCode = MainProg (); if (PowerPCBase) CloseLibrary (PowerPCBase); exit (ReturnCode); } LONG main (LONG Argc,CONST_STRPTR *Argv) { LONG ReturnCode; PowerPCBase = OpenLibrary (POWERPCNAME,14); MYILBM.camg = DEF_MONITOR; MYILBM.Bmhd.w = DEF_WIDTH; MYILBM.Bmhd.h = DEF_HEIGHT; MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH); MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT); strcpy (USERNAME,DEF_USERNAMESTR); ReturnCode = MainProg (); if (PowerPCBase) CloseLibrary (PowerPCBase); return ReturnCode; } LONG MainProg (VOID) { CPUINFO = CheckCPU (SysBase->AttnFlags); if (ModeNotAvailable (MYILBM.camg)) MYILBM.camg = ModeFallBack (MYILBM.camg,MYILBM.Bmhd.w,MYILBM.Bmhd.h,MYILBM.Bmhd.nPlanes); if (MYILBM.Bmhd.nPlanes > GetMaxPlanes (MYILBM.camg)) MYILBM.Bmhd.nPlanes = GetMaxPlanes (MYILBM.camg); if (MYILBM.Bmhd.nPlanes < MIN_DEPTH) { Fail (OpenDisplayError,20L); goto End; } PALETTE = (CheckGFX () ? COLORS_AGA : COLORS_ECS); if ((RMIN >= RMAX) || (IMIN >= IMAX)) { DEF_RMIN = INIT_DEF_RMIN; DEF_RMAX = INIT_DEF_RMAX; DEF_IMIN = INIT_DEF_IMIN; DEF_IMAX = INIT_DEF_IMAX; } else { DEF_RMIN = RMIN; DEF_RMAX = RMAX; DEF_IMIN = IMIN; DEF_IMAX = IMAX; } MYILBM.ParseInfo.propchks = IlbmProps; MYILBM.ParseInfo.collectchks = IlbmCollects; MYILBM.ParseInfo.stopchks = IlbmStops; MYILBM.Bmhd.pageWidth = 0; MYILBM.Bmhd.pageHeight = 0; MYILBM.stype = CUSTOMSCREEN | SCREENQUIET; MYILBM.TBState = TMASK & MASK; MYILBM.ucliptype = OSCAN_TEXT; MYILBM.EHB = FALSE; MYILBM.Autoscroll = TRUE; MYILBM.IFFPFlags = NULL; if (MAINMENU = CreateMenus (ProgMenu,TAG_END)) { if (MYILBM.Bmhd.nPlanes < 6) { MAX_ITERATIONS = 255; ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags &= ~CHECKED; ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED; } switch (PRIORITY) { case -5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,0))->Flags |= CHECKED; break; case -4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,1))->Flags |= CHECKED; break; case -3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,2))->Flags |= CHECKED; break; case -2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,3))->Flags |= CHECKED; break; case -1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,4))->Flags |= CHECKED; break; case 0: ItemAddress (MAINMENU,FULLMENUNUM (1,3,6))->Flags |= CHECKED; break; case 1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,8))->Flags |= CHECKED; break; case 2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,9))->Flags |= CHECKED; break; case 3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,10))->Flags |= CHECKED; break; case 4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,11))->Flags |= CHECKED; break; case 5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,12))->Flags |= CHECKED; break; } SetTaskPri (FindTask (NULL),PRIORITY); if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED; else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED; else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,2))->Flags |= CHECKED; else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,3))->Flags |= CHECKED; if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED; else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED; if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620)) { if (MANDChunk.Flags & PPC_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED; else ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED; } else { ItemAddress (MAINMENU,FULLMENUNUM (1,6,NOSUB))->Flags |= NM_ITEMDISABLED; MANDChunk.Flags &= ~PPC_BIT; MANDChunk.Flags |= MC68K_BIT; } if (COLORS = MakeDisplay (&MYILBM)) { COLORS -= RESERVED_PENS; SaveCoords (MYILBM.win,FALSE); MANDChunk.LeftEdge = MYILBM.win->LeftEdge; MANDChunk.TopEdge = MYILBM.win->TopEdge; MANDChunk.Width = MYILBM.win->Width; MANDChunk.Height = MYILBM.win->Height; MANDChunk.RMin = RMIN; MANDChunk.RMax = RMAX; MANDChunk.IMin = IMIN; MANDChunk.IMax = IMAX; MANDChunk.Iterations = MAX_ITERATIONS + 1L; SPECIAL_CHUNK.ch_Data = &MANDChunk; PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER); ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height); PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); SetMenuStart (MYILBM.win); ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME); ModifyIDCMP (MYILBM.win,NULL); ClearMenuStrip (MYILBM.win); About (MYILBM.win); ResetMenuStrip (MYILBM.win,MAINMENU); ModifyIDCMP (MYILBM.win,IDCMP_STANDARD); Execute (ASSIGNCURRENTDIR,NULL,NULL); do { while (HandleEvents (&MYILBM) & NEWDISPLAY_MSG) { if (SMRequest (&MYILBM)) { if (ZMASK & MASK) { DrawBorder (MYILBM.wrp,&MYBORDER,0,0); MASK &= ~ZMASK; } if (MYILBM.win->RPort->BitMap->Depth <= MYILBM.Bmhd.nPlanes) { MYBITMAP = CopyBitMap (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height); } Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK); CloseDisplay (&MYILBM,VINFO); MYILBM.Bmhd.pageWidth = 0; MYILBM.Bmhd.pageHeight = 0; COLORS = MakeDisplay (&MYILBM); if (COLORS) { COLORS -= RESERVED_PENS; PasteBitMap (MYBITMAP,MYILBM.win,(WORD) GetBitMapAttr (MYBITMAP,BMA_WIDTH),(WORD) GetBitMapAttr (MYBITMAP,BMA_HEIGHT)); if (Choice (MYILBM.win,"Rendering requester","Screen propreties are changed.\nImage and colors can be inaccurate.\n\nRecalculate ?")) { SetMenuStop (MYILBM.win); PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER); ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height); PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); SetMenuStart (MYILBM.win); ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME); } } else { Fail (MakeDisplayError,20L); break; } } } if (RETURNVALUE >= 20L) break; } while (! Choice (MYILBM.win,"Exit requester","Are you sure ?")); if (BMASK & MASK) FreeBitMapSafety (MYBITMAP); Execute (ASSIGNREMOVE,NULL,NULL); } else Fail (MakeDisplayError,20L); Fade (MYILBM.win,PALETTE,50L,1L,TOBLACK); CloseDisplay (&MYILBM,VINFO); FreeMenus (MAINMENU); } else Fail (MenuError,20L); End: return (RETURNVALUE); } /***********************************************************************************************************/ void PutPointer (struct Window *Win,UWORD *PointerImage,LONG Width,LONG Height,LONG XOrigin,LONG YOrigin,UBYTE Type) { switch (Type) { case CLEAR_POINTER: SetWindowPointer (Win,TAG_END); break; case BUSY_POINTER: SetWindowPointer (Win,WA_BusyPointer,TRUE,TAG_END); break; case ZOOM_POINTER: SetPointer (Win,PointerImage,Height,Width,XOrigin,YOrigin); } } UBYTE GetMaxPlanes (ULONG ModeID) { DisplayInfoHandle DisplayHandle; struct DimensionInfo DimensionInfo; UBYTE Planes = 0; DisplayHandle = FindDisplayInfo (ModeID); if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,ModeID)) { Planes = DimensionInfo.MaxDepth; } else Fail (DimensionInfoError,20L); return Planes; } ULONG CheckCPU (ULONG CpuFlags) { ULONG CpuMask = NULL,PPCMask = NULL; if (AFF_68060 & CpuFlags) CpuMask |= CPU_060,strcpy (CPU68K_STR,"68060\0"); else if (AFF_68040 & CpuFlags) CpuMask |= CPU_040,strcpy (CPU68K_STR,"68040\0"); else if (AFF_68030 & CpuFlags) CpuMask |= CPU_030,strcpy (CPU68K_STR,"68030\0"); else if (AFF_68020 & CpuFlags) CpuMask |= CPU_020,strcpy (CPU68K_STR,"68020\0"); else if (AFF_68010 & CpuFlags) CpuMask |= CPU_010,strcpy (CPU68K_STR,"68010\0"); else if (! (CpuMask & (CPU_060|CPU_040|CPU_030|CPU_020|CPU_010))) strcpy (CPU68K_STR,"68000\0"); if (AFF_FPU40 & CpuFlags) CpuMask |= FPU_040,strcpy (FPU68K_STR,"Builtin\0"); else if (AFF_68882 & CpuFlags) CpuMask |= FPU_882,strcpy (FPU68K_STR,"68882\0"); else if (AFF_68881 & CpuFlags) CpuMask |= FPU_881,strcpy (FPU68K_STR,"68881\0"); else if (! (CpuMask & (FPU_040|FPU_882|FPU_881))) strcpy (FPU68K_STR,"None|0"); if (PowerPCBase) { PPCMask = GetCPU (); if (CPUF_603 & PPCMask) CpuMask |= CPU_603,strcpy (CPUPPC_STR,"603\0"),strcpy (FPUPPC_STR,"Builtin\0"); else if (CPUF_603E & PPCMask) CpuMask |= CPU_603e,strcpy (CPUPPC_STR,"603e\0"),strcpy (FPUPPC_STR,"Builtin\0"); else if (CPUF_604 & PPCMask) CpuMask |= CPU_604,strcpy (CPUPPC_STR,"604\0"),strcpy (FPUPPC_STR,"Builtin\0"); else if (CPUF_604E & PPCMask) CpuMask |= CPU_604e,strcpy (CPUPPC_STR,"604e\0"),strcpy (FPUPPC_STR,"Builtin\0"); else if (CPUF_620 & PPCMask) CpuMask |= CPU_620,strcpy (CPUPPC_STR,"620\0"),strcpy (FPUPPC_STR,"Builtin\0"); else if (! (CpuMask & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))) strcpy (CPUPPC_STR,"None\0"),strcpy (FPUPPC_STR,"None\0"); } return CpuMask; } LONG CheckGFX (VOID) { DisplayInfoHandle DisplayHandle; struct DisplayInfo DisplayInfo; BOOL AGA = FALSE,RTG = FALSE; ULONG ModeID = (ULONG) INVALID_ID; if (GetMaxPlanes (LORES_KEY) == MAX_DEPTH) AGA = TRUE; while (((ModeID = NextDisplayInfo (ModeID)) != INVALID_ID) && RTG == FALSE) { DisplayHandle = FindDisplayInfo (ModeID); if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID)) { if ((DisplayInfo.PropertyFlags & DIPF_IS_FOREIGN) && (GetMaxPlanes (ModeID) >= MAX_DEPTH)) RTG = TRUE; } } if (RTG && AGA) return 3L; if (RTG) return 2L; if (AGA) return 1L; return NULL; } VOID CloseDisplay (struct ILBMInfo *Ilbm,CPTR *VInfo) { if (PMASK & MASK) { FreeVec32 (GfxPpcMem); MASK &= ~PMASK; } if (WMASK & MASK) { ClearMenuStrip (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,CLEAR_POINTER); CloseWindow (Ilbm->win); Ilbm->win = NULL; Ilbm->wrp = NULL; MASK &= ~WMASK; } if (VMASK & MASK) { FreeVisualInfo (VInfo); MASK &= ~VMASK; } if (MMASK & MASK) { FreeBitMapSafety (TempBM); MASK &= ~MMASK; } if (LMASK & MASK) { FreeVec (PixelLine); MASK &= ~LMASK; } if (SMASK & MASK) { CloseScreen (Ilbm->scr); FreeBitMapSafety (Ilbm->brbitmap); Ilbm->scr = NULL; Ilbm->vp = NULL; Ilbm->srp = NULL; MASK &= ~SMASK; } if (FMASK & MASK) { CloseFont (NEWFONT); MASK &= ~FMASK; } } BOOL AllocTempRast (struct BitMap *FriendBitMap,UWORD Width,UBYTE Planes) { BOOL Success = FALSE; if (TempBM = AllocBitMap ((((Width + 15) >> 4) << 1), 1, Planes, BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES, FriendBitMap)) { InitRastPort (&TempRP); TempRP.Layer = NULL; TempRP.BitMap = TempBM; if (PixelLine = AllocVec ((((Width + 15) >> 4) << 4),MEMF_CLEAR | MEMF_PUBLIC)) Success = TRUE; else FreeBitMapSafety (TempBM); } return Success; } struct Window *OpenDisplay (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID) { struct Screen *Scr; struct Window *Win = NULL; if (Scr = OpenIdScreen (Ilbm,Width,Height,Depth,ModeID)) { Win = OpenWindowTags (NULL, WA_Left,Scr->LeftEdge, WA_Top,Scr->TopEdge, WA_Width,Scr->Width, WA_Height,Scr->Height, WA_ScreenTitle,VERSION "by " AUTHOR " " COPYRIGHT_DATE, WA_CustomScreen,Scr, WA_IDCMP,IDCMP_STANDARD, WA_Flags,WFLG_STANDARD, WA_MouseQueue,1L, WA_BusyPointer,TRUE, TAG_END); if (! Win) { if (Scr) CloseScreen (Scr); return NULL; } Ilbm->scr = Scr; Ilbm->win = Win; Ilbm->vp = &(Scr->ViewPort); Ilbm->srp = &(Scr->RastPort); Ilbm->wrp = Win->RPort; Ilbm->Bmhd.w = Ilbm->win->Width - Ilbm->win->LeftEdge; Ilbm->Bmhd.h = Ilbm->win->Height - Ilbm->win->TopEdge; Ilbm->Bmhd.nPlanes = Ilbm->wrp->BitMap->Depth; } return (Win); } struct Screen *OpenIdScreen (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID) { struct Rectangle Spos,DClip,TxtO,StdO,MaxO,UClip; struct Rectangle *UClipp; struct Screen *Scr; LONG ErrorCode = NULL,TryNew; ULONG BitMapTag,PassedTags; if (! Ilbm) return (NULL); TryNew = ((QueryOverscan (ModeID,&TxtO,OSCAN_TEXT)) && (QueryOverscan (ModeID,&StdO,OSCAN_STANDARD)) && (QueryOverscan (ModeID,&MaxO,OSCAN_MAX))); if (TryNew) { if (Ilbm->Video) Ilbm->ucliptype = OSCAN_VIDEO; if ((Ilbm->ucliptype) && (QueryOverscan (ModeID,&UClip,(LONG) Ilbm->ucliptype))) UClipp = &UClip; else UClipp = NULL; ClipIt (Width,Height,&Spos,&DClip,&TxtO,&StdO,&MaxO,UClipp,Ilbm->IFFPFlags & IFFPF_NOCENTER ? TRUE : FALSE); BitMapTag = ((Ilbm->brbitmap) && (Ilbm->stype & CUSTOMBITMAP)) ? SA_BitMap : TAG_IGNORE; PassedTags = Ilbm->stags ? TAG_MORE : TAG_IGNORE; Scr = OpenScreenTags (NULL, SA_DisplayID, ModeID, SA_Type, Ilbm->stype, SA_Top, Spos.MinY, SA_Left, Spos.MinX, SA_Width, Width, SA_Height, Height, SA_Depth, Depth, SA_DClip, &DClip, SA_AutoScroll, Ilbm->Autoscroll, SA_Colors32, PALETTE, SA_Pens, PENS, SA_Interleaved, TRUE, SA_Font, &MYFONTSTRUCT, SA_Title, VERSION "by " AUTHOR " " COPYRIGHT_DATE, SA_ErrorCode, &ErrorCode, SA_ShowTitle, Ilbm->TBState, BitMapTag, Ilbm->brbitmap, PassedTags, Ilbm->stags, TAG_END); if (! Scr) { switch (ErrorCode) { case OSERR_NOMONITOR : Fail (NoMonitor,20L); break; case OSERR_NOCHIPS : Fail (NoChips,20L); break; case OSERR_NOMEM : Fail (NoMem,20L); break; case OSERR_NOCHIPMEM : Fail (NoChipMem,20L); break; case OSERR_PUBNOTUNIQUE: Fail (PubNotUnique,20L); break; case OSERR_UNKNOWNMODE : Fail (UnknownMode,20L); break; case OSERR_TOODEEP : Fail (ScreenTooDeep,20L); break; case OSERR_ATTACHFAIL : Fail (AttachScreen,20L); break; case OSERR_NOTAVAILABLE: Fail (ModeNotAvailableError,20L); break; default : Fail (UnknownScrError,20L); break; } return NULL; } } else return NULL; return (Scr); } ULONG ModeFallBack (ULONG OldModeID,WORD Width,WORD Height,WORD Depth) { struct Screen *PubScreen; ULONG NewModeID = HIRESLACE_KEY,ModeID; if (PubScreen = LockPubScreen (NULL)) { NewModeID = GetVPModeID (&(PubScreen->ViewPort)); UnlockPubScreen (NULL,PubScreen); } ModeID = BestModeID (BIDTAG_DIPFMustHave,(OldModeID & EXTRAHALFBRITE_KEY ? DIPF_IS_EXTRAHALFBRITE : 0), BIDTAG_NominalWidth,Width, BIDTAG_NominalHeight,Height, BIDTAG_Depth,Depth, /* BIDTAG_SourceID,NewModeID, */ TAG_END); if (ModeID != INVALID_ID) NewModeID = ModeID; return (NewModeID); } VOID ClipIt (WORD wide,WORD high,struct Rectangle *spos,struct Rectangle *dclip,struct Rectangle *txto, struct Rectangle *stdo,struct Rectangle *maxo, struct Rectangle *uclip,BOOL NoCenter) { struct Rectangle *besto; WORD minx, maxx, miny, maxy; WORD txtw, txth, stdw, stdh, bestw, besth; /* get the txt, std and max widths and heights */ txtw = txto->MaxX - txto->MinX + 1; txth = txto->MaxY - txto->MinY + 1; stdw = stdo->MaxX - stdo->MinX + 1; stdh = stdo->MaxY - stdo->MinY + 1; if ((wide <= txtw) && (high <= txth)) { besto = txto; bestw = txtw; besth = txth; } else { besto = stdo; bestw = stdw; besth = stdh; } if (uclip) { *dclip = *uclip; spos->MinX = uclip->MinX; spos->MinY = uclip->MinY; } else { /* CENTER the screen based on best oscan prefs * but confine dclip within max oscan limits * * FIX MinX first */ spos->MinX = minx = besto->MinX - ((wide - bestw) >> 1); maxx = wide + minx - 1; if (maxx > maxo->MaxX) maxx = maxo->MaxX; /* too right */ if (minx < maxo->MinX) { minx = maxo->MinX; /* too left */ /* if we want left edge of screen not clipped */ if (NoCenter) spos->MinX = minx; } /* FIX MinY */ spos->MinY = miny = besto->MinY - ((high - besth) >> 1); /* if lower than top of txto, move up */ spos->MinY = miny = MIN (spos->MinY,txto->MinY); maxy = high + miny - 1; if (maxy > maxo->MaxY) maxy = maxo->MaxY; /* too down */ if (miny < maxo->MinY) { miny = maxo->MinY; /* too up */ /* if we want top of screen not clipped */ if (NoCenter) spos->MinY = miny; } /* SET up dclip */ dclip->MinX = minx; dclip->MinY = miny; dclip->MaxX = maxx; dclip->MaxY = maxy; } } LONG MakeDisplay (struct ILBMInfo *Ilbm) { static ULONG SAVED_COMPONENT = NULL,SAVED_POSITION = NULL; if (Ilbm->IFFPFlags & IFFPF_USERMODE) Ilbm->camg = Ilbm->usermodeid; Ilbm->Bmhd.w = MAX (MIN_WIDTH,Ilbm->Bmhd.w); Ilbm->Bmhd.h = MAX (MIN_HEIGHT,Ilbm->Bmhd.h); if (ModeNotAvailable (Ilbm->camg) || (Ilbm->IFFPFlags & IFFPF_BESTFIT)) Ilbm->camg = ModeFallBack (Ilbm->camg,Ilbm->Bmhd.w,Ilbm->Bmhd.h,Ilbm->Bmhd.nPlanes); Ilbm->Bmhd.nPlanes = MAX (MIN_DEPTH,Ilbm->Bmhd.nPlanes); if (Ilbm->Bmhd.nPlanes > GetMaxPlanes (Ilbm->camg)) Ilbm->Bmhd.nPlanes = GetMaxPlanes (Ilbm->camg); if (NEWFONT = OpenDiskFont (&MYFONTSTRUCT)) MASK |= FMASK; else { strcpy (MYFONTSTRUCT.ta_Name,DEF_FONTNAMESTR); MYFONTSTRUCT.ta_YSize = DEF_FONTSIZE; MYFONTSTRUCT.ta_Style = FS_NORMAL; MYFONTSTRUCT.ta_Flags = FPF_ROMFONT; if (NEWFONT = OpenFont (&MYFONTSTRUCT)) MASK |= FMASK; else { Fail (FontError,20L); return NULL; } } PALETTE [0L] = ((ULONG) (1L << Ilbm->Bmhd.nPlanes) << 16); if (SAVED_POSITION) PALETTE [SAVED_POSITION] = SAVED_COMPONENT; SAVED_POSITION = 3L * (1L << Ilbm->Bmhd.nPlanes) + 1; SAVED_COMPONENT = PALETTE [SAVED_POSITION]; PALETTE [SAVED_POSITION] = NULL; if (! (OpenDisplay (Ilbm,MAX (Ilbm->Bmhd.pageWidth,Ilbm->Bmhd.w),MAX (Ilbm->Bmhd.pageHeight,Ilbm->Bmhd.h),Ilbm->Bmhd.nPlanes,Ilbm->camg))) return NULL; MASK |= SMASK; MASK |= WMASK; if (! (AllocTempRast (Ilbm->wrp->BitMap,Ilbm->Bmhd.w,Ilbm->Bmhd.nPlanes))) { Fail (NoMemForTempRastPort,20L); return (NULL); } MASK |= MMASK; MASK |= LMASK; if (! (VINFO = GetVisualInfo (Ilbm->scr,TAG_END))) { Fail (VisualInfoError,20L); return NULL; } MASK |= VMASK; if (! (LayoutMenus (MAINMENU,VINFO,GTMN_TextAttr,&MYFONTSTRUCT,GTMN_NewLookMenus,TRUE,TAG_END))) { Fail (FontError,20L); return NULL; } if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620)) { if (GfxPpcMem = AllocVec32 (((((Ilbm->Bmhd.w+15) >> 4) << 4) * (Ilbm->Bmhd.h+1)), MEMF_PUBLIC)) MASK |= PMASK; else { ItemAddress (MAINMENU,FULLMENUNUM (1,6,NOSUB))->Flags |= NM_ITEMDISABLED; MANDChunk.Flags |= MC68K_BIT; MANDChunk.Flags &= ~PPC_BIT; } } SetMenuStrip (Ilbm->win,MAINMENU); Ilbm->EHB = FALSE; return (1L << Ilbm->Bmhd.nPlanes); } VOID ShowTime (struct Window *Win,TEXT *String,ULONG Secs) { if (Secs) sprintf (BAR_STRING,"%s %uh %um %us - Average speed: %.1f Pixels per second",String,Secs / 3600L,(Secs / 60L) % 60L,Secs % 60L,(LDouble) ((Win->Width - Win->BorderLeft - Win->BorderRight) * (Win->Height - Win->BorderTop - Win->BorderBottom)) / Secs); else sprintf (BAR_STRING,"%s Less than one second - Average speed: Realtime",String); SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING); } void SaveCoords (struct Window *Win,BOOL ShowMenu) { URMIN = RMIN; URMAX = RMAX; UIMIN = IMIN; UIMAX = IMAX; UJKRE = JKRE; UJKIM = JKIM; UITERATIONS = MAX_ITERATIONS; UFLAGS = MANDChunk.Flags; if (ShowMenu) OnMenu (Win,FULLMENUNUM (2,4,NOSUB)); } void RestoreCoords (struct Window *Win) { RMIN = URMIN; RMAX = URMAX; IMIN = UIMIN; IMAX = UIMAX; JKRE = UJKRE; JKIM = UJKIM; MAX_ITERATIONS = UITERATIONS; MANDChunk.Flags = UFLAGS; CheckMenu (Win); OffMenu (Win,FULLMENUNUM (2,4,NOSUB)); } BOOL NewCoords (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2) { LDouble KReal,KImag; if (((a2 - a1) < 2L) || ((b2 - b1) < 2L)) return FALSE; KReal = fabs (RMAX-RMIN) / ((LDouble) Win->Width); KImag = fabs (IMAX-IMIN) / ((LDouble) Win->Height); SaveCoords (Win,TRUE); RMAX = RMIN + ((LDouble) a2 * KReal); IMIN = IMAX - ((LDouble) b2 * KImag); RMIN += ((LDouble) a1 * KReal); IMAX -= ((LDouble) b1 * KImag); return TRUE; } void AdjustRatio (LDouble *RMin,LDouble *IMax,LDouble *RMax,LDouble *IMin,WORD ScrWidth,WORD ScrHeight,BOOL KeepReal) { LDouble RWidth,IHeight,RCenter,ICenter; IHeight = *IMax - *IMin; RWidth = *RMax - *RMin; if (KeepReal) { ICenter = *IMin + (IHeight / 2.0); IHeight = (RWidth * ScrHeight) / ScrWidth; *IMax = ICenter + (IHeight / 2.0); *IMin = ICenter - (IHeight / 2.0); } else { RCenter = *RMin + (RWidth / 2.0); RWidth = (IHeight * ScrWidth) / ScrHeight; *RMax = RCenter + (RWidth / 2.0); *RMin = RCenter - (RWidth / 2.0); } } void SystemInfo (struct Window *Win) { static struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,"System info requester","Cpu informations\n\nMc68K\nCpu:%s Fpu:%s\n\nPowerPc\nCpu:%s Fpu:%s\n\n\nMemory informations\n\nAvailable\nChip:%ld Fast:%ld\n\nLargest free\nChip:%ld Fast:%ld\n","Ok" }; EasyRequest (Win,&MyReq,NULL,CPU68K_STR,FPU68K_STR,CPUPPC_STR,FPUPPC_STR,AvailMem (MEMF_CHIP),AvailMem (MEMF_FAST),AvailMem (MEMF_CHIP|MEMF_LARGEST),AvailMem (MEMF_FAST|MEMF_LARGEST)); } LONG About (struct Window *Win) { static struct EasyStruct MyReq_1 = { sizeof (struct EasyStruct),0,"Informations requester","%s %s \n\n\n Snail address: \n %s\n %s\n\n\n %s\n\n*******************************\n* This program is GiftWare !! *\n*******************************\n\n","Ok|More..." }; static struct EasyStruct MyReq_2 = { sizeof (struct EasyStruct),0,"Workgroup","Greetings & thanks to:\n\n Edgar Schwan\n Giorgio Signori\n\n\nIf someone hasn't the courage to risk\nfor his ideals, either his ideals are\nworth nothing, or worth nothing is he\n\nAmiga forever.\n\n","Ok" }; LONG More; More = EasyRequest (Win,&MyReq_1,NULL,VERSION,COPYRIGHT_DATE,AUTHOR,ADDRESS,EMAIL); if (! More) EasyRequest (Win,&MyReq_2,NULL); return More; } ULONG Fail (UBYTE *ErrorString,ULONG ErrorLevel) { DisplayBeep (NULL); fputs (ErrorString,stdout); RETURNVALUE = ErrorLevel; return ErrorLevel; } LONG Choice (struct Window *Win,TEXT *Title,TEXT *String) { struct EasyStruct MyReq = { sizeof (struct EasyStruct),NULL,0,0,"Yes|No" }; MyReq.es_Title = Title; MyReq.es_TextFormat = String; return EasyRequest (Win,&MyReq,0); } BOOL ShowCoords (struct Window *Win) { struct Gadget *GadList = NULL,*StringGad_1,*StringGad_2,*StringGad_3,*StringGad_4,*StringGad_5,*StringGad_6; struct Gadget *MyButtonGad,*MyCheckBoxGad,*MyGad; struct Window *GadWin; struct IntuiMessage *Message; BOOL End = FALSE,Accept = FALSE,Reset = FALSE,Ratio = FALSE,KeepReal = TRUE; TEXT String [MAXCHARS]; UWORD MyCode; ULONG MyClass; LDouble Tmp_RMIN = RMIN,Tmp_IMAX = IMAX,Tmp_RMAX = RMAX,Tmp_IMIN = IMIN,Tmp_JKRE,Tmp_JKIM; TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = CHECKBOXGAD.ng_VisualInfo = VINFO; StringGad_1 = CreateContext (&GadList); TEXTGAD.ng_LeftEdge = 118; TEXTGAD.ng_TopEdge = 20; TEXTGAD.ng_Width = 194; TEXTGAD.ng_Height = (MYFONTSTRUCT.ta_YSize * 3L) >> 1; TEXTGAD.ng_GadgetText = "_Left"; TEXTGAD.ng_Flags = PLACETEXT_LEFT; sprintf (String,"%+2.16f",RMIN); StringGad_1 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); TEXTGAD.ng_TopEdge += (14 + TEXTGAD.ng_Height); TEXTGAD.ng_GadgetText = "_Top "; sprintf (String,"%+2.16f",IMAX); StringGad_2 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); TEXTGAD.ng_TopEdge += (14 + TEXTGAD.ng_Height); TEXTGAD.ng_GadgetText = "_Right"; TEXTGAD.ng_Flags = PLACETEXT_RIGHT; sprintf (String,"%+2.16f",RMAX); StringGad_3 = CreateGadget (STRING_KIND,StringGad_2,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); TEXTGAD.ng_TopEdge += (14 + TEXTGAD.ng_Height); TEXTGAD.ng_GadgetText = "_Bottom"; sprintf (String,"%+2.16f",IMIN); StringGad_4 = CreateGadget (STRING_KIND,StringGad_3,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); TEXTGAD.ng_TopEdge += (24 + TEXTGAD.ng_Height); TEXTGAD.ng_GadgetText = "_Julia real"; TEXTGAD.ng_Flags = PLACETEXT_LEFT; sprintf (String,"%+2.16f",JKRE); StringGad_5 = CreateGadget (STRING_KIND,StringGad_4,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); TEXTGAD.ng_TopEdge += (14 + TEXTGAD.ng_Height); TEXTGAD.ng_GadgetText = "J_ulia imag"; sprintf (String,"%+2.16f",JKIM); StringGad_6 = CreateGadget (STRING_KIND,StringGad_5,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END); CHECKBOXGAD.ng_LeftEdge = 14; CHECKBOXGAD.ng_TopEdge = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 24; CHECKBOXGAD.ng_Width = MYFONTSTRUCT.ta_YSize << 1L; CHECKBOXGAD.ng_Height = MYFONTSTRUCT.ta_YSize + 6; CHECKBOXGAD.ng_GadgetText = "_Keep X axis for ratio"; CHECKBOXGAD.ng_Flags = PLACETEXT_RIGHT; CHECKBOXGAD.ng_GadgetID = KEEP; MyCheckBoxGad = CreateGadget (CHECKBOX_KIND,StringGad_6,&CHECKBOXGAD,GTCB_Checked,TRUE,GTCB_Scaled,TRUE,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge = 14; BUTTONGAD.ng_TopEdge = CHECKBOXGAD.ng_TopEdge + CHECKBOXGAD.ng_Height + 30; BUTTONGAD.ng_Width = 90; BUTTONGAD.ng_Height = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L; BUTTONGAD.ng_GadgetText = "_Accept"; BUTTONGAD.ng_GadgetID = ACCEPT; MyButtonGad = CreateGadget (BUTTON_KIND,MyCheckBoxGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge += (14 + BUTTONGAD.ng_Width); BUTTONGAD.ng_GadgetText = "Rat_io"; BUTTONGAD.ng_GadgetID = RATIO; MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge += (14 + BUTTONGAD.ng_Width); BUTTONGAD.ng_GadgetText = "_Default"; BUTTONGAD.ng_GadgetID = RESET; MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge += (14 + BUTTONGAD.ng_Width); BUTTONGAD.ng_GadgetText = "_Cancel"; BUTTONGAD.ng_GadgetID = CANCEL; MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); if (MyButtonGad) { GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25, WA_Top,Win->TopEdge + 35, WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 24, WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35, WA_Title,"Coordinates requester", WA_ScreenTitle,"Insert new range...", WA_CustomScreen,Win->WScreen, WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|STRINGIDCMP|BUTTONIDCMP, WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP, WA_Gadgets,GadList, TAG_END); if (GadWin) { GT_RefreshWindow (GadWin,NULL); do { WaitPort (GadWin->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort)) { MyGad = (struct Gadget *) Message->IAddress; MyClass = Message->Class; MyCode = Message->Code; GT_ReplyIMsg ((struct IntuiMessage *) Message); switch (MyClass) { case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin); GT_EndRefresh (GadWin,TRUE); break; case IDCMP_VANILLAKEY : switch (ToUpper ((ULONG) MyCode)) { case 'L' : ActivateGadget (StringGad_1,GadWin,0); break; case 'T' : ActivateGadget (StringGad_2,GadWin,0); break; case 'R' : ActivateGadget (StringGad_3,GadWin,0); break; case 'B' : ActivateGadget (StringGad_4,GadWin,0); break; case 'J' : ActivateGadget (StringGad_5,GadWin,0); break; case 'U' : ActivateGadget (StringGad_6,GadWin,0); break; case 'A' : Accept = TRUE; break; case 'I' : Ratio = TRUE; break; case 'D' : Reset = TRUE; break; case 'C' : End = TRUE; break; case 'K' : KeepReal = ! KeepReal; GT_SetGadgetAttrs (MyCheckBoxGad,GadWin,NULL,GTCB_Checked,KeepReal,TAG_END); break; case VAN_ESC: End = TRUE; } break; case IDCMP_GADGETUP : switch (MyGad->GadgetID) { case ACCEPT: Accept = TRUE; break; case RATIO: Ratio = TRUE; break; case RESET: Reset = TRUE; break; case KEEP: KeepReal = ! KeepReal; break; case CANCEL: End = TRUE; } break; case IDCMP_CLOSEWINDOW : End = TRUE; } if (Accept) { Tmp_RMIN = strtod (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,NULL); Tmp_IMAX = strtod (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,NULL); Tmp_RMAX = strtod (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,NULL); Tmp_IMIN = strtod (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,NULL); Tmp_JKRE = strtod (((struct StringInfo *) StringGad_5->SpecialInfo)->Buffer,NULL); Tmp_JKIM = strtod (((struct StringInfo *) StringGad_6->SpecialInfo)->Buffer,NULL); if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX)) DisplayBeep (Win->WScreen); else { SaveCoords (Win,FALSE); RMIN = Tmp_RMIN; IMAX = Tmp_IMAX; RMAX = Tmp_RMAX; IMIN = Tmp_IMIN; JKRE = Tmp_JKRE; JKIM = Tmp_JKIM; End = TRUE; } } if (Ratio) { AdjustRatio (&Tmp_RMIN,&Tmp_IMAX,&Tmp_RMAX,&Tmp_IMIN,Win->Width,Win->Height,KeepReal); TEXTGAD.ng_Flags = PLACETEXT_LEFT; sprintf (String,"%+2.16f",Tmp_RMIN); GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",Tmp_IMAX); GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",Tmp_RMAX); TEXTGAD.ng_Flags = PLACETEXT_RIGHT; GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",Tmp_IMIN); GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END); Ratio = FALSE; } if (Reset) { TEXTGAD.ng_Flags = PLACETEXT_LEFT; sprintf (String,"%+2.16f",DEF_RMIN); GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",DEF_IMAX); GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END); TEXTGAD.ng_Flags = PLACETEXT_RIGHT; sprintf (String,"%+2.16f",DEF_RMAX); GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",DEF_IMIN); GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",DEF_JKRE); GT_SetGadgetAttrs (StringGad_5,GadWin,NULL,GTST_String,String,TAG_END); sprintf (String,"%+2.16f",DEF_JKIM); GT_SetGadgetAttrs (StringGad_6,GadWin,NULL,GTST_String,String,TAG_END); Reset = FALSE; } } } while (End == FALSE); CloseWindow (GadWin); } else Fail (WindowGadgetError,15L); } else Fail (GadgetError,15L); FreeGadgets (GadList); return Accept; } ULONG IntegerGad (struct Window *Win,TEXT *TitleWin,TEXT *TitleScr,TEXT *TxtString,ULONG Var) { struct IntuiMessage *Message; struct Gadget *GadList = NULL,*MyIntGad,*MyButtonGad,*MyGad; struct Window *GadWin; BOOL End = FALSE; UWORD MyCode; ULONG MyClass,ReturnValue = Var; TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = VINFO; MyIntGad = CreateContext (&GadList); TEXTGAD.ng_LeftEdge = 170; TEXTGAD.ng_TopEdge = 20; TEXTGAD.ng_Width = 90; TEXTGAD.ng_Height = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L; TEXTGAD.ng_GadgetText = TxtString; TEXTGAD.ng_Flags = PLACETEXT_LEFT; MyIntGad = CreateGadget (INTEGER_KIND,MyIntGad,&TEXTGAD,GTIN_Number,Var,GTIN_MaxChars,6,STRINGA_ReplaceMode,TRUE,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge = 20; BUTTONGAD.ng_TopEdge = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 30; BUTTONGAD.ng_Width = 90; BUTTONGAD.ng_Height = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L; BUTTONGAD.ng_GadgetText = "_Accept"; BUTTONGAD.ng_GadgetID = ACCEPT; MyButtonGad = CreateGadget (BUTTON_KIND,MyIntGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); BUTTONGAD.ng_LeftEdge += (60 + BUTTONGAD.ng_Width); BUTTONGAD.ng_GadgetText = "_Cancel"; BUTTONGAD.ng_GadgetID = CANCEL; MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END); if (MyButtonGad) { GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25, WA_Top,Win->TopEdge + 35, WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 30, WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35, WA_Title,TitleWin, WA_ScreenTitle,TitleScr, WA_CustomScreen,Win->WScreen, WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|INTEGERIDCMP|BUTTONIDCMP, WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP, WA_Gadgets,GadList, TAG_END); if (GadWin) { GT_RefreshWindow (GadWin,NULL); do { WaitPort (GadWin->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort)) { MyGad = (struct Gadget *) Message->IAddress; MyClass = Message->Class; MyCode = Message->Code; GT_ReplyIMsg ((struct IntuiMessage *) Message); switch (MyClass) { case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin); GT_EndRefresh (GadWin,TRUE); break; case IDCMP_VANILLAKEY : switch (ToUpper ((ULONG) MyCode)) { case 'D' : case 'I' : ActivateGadget (MyIntGad,GadWin,0); break; case 'A' : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt; End = TRUE; break; case 'C' : End = TRUE; break; case VAN_ESC: End = TRUE; } break; case IDCMP_GADGETUP : switch (MyGad->GadgetID) { case ACCEPT : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt; End = TRUE; break; case CANCEL : End = TRUE; } break; case IDCMP_CLOSEWINDOW : End = TRUE; } } } while (End == FALSE); CloseWindow (GadWin); } else Fail (WindowError,15L); } else Fail (GadgetError,15L); FreeGadgets (GadList); return ReturnValue; } UBYTE LinearRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((Iterations * MaxColors) / MaxIterations)); } UBYTE LogRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((log (Iterations) * MaxColors) / log (MaxIterations))); } UBYTE RepeatedRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) ceil (MaxColors - fmod (MaxIterations - Iterations,MaxColors) - 1.0)); } UBYTE SquareRootRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((sqrt (Iterations) * MaxColors) / sqrt (MaxIterations))); } UBYTE OneRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor (((Iterations * Iterations - Iterations) * MaxColors) / (MaxIterations * MaxIterations - MaxIterations))); } UBYTE TwoRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((sqrt (pow (Iterations,3.0) - Iterations * Iterations - Iterations) * MaxColors) / sqrt (pow (MaxIterations,3.0) - MaxIterations * MaxIterations - MaxIterations))); } UBYTE ThreeRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((sinh (log (pow (Iterations,3.0))) * MaxColors) / (sinh (log (pow (MaxIterations,3.0)))))); } UBYTE FourRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations) { return ((UBYTE) floor ((cosh (log10 (pow (Iterations,3.0))) * MaxColors) / (cosh (log10 (pow (MaxIterations,3.0)))))); } void MVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x) { REGISTER WORD y; REGISTER UWORD Color; CRE = RMIN + (((long long double) x) * INCREMREAL); CIM = IMAX - (((long long double) b2) * INCREMIMAG); for (y = b2; y >= b1; y--) { Color = Mandel68K (MAX_ITERATIONS,CRE,CIM); if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS; SetAPen (Rp,Color); CIM += INCREMIMAG; WritePixel (Rp,x,y); } } void MHLine (struct RastPort *Rp,const WORD a1,const WORD width,const WORD y) { REGISTER WORD x; REGISTER UBYTE *TmpArray; REGISTER UWORD Color; x = width; CRE = RMIN + (((LDouble) a1) * INCREMREAL); TmpArray = PixelLine; CIM = IMAX - (((LDouble) y) * INCREMIMAG); while (x--) { Color = Mandel68K (MAX_ITERATIONS,CRE,CIM); if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS; CRE += INCREMREAL; *TmpArray++ = Color; } WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP); } void JVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x) { REGISTER WORD y; REGISTER UWORD Color; CRE = RMIN + (((LDouble) x) * INCREMREAL); CIM = IMAX - (((LDouble) b2) * INCREMIMAG); for (y = b2; y >= b1; y--) { Color = Julia68K (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM); if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS; SetAPen (Rp,Color); CIM += INCREMIMAG; WritePixel (Rp,x,y); } } void JHLine (struct RastPort *Rp,const WORD a1,const WORD width,const WORD y) { REGISTER WORD x; REGISTER UBYTE *TmpArray; REGISTER UWORD Color; x = width; CRE = RMIN + (((LDouble) a1) * INCREMREAL); TmpArray = PixelLine; CIM = IMAX - (((LDouble) y) * INCREMIMAG); while (x--) { Color = Julia68K (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM); if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS; CRE += INCREMREAL; *TmpArray++ = Color; } WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP); } BOOL CheckBox (struct RastPort *Rp,const WORD a1,const WORD b1,const WORD a2,const WORD b2) { const LONG Color = ReadPixel (Rp,a1,b1); REGISTER WORD Var; if (Color != ReadPixel (Rp,a2,b2)) return FALSE; if (Color != ReadPixel (Rp,a2,b1)) return FALSE; if (Color != ReadPixel (Rp,a1,b2)) return FALSE; for (Var = (a1 + 1L); Var < a2; Var++) { if (Color != ReadPixel (Rp,Var,b1)) return FALSE; if (Color != ReadPixel (Rp,Var,b2)) return FALSE; } for (Var = (b1 + 1L); Var < b2; Var++) { if (Color != ReadPixel (Rp,a1,Var)) return FALSE; if (Color != ReadPixel (Rp,a2,Var)) return FALSE; } return TRUE; } void BlinkRect (struct Window *Win,const WORD LeftEdge,const WORD TopEdge,const WORD RightEdge,const WORD BottomEdge) { UBYTE Blink = BLINKTIMES; DisplayBeep (Win->WScreen); ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge; ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge; ZOOMLINE [2] = ZOOMLINE [4] = RightEdge; ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge; while (Blink--) { DrawBorder (Win->RPort,&MYBORDER,0,0); Delay (8L); DrawBorder (Win->RPort,&MYBORDER,0,0); Delay (8L); } } BOOL RectangleDraw (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2) { struct IntuiMessage *Message; UWORD MyCode; WORD helpx,helpy; ULONG MyClass; if ((helpx = (a2 - a1)) < MINLIMIT) return FALSE; if ((helpy = (b2 - b1)) < MINLIMIT) return FALSE; if (Win->UserPort->mp_SigBit) { if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort)) { MyClass = Message->Class; MyCode = Message->Code; GT_ReplyIMsg ((struct IntuiMessage *) Message); switch (MyClass) { case IDCMP_MENUPICK : if (MyCode != MENUNULL) { if (ProcessMenu (Win,MyCode) & STOP_MSG) return TRUE; } break; case IDCMP_RAWKEY : if (MyCode == TAB) { BlinkRect (Win,a1,b1,a2,b2); return FALSE; } if (MyCode == RAW_ESC) { DisplayBeep (Win->WScreen); return TRUE; } break; case IDCMP_CLOSEWINDOW : return TRUE; } } } if (CheckBox (Win->RPort,a1,b1,a2,b2)) { SetAPen (Win->RPort,ReadPixel (Win->RPort,a1,b1)); RectFill (Win->RPort,a1+1L,b1+1L,a2-1L,b2-1L); return FALSE; } if ((helpx < (MINLIMIT * 2L)) || (helpy < (MINLIMIT * 2L))) { for (helpx = (a1 + 1L); helpx < a2; helpx++) { (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx); } return FALSE; } if (helpx >= helpy) { helpx = (a1 + a2) >> 1L; (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx); if (RectangleDraw (Win,a1,b1,helpx,b2)) return TRUE; if (RectangleDraw (Win,helpx,b1,a2,b2)) return TRUE; } else { helpy = (b1 + b2) >> 1L; (*H_LINE) (Win->RPort,a1+1L,a2-a1-1,helpy); if (RectangleDraw (Win,a1,b1,a2,helpy)) return TRUE; if (RectangleDraw (Win,a1,helpy,a2,b2)) return TRUE; } return FALSE; } void CalcFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2) { if (MANDChunk.Flags & JULIA_BIT) { H_LINE = JHLine; V_LINE = JVLine; } else if (MANDChunk.Flags & MANDEL_BIT) { H_LINE = MHLine; V_LINE = MVLine; } if (MANDChunk.Flags & LINEAR_BIT) COLORREMAP = LinearRemap; else if (MANDChunk.Flags & LOG_BIT) COLORREMAP = LogRemap; else if (MANDChunk.Flags & REPEATED_BIT) COLORREMAP = RepeatedRemap; else if (MANDChunk.Flags & SQUARE_BIT) COLORREMAP = SquareRootRemap; else if (MANDChunk.Flags & ONE_BIT) COLORREMAP = OneRemap; else if (MANDChunk.Flags & TWO_BIT) COLORREMAP = TwoRemap; else if (MANDChunk.Flags & THREE_BIT) COLORREMAP = ThreeRemap; else if (MANDChunk.Flags & FOUR_BIT) COLORREMAP = FourRemap; INCREMREAL = (fabs (RMAX-RMIN)) / ((LDouble) (a2 - a1 + 1)); INCREMIMAG = (fabs (IMAX-IMIN)) / ((LDouble) (b2 - b1 + 1)); (*H_LINE) (Win->RPort,a1,a2-a1+1,b1); (*V_LINE) (Win->RPort,b1+1,b2-1,a2); (*H_LINE) (Win->RPort,a1,a2-a1+1,b2); (*V_LINE) (Win->RPort,b1+1,b2-1,a1); RectangleDraw (Win,a1,b1,a2,b2); } ULONG DrawFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2) { ULONG StartSec = NULL , EndSec = NULL , Dummy = NULL; CurrentTime (&StartSec,&Dummy); if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE); if (MANDChunk.Flags & PPC_BIT) { MANDChunk.LeftEdge = a1; MANDChunk.TopEdge = b1; MANDChunk.Width = a2-1; MANDChunk.Height = b2-1; MANDChunk.RMin = RMIN; MANDChunk.RMax = RMAX; MANDChunk.IMin = IMIN; MANDChunk.IMax = IMAX; MANDChunk.JKre = JKRE; MANDChunk.JKim = JKIM; MANDChunk.Iterations = (ULONG) (MAX_ITERATIONS + 1L); MANDChunk.Colors = COLORS; MANDChunk.Modulo = a2 - a1 + Win->BorderLeft + Win->BorderRight; CalcFractalPPC (&MANDChunk,GfxPpcMem); WritePixelArray8 (Win->RPort,a1,b1,a2-1,b2-1,GfxPpcMem,&TempRP); } if (MANDChunk.Flags & MC68K_BIT) CalcFractal (Win,a1,b1,a2-1,b2-1); if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE); CurrentTime (&EndSec,&Dummy); DisplayBeep (Win->WScreen); return (EndSec-StartSec); } BOOL Preview (struct Window *Win,LONG Width,LONG Height) { struct Window *PreviewWin; struct IntuiMessage *Message; BOOL Error = FALSE; UWORD MyCode; ULONG MyClass; MYBITMAP = CopyBitMap (Win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1); PreviewWin = OpenWindowTags (0,WA_Left,Win->LeftEdge + 25, WA_Top,Win->TopEdge + 35, WA_Width,Width / 2, WA_Height,Height / 2, WA_Title,"Preview window", WA_ScreenTitle,"¼ Window preview...", WA_CustomScreen,Win->WScreen, WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW, WA_Flags,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO, WA_BusyPointer,TRUE, TAG_END); if (PreviewWin) { PasteBitMap (MYBITMAP,PreviewWin,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1); PutPointer (PreviewWin,0,0,0,0,0,BUSY_POINTER); ELAPSEDTIME = DrawFractal (PreviewWin,0,0,PreviewWin->GZZWidth,PreviewWin->GZZHeight); PutPointer (PreviewWin,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); ShowTime (PreviewWin,"Preview elapsed time:",ELAPSEDTIME); while (1L) { WaitPort (PreviewWin->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (PreviewWin->UserPort)) { MyClass = Message->Class; MyCode = Message->Code; GT_ReplyIMsg ((struct IntuiMessage *) Message); if (MyClass == IDCMP_CLOSEWINDOW) break; if ((MyClass == IDCMP_RAWKEY) && (MyCode == RAW_ESC)) break; } } PutPointer (PreviewWin,0,0,0,0,0,CLEAR_POINTER); CloseWindow (PreviewWin); } else { if (BMASK & MASK) { FreeBitMapSafety (MYBITMAP); MASK &= ~BMASK; } Fail (PreviewWindowError,15L); Error = TRUE; } return Error; } BOOL DrawFrame (struct Window *Win,const WORD Zx,const WORD Zy,const WORD Zw,const WORD Zh) { WORD LeftEdge,TopEdge,RightEdge,BottomEdge; if ((Zx > 2) && (Zy > 2) && (Zx < Win->Width - 2) && (Zy < Win->Height - 2) && ((Zw >= INITIALZOOM) || (Zh >= INITIALZOOM))) { LeftEdge = Zx - Zw; TopEdge = Zy - Zh; RightEdge = Zx + Zw; BottomEdge = Zy + Zh; if ((LeftEdge >= 0) && (TopEdge >= 0) && (RightEdge <= Win->Width) && (BottomEdge <= Win->Height)) { ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge; ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge; ZOOMLINE [2] = ZOOMLINE [4] = RightEdge; ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge; } DrawBorder (Win->RPort,&MYBORDER,0,0); MASK |= ZMASK; } else MASK &= ~ZMASK; return (BOOL) (ZMASK & MASK); } BOOL FileRequest (struct Window *Win,TEXT *String,TEXT *DrawerTxt,BOOL DrawerType,BOOL Save) { struct FileRequester *MyFileReq; static struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,"Overwrite file requester","File already exists...\n\nDo you want overwrite it ?","Yes|No" }; BPTR MyLock; BOOL Success = FALSE; if (MyFileReq = AllocAslRequest (ASL_FileRequest,0)) { MYDIR = (DrawerType ? PALETTESDIR : PICTURESDIR); if (! strlen (MYDIR)) strncpy (MYDIR,DrawerTxt,MAX_DIRLEN); if (AslRequestTags (MyFileReq,ASLFR_Window,Win, ASLFR_InitialLeftEdge,Win->LeftEdge + 25, ASLFR_InitialTopEdge,Win->TopEdge + 35, ASLFR_InitialWidth,300, ASLFR_InitialHeight,((Win->Height) * 7) >> 3, ASLFR_SleepWindow,TRUE, ASLFR_TextAttr,&MYFONTSTRUCT, ASLFR_TitleText,String, ASLFR_InitialDrawer,MYDIR, ASLFR_InitialFile,MYFILE, ASLFR_DoSaveMode,Save, ASLFR_RejectIcons,TRUE, TAG_END)) { strncpy (MYFILE,MyFileReq->rf_File,MAX_FILELEN); strncpy (MYDIR,MyFileReq->rf_Dir,MAX_DIRLEN); strcpy (MYPATH,MYDIR); Success = AddPart (MYPATH,MYFILE,sizeof (MYPATH)); } FreeAslRequest (MyFileReq); if (Save && Success) { if (MyLock = Lock (MYPATH,ACCESS_READ)) { UnLock (MyLock); if (! EasyRequest (Win,&MyReq,0)) Success = FALSE; } } } return Success; } BOOL FontRequest (struct Window *Win) { struct FontRequester *MyFontReq; BOOL Success = FALSE; if (MyFontReq = AllocAslRequest (ASL_FontRequest,0)) { if (AslRequestTags (MyFontReq,ASLFO_Window,Win, ASLFO_InitialLeftEdge,Win->LeftEdge + 25, ASLFO_InitialTopEdge,Win->TopEdge + 35, ASLFO_InitialWidth,300, ASLFO_InitialHeight,((Win->Height) * 7) >> 3, ASLFO_SleepWindow,TRUE, ASLFO_TextAttr,&MYFONTSTRUCT, ASLFO_TitleText,"Font requester", ASLFO_InitialName,MYFONTSTRUCT.ta_Name, ASLFO_InitialSize,MYFONTSTRUCT.ta_YSize, ASLFO_InitialStyle,MYFONTSTRUCT.ta_Style, ASLFO_InitialFlags,MYFONTSTRUCT.ta_Flags, ASLFO_DoFrontPen,TRUE, ASLFO_DoBackPen,TRUE, ASLFO_DoStyle,TRUE, ASLFO_DoDrawMode,TRUE, ASLFO_MinHeight,8, ASLFO_MaxHeight,24, TAG_END)) { strncpy (MYFONTSTRUCT.ta_Name,MyFontReq->fo_Attr.ta_Name,MAX_FILELEN); MYFONTSTRUCT.ta_YSize = MyFontReq->fo_Attr.ta_YSize; MYFONTSTRUCT.ta_Style = MyFontReq->fo_Attr.ta_Style; MYFONTSTRUCT.ta_Flags = MyFontReq->fo_Attr.ta_Flags; Success = TRUE; } FreeAslRequest (MyFontReq); } return Success; } static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *Hook),REG (a2,struct ScreenModeRequester *SMReq),REG (a1,ULONG DisplayID)) { DisplayInfoHandle DisplayHandle; struct DisplayInfo DisplayInfo; struct DimensionInfo DimensionInfo; ULONG Accept = NULL; DisplayHandle = FindDisplayInfo (DisplayID); if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,DisplayID)) { if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,DisplayID)) { Accept = (ULONG) ((DimensionInfo.MaxDepth <= MAX_DEPTH) && (DisplayInfo.PropertyFlags & DIPF_IS_WB)); } } return Accept; } BOOL SMRequest (struct ILBMInfo *Ilbm) { struct ScreenModeRequester *SMReq; struct Window *Win = Ilbm->win; BOOL NewScreen = FALSE; if (SMReq = AllocAslRequest (ASL_ScreenModeRequest,NULL)) { if (AslRequestTags (SMReq,ASLSM_Window,Win, ASLSM_SleepWindow,TRUE, ASLSM_TitleText,"ScreenMode requester", ASLSM_InitialLeftEdge,Win->LeftEdge + 25, ASLSM_InitialTopEdge,Win->TopEdge + 35, ASLSM_InitialWidth,310, ASLSM_InitialHeight,((Win->Height) * 7) >> 3, ASLSM_InitialDisplayID,GetVPModeID (Ilbm->vp), ASLSM_InitialDisplayWidth,Win->Width, ASLSM_InitialDisplayHeight,Win->Height, ASLSM_InitialDisplayDepth,Ilbm->wrp->BitMap->Depth, ASLSM_InitialOverscanType,Ilbm->ucliptype, ASLSM_InitialInfoOpened,TRUE, ASLSM_InitialInfoLeftEdge,Win->LeftEdge + 310 + 15, ASLSM_InitialInfoTopEdge,Win->TopEdge, ASLSM_DoWidth,TRUE, ASLSM_DoHeight,TRUE, ASLSM_DoDepth,TRUE, ASLSM_DoOverscanType,TRUE, ASLSM_MinDepth,MIN_DEPTH, ASLSM_MaxDepth,MAX_DEPTH, ASLSM_PropertyFlags,DIPF_IS_WB, ASLSM_PropertyMask,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM|DIPF_IS_EXTRAHALFBRITE, ASLSM_FilterFunc,&SMFILTERHOOK, ASLSM_MinWidth,MIN_WIDTH, ASLSM_MinHeight,MIN_HEIGHT, TAG_END)) { Ilbm->camg = SMReq->sm_DisplayID; Ilbm->Bmhd.w = SMReq->sm_DisplayWidth; Ilbm->Bmhd.h = SMReq->sm_DisplayHeight; Ilbm->Bmhd.nPlanes = SMReq->sm_DisplayDepth; Ilbm->ucliptype = SMReq->sm_OverscanType; NewScreen = TRUE; } FreeAslRequest (SMReq); } return NewScreen; } VOID SetMenuStart (struct Window *Win) { OnMenu (Win,FULLMENUNUM (0,0,NOSUB)); OnMenu (Win,FULLMENUNUM (0,2,NOSUB)); OnMenu (Win,FULLMENUNUM (0,4,NOSUB)); OnMenu (Win,FULLMENUNUM (0,6,NOSUB)); OnMenu (Win,FULLMENUNUM (0,7,NOSUB)); OnMenu (Win,FULLMENUNUM (0,8,NOSUB)); OnMenu (Win,FULLMENUNUM (0,9,NOSUB)); OnMenu (Win,FULLMENUNUM (0,11,NOSUB)); OnMenu (Win,FULLMENUNUM (0,13,NOSUB)); OnMenu (Win,FULLMENUNUM (1,0,NOSUB)); OnMenu (Win,FULLMENUNUM (1,1,NOSUB)); OnMenu (Win,FULLMENUNUM (1,2,NOSUB)); OnMenu (Win,FULLMENUNUM (1,4,NOSUB)); OnMenu (Win,FULLMENUNUM (1,5,NOSUB)); OnMenu (Win,FULLMENUNUM (1,6,NOSUB)); OnMenu (Win,FULLMENUNUM (2,2,NOSUB)); OffMenu (Win,FULLMENUNUM (2,7,NOSUB)); OnMenu (Win,FULLMENUNUM (3,0,NOSUB)); OnMenu (Win,FULLMENUNUM (3,2,NOSUB)); OnMenu (Win,FULLMENUNUM (3,4,NOSUB)); OnMenu (Win,FULLMENUNUM (3,6,NOSUB)); } VOID SetMenuStop (struct Window *Win) { OffMenu (Win,FULLMENUNUM (0,0,NOSUB)); OffMenu (Win,FULLMENUNUM (0,2,NOSUB)); OffMenu (Win,FULLMENUNUM (0,4,NOSUB)); OffMenu (Win,FULLMENUNUM (0,6,NOSUB)); OffMenu (Win,FULLMENUNUM (0,7,NOSUB)); OffMenu (Win,FULLMENUNUM (0,8,NOSUB)); OffMenu (Win,FULLMENUNUM (0,9,NOSUB)); OffMenu (Win,FULLMENUNUM (0,11,NOSUB)); OffMenu (Win,FULLMENUNUM (0,13,NOSUB)); OffMenu (Win,FULLMENUNUM (1,0,NOSUB)); OffMenu (Win,FULLMENUNUM (1,1,NOSUB)); OffMenu (Win,FULLMENUNUM (1,2,NOSUB)); OffMenu (Win,FULLMENUNUM (1,4,NOSUB)); OffMenu (Win,FULLMENUNUM (1,5,NOSUB)); OffMenu (Win,FULLMENUNUM (1,6,NOSUB)); OffMenu (Win,FULLMENUNUM (2,0,NOSUB)); OffMenu (Win,FULLMENUNUM (2,2,NOSUB)); OffMenu (Win,FULLMENUNUM (2,6,NOSUB)); OnMenu (Win,FULLMENUNUM (2,7,NOSUB)); OffMenu (Win,FULLMENUNUM (3,0,NOSUB)); OffMenu (Win,FULLMENUNUM (3,2,NOSUB)); OffMenu (Win,FULLMENUNUM (3,4,NOSUB)); OffMenu (Win,FULLMENUNUM (3,6,NOSUB)); } ULONG ProcessMenu (struct Window *Win,UWORD Code) { struct MenuItem *Item; ULONG Choice = NULL; while (Code != MENUNULL) { Item = ItemAddress (MAINMENU,(ULONG) Code); switch (MENUNUM (Code)) { case 0: switch (ITEMNUM (Code)) { case 0: Choice |= ABOUT_MSG; break; case 2: Choice |= SYSINFO_MSG; break; case 4: Choice |= SHOWGUIDE_MSG; break; case 6: Choice |= LOADPICTURE_MSG; break; case 7: Choice |= SAVEPICTURE_MSG; break; case 8: Choice |= LOADPALETTE_MSG; break; case 9: Choice |= SAVEPALETTE_MSG; break; case 11: Choice |= DUMP_MSG; break; case 13: Choice |= EXIT_MSG; break; } break; case 1: switch (ITEMNUM (Code)) { case 0: switch (SUBNUM (Code)) { case 0: Choice |= TITLE_MSG; break; case 2: Choice |= TIME_MSG; break; } break; case 1: Choice |= COORDS_MSG; break; case 2: switch (SUBNUM (Code)) { case 0: MAX_ITERATIONS = 255; break; case 1: MAX_ITERATIONS = 319; break; case 2: MAX_ITERATIONS = 511; break; case 3: MAX_ITERATIONS = 1023; break; case 4: MAX_ITERATIONS = 2047; break; case 5: MAX_ITERATIONS = 4095; break; case 6: MAX_ITERATIONS = 8191; break; case 7: MAX_ITERATIONS = 16383; break; case 8: MAX_ITERATIONS = 32767; break; case 10: Choice |= ITER_MSG; break; } break; case 3: switch (SUBNUM (Code)) { case 0: PRIORITY = -5; break; case 1: PRIORITY = -4; break; case 2: PRIORITY = -3; break; case 3: PRIORITY = -2; break; case 4: PRIORITY = -1; break; case 6: PRIORITY = 0; break; case 8: PRIORITY = 1; break; case 9: PRIORITY = 2; break; case 10: PRIORITY = 3; break; case 11: PRIORITY = 4; break; case 12: PRIORITY = 5; break; } Forbid (); THISTASK = FindTask (NULL); Permit (); SetTaskPri (THISTASK,PRIORITY); break; case 4: switch (SUBNUM (Code)) { case 0: if (! (MANDChunk.Flags & LINEAR_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= LINEAR_BIT; MANDChunk.Flags &= ~(SQUARE_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT); } break; case 1: if (! (MANDChunk.Flags & LOG_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= LOG_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT); } break; case 2: if (! (MANDChunk.Flags & REPEATED_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= REPEATED_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|SQUARE_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT); } break; case 3: if (! (MANDChunk.Flags & SQUARE_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= SQUARE_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT); } break; case 4: if (! (MANDChunk.Flags & ONE_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= ONE_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT); } break; case 5: if (! (MANDChunk.Flags & TWO_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= TWO_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|THREE_BIT|FOUR_BIT); } break; case 6: if (! (MANDChunk.Flags & THREE_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= THREE_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|FOUR_BIT); } break; case 7: if (! (MANDChunk.Flags & FOUR_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= FOUR_BIT; MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT); } break; } break; case 5: switch (SUBNUM (Code)) { case 0: if (! (MANDChunk.Flags & JULIA_BIT)) { if (PickJuliaK (Win)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= JULIA_BIT; MANDChunk.Flags &= ~(MANDEL_BIT|NEWTON_BIT|LYAPUNOV_BIT); Choice |= REDRAW_MSG; } } break; case 1: if (! (MANDChunk.Flags & MANDEL_BIT)) { SaveCoords (Win,TRUE); MANDChunk.Flags |= MANDEL_BIT; MANDChunk.Flags &= ~(JULIA_BIT|NEWTON_BIT|LYAPUNOV_BIT); RMIN = DEF_RMIN; RMAX = DEF_RMAX; IMIN = DEF_IMIN; IMAX = DEF_IMAX; Choice |= REDRAW_MSG; } break; } break; case 6: switch (SUBNUM (Code)) { case 0: MANDChunk.Flags |= MC68K_BIT; MANDChunk.Flags &= ~PPC_BIT; break; case 1: MANDChunk.Flags |= PPC_BIT; MANDChunk.Flags &= ~MC68K_BIT; break; } } break; case 2: switch (ITEMNUM (Code)) { case 0: Choice |= PREVIEW_MSG; break; case 2: Choice |= REDRAW_MSG; break; case 4: Choice |= (UNDO_MSG | REDRAW_MSG); break; case 6: Choice |= DRAW_MSG; break; case 7: Choice |= STOP_MSG; break; } break; case 3: switch (ITEMNUM (Code)) { case 0: switch (SUBNUM (Code)) { case 0: Choice |= CYCLERIGHT_MSG; break; case 1: Choice |= CYCLELEFT_MSG; break; case 3: Choice |= DELAY_MSG; break; } break; case 2: Choice |= PALETTE_MSG; break; case 4: Choice |= NEWDISPLAY_MSG; break; case 6: Choice |= FONTREQ_MSG; break; } } Code = Item->NextSelect; } return Choice; } void CheckMenu (struct Window *Win) { UWORD Index; ClearMenuStrip (Win); for (Index = 0; Index <= 7; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,4,Index))->Flags &= ~CHECKED; if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED; else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED; else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,2))->Flags |= CHECKED; else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,3))->Flags |= CHECKED; else if (MANDChunk.Flags & ONE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,4))->Flags |= CHECKED; else if (MANDChunk.Flags & TWO_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,5))->Flags |= CHECKED; else if (MANDChunk.Flags & THREE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,6))->Flags |= CHECKED; else if (MANDChunk.Flags & FOUR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,7))->Flags |= CHECKED; for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,5,Index))->Flags &= ~CHECKED; if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED; else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED; for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,6,Index))->Flags &= ~CHECKED; if ((MANDChunk.Flags & PPC_BIT) && (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED; else if (MANDChunk.Flags & PPC_BIT) { MANDChunk.Flags &= ~PPC_BIT; MANDChunk.Flags |= MC68K_BIT; } if (MANDChunk.Flags & MC68K_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED; for (Index = 0; Index <= 10; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags &= ~CHECKED; switch (MAX_ITERATIONS) { case 255 : ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED; break; case 319: ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags |= CHECKED; break; case 511: ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags |= CHECKED; break; case 1023: ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags |= CHECKED; break; case 2047: ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags |= CHECKED; break; case 4095: ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags |= CHECKED; break; case 8191: ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags |= CHECKED; break; case 16383: ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags |= CHECKED; break; case 32767: ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags |= CHECKED; break; default: ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags |= CHECKED; break; } ResetMenuStrip (Win,MAINMENU); } VOID ProcessMouse (struct Window *Win,WORD CurMouseX,WORD CurMouseY) { static WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0, W = 0, H = 0; struct IntuiMessage *Message; UWORD MyCode; LONG DefaultQueue; ULONG MyClass; ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE); DefaultQueue = SetMouseQueue (Win,10); if (ZMASK & MASK) DrawFrame (Win,MX1,MY1,W,H); MX1 = CurMouseX; MY1 = CurMouseY; W = INITIALZOOM; H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width); DrawFrame (Win,MX1,MY1,W,H); while (1L) { WaitPort (Win->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort)) { MyClass = Message->Class; MyCode = Message->Code; MX2 = Message->MouseX; MY2 = Message->MouseY; GT_ReplyIMsg ((struct IntuiMessage *) Message); if (MyClass == IDCMP_MOUSEMOVE) { DrawFrame (Win,MX1,MY1,W,H); W = abs (MX1 - MX2); H = abs (MY1 - MY2); if (W > H) (W = ScalerDiv ((LONG) H,(ULONG) Win->Width,(ULONG) Win->Height)); else (H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width)); DrawFrame (Win,MX1,MY1,W,H); } else if ((MyClass == IDCMP_MOUSEBUTTONS) && (MyCode != SELECTDOWN)) break; } } SetMouseQueue (Win,(ULONG) DefaultQueue); ModifyIDCMP (Win,IDCMP_STANDARD); if (ZMASK & MASK) { OnMenu (Win,FULLMENUNUM (2,0,NOSUB)); OnMenu (Win,FULLMENUNUM (2,6,NOSUB)); } else { OffMenu (Win,FULLMENUNUM (2,0,NOSUB)); OffMenu (Win,FULLMENUNUM (2,6,NOSUB)); } } BOOL PickJuliaK (struct Window *Win) { struct IntuiMessage *Message; BOOL Selected = FALSE, End = FALSE; WORD MouseX = 0,MouseY = 0; UWORD MyCode = 0; ULONG MyClass = NULL; LDouble RealCoord=0.0,ImagCoord=0.0; ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK); ClearMenuStrip (Win); SetWindowTitles (Win,(TEXT *) ~0,"Left mouse button to choose new Julia constant, right mouse button to cancel"); Delay (TWOSECS); do { WaitPort (Win->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort)) { MyClass = Message->Class; MyCode = Message->Code; MouseX = Message->MouseX; MouseY = Message->MouseY; GT_ReplyIMsg ((struct IntuiMessage *) Message); } switch (MyClass) { case IDCMP_MOUSEMOVE: if (TMASK & MASK) { RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1)); ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1)); sprintf (BAR_STRING,"Julia constant: Real %+2.16f Imag %+2.16fi",RealCoord,ImagCoord); WaitTOF (); SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING); } break; case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) { JKRE = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1)); JKIM = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1)); End = Selected = TRUE; } break; case IDCMP_MENUPICK: End = TRUE; ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags &= ~CHECKED; ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED; break; } } while (End != TRUE); ResetMenuStrip (Win,MAINMENU); ModifyIDCMP (Win,IDCMP_STANDARD); return (Selected); } ULONG HandleEvents (struct ILBMInfo *Ilbm) { struct IntuiMessage *Message; WORD MouseX = 0,MouseY = 0; UWORD MyCode = 0; LONG Error; ULONG MyClass = NULL,MyMenu = NULL; LDouble RealCoord,ImagCoord,ScrRatio,FracRatio; PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); do { WaitPort (Ilbm->win->UserPort); if (Message = (struct IntuiMessage *) GT_GetIMsg (Ilbm->win->UserPort)) { MyClass = Message->Class; MyCode = Message->Code; MouseX = Message->MouseX; MouseY = Message->MouseY; GT_ReplyIMsg ((struct IntuiMessage *) Message); } switch (MyClass) { case IDCMP_MOUSEMOVE: if (TMASK & MASK) { RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Ilbm->win->Width - 1)); ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Ilbm->win->Height - 1)); ScrRatio = (LDouble) Ilbm->win->Width / (LDouble) Ilbm->win->Height; FracRatio = fabs (RMAX-RMIN) / fabs (IMAX-IMIN); sprintf (BAR_STRING,"Real %#+2.16f Imag %#+2.16fi W:H %.3f R:I %.3f",RealCoord,ImagCoord,ScrRatio,FracRatio); WaitTOF (); SetWindowTitles (Ilbm->win,(TEXT *) ~0,BAR_STRING); } break; case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) ProcessMouse (Ilbm->win,MouseX,MouseY); break; case IDCMP_MENUPICK: MyMenu = ProcessMenu (Ilbm->win,MyCode); if (MyMenu & EXIT_MSG) break; if (MyMenu & SHOWGUIDE_MSG) { Execute (SHOWGUIDECOMMAND,NULL,NULL); break; } if (MyMenu & TITLE_MSG) { if (TMASK & MASK) MASK &= ~TMASK; else MASK |= TMASK; Ilbm->TBState = TMASK & MASK; ShowTitle (Ilbm->scr,(LONG) Ilbm->TBState); break; } if (MyMenu & TIME_MSG) { if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,TRUE); ShowTime (Ilbm->win,"Last calculating time:",ELAPSEDTIME); Delay (TWOSECS); if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,FALSE); break; } if (MyMenu & ITER_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); while (1L) { MAX_ITERATIONS = (UWORD) IntegerGad (Ilbm->win,"Iterations requester","Insert new iterations... between 2^5 (32) and 2^15 (32768)","_Iterations",MAX_ITERATIONS + 1L) - 1L; if (MAX_ITERATIONS >= MIN_ITERATIONS && MAX_ITERATIONS <= MAX_ALLOWED_ITERATIONS) break; DisplayBeep (Ilbm->scr); } ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & ABOUT_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); About (Ilbm->win); ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & SYSINFO_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); SystemInfo (Ilbm->win); ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & PALETTE_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); if (! ModifyPalette (Ilbm->win,Ilbm->win->LeftEdge + 25,Ilbm->win->TopEdge + 35,PALETTE)) Fail (PaletteRequesterError,15L); ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & CYCLERIGHT_MSG) { ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK); if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE); ClearMenuStrip (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); Cycle (Ilbm->win,DELAY,SHIFTRIGHT); PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); ResetMenuStrip (Ilbm->win,MAINMENU); if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE); LoadRGB32 (Ilbm->vp,PALETTE); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & CYCLELEFT_MSG) { ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK); if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE); ClearMenuStrip (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); Cycle (Ilbm->win,DELAY,SHIFTLEFT); PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); ResetMenuStrip (Ilbm->win,MAINMENU); if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE); LoadRGB32 (Ilbm->vp,PALETTE); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & DELAY_MSG) { while (1L) { DELAY = IntegerGad (Ilbm->win,"Cycle delay time requester","Insert cycle delay time... between 0 (fastest) and 200 (slowest)","_Delay time",DELAY); if ((DELAY >= 0L) && (DELAY <= 200)) break; DisplayBeep (Ilbm->scr); } break; } if (MyMenu & STOP_MSG) { SetMenuStart (Ilbm->win); PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & LOADPICTURE_MSG) { if (FileRequest (Ilbm->win,"Load iff picture","FLASHMANDEL:Pictures",PICTURES_DRAWER,FALSE)) { PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); if (Ilbm->ParseInfo.iff = AllocIFF ()) { SaveCoords (Ilbm->win,TRUE); if (! (Error = QueryMandPic (Ilbm,&MANDChunk,MYPATH))) { RMIN = MANDChunk.RMin; RMAX = MANDChunk.RMax; IMIN = MANDChunk.IMin; IMAX = MANDChunk.IMax; JKRE = MANDChunk.JKre; JKIM = MANDChunk.JKim; MAX_ITERATIONS = MANDChunk.Iterations - 1L; Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK); CloseDisplay (Ilbm,VINFO); Ilbm->IFFPFlags = IFFPF_BESTFIT; COLORS = MakeDisplay (Ilbm); Ilbm->IFFPFlags = NULL; if (! COLORS) { Fail (MakeDisplayError,20L); MyMenu = EXIT_MSG; break; } MASK &= ~ZMASK; COLORS -= RESERVED_PENS; if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE); if (LoadMandPic (Ilbm,MYPATH)) Fail (LoadMandPicError,5L); if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE); GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L); CheckMenu (Ilbm->win); } else Fail (QueryMandPicError,NULL); FreeIFF (Ilbm->ParseInfo.iff); } } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & SAVEPICTURE_MSG) { if (FileRequest (Ilbm->win,"Save iff picture","FLASHMANDEL:Pictures",PICTURES_DRAWER,TRUE)) { PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); if (Ilbm->ParseInfo.iff = AllocIFF ()) { MANDChunk.LeftEdge = Ilbm->win->LeftEdge; MANDChunk.TopEdge = Ilbm->win->TopEdge; MANDChunk.Width = Ilbm->win->Width; MANDChunk.Height = Ilbm->win->Height; MANDChunk.RMin = RMIN; MANDChunk.RMax = RMAX; MANDChunk.IMin = IMIN; MANDChunk.IMax = IMAX; MANDChunk.JKre = JKRE; MANDChunk.JKim = JKIM; MANDChunk.Iterations = MAX_ITERATIONS + 1L; if (ZMASK & MASK) { DrawBorder (Ilbm->wrp,&MYBORDER,0,0); MASK &= ~ZMASK; } if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE); if (SaveMandPic (Ilbm,&SPECIAL_CHUNK,&USERNAME_CHUNK,MYPATH)) Fail (SaveMandPicError,5L); if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE); FreeIFF (Ilbm->ParseInfo.iff); } } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & LOADPALETTE_MSG) { if (FileRequest (Ilbm->win,"Load palette","FLASHMANDEL:Palettes",PALETTES_DRAWER,FALSE)) { PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); if (Ilbm->ParseInfo.iff = AllocIFF ()) { if (LoadPalette (Ilbm,MYPATH)) Fail (LoadMandPalError,5L); GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L); FreeIFF (Ilbm->ParseInfo.iff); } else Fail (NoMem,5L); } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & SAVEPALETTE_MSG) { if (FileRequest (Ilbm->win,"Save palette","FLASHMANDEL:Palettes",PALETTES_DRAWER,TRUE)) { PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); if (Ilbm->ParseInfo.iff = AllocIFF ()) { if (SavePalette (Ilbm,©RIGHT_CHUNK,MYPATH)) Fail (LoadMandPalError,5L); FreeIFF (Ilbm->ParseInfo.iff); } else Fail (NoMem,5L); } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & FONTREQ_MSG) { if (FontRequest (Ilbm->win)) { if (ZMASK & MASK) { DrawBorder (Ilbm->wrp,&MYBORDER,0,0); MASK &= ~ZMASK; } PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); MYBITMAP = CopyBitMap (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height); Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK); CloseDisplay (Ilbm,VINFO); if (! MakeDisplay (Ilbm)) { Fail (MakeDisplayError,20L); MyMenu = EXIT_MSG; break; } PasteBitMap (MYBITMAP,Ilbm->win,Ilbm->win->Width,Ilbm->win->Height); } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); break; } if (MyMenu & DUMP_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); if (Choice (Ilbm->win,"Print requester","Are you sure ?")) { WinDump (Ilbm->win); } PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); break; } if (MyMenu & PREVIEW_MSG) { if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5])) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); Preview (Ilbm->win,Ilbm->win->Width,Ilbm->win->Height); ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); RestoreCoords (Ilbm->win); } break; } if (MyMenu & COORDS_MSG) { ModifyIDCMP (Ilbm->win,NULL); ClearMenuStrip (Ilbm->win); if (ShowCoords (Ilbm->win)) { if (Choice (Ilbm->win,"Rendering requester","Recalculate ?")) MyMenu |= REDRAW_MSG; } ResetMenuStrip (Ilbm->win,MAINMENU); ModifyIDCMP (Ilbm->win,IDCMP_STANDARD); } if (MyMenu & UNDO_MSG) RestoreCoords (Ilbm->win); if (MyMenu & REDRAW_MSG) { if (ZMASK & MASK) { DrawBorder (Ilbm->wrp,&MYBORDER,0,0); MASK &= ~ZMASK; } SetMenuStop (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height); PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); SetMenuStart (Ilbm->win); ShowTime (Ilbm->win,"Recalculate elapsed time:",ELAPSEDTIME); break; } if (MyMenu & DRAW_MSG) { if (ZMASK & MASK) { DrawBorder (Ilbm->wrp,&MYBORDER,0,0); MASK &= ~ZMASK; } if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5])) { MYBITMAP = CopyBitMap (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1); PasteBitMap (MYBITMAP,Ilbm->win,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1); SetMenuStop (Ilbm->win); PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER); ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height); PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER); SetMenuStart (Ilbm->win); ShowTime (Ilbm->win,"Zoom elapsed time:",ELAPSEDTIME); } break; } break; case IDCMP_RAWKEY: if (MyCode == RAW_ESC) MyMenu = EXIT_MSG; if (MyCode == HELP) Execute (SHOWGUIDECOMMAND,NULL,NULL); break; case IDCMP_CLOSEWINDOW: MyMenu = EXIT_MSG; } } while (! ((MyMenu & EXIT_MSG) || (MyMenu & NEWDISPLAY_MSG))); return MyMenu; } void FreeBitMapSafety (struct BitMap *Bitmap) { WaitBlit (); FreeBitMap (Bitmap); } struct BitMap *CopyBitMap (struct Window *Win,WORD Left,WORD Top,WORD Width,WORD Height) { struct BitMap *NewBM; NewBM = AllocBitMap ((ULONG) Width,(ULONG) Height,(ULONG) Win->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,Win->RPort->BitMap); if (NewBM) { if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0); if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE); BltBitMap (Win->RPort->BitMap,Left,Top,NewBM,0,0,Width,Height,0xC0,0xFF,NULL); if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE); if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0); MASK |= BMASK; } return NewBM; } BOOL PasteBitMap (struct BitMap *SrcBM,struct Window *DstWin,WORD SrcWidth,WORD SrcHeight) { BOOL Success = FALSE; UWORD DstWinWidth,DstWinHeight; struct BitMap *TmpBM; if (SrcBM && (MASK & BMASK)) { DstWinWidth = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZWidth : DstWin->Width); DstWinHeight = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZHeight : DstWin->Height); TmpBM = AllocBitMap ((ULONG) DstWinWidth,(ULONG) DstWinHeight,(ULONG) DstWin->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_MINPLANES | BMF_CLEAR,DstWin->RPort->BitMap); if (TmpBM) { BSA.bsa_SrcWidth = SrcWidth; BSA.bsa_SrcHeight = SrcHeight; BSA.bsa_XSrcFactor = SrcWidth; BSA.bsa_YSrcFactor = SrcHeight; BSA.bsa_XDestFactor = DstWinWidth; BSA.bsa_YDestFactor = DstWinHeight; BSA.bsa_SrcBitMap = SrcBM; BSA.bsa_DestBitMap = TmpBM; BitMapScale (&BSA); BltBitMapRastPort (TmpBM,0,0,DstWin->RPort,0,0,DstWinWidth,DstWinHeight,0xC0); FreeBitMapSafety (TmpBM); Success = TRUE; } FreeBitMapSafety (SrcBM); MASK &= ~BMASK; } return Success; } LONG WinDump (struct Window *Win) { struct IODRPReq *IODrp; struct MsgPort *PrinterPort; struct ViewPort *Vp; LONG Error = PDERR_BADDIMENSION; if (! Win) return Error; if (PrinterPort = CreatePort (0,0)) { if (IODrp = (struct IODRPReq *) CreateExtIO (PrinterPort,sizeof (struct IODRPReq))) { if (! (Error = OpenDevice ("printer.device",0,(struct IORequest *) IODrp,0))) { Vp = ViewPortAddress (Win); IODrp->io_Command = PRD_DUMPRPORT; IODrp->io_RastPort = Win->RPort; IODrp->io_ColorMap = Vp->ColorMap; IODrp->io_Modes = (ULONG) Vp->Modes; IODrp->io_SrcX = Win->LeftEdge; IODrp->io_SrcY = Win->TopEdge; IODrp->io_SrcWidth = Win->Width; IODrp->io_SrcHeight = Win->Height; IODrp->io_DestCols = 0; IODrp->io_Special = SPECIAL_FULLCOLS | SPECIAL_ASPECT; Error = DoIO ((struct IORequest *)IODrp); CloseDevice ((struct IORequest *)IODrp); } DeleteExtIO ((struct IORequest *)IODrp); } DeletePort (PrinterPort); } return Error; }