#include "Resources/Win32EditorResourceService.h" #include "EditorResources.h" #include namespace XCEngine::UI::Editor::Host { namespace { int ResolvePngResourceId(EditorHostPngResourceKind kind) { switch (kind) { case EditorHostPngResourceKind::FolderIcon: return IDR_PNG_FOLDER_ICON; case EditorHostPngResourceKind::GameObjectIcon: return IDR_PNG_GAMEOBJECT_ICON; case EditorHostPngResourceKind::SceneIcon: return IDR_PNG_SCENE_ICON; case EditorHostPngResourceKind::Logo: return IDR_PNG_LOGO; case EditorHostPngResourceKind::LogoIcon: return IDR_PNG_LOGO_ICON; case EditorHostPngResourceKind::CameraGizmoIcon: return IDR_PNG_CAMERA_GIZMO_ICON; case EditorHostPngResourceKind::DirectionalLightGizmoIcon: return IDR_PNG_DIRECTIONAL_LIGHT_GIZMO_ICON; case EditorHostPngResourceKind::PointLightGizmoIcon: return IDR_PNG_POINT_LIGHT_GIZMO_ICON; case EditorHostPngResourceKind::SpotLightGizmoIcon: return IDR_PNG_SPOT_LIGHT_GIZMO_ICON; case EditorHostPngResourceKind::PlayButtonIcon: return IDR_PNG_PLAY_BUTTON_ICON; case EditorHostPngResourceKind::PauseButtonIcon: return IDR_PNG_PAUSE_BUTTON_ICON; case EditorHostPngResourceKind::StepButtonIcon: return IDR_PNG_STEP_BUTTON_ICON; case EditorHostPngResourceKind::ViewMoveToolIcon: return IDR_PNG_VIEW_MOVE_TOOL_ICON; case EditorHostPngResourceKind::ViewMoveToolActiveIcon: return IDR_PNG_VIEW_MOVE_TOOL_ACTIVE_ICON; case EditorHostPngResourceKind::MoveToolIcon: return IDR_PNG_MOVE_TOOL_ICON; case EditorHostPngResourceKind::MoveToolActiveIcon: return IDR_PNG_MOVE_TOOL_ACTIVE_ICON; case EditorHostPngResourceKind::RotateToolIcon: return IDR_PNG_ROTATE_TOOL_ICON; case EditorHostPngResourceKind::RotateToolActiveIcon: return IDR_PNG_ROTATE_TOOL_ACTIVE_ICON; case EditorHostPngResourceKind::ScaleToolIcon: return IDR_PNG_SCALE_TOOL_ICON; case EditorHostPngResourceKind::ScaleToolActiveIcon: return IDR_PNG_SCALE_TOOL_ACTIVE_ICON; case EditorHostPngResourceKind::TransformToolIcon: return IDR_PNG_TRANSFORM_TOOL_ICON; case EditorHostPngResourceKind::TransformToolActiveIcon: return IDR_PNG_TRANSFORM_TOOL_ACTIVE_ICON; default: return 0; } } } // namespace Win32EditorResourceService::Win32EditorResourceService(HINSTANCE instance) : m_instance(instance) {} bool Win32EditorResourceService::TryLoadPngResource( EditorHostPngResourceKind kind, EditorHostResourceBytes& outBytes, std::string& outError) const { outBytes = {}; outError.clear(); const int resourceId = ResolvePngResourceId(kind); if (resourceId == 0) { outError = "Unknown PNG resource kind."; return false; } HINSTANCE module = m_instance; if (module == nullptr) { module = GetModuleHandleW(nullptr); } if (module == nullptr) { outError = "GetModuleHandleW(nullptr) returned null."; return false; } HRSRC resource = FindResourceW(module, MAKEINTRESOURCEW(resourceId), L"PNG"); if (resource == nullptr) { outError = "FindResourceW failed."; return false; } HGLOBAL resourceData = LoadResource(module, resource); if (resourceData == nullptr) { outError = "LoadResource failed."; return false; } const DWORD resourceSize = SizeofResource(module, resource); if (resourceSize == 0u) { outError = "SizeofResource returned zero."; return false; } const void* lockedBytes = LockResource(resourceData); if (lockedBytes == nullptr) { outError = "LockResource failed."; return false; } outBytes.data = reinterpret_cast(lockedBytes); outBytes.size = static_cast(resourceSize); return true; } std::filesystem::path Win32EditorResourceService::GetExecutableDirectory() const { std::vector buffer(MAX_PATH); while (true) { const DWORD copied = ::GetModuleFileNameW( nullptr, buffer.data(), static_cast(buffer.size())); if (copied == 0u) { return std::filesystem::current_path().lexically_normal(); } if (copied < buffer.size() - 1u) { return std::filesystem::path(std::wstring(buffer.data(), copied)) .parent_path() .lexically_normal(); } buffer.resize(buffer.size() * 2u); } } } // namespace XCEngine::UI::Editor::Host