metaforce/specter/lib/ViewResources.cpp

93 lines
3.1 KiB
C++
Raw Normal View History

2016-03-04 23:03:47 +00:00
#include "specter/ViewResources.hpp"
2016-03-04 23:03:47 +00:00
namespace specter
{
2016-03-04 23:03:47 +00:00
static logvisor::Module Log("specter::ViewResources");
2015-12-04 01:35:01 +00:00
void ViewResources::init(boo::IGraphicsDataFactory* factory, FontCache* fcache,
const IThemeData* theme, float pf)
{
if (!factory || !fcache || !theme)
2016-03-04 23:03:47 +00:00
Log.report(logvisor::Fatal, "all arguments of ViewResources::init() must be non-null");
m_pixelFactor = pf;
m_factory = factory;
2016-03-30 19:15:32 +00:00
m_theme = theme;
2015-12-04 01:35:01 +00:00
m_fcache = fcache;
unsigned dpi = 72.f * m_pixelFactor;
2016-03-30 19:15:32 +00:00
m_curveFont = fcache->prepCurvesFont(factory, AllCharFilter, false, 8.f, dpi);
m_resData = factory->commitTransaction(
[&](boo::IGraphicsDataFactory::Context& ctx) -> bool
{
2016-03-30 19:15:32 +00:00
switch (ctx.platform())
{
2016-08-24 04:35:06 +00:00
case boo::IGraphicsDataFactory::Platform::OpenGL:
2016-03-30 19:15:32 +00:00
init<boo::GLDataFactory::Context>(static_cast<boo::GLDataFactory::Context&>(ctx), *theme, fcache);
break;
#if _WIN32
2016-03-30 19:15:32 +00:00
case boo::IGraphicsDataFactory::Platform::D3D11:
case boo::IGraphicsDataFactory::Platform::D3D12:
init<boo::ID3DDataFactory::Context>(static_cast<boo::ID3DDataFactory::Context&>(ctx), *theme, fcache);
break;
2016-02-23 02:33:59 +00:00
#endif
#if BOO_HAS_METAL
2016-03-30 19:15:32 +00:00
case boo::IGraphicsDataFactory::Platform::Metal:
init<boo::MetalDataFactory::Context>(static_cast<boo::MetalDataFactory::Context&>(ctx), *theme, fcache);
break;
2016-02-23 02:33:59 +00:00
#endif
#if BOO_HAS_VULKAN
2016-03-30 19:15:32 +00:00
case boo::IGraphicsDataFactory::Platform::Vulkan:
init<boo::VulkanDataFactory::Context>(static_cast<boo::VulkanDataFactory::Context&>(ctx), *theme, fcache);
break;
#endif
2016-03-30 19:15:32 +00:00
default:
Log.report(logvisor::Fatal, _S("unable to init view system for %s"), ctx.platformName());
}
return true;
});
}
void ViewResources::prepFontCacheSync()
2015-12-04 01:35:01 +00:00
{
unsigned dpi = 72.f * m_pixelFactor;
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
2015-12-04 01:35:01 +00:00
m_mainFont = m_fcache->prepMainFont(m_factory, AllCharFilter, false, 10.f, dpi);
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
2015-12-04 01:35:01 +00:00
m_monoFont = m_fcache->prepMonoFont(m_factory, AllCharFilter, false, 10.f, dpi);
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
2015-12-04 01:35:01 +00:00
m_heading14 = m_fcache->prepMainFont(m_factory, LatinAndJapaneseCharFilter, false, 14.f, dpi);
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
2015-12-04 01:35:01 +00:00
m_heading18 = m_fcache->prepMainFont(m_factory, LatinAndJapaneseCharFilter, false, 18.f, dpi);
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
m_titleFont = m_fcache->prepMainFont(m_factory, LatinCharFilter, false, 36.f, dpi);
2015-12-13 03:07:12 +00:00
if (m_fcacheInterrupt) return;
2015-12-04 01:35:01 +00:00
m_fcache->closeBuiltinFonts();
m_fcacheReady = true;
}
void ViewResources::prepFontCacheAsync(boo::IWindow* window)
{
m_fcacheReady = false;
m_fcacheThread = std::thread([this, window]()
{
window->getLoadContextDataFactory();
prepFontCacheSync();
});
}
void ViewResources::resetPixelFactor(float pf)
{
m_pixelFactor = pf;
unsigned dpi = 72.f * m_pixelFactor;
m_curveFont = m_fcache->prepCurvesFont(m_factory, AllCharFilter, false, 8.f, dpi);
prepFontCacheSync();
2015-12-04 01:35:01 +00:00
}
void ViewResources::resetTheme(const IThemeData* theme)
2015-12-04 01:35:01 +00:00
{
m_theme = theme;
}
}