integrate RMLUI library

This commit is contained in:
2026-01-03 12:17:19 +01:00
parent 784e054105
commit 1074a1e59a
90 changed files with 3939 additions and 4 deletions

View File

@@ -2,12 +2,89 @@
#include "egl_context.h"
#include "render_target.h"
#include "logger.h"
#include "assets_manager.h"
#include "aidl/com/omixlab/mosis/IMosisListener.h"
#include <android/hardware_buffer.h>
#include <android/asset_manager.h>
#include <RmlUi/Core.h>
#include "RmlUi_Renderer_GL3.h"
#include <ranges>
#include <span>
using namespace aidl::com::omixlab::mosis;
using namespace aidl::android::hardware;
class AssetFilesInterface : public Rml::FileInterface
{
public:
static AssetFilesInterface& Instance()
{
static AssetFilesInterface instance;
return instance;
}
Rml::FileHandle Open(const Rml::String &path) override
{
AAssetManager* am = AssetsManager::Native();
AAsset* asset = AAssetManager_open(am, path.c_str(), AASSET_MODE_BUFFER);
return reinterpret_cast<Rml::FileHandle>(asset);
}
void Close(Rml::FileHandle file) override
{
AAsset* asset = reinterpret_cast<AAsset*>(file);
AAsset_close(asset);
}
size_t Read(void *buffer, size_t size, Rml::FileHandle file) override
{
AAsset* asset = reinterpret_cast<AAsset*>(file);
return AAsset_read(asset, buffer, size);
}
bool Seek(Rml::FileHandle file, long offset, int origin) override
{
AAsset* asset = reinterpret_cast<AAsset*>(file);
off_t new_cursor = AAsset_seek(asset, offset, origin);
return new_cursor != -1;
}
size_t Tell(Rml::FileHandle file) override
{
AAsset* asset = reinterpret_cast<AAsset*>(file);
return AAsset_seek(asset, 0, SEEK_CUR);
}
size_t Length(Rml::FileHandle file) override
{
AAsset* asset = reinterpret_cast<AAsset*>(file);
return AAsset_getLength(asset);
}
bool LoadFile(const Rml::String &path, Rml::String &out_data) override
{
AAssetManager* am = AssetsManager::Native();
AAsset* asset = AAssetManager_open(am, path.c_str(), AASSET_MODE_BUFFER);
if (!asset)
return false;
out_data.resize(AAsset_getLength(asset));
auto data_ptr = static_cast<const char*>(AAsset_getBuffer(asset));
std::span data = std::span(data_ptr, out_data.size());
std::ranges::copy(data, out_data.begin());
return true;
}
};
class SystemInterface : public Rml::SystemInterface
{
public:
static SystemInterface& Instance()
{
static SystemInterface instance;
return instance;
}
bool LogMessage(Rml::Log::Type type, const Rml::String &message) override
{
Logger::Log(std::format("RMLUI: {}", message));
return true;
}
};
void Kernel::main_loop()
{
m_egl_context = std::make_unique<egl::Context>();
@@ -30,12 +107,45 @@ void Kernel::main_loop()
for (const auto& [pid, l] : m_listeners)
l->onBufferAvailable(*m_aidl_buffer);
RenderInterface_GL3 rmlui_render_interface;
if (!rmlui_render_interface)
{
Logger::Log("failed to create render interface");
return;
}
Rml::SetRenderInterface(&rmlui_render_interface);
Rml::SetFileInterface(&AssetFilesInterface::Instance());
Rml::SetSystemInterface(&SystemInterface::Instance());
Rml::Initialise();
Rml::Context* context = Rml::CreateContext("default", Rml::Vector2i(1024, 1024));
if (!context)
{
Logger::Log("RMLUI failed to create a context");
Rml::Shutdown();
return;
}
Rml::LoadFontFace("Roboto/static/Roboto_Condensed-Regular.ttf");
Rml::LoadFontFace("LatoLatin-Regular.ttf");
// Now we are ready to load our document.
Rml::ElementDocument* document = context->LoadDocument("demo.rml");
document->Show();
while (true)
{
static float angle = 0.0f;
angle += 0.1f;
m_render_target->bind();
glClearColor(fabs(sin(angle)), 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 1024, 1024);
context->Update();
rmlui_render_interface.SetViewport(1024, 1024);
rmlui_render_interface.BeginFrame();
context->Render();
rmlui_render_interface.EndFrame(m_render_target->framebuffer());
glFinish();
{
std::lock_guard _lock(m_mutex);
@@ -44,6 +154,7 @@ void Kernel::main_loop()
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
Rml::Shutdown();
}
Kernel::Kernel(const std::shared_ptr<IMosisListener> &listener)