metaforce/imgui/ImGuiEngine.cpp

78 lines
2.7 KiB
C++
Raw Normal View History

2021-05-24 21:25:31 +00:00
#include "ImGuiEngine.hpp"
2022-02-01 00:06:54 +00:00
#include "aurora_imgui.h"
#include "athena/Compression.hpp"
2021-05-24 21:25:31 +00:00
2021-05-27 04:56:25 +00:00
#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;
2021-05-27 04:56:25 +00:00
extern "C" const uint8_t METAFORCE_ICON[];
extern "C" const size_t METAFORCE_ICON_SZ;
2021-05-24 21:25:31 +00:00
namespace metaforce {
2021-05-27 04:56:25 +00:00
ImFont* ImGuiEngine::fontNormal;
ImFont* ImGuiEngine::fontLarge;
2022-02-01 00:06:54 +00:00
ImTextureID ImGuiEngine::metaforceIcon;
2021-05-27 04:56:25 +00:00
2022-02-01 00:06:54 +00:00
void ImGuiEngine_Initialize(float scale) {
ImGui::GetCurrentContext();
2021-05-24 21:25:31 +00:00
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);
2021-05-27 04:56:25 +00:00
ImFontConfig fontConfig{};
fontConfig.FontData = fontData;
fontConfig.FontDataSize = int(NOTO_MONO_FONT_DECOMPRESSED_SZ);
2022-02-09 07:08:07 +00:00
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));
2022-02-01 00:06:54 +00:00
ImGuiEngine::fontNormal = io.Fonts->AddFont(&fontConfig);
2022-02-09 07:08:07 +00:00
2021-05-27 12:25:55 +00:00
fontConfig.FontDataOwnedByAtlas = false; // first one took ownership
2022-02-09 07:08:07 +00:00
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",
2021-05-27 04:56:25 +00:00
static_cast<int>(fontConfig.SizePixels));
#endif
2022-02-01 00:06:54 +00:00
ImGuiEngine::fontLarge = io.Fonts->AddFont(&fontConfig);
ImGui::GetStyle().ScaleAllSizes(scale);
2021-05-24 21:25:31 +00:00
}
2022-02-08 08:28:56 +00:00
Icon GetIcon() {
2022-02-01 00:06:54 +00:00
int iconWidth = 0;
int iconHeight = 0;
2022-02-08 08:28:56 +00:00
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});
2021-05-24 21:25:31 +00:00
}
} // namespace metaforce