diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-28 20:56:41 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-28 20:57:58 +0100 |
commit | 264be2108c51837fa92085f6c839e66aebbcfc9e (patch) | |
tree | e1f535d4cda5f399e5e622f6154690a0a4e08c4b /src/resources/resource.h | |
parent | d86a1df562e00a6e930683534b9d001f45a951ff (diff) | |
download | mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.gz mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.bz2 mana-264be2108c51837fa92085f6c839e66aebbcfc9e.tar.xz mana-264be2108c51837fa92085f6c839e66aebbcfc9e.zip |
Added support for map/layer mask
A custom "Mask" property on a layer or a "foregroundXmask" property on a
map can now be used in combination with the SMSG_MAP_MASK to dynamically
disable certain map layers from the server.
Feature previously seen on ManaPlus and implemented for Mana client for
compatibility.
Also added a ResourceRef class for automating the Resource reference
counting.
Closes #44
Diffstat (limited to 'src/resources/resource.h')
-rw-r--r-- | src/resources/resource.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/resources/resource.h b/src/resources/resource.h index af688eb0..988b78a5 100644 --- a/src/resources/resource.h +++ b/src/resources/resource.h @@ -69,4 +69,72 @@ class Resource unsigned mRefCount; /**< Reference count. */ }; +/** + * Automatically counting Resource reference. + */ +template<typename RESOURCE> +class ResourceRef +{ +public: + // Allow implicit construction from RESOURCE * + ResourceRef(RESOURCE *resource = nullptr) + : mResource(resource) + { + if (mResource) + mResource->incRef(); + } + + // Copy constructor + ResourceRef(const ResourceRef &other) + : mResource(other.mResource) + { + if (mResource) + mResource->incRef(); + } + + // Move constructor + ResourceRef(ResourceRef &&other) + : mResource(other.mResource) + { + other.mResource = nullptr; + } + + // Destructor + ~ResourceRef() + { + if (mResource) + mResource->decRef(); + } + + // Assignment operator + ResourceRef &operator=(const ResourceRef &other) + { + if (this != &other) + { + if (mResource) + mResource->decRef(); + + mResource = other.mResource; + + if (mResource) + mResource->incRef(); + } + return *this; + } + + // Allow dereferencing + RESOURCE *operator->() const + { return mResource; } + + RESOURCE *get() const + { return mResource; } + + // Allow implicit conversion to RESOURCE * + operator RESOURCE *() const + { return mResource; } + +private: + RESOURCE *mResource; +}; + #endif |