# HG changeset patch # User Paul Boddie # Date 1541874013 -3600 # Node ID ed2641a2294d143c80e20878d939fdad6ce16cc7 # Parent 849db491104b644b2cafb1ddd090c48ad3df5967 Simplified viewport initialisation somewhat. diff -r 849db491104b -r ed2641a2294d examples/vga/main.c --- a/examples/vga/main.c Sat Nov 10 19:06:08 2018 +0100 +++ b/examples/vga/main.c Sat Nov 10 19:20:13 2018 +0100 @@ -95,10 +95,6 @@ uint8_t *screen_starts[FRAME_COUNT]; -/* Origin details for the viewport. */ - -int xorigins[FRAME_COUNT], yorigins[FRAME_COUNT]; - /* Bundled image and font data. */ @@ -208,12 +204,11 @@ /* Scrolling viewport. */ - viewport_t v; + Viewport(v, &display_config, SCROLL_XSTEP, SOURCE_YSTEP, plot_screen_edge); - /* Initialise the viewport. */ + /* Reset the viewport to a well-defined state. */ - init_viewport(&v, &display_config, xorigins, yorigins, - SCROLL_XSTEP, SOURCE_YSTEP, plot_screen_edge); + viewport_set_origin(&v, 0, 0); /* Animation loop. */ diff -r 849db491104b -r ed2641a2294d include/viewport.h --- a/include/viewport.h Sat Nov 10 19:06:08 2018 +0100 +++ b/include/viewport.h Sat Nov 10 19:20:13 2018 +0100 @@ -53,12 +53,27 @@ +/* Initialise a viewport. + + Viewport(, display_config_t *cfg, int xscale, int yscale, void (*update)()) +*/ + +#define Viewport(NAME, CFG, XSCALE, YSCALE, UPDATE) \ + int __##NAME##_xorigins[(CFG)->frames]; \ + int __##NAME##_yorigins[(CFG)->frames]; \ + viewport_t NAME = { \ + .cfg=CFG, \ + .xorigins=__##NAME##_xorigins, \ + .yorigins=__##NAME##_yorigins, \ + .xorigin=0, \ + .yorigin=0, \ + .xscale=XSCALE, \ + .yscale=YSCALE, \ + .update=UPDATE}; + /* Viewport operations. */ -void init_viewport(viewport_t *v, display_config_t *cfg, - int xorigins[], int yorigins[], - int xscale, int yscale, - void (*update)()); +void viewport_set_origin(viewport_t *v, int xorigin, int yorigin); void viewport_update_origin(viewport_t *v, int dx, int dy); diff -r 849db491104b -r ed2641a2294d lib/viewport.c --- a/lib/viewport.c Sat Nov 10 19:06:08 2018 +0100 +++ b/lib/viewport.c Sat Nov 10 19:20:13 2018 +0100 @@ -21,42 +21,21 @@ -/* Initialise a viewport with display, origin, scaling and update function - details. */ +/* Initialise the origin for a viewport. */ -void init_viewport(viewport_t *v, display_config_t *cfg, - int xorigins[], int yorigins[], - int xscale, int yscale, - void (*update)()) +void viewport_set_origin(viewport_t *v, int xorigin, int yorigin) { int frame; - v->cfg = cfg; - - /* Set the storage for the frame origin details. */ + /* Set the origin for every frame. */ - v->xorigins = xorigins; - v->yorigins = yorigins; - - /* Set the relationship between origin coordinates and display columns and - rows. */ - - v->xscale = xscale; - v->yscale = yscale; + v->xorigin = xorigin; + v->yorigin = yorigin; - /* Set the post-scroll update function. */ - - v->update = update; - - /* Set the origin to (0, 0) for every frame. */ - - v->xorigin = 0; - v->yorigin = 0; - - for (frame = 0; frame < cfg->frames; frame++) + for (frame = 0; frame < v->cfg->frames; frame++) { - v->xorigins[frame] = 0; - v->yorigins[frame] = 0; + v->xorigins[frame] = xorigin; + v->yorigins[frame] = yorigin; } }