public void NextFrame(object sender, EventArgs e)
{
frameTimer.Stop();
if (_numberOfFrames == 0) return;
if (_frameList[_frameCounter].disposalMethod == 2)
{
// dispose = background, tricky code to make transparent last frames region
for (int fc = 0; fc < _frameCounter; fc++)
{
if (_frameList[fc].Visibility == Visibility.Visible)
{
GifFrame gf = _frameList[_frameCounter];
RectangleGeometry rg2 = new RectangleGeometry(new Rect(gf.left, gf.top, gf.width, gf.height));
totalTransparentGeometry = new CombinedGeometry(GeometryCombineMode.Union, totalTransparentGeometry, rg2);
GifFrame gfBack = _frameList[fc];
RectangleGeometry rgBack = new RectangleGeometry(new Rect(gfBack.left, gfBack.top, gfBack.width, gfBack.height));
CombinedGeometry cg = new CombinedGeometry(GeometryCombineMode.Exclude, rgBack, totalTransparentGeometry);
GeometryDrawing gd = new GeometryDrawing(Brushes.Black, new Pen(Brushes.Black, 0), cg);
DrawingBrush db = new DrawingBrush(gd);
_frameList[fc].OpacityMask = db;
}
}
_frameList[_frameCounter].Visibility = Visibility.Hidden;
}
if (_frameList[_frameCounter].disposalMethod >= 3)
{
_frameList[_frameCounter].Visibility = Visibility.Hidden;
}
_frameCounter++;
if (_frameCounter < _numberOfFrames)
{
_frameList[_frameCounter].Visibility = Visibility.Visible;
frameTimer.Interval = new TimeSpan(0, 0, 0, 0, _frameList[_frameCounter].delayTime * 10);
frameTimer.Start();
}
else
{
if (_numberOfLoops != 0)
{
_currentLoop++;
}
if (_currentLoop < _numberOfLoops || _numberOfLoops == 0)
{
for (int f = 0; f < _frameList.Count; f++)
{
_frameList[f].Visibility = Visibility.Hidden;
_frameList[f].OpacityMask = null;
}
totalTransparentGeometry = null;
_frameCounter = 0;
_frameList[_frameCounter].Visibility = Visibility.Visible;
frameTimer.Interval = new TimeSpan(0, 0, 0, 0, _frameList[_frameCounter].delayTime * 10);
frameTimer.Start();
}
}
}