PaulS:
struct imageSet{
uint8_t *bitmap1;
uint8_t *bitmap2;
uint8_t *bitmap3;
uint8_t *bitmap4;
uint8_t *colorSet};
How much SRAM do you think you are saving by putting these 5 pointers into PROGMEM? Is saving 10 bytes worth the doubling of effort required to access the data?
Probably not! I may have misunderstood what I had been reading about program space - I thought if the struct wasn't in PROGMEM itself, it'd also end up pulling the bitmaps into data space (RAM). Pretty sure that's not what it was saying, on re-review. I've had a difficult few days trying to understand pointers, but I think in the last few hours it has clicked. Like I said... still a beginner at some of this stuff.
As it happens, I've solved the issues I was having anyway.
My project scope started on a Pro Trinket - AVR architecture - but I rapidly outgrew the capabilities of the device, even trying to put everything in PROGMEM. I switched to the Teensy 3.2, which had the same footprint as the Pro Trinket but way more metaphorical horsepower, and just kept trucking.
Teensy is not an AVR chip, it's ARM. Turns out, that means it doesn't use PROGMEM declarations at all. If something is a const, it handles the PROGMEM stuff automatically. I had been trying to set up what I thought were working pgm_read_byte/pgm_read_word lines to pull data from that memory space, only they were totally unnecessary and causing intermittent issues.
Once I discovered this error, I facepalmed mightily, stripped out all the PROGMEM-related stuff, replaced all my pgm_read stuff with straight variables, ran the program, and now everything seems to be working beautifully. Oh well!