aboutsummaryrefslogtreecommitdiff
path: root/guilib/TextureManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'guilib/TextureManager.cpp')
-rw-r--r--guilib/TextureManager.cpp581
1 files changed, 0 insertions, 581 deletions
diff --git a/guilib/TextureManager.cpp b/guilib/TextureManager.cpp
deleted file mode 100644
index 5830a8446b..0000000000
--- a/guilib/TextureManager.cpp
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
-* Copyright (C) 2005-2008 Team XBMC
-* http://www.xbmc.org
-*
-* This Program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2, or (at your option)
-* any later version.
-*
-* This Program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with XBMC; see the file COPYING. If not, write to
-* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-* http://www.gnu.org/copyleft/gpl.html
-*
-*/
-
-#include "TextureManager.h"
-#include "Texture.h"
-#include "AnimatedGif.h"
-#include "GraphicContext.h"
-#include "utils/SingleLock.h"
-#include "utils/CharsetConverter.h"
-#include "utils/log.h"
-#include "utils/log.h"
-#include "addons/Skin.h"
-#ifdef _DEBUG
-#include "utils/TimeUtils.h"
-#endif
-#include "../xbmc/Util.h"
-#include "../xbmc/FileSystem/File.h"
-#include "../xbmc/FileSystem/Directory.h"
-#include <assert.h>
-
-using namespace std;
-
-
-/************************************************************************/
-/* */
-/************************************************************************/
-CTextureArray::CTextureArray(int width, int height, int loops, bool texCoordsArePixels)
-{
- m_width = width;
- m_height = height;
- m_loops = loops;
- m_orientation = 0;
- m_texWidth = 0;
- m_texHeight = 0;
- m_texCoordsArePixels = false;
-}
-
-CTextureArray::CTextureArray()
-{
- Reset();
-}
-
-CTextureArray::~CTextureArray()
-{
-
-}
-
-unsigned int CTextureArray::size() const
-{
- return m_textures.size();
-}
-
-
-void CTextureArray::Reset()
-{
- m_textures.clear();
- m_delays.clear();
- m_width = 0;
- m_height = 0;
- m_loops = 0;
- m_orientation = 0;
- m_texWidth = 0;
- m_texHeight = 0;
- m_texCoordsArePixels = false;
-}
-
-void CTextureArray::Add(CBaseTexture *texture, int delay)
-{
- if (!texture)
- return;
-
- m_textures.push_back(texture);
- m_delays.push_back(delay ? delay * 2 : 100);
-
- m_texWidth = texture->GetTextureWidth();
- m_texHeight = texture->GetTextureHeight();
- m_texCoordsArePixels = false;
-}
-
-void CTextureArray::Set(CBaseTexture *texture, int width, int height)
-{
- assert(!m_textures.size()); // don't try and set a texture if we already have one!
- m_width = width;
- m_height = height;
- m_orientation = texture ? texture->GetOrientation() : 0;
- Add(texture, 100);
-}
-
-void CTextureArray::Free()
-{
- CSingleLock lock(g_graphicsContext);
- for (unsigned int i = 0; i < m_textures.size(); i++)
- {
- delete m_textures[i];
- }
-
- m_textures.clear();
- m_delays.clear();
-
- Reset();
-}
-
-
-/************************************************************************/
-/* */
-/************************************************************************/
-
-CTextureMap::CTextureMap()
-{
- m_textureName = "";
- m_referenceCount = 0;
- m_memUsage = 0;
-}
-
-CTextureMap::CTextureMap(const CStdString& textureName, int width, int height, int loops)
-: m_texture(width, height, loops)
-{
- m_textureName = textureName;
- m_referenceCount = 0;
- m_memUsage = 0;
-}
-
-CTextureMap::~CTextureMap()
-{
- FreeTexture();
-}
-
-bool CTextureMap::Release()
-{
- if (!m_texture.m_textures.size())
- return true;
- if (!m_referenceCount)
- return true;
-
- m_referenceCount--;
- if (!m_referenceCount)
- {
- return true;
- }
- return false;
-}
-
-const CStdString& CTextureMap::GetName() const
-{
- return m_textureName;
-}
-
-const CTextureArray& CTextureMap::GetTexture()
-{
- m_referenceCount++;
- return m_texture;
-}
-
-void CTextureMap::Dump() const
-{
- if (!m_referenceCount)
- return; // nothing to see here
-
- CStdString strLog;
- strLog.Format(" texture:%s has %i frames %i refcount\n", m_textureName.c_str(), m_texture.m_textures.size(), m_referenceCount);
- OutputDebugString(strLog.c_str());
-}
-
-unsigned int CTextureMap::GetMemoryUsage() const
-{
- return m_memUsage;
-}
-
-void CTextureMap::Flush()
-{
- if (!m_referenceCount)
- FreeTexture();
-}
-
-
-void CTextureMap::FreeTexture()
-{
- m_texture.Free();
-}
-
-bool CTextureMap::IsEmpty() const
-{
- return m_texture.m_textures.size() == 0;
-}
-
-void CTextureMap::Add(CBaseTexture* texture, int delay)
-{
- m_texture.Add(texture, delay);
-
- if (texture)
- m_memUsage += sizeof(CTexture) + (texture->GetTextureWidth() * texture->GetTextureHeight() * 4);
-}
-
-/************************************************************************/
-/* */
-/************************************************************************/
-CGUITextureManager::CGUITextureManager(void)
-{
- // we set the theme bundle to be the first bundle (thus prioritizing it)
- m_TexBundle[0].SetThemeBundle(true);
-}
-
-CGUITextureManager::~CGUITextureManager(void)
-{
- Cleanup();
-}
-
-const CTextureArray& CGUITextureManager::GetTexture(const CStdString& strTextureName)
-{
- static CTextureArray emptyTexture;
- // CLog::Log(LOGINFO, " refcount++ for GetTexture(%s)\n", strTextureName.c_str());
- for (int i = 0; i < (int)m_vecTextures.size(); ++i)
- {
- CTextureMap *pMap = m_vecTextures[i];
- if (pMap->GetName() == strTextureName)
- {
- //CLog::Log(LOGDEBUG, "Total memusage %u", GetMemoryUsage());
- return pMap->GetTexture();
- }
- }
- return emptyTexture;
-}
-
-/************************************************************************/
-/* */
-/************************************************************************/
-bool CGUITextureManager::CanLoad(const CStdString &texturePath) const
-{
- if (texturePath == "-")
- return false;
-
- if (!CURL::IsFullPath(texturePath))
- return true; // assume we have it
-
- // we can't (or shouldn't) be loading from remote paths, so check these
- return CUtil::IsHD(texturePath);
-}
-
-bool CGUITextureManager::HasTexture(const CStdString &textureName, CStdString *path, int *bundle, int *size)
-{
- // default values
- if (bundle) *bundle = -1;
- if (size) *size = 0;
- if (path) *path = textureName;
-
- if (!CanLoad(textureName))
- return false;
-
- // Check our loaded and bundled textures - we store in bundles using \\.
- CStdString bundledName = CTextureBundle::Normalize(textureName);
- for (int i = 0; i < (int)m_vecTextures.size(); ++i)
- {
- CTextureMap *pMap = m_vecTextures[i];
- if (pMap->GetName() == textureName)
- {
- if (size) *size = 1;
- return true;
- }
- }
-
- for (int i = 0; i < 2; i++)
- {
- if (m_TexBundle[i].HasFile(bundledName))
- {
- if (bundle) *bundle = i;
- return true;
- }
- }
-
- CStdString fullPath = GetTexturePath(textureName);
- if (path)
- *path = fullPath;
-
- return !fullPath.IsEmpty();
-}
-
-int CGUITextureManager::Load(const CStdString& strTextureName, bool checkBundleOnly /*= false */)
-{
- CStdString strPath;
- int bundle = -1;
- int size = 0;
- if (!HasTexture(strTextureName, &strPath, &bundle, &size))
- return 0;
-
- if (size) // we found the texture
- return size;
-
- if (checkBundleOnly && bundle == -1)
- return 0;
-
- //Lock here, we will do stuff that could break rendering
- CSingleLock lock(g_graphicsContext);
-
-#ifdef _DEBUG
- int64_t start;
- start = CurrentHostCounter();
-#endif
-
- if (strPath.Right(4).ToLower() == ".gif")
- {
- CTextureMap* pMap;
-
- if (bundle >= 0)
- {
- CBaseTexture **pTextures;
- int nLoops = 0, width = 0, height = 0;
- int* Delay;
- int nImages = m_TexBundle[bundle].LoadAnim(strTextureName, &pTextures, width, height, nLoops, &Delay);
- if (!nImages)
- {
- CLog::Log(LOGERROR, "Texture manager unable to load bundled file: %s", strTextureName.c_str());
- return 0;
- }
-
- pMap = new CTextureMap(strTextureName, width, height, nLoops);
- for (int iImage = 0; iImage < nImages; ++iImage)
- {
- pMap->Add(pTextures[iImage], Delay[iImage]);
- }
-
- delete [] pTextures;
- delete [] Delay;
- }
- else
- {
- CAnimatedGifSet AnimatedGifSet;
- int iImages = AnimatedGifSet.LoadGIF(strPath.c_str());
- if (iImages == 0)
- {
- CStdString rootPath = strPath.Left(g_SkinInfo->Path().GetLength());
- if (0 == rootPath.CompareNoCase(g_SkinInfo->Path()))
- CLog::Log(LOGERROR, "Texture manager unable to load file: %s", strPath.c_str());
- return 0;
- }
- int iWidth = AnimatedGifSet.FrameWidth;
- int iHeight = AnimatedGifSet.FrameHeight;
-
- // fixup our palette
- COLOR *palette = AnimatedGifSet.m_vecimg[0]->Palette;
- // set the alpha values to fully opaque
- for (int i = 0; i < 256; i++)
- palette[i].x = 0xff;
- // and set the transparent colour
- if (AnimatedGifSet.m_vecimg[0]->Transparency && AnimatedGifSet.m_vecimg[0]->Transparent >= 0)
- palette[AnimatedGifSet.m_vecimg[0]->Transparent].x = 0;
-
- pMap = new CTextureMap(strTextureName, iWidth, iHeight, AnimatedGifSet.nLoops);
-
- for (int iImage = 0; iImage < iImages; iImage++)
- {
- CTexture *glTexture = new CTexture();
- if (glTexture)
- {
- CAnimatedGif* pImage = AnimatedGifSet.m_vecimg[iImage];
- glTexture->LoadPaletted(pImage->Width, pImage->Height, pImage->BytesPerRow, XB_FMT_A8R8G8B8, (unsigned char *)pImage->Raster, palette);
- pMap->Add(glTexture, pImage->Delay);
- }
- } // of for (int iImage=0; iImage < iImages; iImage++)
- }
-
-#ifdef _DEBUG
- int64_t end, freq;
- end = CurrentHostCounter();
- freq = CurrentHostFrequency();
- char temp[200];
- sprintf(temp, "Load %s: %.1fms%s\n", strPath.c_str(), 1000.f * (end - start) / freq, (bundle >= 0) ? " (bundled)" : "");
- OutputDebugString(temp);
-#endif
-
- m_vecTextures.push_back(pMap);
- return 1;
- } // of if (strPath.Right(4).ToLower()==".gif")
-
- CBaseTexture *pTexture = NULL;
- int width = 0, height = 0;
- if (bundle >= 0)
- {
- if (FAILED(m_TexBundle[bundle].LoadTexture(strTextureName, &pTexture, width, height)))
- {
- CLog::Log(LOGERROR, "Texture manager unable to load bundled file: %s", strTextureName.c_str());
- return 0;
- }
- }
- else
- {
- pTexture = new CTexture();
- if(!pTexture->LoadFromFile(strPath))
- return 0;
- width = pTexture->GetWidth();
- height = pTexture->GetHeight();
- }
-
- if (!pTexture) return 0;
-
- CTextureMap* pMap = new CTextureMap(strTextureName, width, height, 0);
- pMap->Add(pTexture, 100);
- m_vecTextures.push_back(pMap);
-
-#ifdef _DEBUG_TEXTURES
- int64_t end, freq;
- end = CurrentHostCounter();
- freq = CurrentHostFrequency();
- char temp[200];
- sprintf(temp, "Load %s: %.1fms%s\n", strPath.c_str(), 1000.f * (end - start) / freq, (bundle >= 0) ? " (bundled)" : "");
- OutputDebugString(temp);
-#endif
-
- return 1;
-}
-
-
-void CGUITextureManager::ReleaseTexture(const CStdString& strTextureName)
-{
- CSingleLock lock(g_graphicsContext);
-
- ivecTextures i;
- i = m_vecTextures.begin();
- while (i != m_vecTextures.end())
- {
- CTextureMap* pMap = *i;
- if (pMap->GetName() == strTextureName)
- {
- if (pMap->Release())
- {
- //CLog::Log(LOGINFO, " cleanup:%s", strTextureName.c_str());
- // add to our textures to free
- m_unusedTextures.push_back(pMap);
- i = m_vecTextures.erase(i);
- }
- return;
- }
- ++i;
- }
- CLog::Log(LOGWARNING, "%s: Unable to release texture %s", __FUNCTION__, strTextureName.c_str());
-}
-
-void CGUITextureManager::FreeUnusedTextures()
-{
- CSingleLock lock(g_graphicsContext);
- for (ivecTextures i = m_unusedTextures.begin(); i != m_unusedTextures.end(); ++i)
- delete *i;
- m_unusedTextures.clear();
-}
-
-void CGUITextureManager::Cleanup()
-{
- CSingleLock lock(g_graphicsContext);
-
- ivecTextures i;
- i = m_vecTextures.begin();
- while (i != m_vecTextures.end())
- {
- CTextureMap* pMap = *i;
- CLog::Log(LOGWARNING, "%s: Having to cleanup texture %s", __FUNCTION__, pMap->GetName().c_str());
- delete pMap;
- i = m_vecTextures.erase(i);
- }
- for (int i = 0; i < 2; i++)
- m_TexBundle[i].Cleanup();
- FreeUnusedTextures();
-}
-
-void CGUITextureManager::Dump() const
-{
- CStdString strLog;
- strLog.Format("total texturemaps size:%i\n", m_vecTextures.size());
- OutputDebugString(strLog.c_str());
-
- for (int i = 0; i < (int)m_vecTextures.size(); ++i)
- {
- const CTextureMap* pMap = m_vecTextures[i];
- if (!pMap->IsEmpty())
- pMap->Dump();
- }
-}
-
-void CGUITextureManager::Flush()
-{
- CSingleLock lock(g_graphicsContext);
-
- ivecTextures i;
- i = m_vecTextures.begin();
- while (i != m_vecTextures.end())
- {
- CTextureMap* pMap = *i;
- pMap->Flush();
- if (pMap->IsEmpty() )
- {
- delete pMap;
- i = m_vecTextures.erase(i);
- }
- else
- {
- ++i;
- }
- }
-}
-
-unsigned int CGUITextureManager::GetMemoryUsage() const
-{
- unsigned int memUsage = 0;
- for (int i = 0; i < (int)m_vecTextures.size(); ++i)
- {
- memUsage += m_vecTextures[i]->GetMemoryUsage();
- }
- return memUsage;
-}
-
-void CGUITextureManager::SetTexturePath(const CStdString &texturePath)
-{
- m_texturePaths.clear();
- AddTexturePath(texturePath);
-}
-
-void CGUITextureManager::AddTexturePath(const CStdString &texturePath)
-{
- if (!texturePath.IsEmpty())
- m_texturePaths.push_back(texturePath);
-}
-
-void CGUITextureManager::RemoveTexturePath(const CStdString &texturePath)
-{
- for (vector<CStdString>::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it)
- {
- if (*it == texturePath)
- {
- m_texturePaths.erase(it);
- return;
- }
- }
-}
-
-CStdString CGUITextureManager::GetTexturePath(const CStdString &textureName, bool directory /* = false */)
-{
- if (CURL::IsFullPath(textureName))
- return textureName;
- else
- { // texture doesn't include the full path, so check all fallbacks
- for (vector<CStdString>::iterator it = m_texturePaths.begin(); it != m_texturePaths.end(); ++it)
- {
- CStdString path = CUtil::AddFileToFolder(it->c_str(), "media");
- path = CUtil::AddFileToFolder(path, textureName);
- if (directory)
- {
- if (XFILE::CDirectory::Exists(path))
- return path;
- }
- else
- {
- if (XFILE::CFile::Exists(path))
- return path;
- }
- }
- }
- return "";
-}
-
-void CGUITextureManager::GetBundledTexturesFromPath(const CStdString& texturePath, std::vector<CStdString> &items)
-{
- m_TexBundle[0].GetTexturesFromPath(texturePath, items);
- if (items.empty())
- m_TexBundle[1].GetTexturesFromPath(texturePath, items);
-}