Files
XCEngine/new_editor/app/Rendering/Native/NativeRendererDraw.cpp

86 lines
3.0 KiB
C++

#include "NativeRendererSupport.h"
namespace XCEngine::UI::Editor::Host {
using namespace NativeRendererSupport;
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) {
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