/*------------ INCLUDE FILES ----------------*/ #include "common.h" /*------------ DEFINES -------------*/ #define NO_OUTPUT_FILE 1L #define NO_ICON_FILE 2L #define NO_INPUT_FILE 3L #define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);} /*--------------- EXTERNAL STRUCTURES -------------*/ extern struct Menu Menu1; extern struct NewWindow NewWindowStructure1; extern struct NewScreen NewScreenStructure; /*--------------- EXTERNAL DATA ------------------*/ extern USHORT Palette[4]; extern BOOL titleon; extern AllPlotData *apd; /*------------------ STRUCTURES ---------------*/ struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct IconBase *IconBase; struct ArpBase *ArpBase; struct Library *ColorBase; struct IFFBase *IFFBase; struct ILBMBase *ILBMBase; struct Screen *scr; struct Window *win; struct RastPort *rastport; struct ViewPort *viewport; struct Screen *setscr; struct Window *setwin; struct RastPort *setrastport; struct ViewPort *setviewport; static struct NewScreen newscr = { 0,0,320,200,5, /* LeftEdge, TopEdge, Width, Height, Depth */ 0,1, /* DetailPen, BlockPen */ NULL, /* ViewModes */ CUSTOMSCREEN, /* Type */ NULL, /* Font */ "3DPlot v2.0 1990 Randy Finch (All Rights Reserved)", /* DefaultTitle */ NULL, /* Gadgets */ NULL /* CustomBitMap */ }; static struct NewWindow newwin = { 0,0,320,200, /* LeftEdge, TopEdge, Width, Height */ 0,1, /* DetailPen, BlockPen */ MENUPICK | GADGETUP | GADGETDOWN | REQCLEAR, /* IDCMPFlags */ BACKDROP | ACTIVATE | SMART_REFRESH | BORDERLESS, /* Flags */ NULL, /* FirstGadget */ NULL, /* CheckMark */ NULL, /* Title */ NULL, /* Screen */ NULL, /* BitMap */ 20,20, /* MinWidth, MinHeight */ 320,200, /* MaxWidth, MaxHeight */ CUSTOMSCREEN /* Type */ }; /*----------------- EXTERNAL FUNCTIONS ----------------*/ extern VOID FreeAllPlotData(AllPlotData *); /*------------------ FUNCTIONS -----------------*/ void finishup(code) LONG code; { if(apd) FreeAllPlotData(apd); if(win) CloseWindow(win); if(scr) CloseScreen(scr); if(setwin) CloseWindow(setwin); if(setscr) CloseScreen(setscr); if(IntuitionBase) CloseLibrary(IntuitionBase); if(GfxBase) CloseLibrary(GfxBase); if(IconBase) CloseLibrary(IconBase); if(ArpBase) CloseLibrary(ArpBase); if(ColorBase) CloseLibrary(ColorBase); if(IFFBase) CloseLibrary(IFFBase); if(ILBMBase) CloseLibrary(ILBMBase); exit(code); } /* finishup */ void openlibraries() { IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",33); if(!IntuitionBase) { puts("Unable to open Intuition Library\n"); finishup(FALSE); } GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",33); if(!GfxBase) { puts("Unable to open Graphics Library\n"); finishup(FALSE); } IconBase = (struct IconBase *) OpenLibrary("icon.library",33); if (!IconBase) { puts("Can't open icon.library\n"); finishup(FALSE); } ArpBase = (struct ArpBase *) OpenLibrary("arp.library",0); if (!ArpBase) { puts("Can't open arp.library\n"); finishup(FALSE); } ColorBase = (struct Library *) OpenLibrary("color.library",0); if (!ColorBase) { puts("Can't open color.library\n"); finishup(FALSE); } IFFBase = (struct IFFBase *) OpenLibrary("iff.library",0); if (!IFFBase) { puts("Can't open iff.library\n"); finishup(FALSE); } ILBMBase = (struct ILBMBase *) OpenLibrary("ilbm.library",0); if (!ILBMBase) { puts("Can't open ilbm.library\n"); finishup(FALSE); } } /* openlibraries */ void opendisplay() { scr = (struct Screen *) OpenScreen(&newscr); if(!scr) { puts("Screen failed\n"); finishup(FALSE); } newwin.Screen = scr; win = (struct Window *) OpenWindow(&newwin); if(!win) { puts("Window failed.\n"); finishup(FALSE); } if(titleon) { ShowTitle(scr, TRUE); } else { ShowTitle(scr, FALSE); } SetMenuStrip(win, &Menu1); viewport = (struct ViewPort *) ViewPortAddress(win); rastport = win->RPort; } /* opendisplay */ LONG loaddisplay(STRPTR fn) /* fn is filename */ { APTR ifffile = NULL; long count; UWORD colortable[128]; struct BitMapHeader *bmhd; /* Close current screen first */ ClearMenuStrip(win); CloseWindow(win); CloseScreen(scr); /* Open new file and get bitmap header */ if(!(ifffile=OldOpenIFF(fn))) return IffError(); if(!(bmhd=GetIFFBMHD(ifffile))) return IffError(); newscr.Width = bmhd->w; newscr.Height = bmhd->h; newscr.Depth = bmhd->nPlanes; newscr.ViewModes = GetViewModes(ifffile); scr = (struct Screen *) OpenScreen(&newscr); if(!scr) { puts("Screen failed\n"); finishup(FALSE); } newwin.Screen = scr; newwin.Width = newscr.Width; newwin.MaxWidth = newscr.Width; newwin.Height = newscr.Height; newwin.MaxHeight = newscr.Height; win = (struct Window *) OpenWindow(&newwin); if(!win) { puts("Window failed.\n"); finishup(FALSE); } count = GetColorTab(ifffile,colortable); if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */ LoadRGB4(&(scr->ViewPort),colortable,count); viewport = (struct ViewPort *) ViewPortAddress(win); rastport = win->RPort; SetMenuStrip(win, &Menu1); ShowTitle(scr, FALSE); /* Turn off for loading pic */ if(!DecodePic(ifffile,rastport->BitMap)) { CloseWindow(win); CloseScreen(scr); return IffError(); } /* Turn on title if necessary */ if(titleon) { ShowTitle(scr, TRUE); } CloseIFF(ifffile); return 0L; } /* loaddisplay */ LONG loadcolors(STRPTR fn) /* fn is filename */ { APTR ifffile = NULL; long count; UWORD colortable[128]; /* Open new file and get colors */ if(!(ifffile=OldOpenIFF(fn))) return IffError(); count = GetColorTab(ifffile,colortable); if(count>32L) count = 32L; /* Some HAM pictures have 64 colors ?! */ LoadRGB4(&(scr->ViewPort),colortable,count); CloseIFF(ifffile); return 0L; } /* loadcolors */ IFFP savecolors(STRPTR filename) { LONG file; IFFP ifferr = IFF_OKAY; GroupContext fileContext, formContext; if (!(file = Open(filename, MODE_NEWFILE))) { printf("Can't open output file\n"); return (NO_OUTPUT_FILE); } Write(file,"x",1); /* 1.1 so Seek to beginning works ? */ #if DEBUG printf("\nSaving...\n"); #endif CkErr( OpenWIFF(szNotYetKnown, file, &fileContext) ); CkErr( StartWGroup(FORM,szNotYetKnown,ID_ILBM,&fileContext,&formContext) ); CkErr( PutCMAP(scr->BitMap.Depth, &formContext, viewport->ColorMap->ColorTable) ); CkErr( EndWGroup(&formContext) ); CkErr( CloseWGroup(&fileContext) ); Close(file); #if DEBUG if (ifferr == IFF_OKAY) { printf("3DPL IFF saved\n"); } else { printf("Error on save\n"); } #endif return(ifferr); } /* savecolors */ void opendisplayset() { setscr = (struct Screen *) OpenScreen(&NewScreenStructure); if(!setscr) { puts("Screen failed\n"); finishup(FALSE); } NewWindowStructure1.Screen = setscr; setwin = (struct Window *) OpenWindow(&NewWindowStructure1); if(!setwin) { puts("Window failed.\n"); finishup(FALSE); } SetMenuStrip(setwin, &Menu1); setviewport = (struct ViewPort *) ViewPortAddress(setwin); setrastport = setwin->RPort; LoadRGB4(setviewport, Palette, 4); } /* opendisplayset */ void ChangeResolution(res) UBYTE res; { BOOL change = FALSE; switch(res) { case SCREENLOWRES: if(newscr.Width != 320) { newscr.Width = 320; newscr.Depth = 5; newscr.ViewModes &= ~HIRES; newwin.Width = 320; newwin.MaxWidth = 320; change = TRUE; } break; case SCREENHIGHRES: if(newscr.Width != 640) { newscr.Width = 640; newscr.Depth = 4; newscr.ViewModes |= HIRES; newwin.Width = 640; newwin.MaxWidth = 640; change = TRUE; } break; case SCREENINTERLACE: if(newscr.Height != 400) { newscr.Height = 400; newscr.ViewModes |= LACE; newwin.Height = 400; newwin.MaxHeight = 400; change = TRUE; } break; case SCREENNONINTERLACE: if(newscr.Height != 200) { newscr.Height = 200; newscr.ViewModes &= ~LACE; newwin.Height = 200; newwin.MaxHeight = 200; change = TRUE; } break; case SCREENNORMAL: case SCREENMEDIUMOVERSCAN: case SCREENSEVEREOVERSCAN: break; default: break; } /* switch */ if (change == TRUE) { ClearMenuStrip(win); CloseWindow(win); CloseScreen(scr); opendisplay(); } /* if */ } /* ChangeResolution */