View Raw SPL
/* pdc magnify command */
static maxstate = 10;
static xl, xr, yb, yt, curmax;
static win = -1;
static state = -1;
static winsave = 1;
static ymin, ymax, xmin, xmax;
/* magnify function with callback */
_winmagnify()
{
local x = inf, save;
if (_winmagnify_changed())
{
/* data has changed, reset and save */
_winmagnify_reset();
_winmagnify_save();
}
/* magnify */
x = magnify(0, -1, -1, -1, "_winmagnify_onrclick");
/* inf indicates cancel */
if (winsave && not(isinf(x)))
{
_winmagnify_save();
}
winsave = 1;
}
/* no saving - for callback recursion from magnify.men */
_winmagnify_nosave()
{
winsave = 0;
}
/* save or initialize state */
_winmagnify_save()
{
if (state < 0)
{
/* initialize */
xl = xr = yb = yt = zeros(maxstate, 1);
win = w0.wnum;
ymin = fastmin(w0);
ymax = fastmax(w0);
(xmin, xmax) = xminmax(w0);
state = 0;
curmax = 0;
}
if (state < maxstate)
{
state++;
}
/* save coords */
xl[state] = getxl(w0);
xr[state] = getxr(w0);
yb[state] = getyb(w0);
yt[state] = getyt(w0);
curmax = state;
}
/* undo coords */
_winmagnify_undo()
{
if (not(_winmagnify_changed()))
{
state--;
if (state > 0)
{
setxy(w0, xl[state], xr[state], yb[state], yt[state]);
plotmode(w0, 1);
}
else
{
state = 1;
}
}
}
/* redo coords */
_winmagnify_redo()
{
if (not(_winmagnify_changed()))
{
if (state < curmax)
{
state++;
setxy(w0, xl[state], xr[state], yb[state], yt[state]);
plotmode(w0, 1);
}
}
}
/* reset state */
_winmagnify_reset()
{
win = -1;
state = -1;
curmax = -1;
winsave = 1;
}
/* check data range to indicate data has changed */
_winmagnify_changed()
{
local minx, maxx, changed = 1;
if (win == w0.wnum)
{
if (fastmax(w0) == ymax && fastmin(w0) == ymin)
{
(minx, maxx) = xminmax(w0);
changed = not(minx == xmin && maxx == xmax);
}
}
return(changed);
}