sync with linuxport @ 18013
[xbmc:xbmc-antiquated.git] / xbmc / GUILargeTextureManager.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2008 Team XBMC
5  *      http://www.xbmc.org
6  *
7  *  This Program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2, or (at your option)
10  *  any later version.
11  *
12  *  This Program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with XBMC; see the file COPYING.  If not, write to
19  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  *  http://www.gnu.org/copyleft/gpl.html
21  *
22  */
23
24 #include "utils/Thread.h"
25 #include "utils/CriticalSection.h"
26 #ifdef HAS_SDL
27 #include "SDL/SDL.h"
28 #include "TextureManager.h"
29 #endif
30
31 #include <assert.h>
32
33 class CGUILargeTextureManager : public CThread
34 {
35 public:
36   CGUILargeTextureManager();
37   virtual ~CGUILargeTextureManager();
38
39   virtual void Process();
40
41   CBaseTexture GetImage(const CStdString &path, int &orientation, bool firstRequest);
42   void ReleaseImage(const CStdString &path, bool immediately = false);
43
44   void CleanupUnusedImages();
45
46 protected:
47   class CLargeTexture
48   {
49   public:
50     CLargeTexture(const CStdString &path)
51     {
52       m_path = path;
53       m_width = 0;
54       m_height = 0;
55       m_orientation = 0;
56       m_texture = NULL;
57       m_refCount = 1;
58       m_timeToDelete = 0;
59     };
60
61     virtual ~CLargeTexture()
62     {
63       assert(m_refCount == 0);
64       if (m_texture)
65 #ifdef HAS_SDL_OPENGL
66         delete m_texture;
67 #else
68         SDL_FreeSurface(m_texture);
69 #endif
70       m_texture = NULL;
71     };
72
73     void AddRef() { m_refCount++; };
74     bool DecrRef(bool deleteImmediately)
75     {
76       assert(m_refCount);
77       m_refCount--;
78       if (m_refCount == 0)
79       {
80         if (deleteImmediately)
81           delete this;
82         else
83           m_timeToDelete = timeGetTime() + TIME_TO_DELETE;
84         return true;
85       }
86       return false;
87     };
88
89     bool DeleteIfRequired()
90     {
91       if (m_refCount == 0 && m_timeToDelete < timeGetTime())
92       {
93         delete this;
94         return true;
95       }
96       return false;
97     };
98
99     void SetTexture(SDL_Surface * texture, int width, int height, int orientation)
100     {
101       assert(m_texture == NULL);
102 #ifdef HAS_SDL_OPENGL
103       if (texture)
104         m_texture = new CGLTexture(texture, false, true);
105       else
106         m_texture = NULL; // unable to load the textures
107 #else
108       m_texture = texture;
109 #endif
110       m_width = width;
111       m_height = height;
112       m_orientation = orientation;
113     };
114
115 #ifdef HAS_SDL_OPENGL
116     CGLTexture * GetTexture() const { return m_texture; };
117 #else
118     SDL_Surface * GetTexture() const { return m_texture; };
119 #endif
120     int GetWidth() const { return m_width; };
121     int GetHeight() const { return m_height; };
122     int GetOrientation() const { return m_orientation; };
123     const CStdString &GetPath() const { return m_path; };
124
125   private:
126     static const unsigned int TIME_TO_DELETE = 2000;
127
128     unsigned int m_refCount;
129     CStdString m_path;
130 #ifdef HAS_SDL_OPENGL
131     CGLTexture * m_texture;
132 #else
133     SDL_Surface * m_texture;
134 #endif
135     int m_width;
136     int m_height;
137     int m_orientation;
138     unsigned int m_timeToDelete;
139   };
140
141   void QueueImage(const CStdString &path);
142
143 private:
144   std::vector<CLargeTexture *> m_queued;
145   std::vector<CLargeTexture *> m_allocated;
146   typedef std::vector<CLargeTexture *>::iterator listIterator;
147
148   CCriticalSection m_listSection;
149   CEvent m_listEvent;
150   bool m_running;
151 };
152
153 extern CGUILargeTextureManager g_largeTextureManager;
154