diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/texturemanager.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/texturemanager.cpp | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp index 4da872978dd..f5423b34eed 100644 --- a/src/osd/modules/render/bgfx/texturemanager.cpp +++ b/src/osd/modules/render/bgfx/texturemanager.cpp @@ -11,14 +11,18 @@ #include <bgfx/bgfx.h> +#include "emu.h" + #include "texturemanager.h" #include "texture.h" +#include "rendutil.h" +#include "modules/render/copyutil.h" texture_manager::~texture_manager() { - for (std::pair<std::string, bgfx_texture*> texture : m_textures) + for (std::pair<std::string, bgfx_texture_handle_provider*> texture : m_textures) { - if (!(texture.second)->is_target()) + if (texture.second != nullptr && !(texture.second)->is_target()) { delete texture.second; } @@ -26,21 +30,65 @@ texture_manager::~texture_manager() m_textures.clear(); } -void texture_manager::add_texture(std::string name, bgfx_texture* texture) +void texture_manager::add_provider(std::string name, bgfx_texture_handle_provider* provider) { - m_textures[name] = texture; + std::map<std::string, bgfx_texture_handle_provider*>::iterator iter = m_textures.find(name); + if (iter != m_textures.end()) + { + iter->second = provider; + } + else + { + m_textures[name] = provider; + } } bgfx_texture* texture_manager::create_texture(std::string name, bgfx::TextureFormat::Enum format, uint32_t width, uint32_t height, void* data, uint32_t flags) { - bgfx_texture* texture = new bgfx_texture(name, format, width, height, data, flags); + bgfx_texture* texture = new bgfx_texture(name, format, width, height, flags, data); m_textures[name] = texture; return texture; } -bgfx_texture* texture_manager::texture(std::string name) +bgfx_texture* texture_manager::create_png_texture(std::string path, std::string file_name, std::string texture_name, uint32_t flags) +{ + bitmap_argb32 bitmap; + emu_file file(path.c_str(), OPEN_FLAG_READ); + render_load_png(bitmap, file, nullptr, file_name.c_str()); + + uint8_t *texture_data = new uint8_t[bitmap.width() * bitmap.height() * 4]; + + uint32_t width = bitmap.width(); + uint32_t height = bitmap.height(); + uint32_t rowpixels = bitmap.rowpixels(); + void *base = bitmap.raw_pixptr(0); + for (int y = 0; y < height; y++) { + copy_util::copyline_argb32(reinterpret_cast<UINT32 *>(texture_data) + y * width, reinterpret_cast<UINT32 *>(base) + y * rowpixels, width, nullptr); + } + + bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::RGBA8, width, height, texture_data, flags); + + delete[] texture_data; + + return texture; +} + +bgfx::TextureHandle texture_manager::handle(std::string name) +{ + bgfx::TextureHandle handle = BGFX_INVALID_HANDLE; + std::map<std::string, bgfx_texture_handle_provider*>::iterator iter = m_textures.find(name); + if (iter != m_textures.end()) + { + handle = (iter->second)->texture(); + } + + assert(handle.idx != bgfx::invalidHandle); + return handle; +} + +bgfx_texture_handle_provider* texture_manager::provider(std::string name) { - std::map<std::string, bgfx_texture*>::iterator iter = m_textures.find(name); + std::map<std::string, bgfx_texture_handle_provider*>::iterator iter = m_textures.find(name); if (iter != m_textures.end()) { return iter->second; |