1//
2// This file is part of the aMule Project.
3//
4// Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5//
6// Any parts of this program derived from the xMule, lMule or eMule project,
7// or contributed by third-party developers are copyrighted by their
8// respective authors.
9//
10// This program is free software; you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation; either version 2 of the License, or
13// (at your option) any later version.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
23//
24
25
26#include <wx/mstream.h>
27#include <wx/gifdecod.h>
28#include <wx/dcbuffer.h>
29
30
31#include "MuleGifCtrl.h"
32#include "Types.h"
33
34
35BEGIN_EVENT_TABLE(MuleGifCtrl, wxControl)
36	EVT_TIMER(GIFTIMERID, MuleGifCtrl::OnTimer)
37	EVT_PAINT(MuleGifCtrl::OnPaint)
38	EVT_ERASE_BACKGROUND(MuleGifCtrl::OnErase)
39END_EVENT_TABLE()
40
41class MuleGIFDecoder : public wxGIFDecoder
42{
43public:
44	MuleGIFDecoder()
45	{
46		m_nframe = 0;
47	}
48
49	~MuleGIFDecoder() { }
50
51	void GoFirstFrame() { m_nframe = 0; }
52	void GoNextFrame() { m_nframe < GetFrameCount() - 1 ? m_nframe++ : m_nframe = 0; }
53	void GoLastFrame() { m_nframe = GetFrameCount() - 1; }
54
55	void ConvertToImage(wxImage* image) { wxGIFDecoder::ConvertToImage(m_nframe, image); }
56
57	long GetDelay() { return wxGIFDecoder::GetDelay(m_nframe); }
58
59private:
60	uint32_t m_nframe;
61};
62
63MuleGifCtrl::MuleGifCtrl(
64	wxWindow *parent,
65	wxWindowID id,
66	const wxPoint& pos,
67	const wxSize& size,
68	long style,
69	const wxValidator& validator,
70	const wxString& name)
71:
72wxControl(parent, id, pos, size, style, validator, name),
73m_decoder(NULL),
74m_timer(this, GIFTIMERID)
75{
76}
77
78
79MuleGifCtrl::~MuleGifCtrl()
80{
81	m_timer.Stop();
82	if (m_decoder) {
83		delete m_decoder;
84		m_decoder = NULL;
85	}
86}
87
88
89bool MuleGifCtrl::LoadData(const char* data, int size)
90{
91	if (m_decoder) {
92		m_timer.Stop();
93   		delete m_decoder;
94  		m_decoder = NULL;
95	}
96
97  	wxMemoryInputStream stream(data, size);
98  	m_decoder = new MuleGIFDecoder();
99  	if ( m_decoder->LoadGIF(stream) != wxGIF_OK ) {
100   		delete m_decoder;
101   		m_decoder = NULL;
102   		return false;
103  	}
104
105	m_decoder->GoFirstFrame();
106	wxImage frame;
107	m_decoder->ConvertToImage( &frame );
108	m_frame = wxBitmap(frame);
109
110	return true;
111}
112
113
114void MuleGifCtrl::Start()
115{
116	if (m_decoder && m_decoder->IsAnimation()) {
117		m_timer.Stop();
118		m_decoder->GoLastFrame();
119#if wxCHECK_VERSION(2, 9, 0)
120		wxTimerEvent evt(m_timer);
121#else
122		wxTimerEvent evt;
123#endif
124		OnTimer(evt);
125	}
126}
127
128
129void MuleGifCtrl::Stop()
130{
131	m_timer.Stop();
132}
133
134
135wxSize MuleGifCtrl::GetBestSize()
136{
137	return m_decoder->GetAnimationSize();
138}
139
140
141void MuleGifCtrl::OnTimer(wxTimerEvent& WXUNUSED(event))
142{
143	if (m_decoder) {
144		if (m_decoder->IsAnimation()) {
145			m_decoder->GoNextFrame();
146		}
147
148		wxImage frame;
149		m_decoder->ConvertToImage(&frame);
150		m_frame = wxBitmap(frame);
151
152		Refresh();
153
154		if (m_decoder->IsAnimation()) {
155			m_timer.Start(m_decoder->GetDelay(), true);
156		}
157	}
158}
159
160
161void MuleGifCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
162{
163	wxBufferedPaintDC dc(this);
164
165	wxSize clientsize = GetClientSize();
166	wxSize gifsize = m_decoder->GetAnimationSize();
167	int x = (clientsize.GetWidth()-gifsize.GetWidth())/2;
168	int y = (clientsize.GetHeight()-gifsize.GetHeight())/2;
169
170	dc.SetBackground(*(wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID)));
171	dc.Clear();
172	dc.DrawBitmap(m_frame, x, y, true);
173}
174
175
176// File_checked_for_headers
177