summaryrefslogtreecommitdiffstats
path: root/xbmc/TextureCacheJob.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xbmc/TextureCacheJob.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/xbmc/TextureCacheJob.h b/xbmc/TextureCacheJob.h
new file mode 100644
index 0000000..66775ac
--- /dev/null
+++ b/xbmc/TextureCacheJob.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2012-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 "pictures/PictureScalingAlgorithm.h"
+#include "utils/Job.h"
+
+#include <cstddef>
+#include <memory>
+#include <stdint.h>
+#include <string>
+#include <vector>
+
+class CTexture;
+
+/*!
+ \ingroup textures
+ \brief Simple class for passing texture detail around
+ */
+class CTextureDetails
+{
+public:
+ CTextureDetails()
+ {
+ id = -1;
+ width = height = 0;
+ updateable = false;
+ };
+ bool operator==(const CTextureDetails &right) const
+ {
+ return (id == right.id &&
+ file == right.file &&
+ width == right.width );
+ };
+ int id;
+ std::string file;
+ std::string hash;
+ unsigned int width;
+ unsigned int height;
+ bool updateable;
+};
+
+/*!
+ \ingroup textures
+ \brief Job class for caching textures
+
+ Handles loading and caching of textures.
+ */
+class CTextureCacheJob : public CJob
+{
+public:
+ CTextureCacheJob(const std::string &url, const std::string &oldHash = "");
+ ~CTextureCacheJob() override;
+
+ const char* GetType() const override { return kJobTypeCacheImage; }
+ bool operator==(const CJob *job) const override;
+ bool DoWork() override;
+
+ /*! \brief retrieve a hash for the given image
+ Combines the size, ctime and mtime of the image file into a "unique" hash
+ \param url location of the image
+ \return a hash string for this image
+ */
+ bool CacheTexture(std::unique_ptr<CTexture>* texture = nullptr);
+
+ static bool ResizeTexture(const std::string &url, uint8_t* &result, size_t &result_size);
+
+ std::string m_url;
+ std::string m_oldHash;
+ CTextureDetails m_details;
+private:
+ /*! \brief retrieve a hash for the given image
+ Combines the size, ctime and mtime of the image file into a "unique" hash
+ \param url location of the image
+ \return a hash string for this image
+ */
+ static std::string GetImageHash(const std::string &url);
+
+ /*! \brief Check whether a given URL represents an image that can be updated
+ We currently don't check http:// and https:// URLs for updates, under the assumption that
+ a image URL is much more likely to be static and the actual image at the URL is unlikely
+ to change, so no point checking all the time.
+ \param url the url to check
+ \return true if the image given by the URL should be checked for updates, false otherwise
+ */
+ bool UpdateableURL(const std::string &url) const;
+
+ /*! \brief Decode an image URL to the underlying image, width, height and orientation
+ \param url wrapped URL of the image
+ \param width width derived from URL
+ \param height height derived from URL
+ \param scalingAlgorithm scaling algorithm derived from URL
+ \param additional_info additional information, such as "flipped" to flip horizontally
+ \return URL of the underlying image file.
+ */
+ static std::string DecodeImageURL(const std::string &url, unsigned int &width, unsigned int &height, CPictureScalingAlgorithm::Algorithm& scalingAlgorithm, std::string &additional_info);
+
+ /*! \brief Load an image at a given target size and orientation.
+
+ Doesn't necessarily load the image at the desired size - the loader *may* decide to load it slightly larger
+ or smaller than the desired size for speed reasons.
+
+ \param image the URL of the image file.
+ \param width the desired maximum width.
+ \param height the desired maximum height.
+ \param additional_info extra info for loading, such as whether to flip horizontally.
+ \return a pointer to a CTexture object, NULL if failed.
+ */
+ static std::unique_ptr<CTexture> LoadImage(const std::string& image,
+ unsigned int width,
+ unsigned int height,
+ const std::string& additional_info,
+ bool requirePixels = false);
+
+ std::string m_cachePath;
+};
+
+/* \brief Job class for storing the use count of textures
+ */
+class CTextureUseCountJob : public CJob
+{
+public:
+ explicit CTextureUseCountJob(const std::vector<CTextureDetails> &textures);
+
+ const char* GetType() const override { return "usecount"; }
+ bool operator==(const CJob *job) const override;
+ bool DoWork() override;
+
+private:
+ std::vector<CTextureDetails> m_textures;
+};