1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/lib/viewport.c Fri Nov 09 22:50:30 2018 +0100
1.3 @@ -0,0 +1,95 @@
1.4 +/*
1.5 + * Common viewport-related functions.
1.6 + *
1.7 + * Copyright (C) 2018 Paul Boddie <paul@boddie.org.uk>
1.8 + *
1.9 + * This program is free software: you can redistribute it and/or modify
1.10 + * it under the terms of the GNU General Public License as published by
1.11 + * the Free Software Foundation, either version 3 of the License, or
1.12 + * (at your option) any later version.
1.13 + *
1.14 + * This program is distributed in the hope that it will be useful,
1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1.17 + * GNU General Public License for more details.
1.18 + *
1.19 + * You should have received a copy of the GNU General Public License
1.20 + * along with this program. If not, see <http://www.gnu.org/licenses/>.
1.21 + */
1.22 +
1.23 +#include "viewport.h"
1.24 +
1.25 +
1.26 +
1.27 +/* Initialise a viewport with display, origin, scaling and update function
1.28 + details. */
1.29 +
1.30 +void init_viewport(viewport_t *v, display_config_t *cfg,
1.31 + int xorigins[], int yorigins[],
1.32 + int xscale, int yscale,
1.33 + void (*update)())
1.34 +{
1.35 + int frame;
1.36 +
1.37 + v->cfg = cfg;
1.38 +
1.39 + /* Set the storage for the frame origin details. */
1.40 +
1.41 + v->xorigins = xorigins;
1.42 + v->yorigins = yorigins;
1.43 +
1.44 + /* Set the relationship between origin coordinates and display columns and
1.45 + rows. */
1.46 +
1.47 + v->xscale = xscale;
1.48 + v->yscale = yscale;
1.49 +
1.50 + /* Set the post-scroll update function. */
1.51 +
1.52 + v->update = update;
1.53 +
1.54 + /* Set the origin to (0, 0) for every frame. */
1.55 +
1.56 + v->xorigin = 0;
1.57 + v->yorigin = 0;
1.58 +
1.59 + for (frame = 0; frame < cfg->frames; frame++)
1.60 + {
1.61 + v->xorigins[frame] = 0;
1.62 + v->yorigins[frame] = 0;
1.63 + }
1.64 +}
1.65 +
1.66 +/* Update the origin by the given changes in origin coordinates. */
1.67 +
1.68 +void viewport_update_origin(viewport_t *v, int dx, int dy)
1.69 +{
1.70 + int xstep, ystep;
1.71 + int frame = v->cfg->frame;
1.72 +
1.73 + /* Change the origin coordinates. */
1.74 +
1.75 + v->xorigin += dx;
1.76 + v->yorigin += dy;
1.77 +
1.78 + /* Determine the magnitude of the scrolling required from this frame to the
1.79 + current origin. */
1.80 +
1.81 + xstep = v->xorigin - v->xorigins[frame];
1.82 + ystep = v->yorigin - v->yorigins[frame];
1.83 +
1.84 + /* Scroll the frame, converting to columns and rows. */
1.85 +
1.86 + display_scroll(v->cfg, xstep / v->xscale, ystep / v->yscale);
1.87 +
1.88 + /* For horizontal scrolling, plot the exposed column at the left (if
1.89 + scrolling left) or at the right (if scrolling right). */
1.90 +
1.91 + if (v->update)
1.92 + v->update(v, v->xorigin, v->yorigin, xstep, ystep);
1.93 +
1.94 + /* Record the origin for this frame. */
1.95 +
1.96 + v->xorigins[frame] = v->xorigin;
1.97 + v->yorigins[frame] = v->yorigin;
1.98 +}