home *** CD-ROM | disk | FTP | other *** search
- # include <types.h> /* Nearly always required */
- # include <quickdraw.h> /* To access the qd globals */
- # include <toolutils.h> /* CursHandle and iBeamCursor */
- # include <fonts.h> /* Only for InitFonts() trap */
- # include <events.h> /* GetNextEvent(), ... */
- # include <windows.h> /* GetNewWindow(), ... */
- # include <controls.h>
- # include <files.h>
- # include <fcntl.h>
- # include <packages.h>
- # include <dialogs.h> /* InitDialogs() and GetNewDialog() */
- # include <menus.h> /* EnableItem(), DisableItem() */
- # include <desk.h> /* SystemTask(), SystemClick() */
- # include <textedit.h> /* TENew() */
- # include <scrap.h> /* ZeroScrap() */
- # include <StdIO.h>
- # include <Math.h>
- # include <Palette.h>
-
- # include "fview.h"
-
- #include <Resources.h>
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- findbi find the FTEXT data structure associated with another
- data structure of a different type.
-
- */
-
- struct Mwin * findbi (tw)
- struct Mwin *tw;
- {
- struct Mwin *mw;
- extern struct Mwin *Mlist;
-
- mw = Mlist;
- while (mw)
- if (mw->wintype == FBI && mw->dat == tw->dat)
- return (mw);
- else
- mw = mw->next;
-
- return NULL;
- }
-
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- findimage find the FTEXT data structure associated with another
- data structure of a different type.
-
- */
-
- struct Mwin * findimage (tw)
- struct Mwin *tw;
- {
- struct Mwin *mw;
- extern struct Mwin *Mlist;
-
- mw = Mlist;
- while (mw)
- if (mw->wintype == FIMG && mw->dat == tw->dat)
- return (mw);
- else
- mw = mw->next;
-
- return NULL;
- }
-
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- finddata find the FTEXT data structure associated with another
- data structure of a different type.
-
- */
-
- struct Mwin * finddata (tw)
- struct Mwin *tw;
- {
- struct Mwin *mw;
- extern struct Mwin *Mlist;
-
- mw = Mlist;
- while (mw)
- if (mw->wintype == FTEXT && mw->dat == tw->dat)
- return (mw);
- else
- mw = mw->next;
-
- return NULL;
- }
-
- /*
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- interpit create an interpolated image from the dataset.
-
- tw = pointer to the Mwin structure
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
- interpit(tw)
- struct Mwin *tw;
- {
- struct fdatawin *td;
- register int i,change;
- struct Mwin *tempw, *keepw;
- register float *f;
- void ErrorAlert();
-
- if (!tw->dat) return;
- keepw = tw;
- td = tw->dat;
-
- /* is there already an interpolation record. */
-
- if (td->interp) {
-
- /* did the interpolation size change. */
-
- tempw = findbi (tw);
- if (td->xsize != tempw->bw->xsize || td->ysize != tempw->bw->ysize)
- {
- if (td->interp == tw)
- keepw = tw = finddata (tw);
-
- loseinterp (td->interp);
- td = tw->dat;
- }
- else {
- tw = td->interp;
- setwtitle(tw->win,td->dvar); /* could be a new window title */
- interpdraw(tw);
- SetCursor(&qd.arrow);
- return;
- }
- }
-
- if (td->xsize < 50) { /* minimum sizes for window to create */
- td->xsize = 50;
- td->exx = 50/td->xdim;
- }
- if (td->ysize < 50) {
- td->ysize = 50;
- td->exy = 50/td->ydim;
- }
-
- if (td->xsize & 1) /* Odd width window. For interpolated image,
- we don't need odd width windows, who'll notice? */
- td->xsize++;
- /*
- * warning about continuous scales. Must be increasing or decreasing.
- */
- change = 0; /* flag == OK */
- f = td->xvals;
- if (*td->xvals > *(td->xvals + td->xdim -1) ) { /* decreasing */
- for (i=0; i < td->xdim-1; i++,f++)
- if (*f < *(f+1))
- change = 1;
- }
- else { /* increasing */
- for (i=0; i < td->xdim-1; i++,f++)
- if (*f > *(f+1))
- change = 1;
- }
- f = td->yvals;
- if (*td->yvals > *(td->yvals + td->ydim -1) ) { /* decreasing */
- for (i=0; i < td->ydim-1; i++,f++)
- if (*f < *(f+1))
- change = 1;
- }
- else { /* increasing */
- for (i=0; i < td->ydim-1; i++,f++)
- if (*f > *(f+1))
- change = 1;
- }
-
- if (change)
- NoteAlert(1006,nil); /* not OK, warn user */
-
- /*
- * Are we going to have enough memory to do this?
- */
- if (checkmem(td->xsize*td->ysize+2000))
- {ErrorAlert(GetResource('STR ',1001));
- return;
- }
-
- tempw = (struct Mwin *)NewPtr(sizeof(struct Mwin));
- if (!tempw)
- {ErrorAlert(GetResource('STR ',1001));
- return;
- }
-
- tempw->dat = tw->dat; /* point to same dataset */
- tempw->dat->refcount++; /* increase refcount bookkeeping */
- tempw->bw = (struct fbiwin *)NewPtr(sizeof(struct fbiwin));
-
- tw = tempw; /* move to this element of list */
-
- tw->dat->interp = tw; /* back pointer for