Removes raw pointers management from sprites owned by CGUI.
This was SVN commit r25695.
This commit is contained in:
parent
8e150199a8
commit
4ffc005a7f
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user