2026-04-15 22:47:42 +08:00
|
|
|
#include "NativeRendererInternal.h"
|
2026-04-15 08:24:06 +08:00
|
|
|
|
|
|
|
|
namespace XCEngine::UI::Editor::Host {
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
using namespace NativeRendererInternal;
|
2026-04-15 08:24:06 +08:00
|
|
|
|
|
|
|
|
bool NativeRenderer::RenderToTarget(
|
|
|
|
|
ID2D1RenderTarget& renderTarget,
|
|
|
|
|
ID2D1SolidColorBrush& solidBrush,
|
|
|
|
|
const ::XCEngine::UI::UIDrawData& drawData) {
|
|
|
|
|
renderTarget.SetDpi(kBaseDpi, kBaseDpi);
|
|
|
|
|
renderTarget.SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE);
|
|
|
|
|
renderTarget.BeginDraw();
|
|
|
|
|
renderTarget.Clear(D2D1::ColorF(0.04f, 0.05f, 0.06f, 1.0f));
|
|
|
|
|
|
|
|
|
|
std::vector<D2D1_RECT_F> clipStack = {};
|
|
|
|
|
for (const ::XCEngine::UI::UIDrawList& drawList : drawData.GetDrawLists()) {
|
|
|
|
|
for (const ::XCEngine::UI::UIDrawCommand& command : drawList.GetCommands()) {
|
|
|
|
|
RenderCommand(renderTarget, solidBrush, command, clipStack);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (!clipStack.empty()) {
|
|
|
|
|
renderTarget.PopAxisAlignedClip();
|
|
|
|
|
clipStack.pop_back();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NativeRenderer::RenderCommand(
|
|
|
|
|
ID2D1RenderTarget& renderTarget,
|
|
|
|
|
ID2D1SolidColorBrush& solidBrush,
|
|
|
|
|
const ::XCEngine::UI::UIDrawCommand& command,
|
|
|
|
|
std::vector<D2D1_RECT_F>& clipStack) {
|
|
|
|
|
solidBrush.SetColor(ToD2DColor(command.color));
|
|
|
|
|
|
|
|
|
|
switch (command.type) {
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::FilledRect:
|
|
|
|
|
RenderFilledRectCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::FilledRectLinearGradient:
|
|
|
|
|
RenderFilledRectLinearGradientCommand(renderTarget, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::RectOutline:
|
|
|
|
|
RenderRectOutlineCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::Line:
|
|
|
|
|
RenderLineCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::FilledTriangle:
|
|
|
|
|
RenderFilledTriangleCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::FilledCircle:
|
|
|
|
|
RenderFilledCircleCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::CircleOutline:
|
|
|
|
|
RenderCircleOutlineCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::Text:
|
|
|
|
|
RenderTextCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
2026-04-15 10:36:09 +08:00
|
|
|
case ::XCEngine::UI::UIDrawCommandType::Image:
|
|
|
|
|
RenderImageCommand(renderTarget, solidBrush, command);
|
2026-04-15 08:24:06 +08:00
|
|
|
break;
|
|
|
|
|
case ::XCEngine::UI::UIDrawCommandType::PushClipRect: {
|
2026-04-15 10:36:09 +08:00
|
|
|
const float dpiScale = ClampDpiScale(m_dpiScale);
|
2026-04-15 08:24:06 +08:00
|
|
|
const D2D1_RECT_F rect = ToD2DRect(command.rect, dpiScale);
|
|
|
|
|
renderTarget.PushAxisAlignedClip(rect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
|
|
|
|
clipStack.push_back(rect);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case ::XCEngine::UI::UIDrawCommandType::PopClipRect: {
|
|
|
|
|
if (!clipStack.empty()) {
|
|
|
|
|
renderTarget.PopAxisAlignedClip();
|
|
|
|
|
clipStack.pop_back();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace XCEngine::UI::Editor::Host
|