#include "NativeRendererInternal.h" namespace XCEngine::UI::Editor::Host { using namespace NativeRendererInternal; 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 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& clipStack) { solidBrush.SetColor(ToD2DColor(command.color)); switch (command.type) { case ::XCEngine::UI::UIDrawCommandType::FilledRect: RenderFilledRectCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::FilledRectLinearGradient: RenderFilledRectLinearGradientCommand(renderTarget, command); break; case ::XCEngine::UI::UIDrawCommandType::RectOutline: RenderRectOutlineCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::Line: RenderLineCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::FilledTriangle: RenderFilledTriangleCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::FilledCircle: RenderFilledCircleCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::CircleOutline: RenderCircleOutlineCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::Text: RenderTextCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::Image: RenderImageCommand(renderTarget, solidBrush, command); break; case ::XCEngine::UI::UIDrawCommandType::PushClipRect: { const float dpiScale = ClampDpiScale(m_dpiScale); 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