1
0
forked from 0ad/0ad

Removes raw pointers management from sprites owned by CGUI.

This was SVN commit r25695.
This commit is contained in:
Vladislav Belov 2021-06-06 00:32:49 +00:00
parent 8e150199a8
commit 4ffc005a7f
6 changed files with 19 additions and 21 deletions

View File

@ -111,9 +111,6 @@ CGUI::~CGUI()
{ {
for (const std::pair<const CStr, IGUIObject*>& p : m_pAllObjects) for (const std::pair<const CStr, IGUIObject*>& p : m_pAllObjects)
delete p.second; delete p.second;
for (const std::pair<const CStr, const CGUISprite*>& p : m_Sprites)
delete p.second;
} }
InReaction CGUI::HandleEvent(const SDL_Event_* ev) InReaction CGUI::HandleEvent(const SDL_Event_* ev)
@ -991,7 +988,7 @@ void CGUI::Xeromyces_ReadScript(const XMBData& xmb, XMBElement element, std::uno
void CGUI::Xeromyces_ReadSprite(const XMBData& xmb, XMBElement element) void CGUI::Xeromyces_ReadSprite(const XMBData& xmb, XMBElement element)
{ {
CGUISprite* Sprite = new CGUISprite; auto sprite = std::make_unique<CGUISprite>();
// Get name, we know it exists because of DTD requirements // Get name, we know it exists because of DTD requirements
CStr name = element.GetAttributes().GetNamedItem(xmb.GetAttributeID("name")); CStr name = element.GetAttributes().GetNamedItem(xmb.GetAttributeID("name"));
@ -1006,7 +1003,7 @@ void CGUI::Xeromyces_ReadSprite(const XMBData& xmb, XMBElement element)
{ {
std::string_view ElementName(xmb.GetElementStringView(child.GetNodeName())); std::string_view ElementName(xmb.GetElementStringView(child.GetNodeName()));
if (ElementName == "image") if (ElementName == "image")
Xeromyces_ReadImage(xmb, child, *Sprite); Xeromyces_ReadImage(xmb, child, *sprite);
else if (ElementName == "effect") else if (ElementName == "effect")
{ {
if (effects) if (effects)
@ -1025,13 +1022,13 @@ void CGUI::Xeromyces_ReadSprite(const XMBData& xmb, XMBElement element)
// different effects) // different effects)
if (effects) if (effects)
{ {
for (const std::unique_ptr<SGUIImage>& image : Sprite->m_Images) for (const std::unique_ptr<SGUIImage>& image : sprite->m_Images)
if (!image->m_Effects) if (!image->m_Effects)
image->m_Effects = effects; image->m_Effects = effects;
} }
m_Sprites.erase(name); m_Sprites.erase(name);
m_Sprites.emplace(name, Sprite); m_Sprites.emplace(name, std::move(sprite));
} }
void CGUI::Xeromyces_ReadImage(const XMBData& xmb, XMBElement element, CGUISprite& parent) void CGUI::Xeromyces_ReadImage(const XMBData& xmb, XMBElement element, CGUISprite& parent)

View File

@ -35,6 +35,7 @@
#include "scriptinterface/ScriptForward.h" #include "scriptinterface/ScriptForward.h"
#include <map> #include <map>
#include <memory>
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
@ -670,7 +671,7 @@ private:
std::map<CStr, const CGUIColor> m_PreDefinedColors; std::map<CStr, const CGUIColor> m_PreDefinedColors;
// Sprites // Sprites
std::map<CStr, const CGUISprite*> m_Sprites; std::map<CStr, std::unique_ptr<const CGUISprite>> m_Sprites;
// Styles // Styles
std::map<CStr, const SGUIStyle> m_Styles; std::map<CStr, const SGUIStyle> m_Styles;

View File

@ -26,7 +26,7 @@ void CGUISprite::AddImage(std::unique_ptr<SGUIImage> image)
m_Images.emplace_back(std::move(image)); m_Images.emplace_back(std::move(image));
} }
void CGUISpriteInstance::Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const void CGUISpriteInstance::Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, std::unique_ptr<const CGUISprite>>& Sprites) const
{ {
if (m_CachedSize != Size) if (m_CachedSize != Size)
{ {

View File

@ -139,7 +139,7 @@ public:
CGUISpriteInstance(); CGUISpriteInstance();
CGUISpriteInstance(const CStr& SpriteName); CGUISpriteInstance(const CStr& SpriteName);
void Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) const; void Draw(CGUI& pGUI, CCanvas2D& canvas, const CRect& Size, std::map<CStr, std::unique_ptr<const CGUISprite>>& Sprites) const;
/** /**
* Whether this Sprite has no texture name set. * Whether this Sprite has no texture name set.

View File

@ -60,7 +60,7 @@ DrawCalls& DrawCalls::operator=(const DrawCalls&)
} }
void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, std::map<CStr, const CGUISprite*>& Sprites) void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, std::map<CStr, std::unique_ptr<const CGUISprite>>& Sprites)
{ {
// This is called only when something has changed (like the size of the // This is called only when something has changed (like the size of the
// sprite), so it doesn't need to be particularly efficient. // sprite), so it doesn't need to be particularly efficient.
@ -75,7 +75,7 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
return; return;
std::map<CStr, const CGUISprite*>::iterator it(Sprites.find(SpriteName)); std::map<CStr, std::unique_ptr<const CGUISprite>>::iterator it(Sprites.find(SpriteName));
if (it == Sprites.end()) if (it == Sprites.end())
{ {
/* /*
@ -96,7 +96,7 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
LOGERROR("Trying to use a sprite that doesn't exist (\"%s\").", SpriteName.c_str()); LOGERROR("Trying to use a sprite that doesn't exist (\"%s\").", SpriteName.c_str());
return; return;
} }
CGUISprite* Sprite = new CGUISprite; auto sprite = std::make_unique<CGUISprite>();
VfsPath TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.AfterLast(":")); VfsPath TextureName = VfsPath("art/textures/ui") / wstring_from_utf8(SpriteName.AfterLast(":"));
if (SpriteName.Find("stretched:") != -1) if (SpriteName.Find("stretched:") != -1)
{ {
@ -110,8 +110,8 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
image->m_Effects->m_Greyscale = true; image->m_Effects->m_Greyscale = true;
} }
Sprite->AddImage(std::move(image)); sprite->AddImage(std::move(image));
Sprites[SpriteName] = Sprite; Sprites[SpriteName] = std::move(sprite);
} }
else if (SpriteName.Find("cropped:") != -1) else if (SpriteName.Find("cropped:") != -1)
{ {
@ -135,8 +135,8 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
image->m_Effects->m_Greyscale = true; image->m_Effects->m_Greyscale = true;
} }
Sprite->AddImage(std::move(image)); sprite->AddImage(std::move(image));
Sprites[SpriteName] = Sprite; Sprites[SpriteName] = std::move(sprite);
} }
if (SpriteName.Find("color:") != -1) if (SpriteName.Find("color:") != -1)
{ {
@ -164,15 +164,15 @@ void GUIRenderer::UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const
return; return;
} }
Sprite->AddImage(std::move(image)); sprite->AddImage(std::move(image));
Sprites[SpriteName] = Sprite; Sprites[SpriteName] = std::move(sprite);
} }
it = Sprites.find(SpriteName); it = Sprites.find(SpriteName);
// Otherwise, just complain and give up: // Otherwise, just complain and give up:
if (it == Sprites.end()) if (it == Sprites.end())
{ {
SAFE_DELETE(Sprite); sprite.reset();
LOGERROR("Trying to use a sprite that doesn't exist (\"%s\").", SpriteName.c_str()); LOGERROR("Trying to use a sprite that doesn't exist (\"%s\").", SpriteName.c_str());
return; return;
} }

View File

@ -65,7 +65,7 @@ namespace GUIRenderer
DrawCalls& operator=(const DrawCalls&); DrawCalls& operator=(const DrawCalls&);
}; };
void UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr8& SpriteName, const CRect& Size, std::map<CStr8, const CGUISprite*>& Sprites); void UpdateDrawCallCache(const CGUI& pGUI, DrawCalls& Calls, const CStr8& SpriteName, const CRect& Size, std::map<CStr8, std::unique_ptr<const CGUISprite>>& Sprites);
void Draw(DrawCalls& Calls, CCanvas2D& canvas); void Draw(DrawCalls& Calls, CCanvas2D& canvas);
} }