Files
ULRE/src/GUI/ThemeEngine.cpp

134 lines
3.0 KiB
C++

#include<hgl/gui/ThemeEngine.h>
#include<hgl/gui/ThemeForm.h>
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VKDevice.h>
namespace hgl
{
namespace gui
{
namespace
{
ThemeEngine *default_theme_engine=nullptr;
}//namespace
ThemeEngine *CreateDefaultThemeEngine(GPUDevice *dev);
ThemeEngine *GetDefaultThemeEngine(GPUDevice *dev)
{
if(!default_theme_engine)
default_theme_engine=CreateDefaultThemeEngine(dev);
return default_theme_engine;
}
ThemeEngine *CreateThemeEngine(GPUDevice *dev)
{
return GetDefaultThemeEngine();
}
RenderTarget *ThemeEngine::CreateRT(const uint32_t w,const uint32_t h,const VkFormat format)
{
const uint width=power_to_2(w);
const uint height=power_to_2(h);
FramebufferInfo fbi(format,w,h);
return device->CreateRT(&fbi);
}
bool ThemeEngine::Registry(Form *f,const VkFormat format)
{
if(!f)return(false);
if(form_list.ContainsKey(f))
return(false);
Vector2f size=f->GetSize();
RenderTarget *rt=CreateRT(size.x,size.y,format);
if(!rt)return(false);
ThemeForm *tf=CreateForm(f,rt);
form_list.Add(f,tf);
return(true);
}
void ThemeEngine::Unregistry(Form *f)
{
if(!f)return;
ThemeForm *tf;
if(!form_list.Get(f,tf))
return;
delete tf;
}
bool ThemeEngine::Resize(Form *f,const uint32_t w,const uint32_t h,const VkFormat format)
{
if(!f)return(false);
ThemeForm *tf;
if(!form_list.Get(f,tf))return(false);
if(w<=0||h<=0)
{
tf->SetRenderTarget(nullptr);
return(true);
}
RenderTarget *old_rt=tf->GetRenderTarget();
if(!old_rt)
{
const VkExtent2D old_size=old_rt->GetExtent();
if(old_size.width>=w
&&old_size.height>=h)
{
tf->Resize(w,h);
return(true);
}
}
graph::RenderTarget *rt=CreateRT(w,h,format);
if(!rt)return(false);
tf->SetRenderTarget(rt);
tf->Resize(w,h);
return(true);
}
bool ThemeEngine::Render(ThemeForm *tf)
{
tf->BeginRender();
tf->Render();
tf->EndRender();
}
bool ThemeEngine::Render(Form *f)
{
if(!f)return(false);
const Vector2f &size=f->GetSize();
if(size.x==0&&size.y==0)return(false);
ThemeForm *tf;
if(!form_list.Get(f,tf))
return(false);
return Render(tf);
}
}//namespace gui
}//namespace hgl