1.1 --- a/examples/vga/main.c Sat Nov 10 19:06:08 2018 +0100
1.2 +++ b/examples/vga/main.c Sat Nov 10 19:20:13 2018 +0100
1.3 @@ -95,10 +95,6 @@
1.4
1.5 uint8_t *screen_starts[FRAME_COUNT];
1.6
1.7 -/* Origin details for the viewport. */
1.8 -
1.9 -int xorigins[FRAME_COUNT], yorigins[FRAME_COUNT];
1.10 -
1.11
1.12
1.13 /* Bundled image and font data. */
1.14 @@ -208,12 +204,11 @@
1.15
1.16 /* Scrolling viewport. */
1.17
1.18 - viewport_t v;
1.19 + Viewport(v, &display_config, SCROLL_XSTEP, SOURCE_YSTEP, plot_screen_edge);
1.20
1.21 - /* Initialise the viewport. */
1.22 + /* Reset the viewport to a well-defined state. */
1.23
1.24 - init_viewport(&v, &display_config, xorigins, yorigins,
1.25 - SCROLL_XSTEP, SOURCE_YSTEP, plot_screen_edge);
1.26 + viewport_set_origin(&v, 0, 0);
1.27
1.28 /* Animation loop. */
1.29
2.1 --- a/include/viewport.h Sat Nov 10 19:06:08 2018 +0100
2.2 +++ b/include/viewport.h Sat Nov 10 19:20:13 2018 +0100
2.3 @@ -53,12 +53,27 @@
2.4
2.5
2.6
2.7 +/* Initialise a viewport.
2.8 +
2.9 + Viewport(<name>, display_config_t *cfg, int xscale, int yscale, void (*update)())
2.10 +*/
2.11 +
2.12 +#define Viewport(NAME, CFG, XSCALE, YSCALE, UPDATE) \
2.13 + int __##NAME##_xorigins[(CFG)->frames]; \
2.14 + int __##NAME##_yorigins[(CFG)->frames]; \
2.15 + viewport_t NAME = { \
2.16 + .cfg=CFG, \
2.17 + .xorigins=__##NAME##_xorigins, \
2.18 + .yorigins=__##NAME##_yorigins, \
2.19 + .xorigin=0, \
2.20 + .yorigin=0, \
2.21 + .xscale=XSCALE, \
2.22 + .yscale=YSCALE, \
2.23 + .update=UPDATE};
2.24 +
2.25 /* Viewport operations. */
2.26
2.27 -void init_viewport(viewport_t *v, display_config_t *cfg,
2.28 - int xorigins[], int yorigins[],
2.29 - int xscale, int yscale,
2.30 - void (*update)());
2.31 +void viewport_set_origin(viewport_t *v, int xorigin, int yorigin);
2.32
2.33 void viewport_update_origin(viewport_t *v, int dx, int dy);
2.34
3.1 --- a/lib/viewport.c Sat Nov 10 19:06:08 2018 +0100
3.2 +++ b/lib/viewport.c Sat Nov 10 19:20:13 2018 +0100
3.3 @@ -21,42 +21,21 @@
3.4
3.5
3.6
3.7 -/* Initialise a viewport with display, origin, scaling and update function
3.8 - details. */
3.9 +/* Initialise the origin for a viewport. */
3.10
3.11 -void init_viewport(viewport_t *v, display_config_t *cfg,
3.12 - int xorigins[], int yorigins[],
3.13 - int xscale, int yscale,
3.14 - void (*update)())
3.15 +void viewport_set_origin(viewport_t *v, int xorigin, int yorigin)
3.16 {
3.17 int frame;
3.18
3.19 - v->cfg = cfg;
3.20 -
3.21 - /* Set the storage for the frame origin details. */
3.22 + /* Set the origin for every frame. */
3.23
3.24 - v->xorigins = xorigins;
3.25 - v->yorigins = yorigins;
3.26 -
3.27 - /* Set the relationship between origin coordinates and display columns and
3.28 - rows. */
3.29 -
3.30 - v->xscale = xscale;
3.31 - v->yscale = yscale;
3.32 + v->xorigin = xorigin;
3.33 + v->yorigin = yorigin;
3.34
3.35 - /* Set the post-scroll update function. */
3.36 -
3.37 - v->update = update;
3.38 -
3.39 - /* Set the origin to (0, 0) for every frame. */
3.40 -
3.41 - v->xorigin = 0;
3.42 - v->yorigin = 0;
3.43 -
3.44 - for (frame = 0; frame < cfg->frames; frame++)
3.45 + for (frame = 0; frame < v->cfg->frames; frame++)
3.46 {
3.47 - v->xorigins[frame] = 0;
3.48 - v->yorigins[frame] = 0;
3.49 + v->xorigins[frame] = xorigin;
3.50 + v->yorigins[frame] = yorigin;
3.51 }
3.52 }
3.53