summaryrefslogtreecommitdiffstats
path: root/xbmc/GUILargeTextureManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/GUILargeTextureManager.h')
-rw-r--r--xbmc/GUILargeTextureManager.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/xbmc/GUILargeTextureManager.h b/xbmc/GUILargeTextureManager.h
new file mode 100644
index 0000000..ecb3b5e
--- /dev/null
+++ b/xbmc/GUILargeTextureManager.h
@@ -0,0 +1,143 @@
+/*
+ * 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 "guilib/TextureManager.h"
+#include "threads/CriticalSection.h"
+#include "utils/Job.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+class CTexture;
+
+/*!
+ \ingroup textures,jobs
+ \brief Image loader job class
+
+ Used by the CGUILargeTextureManager to perform asynchronous loading of textures.
+
+ \sa CGUILargeTextureManager and CJob
+ */
+class CImageLoader : public CJob
+{
+public:
+ CImageLoader(const std::string &path, const bool useCache);
+ ~CImageLoader() override;
+
+ /*!
+ \brief Work function that loads in a particular image.
+ */
+ bool DoWork() override;
+
+ bool m_use_cache; ///< Whether or not to use any caching with this image
+ std::string m_path; ///< path of image to load
+ std::unique_ptr<CTexture> m_texture; ///< Texture object to load the image into \sa CTexture.
+};
+
+/*!
+ \ingroup textures
+ \brief Background texture loading manager
+
+ Used to load textures for the user interface asynchronously, allowing fluid framerates
+ while background loading textures.
+
+ \sa IJobCallback, CGUITexture
+ */
+class CGUILargeTextureManager : public IJobCallback
+{
+public:
+ CGUILargeTextureManager();
+ ~CGUILargeTextureManager() override;
+
+ /*!
+ \brief Callback from CImageLoader on completion of a loaded image
+
+ Transfers texture information from the loading job to our allocated texture list.
+
+ \sa CImageLoader, IJobCallback
+ */
+ void OnJobComplete(unsigned int jobID, bool success, CJob *job) override;
+
+ /*!
+ \brief Request a texture to be loaded in the background.
+
+ Loaded textures are reference counted, hence this call may immediately return with the texture
+ object filled if the texture has been previously loaded, else will return with an empty texture
+ object if it is being loaded.
+
+ \param path path of the image to load.
+ \param texture texture object to hold the resulting texture
+ \param orientation orientation of resulting texture
+ \param firstRequest true if this is the first time we are requesting this texture
+ \return true if the image exists, else false.
+ \sa CGUITextureArray and CGUITexture
+ */
+ bool GetImage(const std::string &path, CTextureArray &texture, bool firstRequest, bool useCache = true);
+
+ /*!
+ \brief Request a texture to be unloaded.
+
+ When textures are finished with, this function should be called. This decrements the texture's
+ reference count, and schedules it to be unloaded once the reference count reaches zero. If the
+ texture is still queued for loading, or is in the process of loading, the image load is cancelled.
+
+ \param path path of the image to release.
+ \param immediately if set true the image is immediately unloaded once its reference count reaches zero
+ rather than being unloaded after a delay.
+ */
+ void ReleaseImage(const std::string &path, bool immediately = false);
+
+ /*!
+ \brief Cleanup images that are no longer in use.
+
+ Loaded textures are reference counted, and upon reaching reference count 0 through ReleaseImage()
+ they are flagged as unused with the current time. After a delay they may be unloaded, hence
+ CleanupUnusedImages() should be called periodically to ensure this occurs.
+
+ \param immediately set to true to cleanup images regardless of whether the delay has passed
+ */
+ void CleanupUnusedImages(bool immediately = false);
+
+private:
+ class CLargeTexture
+ {
+ public:
+ explicit CLargeTexture(const std::string &path);
+ virtual ~CLargeTexture();
+
+ void AddRef();
+ bool DecrRef(bool deleteImmediately);
+ bool DeleteIfRequired(bool deleteImmediately = false);
+ void SetTexture(std::unique_ptr<CTexture> texture);
+
+ const std::string& GetPath() const { return m_path; }
+ const CTextureArray& GetTexture() const { return m_texture; }
+
+ private:
+ static const unsigned int TIME_TO_DELETE = 2000;
+
+ unsigned int m_refCount;
+ std::string m_path;
+ CTextureArray m_texture;
+ unsigned int m_timeToDelete;
+ };
+
+ void QueueImage(const std::string &path, bool useCache = true);
+
+ std::vector< std::pair<unsigned int, CLargeTexture *> > m_queued;
+ std::vector<CLargeTexture *> m_allocated;
+ typedef std::vector<CLargeTexture *>::iterator listIterator;
+ typedef std::vector< std::pair<unsigned int, CLargeTexture *> >::iterator queueIterator;
+
+ CCriticalSection m_listSection;
+};
+