/* * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ #pragma once #include "GUIComponent.h" #include "TextureBundle.h" #include "threads/CriticalSection.h" #include #include #include #include #include #include #include #include class CTexture; /************************************************************************/ /* */ /************************************************************************/ class CTextureArray { public: CTextureArray(int width, int height, int loops, bool texCoordsArePixels = false); CTextureArray(); virtual ~CTextureArray(); void Reset(); void Add(std::shared_ptr texture, int delay); void Set(std::shared_ptr texture, int width, int height); void Free(); unsigned int size() const; std::vector> m_textures; std::vector m_delays; int m_width; int m_height; int m_orientation; int m_loops; int m_texWidth; int m_texHeight; bool m_texCoordsArePixels; }; /*! \ingroup textures \brief */ /************************************************************************/ /* */ /************************************************************************/ class CTextureMap { public: CTextureMap(); CTextureMap(const std::string& textureName, int width, int height, int loops); virtual ~CTextureMap(); void Add(std::unique_ptr texture, int delay); bool Release(); const std::string& GetName() const; const CTextureArray& GetTexture(); void Dump() const; uint32_t GetMemoryUsage() const; void Flush(); bool IsEmpty() const; void SetHeight(int height); void SetWidth(int height); protected: void FreeTexture(); CTextureArray m_texture; std::string m_textureName; unsigned int m_referenceCount; uint32_t m_memUsage; }; /*! \ingroup textures \brief */ /************************************************************************/ /* */ /************************************************************************/ class CGUITextureManager { public: CGUITextureManager(void); virtual ~CGUITextureManager(void); bool HasTexture(const std::string &textureName, std::string *path = NULL, int *bundle = NULL, int *size = NULL); static bool CanLoad(const std::string &texturePath); ///< Returns true if the texture manager can load this texture const CTextureArray& Load(const std::string& strTextureName, bool checkBundleOnly = false); void ReleaseTexture(const std::string& strTextureName, bool immediately = false); void Cleanup(); void Dump() const; uint32_t GetMemoryUsage() const; void Flush(); std::string GetTexturePath(const std::string& textureName, bool directory = false); std::vector GetBundledTexturesFromPath(const std::string& texturePath); void AddTexturePath(const std::string &texturePath); ///< Add a new path to the paths to check when loading media void SetTexturePath(const std::string &texturePath); ///< Set a single path as the path to check when loading media (clear then add) void RemoveTexturePath(const std::string &texturePath); ///< Remove a path from the paths to check when loading media void FreeUnusedTextures(unsigned int timeDelay = 0); ///< Free textures (called from app thread only) void ReleaseHwTexture(unsigned int texture); protected: std::vector m_vecTextures; std::list>> m_unusedTextures; std::vector m_unusedHwTextures; typedef std::vector::iterator ivecTextures; // we have 2 texture bundles (one for the base textures, one for the theme) CTextureBundle m_TexBundle[2]; std::vector m_texturePaths; CCriticalSection m_section; };