1.1 --- a/examples/vga/main.c Tue Nov 13 12:57:52 2018 +0100
1.2 +++ b/examples/vga/main.c Tue Nov 13 14:35:22 2018 +0100
1.3 @@ -94,7 +94,7 @@
1.4 extern image_t screendata;
1.5 extern image_t sprite;
1.6
1.7 -static SpriteOverwriting(scr, &screendata, &display_config, SOURCE_YSTEP);
1.8 +static SpriteOverwriting(scr, &screendata, &display_config, FRAME_COUNT, SOURCE_YSTEP);
1.9
1.10 extern uint8_t fontchars[];
1.11 extern font_range_t fontbase;
1.12 @@ -118,7 +118,7 @@
1.13 {
1.14 /* Stores of background details, replotted when moving the sprite. */
1.15
1.16 - Sprite(s, &sprite, &display_config, SOURCE_YSTEP);
1.17 + Sprite(s, &sprite, &display_config, FRAME_COUNT, SOURCE_YSTEP);
1.18
1.19 /* Sprite position. */
1.20
2.1 --- a/include/image.h Tue Nov 13 12:57:52 2018 +0100
2.2 +++ b/include/image.h Tue Nov 13 14:35:22 2018 +0100
2.3 @@ -61,10 +61,6 @@
2.4
2.5 int stored;
2.6
2.7 - /* Stored region positions. */
2.8 -
2.9 - position_t *pos;
2.10 -
2.11 } stored_regions_t;
2.12
2.13
2.14 @@ -81,6 +77,10 @@
2.15
2.16 stored_regions_t *regions;
2.17
2.18 + /* Sprite frame positions. */
2.19 +
2.20 + position_t *pos;
2.21 +
2.22 /* The vertical scaling factor translating display rows to image
2.23 coordinates. */
2.24
2.25 @@ -101,16 +101,14 @@
2.26
2.27 #define Stored_Regions(NAME, FRAMES, SIZE) \
2.28 uint8_t __##NAME##_image[(FRAMES) * (SIZE)]; \
2.29 - position_t __##NAME##_pos[FRAMES]; \
2.30 stored_regions_t NAME = { \
2.31 .image=__##NAME##_image, \
2.32 .size=SIZE, \
2.33 - .stored=0, \
2.34 - .pos=__##NAME##_pos};
2.35 + .stored=0};
2.36
2.37 /* Access functions. */
2.38
2.39 -position_t *image_get_stored_position(stored_regions_t *r, int frame);
2.40 +position_t *image_get_stored_position(sprite_t *s, int frame);
2.41
2.42 uint8_t *image_get_stored_region(stored_regions_t *r, int frame);
2.43
2.44 @@ -119,30 +117,34 @@
2.45 /* Initialise a sprite object using an existing image without the capability of
2.46 storing regions of the screen.
2.47
2.48 - SpriteOverwriting(<name>, image_t *image, display_config_t *cfg, int yscale)
2.49 + SpriteOverwriting(<name>, image_t *image, display_config_t *cfg, int frames, int yscale)
2.50 */
2.51
2.52 -#define SpriteOverwriting(NAME, IMAGE, CFG, YSCALE) \
2.53 +#define SpriteOverwriting(NAME, IMAGE, CFG, FRAMES, YSCALE) \
2.54 + position_t __##NAME##_pos[FRAMES]; \
2.55 sprite_t NAME = { \
2.56 .image=IMAGE, \
2.57 .regions=0, \
2.58 .yscale=YSCALE, \
2.59 - .cfg=CFG};
2.60 + .cfg=CFG, \
2.61 + .pos=__##NAME##_pos};
2.62
2.63 /* Initialise a sprite object using an existing image, creating stored regions
2.64 for the animation of the sprite.
2.65
2.66 - Sprite(<name>, image_t *image, display_config_t *cfg, int yscale)
2.67 + Sprite(<name>, image_t *image, display_config_t *cfg, int frames, int yscale)
2.68 */
2.69
2.70 -#define Sprite(NAME, IMAGE, CFG, YSCALE) \
2.71 - Stored_Regions(__##NAME##_regions, (CFG)->frames, \
2.72 +#define Sprite(NAME, IMAGE, CFG, FRAMES, YSCALE) \
2.73 + Stored_Regions(__##NAME##_regions, FRAMES, \
2.74 (IMAGE)->width * (IMAGE)->height * (YSCALE)); \
2.75 + position_t __##NAME##_pos[FRAMES]; \
2.76 sprite_t NAME = { \
2.77 .image=IMAGE, \
2.78 .regions=&(__##NAME##_regions), \
2.79 .yscale=YSCALE, \
2.80 - .cfg=CFG};
2.81 + .cfg=CFG, \
2.82 + .pos=__##NAME##_pos};
2.83
2.84 /* Sprite plotting operations. */
2.85
3.1 --- a/lib/image.c Tue Nov 13 12:57:52 2018 +0100
3.2 +++ b/lib/image.c Tue Nov 13 14:35:22 2018 +0100
3.3 @@ -25,9 +25,9 @@
3.4
3.5 /* Obtain the position for the stored region from the given frame. */
3.6
3.7 -position_t *image_get_stored_position(stored_regions_t *r, int frame)
3.8 +position_t *image_get_stored_position(sprite_t *s, int frame)
3.9 {
3.10 - return &r->pos[frame];
3.11 + return &s->pos[frame];
3.12 }
3.13
3.14 /* Obtain the image data for the stored region from the given frame. */
3.15 @@ -49,7 +49,7 @@
3.16 if (s->regions)
3.17 {
3.18 frame = s->cfg->frame;
3.19 - p = image_get_stored_position(s->regions, frame);
3.20 + p = image_get_stored_position(s, frame);
3.21
3.22 /* Copy to the stored region. */
3.23
3.24 @@ -88,7 +88,7 @@
3.25 return;
3.26
3.27 frame = s->cfg->frame;
3.28 - p = image_get_stored_position(s->regions, frame);
3.29 + p = image_get_stored_position(s, frame);
3.30
3.31 /* Only unplot the sprite if a region was stored for the frame. */
3.32