Handle 25-light panel animations in SMXPanelAnimation.

master
Glenn Maynard 6 years ago
parent 880774f9e4
commit 0b3202ccff
  1. 42
      sdk/Windows/SMXPanelAnimation.cpp

@ -242,7 +242,7 @@ namespace {
// Given a 14x15 graphic frame and a panel number, return an array of 16 colors, containing
// each light in the order it's sent to the master controller.
void ConvertToPanelGraphic(const SMXGif::GIFImage &src, vector<SMXGif::Color> &dst, int panel)
void ConvertToPanelGraphic16(const SMXGif::GIFImage &src, vector<SMXGif::Color> &dst, int panel)
{
dst.clear();
@ -254,6 +254,32 @@ namespace {
for(int dy = 0; dy < 4; ++dy)
for(int dx = 0; dx < 4; ++dx)
dst.push_back(src.get(x+dx, y+dy));
// These animations have no data for the 3x3 grid, so just set them to transparent.
for(int dy = 0; dy < 3; ++dy)
for(int dx = 0; dx < 3; ++dx)
dst.push_back(SMXGif::Color(0,0,0,0));
}
// Given a 23x24 graphic frame and a panel number, return an array of 25 colors, containing
// each light in the order it's sent to the master controller.
void ConvertToPanelGraphic25(const SMXGif::GIFImage &src, vector<SMXGif::Color> &dst, int panel)
{
dst.clear();
// The top-left corner for this panel:
int x = graphic_positions[panel].first * 8;
int y = graphic_positions[panel].second * 8;
// Add the 4x4 grid first.
for(int dy = 0; dy < 4; ++dy)
for(int dx = 0; dx < 4; ++dx)
dst.push_back(src.get(x+dx*2, y+dy*2));
// Add the 3x3 grid.
for(int dy = 0; dy < 3; ++dy)
for(int dx = 0; dx < 3; ++dx)
dst.push_back(src.get(x+dx*2+1, y+dy*2+1));
}
}
@ -266,7 +292,7 @@ SMXPanelAnimation SMXPanelAnimation::GetLoadedAnimation(int pad, int panel, SMX_
}
// Load an array of animation frames as a panel animation. Each frame must
// be 14x15.
// be 14x15 or 23x24.
void SMXPanelAnimation::Load(const vector<SMXGif::SMXGifFrame> &frames, int panel)
{
m_aPanelGraphics.clear();
@ -287,9 +313,13 @@ void SMXPanelAnimation::Load(const vector<SMXGif::SMXGifFrame> &frames, int pane
m_iLoopFrame = frame_no;
}
// Extract this frame.
// Extract this frame. If the graphic is 14x15 it's a 4x4 animation,
// and if it's 23x24 it's 25-light.
vector<SMXGif::Color> panel_graphic;
ConvertToPanelGraphic(gif_frame.frame, panel_graphic, panel);
if(frames[0].width == 14)
ConvertToPanelGraphic16(gif_frame.frame, panel_graphic, panel);
else
ConvertToPanelGraphic25(gif_frame.frame, panel_graphic, panel);
m_aPanelGraphics.push_back(panel_graphic);
// GIFs have a very low-resolution duration field, with 10ms units.
@ -325,9 +355,9 @@ bool SMX_LightsAnimation_Load(const char *gif, int size, int pad, SMX_LightsType
// Check the dimensions of the image. We only need to check the first, the
// others will always have the same size.
if(frames[0].width != 14 || frames[0].height != 15)
if((frames[0].width != 14 || frames[0].height != 15) && (frames[0].width != 23 || frames[0].height != 24))
{
*error = "The GIF must be 14x15.";
*error = "The GIF must be 14x15 or 23x24.";
return false;
}

Loading…
Cancel
Save