Coalesce identical GIF frames on load.
This commit is contained in:
parent
a094588055
commit
bf9b8b185c
@ -47,6 +47,13 @@ void SMXGif::GIFImage::Blit(SMXGif::GIFImage &src, int dst_left, int dst_top, in
|
|||||||
get(x + dst_left, y + dst_top) = src.get(x, y);
|
get(x + dst_left, y + dst_top) = src.get(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool SMXGif::GIFImage::operator==(const GIFImage &rhs) const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
width == rhs.width &&
|
||||||
|
height == rhs.height &&
|
||||||
|
image == rhs.image;
|
||||||
|
}
|
||||||
|
|
||||||
class DataStream
|
class DataStream
|
||||||
{
|
{
|
||||||
@ -394,6 +401,14 @@ void GIFDecoder::ReadAllFrames(vector<SMXGif::SMXGifFrame> &frames)
|
|||||||
gif_frame.height = global_data.height;
|
gif_frame.height = global_data.height;
|
||||||
gif_frame.milliseconds = global_data.duration * 10;
|
gif_frame.milliseconds = global_data.duration * 10;
|
||||||
gif_frame.frame = frame_image;
|
gif_frame.frame = frame_image;
|
||||||
|
|
||||||
|
// If this frame is identical to the previous one, just extend the previous frame.
|
||||||
|
if(!frames.empty() && gif_frame.frame == frames.back().frame)
|
||||||
|
{
|
||||||
|
frames.back().milliseconds += gif_frame.milliseconds;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
frames.push_back(gif_frame);
|
frames.push_back(gif_frame);
|
||||||
|
|
||||||
frame++;
|
frame++;
|
||||||
|
@ -47,6 +47,8 @@ namespace SMXGif
|
|||||||
// Copy src into a rectangle in this image.
|
// Copy src into a rectangle in this image.
|
||||||
void Blit(GIFImage &src, int dst_left, int dst_top, int dst_width, int dst_height);
|
void Blit(GIFImage &src, int dst_left, int dst_top, int dst_width, int dst_height);
|
||||||
|
|
||||||
|
bool operator==(const GIFImage &rhs) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Color> image;
|
std::vector<Color> image;
|
||||||
};
|
};
|
||||||
|
@ -320,7 +320,6 @@ void SMXPanelAnimation::Load(const vector<SMXGif::SMXGifFrame> &frames, int pane
|
|||||||
ConvertToPanelGraphic16(gif_frame.frame, panel_graphic, panel);
|
ConvertToPanelGraphic16(gif_frame.frame, panel_graphic, panel);
|
||||||
else
|
else
|
||||||
ConvertToPanelGraphic25(gif_frame.frame, panel_graphic, panel);
|
ConvertToPanelGraphic25(gif_frame.frame, panel_graphic, panel);
|
||||||
m_aPanelGraphics.push_back(panel_graphic);
|
|
||||||
|
|
||||||
// GIFs have a very low-resolution duration field, with 10ms units.
|
// GIFs have a very low-resolution duration field, with 10ms units.
|
||||||
// The panels run at 30 FPS internally, or 33 1/3 ms, but GIF can only
|
// The panels run at 30 FPS internally, or 33 1/3 ms, but GIF can only
|
||||||
@ -333,6 +332,7 @@ void SMXPanelAnimation::Load(const vector<SMXGif::SMXGifFrame> &frames, int pane
|
|||||||
else
|
else
|
||||||
seconds = gif_frame.milliseconds / 1000.0;
|
seconds = gif_frame.milliseconds / 1000.0;
|
||||||
|
|
||||||
|
m_aPanelGraphics.push_back(panel_graphic);
|
||||||
m_iFrameDurations.push_back(seconds);
|
m_iFrameDurations.push_back(seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user