metaforce/imgui/ImGuiEngine.cpp

78 lines
2.7 KiB
C++

#include "ImGuiEngine.hpp"
#include "aurora_imgui.h"
#include "athena/Compression.hpp"
#define STBI_NO_STDIO
#define STB_IMAGE_STATIC
#define STB_IMAGE_IMPLEMENTATION
#define STBI_ONLY_PNG
#include "stb_image.h"
#ifdef IMGUI_ENABLE_FREETYPE
#include "misc/freetype/imgui_freetype.h"
#endif
extern "C" const uint8_t NOTO_MONO_FONT[];
extern "C" const size_t NOTO_MONO_FONT_SZ;
extern "C" const size_t NOTO_MONO_FONT_DECOMPRESSED_SZ;
extern "C" const uint8_t METAFORCE_ICON[];
extern "C" const size_t METAFORCE_ICON_SZ;
namespace metaforce {
ImFont* ImGuiEngine::fontNormal;
ImFont* ImGuiEngine::fontLarge;
ImTextureID ImGuiEngine::metaforceIcon;
void ImGuiEngine_Initialize(float scale) {
ImGui::GetCurrentContext();
ImGuiIO& io = ImGui::GetIO();
auto* fontData = new uint8_t[NOTO_MONO_FONT_DECOMPRESSED_SZ];
athena::io::Compression::decompressZlib(static_cast<const atUint8*>(NOTO_MONO_FONT), atUint32(NOTO_MONO_FONT_SZ),
fontData, NOTO_MONO_FONT_DECOMPRESSED_SZ);
ImFontConfig fontConfig{};
fontConfig.FontData = fontData;
fontConfig.FontDataSize = int(NOTO_MONO_FONT_DECOMPRESSED_SZ);
fontConfig.SizePixels = std::floor(15.f * scale);
snprintf(static_cast<char*>(fontConfig.Name), sizeof(fontConfig.Name), "Noto Mono Regular, %dpx",
static_cast<int>(fontConfig.SizePixels));
ImGuiEngine::fontNormal = io.Fonts->AddFont(&fontConfig);
fontConfig.FontDataOwnedByAtlas = false; // first one took ownership
fontConfig.SizePixels = std::floor(26.f * scale);
#ifdef IMGUI_ENABLE_FREETYPE
fontConfig.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Bold;
snprintf(static_cast<char*>(fontConfig.Name), sizeof(fontConfig.Name), "Noto Mono Bold, %dpx",
static_cast<int>(fontConfig.SizePixels));
#else
snprintf(static_cast<char*>(fontConfig.Name), sizeof(fontConfig.Name), "Noto Mono Regular, %dpx",
static_cast<int>(fontConfig.SizePixels));
#endif
ImGuiEngine::fontLarge = io.Fonts->AddFont(&fontConfig);
ImGui::GetStyle().ScaleAllSizes(scale);
}
Icon GetIcon() {
int iconWidth = 0;
int iconHeight = 0;
auto* data = stbi_load_from_memory(static_cast<const stbi_uc*>(METAFORCE_ICON), int(METAFORCE_ICON_SZ), &iconWidth,
&iconHeight, nullptr, 4);
return Icon{
std::unique_ptr<uint8_t[]>{data},
static_cast<size_t>(iconWidth) * static_cast<size_t>(iconHeight) * 4,
static_cast<uint32_t>(iconWidth),
static_cast<uint32_t>(iconHeight),
};
}
void ImGuiEngine_AddTextures(ImGuiState& state, const DeviceHolder& gpu) {
auto icon = GetIcon();
ImGuiEngine::metaforceIcon =
ImGuiEngine_AddTexture(state, gpu, icon.width, icon.height, {icon.data.get(), icon.size});
}
} // namespace metaforce