# HG changeset patch # User Paul Boddie # Date 1542116122 -3600 # Node ID f98c32b8cbb73e00042abc55fdcd629948207a1a # Parent f124b4ddd0aede9fd14829ec879d461d5fa44c80 Moved sprite positions out of the stored regions structure. diff -r f124b4ddd0ae -r f98c32b8cbb7 examples/vga/main.c --- a/examples/vga/main.c Tue Nov 13 12:57:52 2018 +0100 +++ b/examples/vga/main.c Tue Nov 13 14:35:22 2018 +0100 @@ -94,7 +94,7 @@ extern image_t screendata; extern image_t sprite; -static SpriteOverwriting(scr, &screendata, &display_config, SOURCE_YSTEP); +static SpriteOverwriting(scr, &screendata, &display_config, FRAME_COUNT, SOURCE_YSTEP); extern uint8_t fontchars[]; extern font_range_t fontbase; @@ -118,7 +118,7 @@ { /* Stores of background details, replotted when moving the sprite. */ - Sprite(s, &sprite, &display_config, SOURCE_YSTEP); + Sprite(s, &sprite, &display_config, FRAME_COUNT, SOURCE_YSTEP); /* Sprite position. */ diff -r f124b4ddd0ae -r f98c32b8cbb7 include/image.h --- a/include/image.h Tue Nov 13 12:57:52 2018 +0100 +++ b/include/image.h Tue Nov 13 14:35:22 2018 +0100 @@ -61,10 +61,6 @@ int stored; - /* Stored region positions. */ - - position_t *pos; - } stored_regions_t; @@ -81,6 +77,10 @@ stored_regions_t *regions; + /* Sprite frame positions. */ + + position_t *pos; + /* The vertical scaling factor translating display rows to image coordinates. */ @@ -101,16 +101,14 @@ #define Stored_Regions(NAME, FRAMES, SIZE) \ uint8_t __##NAME##_image[(FRAMES) * (SIZE)]; \ - position_t __##NAME##_pos[FRAMES]; \ stored_regions_t NAME = { \ .image=__##NAME##_image, \ .size=SIZE, \ - .stored=0, \ - .pos=__##NAME##_pos}; + .stored=0}; /* Access functions. */ -position_t *image_get_stored_position(stored_regions_t *r, int frame); +position_t *image_get_stored_position(sprite_t *s, int frame); uint8_t *image_get_stored_region(stored_regions_t *r, int frame); @@ -119,30 +117,34 @@ /* Initialise a sprite object using an existing image without the capability of storing regions of the screen. - SpriteOverwriting(, image_t *image, display_config_t *cfg, int yscale) + SpriteOverwriting(, image_t *image, display_config_t *cfg, int frames, int yscale) */ -#define SpriteOverwriting(NAME, IMAGE, CFG, YSCALE) \ +#define SpriteOverwriting(NAME, IMAGE, CFG, FRAMES, YSCALE) \ + position_t __##NAME##_pos[FRAMES]; \ sprite_t NAME = { \ .image=IMAGE, \ .regions=0, \ .yscale=YSCALE, \ - .cfg=CFG}; + .cfg=CFG, \ + .pos=__##NAME##_pos}; /* Initialise a sprite object using an existing image, creating stored regions for the animation of the sprite. - Sprite(, image_t *image, display_config_t *cfg, int yscale) + Sprite(, image_t *image, display_config_t *cfg, int frames, int yscale) */ -#define Sprite(NAME, IMAGE, CFG, YSCALE) \ - Stored_Regions(__##NAME##_regions, (CFG)->frames, \ +#define Sprite(NAME, IMAGE, CFG, FRAMES, YSCALE) \ + Stored_Regions(__##NAME##_regions, FRAMES, \ (IMAGE)->width * (IMAGE)->height * (YSCALE)); \ + position_t __##NAME##_pos[FRAMES]; \ sprite_t NAME = { \ .image=IMAGE, \ .regions=&(__##NAME##_regions), \ .yscale=YSCALE, \ - .cfg=CFG}; + .cfg=CFG, \ + .pos=__##NAME##_pos}; /* Sprite plotting operations. */ diff -r f124b4ddd0ae -r f98c32b8cbb7 lib/image.c --- a/lib/image.c Tue Nov 13 12:57:52 2018 +0100 +++ b/lib/image.c Tue Nov 13 14:35:22 2018 +0100 @@ -25,9 +25,9 @@ /* Obtain the position for the stored region from the given frame. */ -position_t *image_get_stored_position(stored_regions_t *r, int frame) +position_t *image_get_stored_position(sprite_t *s, int frame) { - return &r->pos[frame]; + return &s->pos[frame]; } /* Obtain the image data for the stored region from the given frame. */ @@ -49,7 +49,7 @@ if (s->regions) { frame = s->cfg->frame; - p = image_get_stored_position(s->regions, frame); + p = image_get_stored_position(s, frame); /* Copy to the stored region. */ @@ -88,7 +88,7 @@ return; frame = s->cfg->frame; - p = image_get_stored_position(s->regions, frame); + p = image_get_stored_position(s, frame); /* Only unplot the sprite if a region was stored for the frame. */