Extract canvas layer flows, pen modes, and node attributes

This commit is contained in:
2026-06-16 20:09:25 +02:00
parent 9b2a0d9c30
commit d6a7512b94
10 changed files with 832 additions and 747 deletions

View File

@@ -0,0 +1,207 @@
#include "pch.h"
#include "legacy_ui_node_attributes.h"
#include "log.h"
#include "node.h"
namespace pp::panopainter {
void parse_legacy_ui_node_attribute(Node& node, kAttribute ka, const tinyxml2::XMLAttribute* attr)
{
switch (ka)
{
case kAttribute::id:
node.m_nodeID_s = attr->Value();
node.m_nodeID = const_hash(attr->Value());
break;
case kAttribute::Width:
if (strcmp(attr->Value(), "auto") == 0)
{
YGNodeStyleSetWidth(node.y_node, YGUndefined);
YGNodeStyleSetWidthPercent(node.y_node, YGUndefined);
node.auto_width = true;
}
else
{
if (strchr(attr->Value(), '%'))
YGNodeStyleSetWidthPercent(node.y_node, attr->FloatValue());
else
YGNodeStyleSetWidth(node.y_node, attr->FloatValue());
node.auto_width = false;
}
break;
case kAttribute::MinWidth:
YGNodeStyleSetMinWidth(node.y_node, attr->FloatValue());
break;
case kAttribute::MaxWidth:
YGNodeStyleSetMaxWidth(node.y_node, attr->FloatValue());
break;
case kAttribute::Height:
if (strcmp(attr->Value(), "auto") == 0)
{
YGNodeStyleSetHeight(node.y_node, YGUndefined);
YGNodeStyleSetHeightPercent(node.y_node, YGUndefined);
node.auto_height = true;
}
else
{
if (strchr(attr->Value(), '%'))
YGNodeStyleSetHeightPercent(node.y_node, attr->FloatValue());
else
YGNodeStyleSetHeight(node.y_node, attr->FloatValue());
node.auto_height = false;
}
break;
case kAttribute::MinHeight:
YGNodeStyleSetMinHeight(node.y_node, attr->FloatValue());
break;
case kAttribute::MaxHeight:
YGNodeStyleSetMaxHeight(node.y_node, attr->FloatValue());
break;
case kAttribute::Grow:
YGNodeStyleSetFlexGrow(node.y_node, attr->FloatValue());
break;
case kAttribute::Shrink:
YGNodeStyleSetFlexShrink(node.y_node, attr->FloatValue());
break;
case kAttribute::FlexDir:
{
YGFlexDirection dir = YGFlexDirectionRow;
if (strcmp("col", attr->Value()) == 0)
dir = YGFlexDirectionColumn;
else if (strcmp("col-reverse", attr->Value()) == 0)
dir = YGFlexDirectionColumnReverse;
else if (strcmp("row", attr->Value()) == 0)
dir = YGFlexDirectionRow;
else if (strcmp("row-reverse", attr->Value()) == 0)
dir = YGFlexDirectionRowReverse;
YGNodeStyleSetFlexDirection(node.y_node, dir);
break;
}
case kAttribute::FlexWrap:
YGNodeStyleSetFlexWrap(node.y_node, attr->IntValue() ? YGWrapWrap : YGWrapNoWrap);
break;
case kAttribute::Justify:
{
YGJustify v = YGJustifyFlexStart;
if (strcmp("center", attr->Value()) == 0)
v = YGJustifyCenter;
else if (strcmp("flex-start", attr->Value()) == 0)
v = YGJustifyFlexStart;
else if (strcmp("flex-end", attr->Value()) == 0)
v = YGJustifyFlexEnd;
else if (strcmp("space-around", attr->Value()) == 0)
v = YGJustifySpaceAround;
else if (strcmp("space-between", attr->Value()) == 0)
v = YGJustifySpaceBetween;
YGNodeStyleSetJustifyContent(node.y_node, v);
break;
}
case kAttribute::Align:
{
YGAlign v = YGAlignStretch;
if (strcmp("stretch", attr->Value()) == 0)
v = YGAlignStretch;
else if (strcmp("flex-start", attr->Value()) == 0)
v = YGAlignFlexStart;
else if (strcmp("flex-end", attr->Value()) == 0)
v = YGAlignFlexEnd;
else if (strcmp("center", attr->Value()) == 0)
v = YGAlignCenter;
YGNodeStyleSetAlignItems(node.y_node, v);
break;
}
case kAttribute::Positioning:
{
YGPositionType v = YGPositionTypeRelative;
if (strcmp("relative", attr->Value()) == 0)
v = YGPositionTypeRelative;
else if (strcmp("absolute", attr->Value()) == 0)
v = YGPositionTypeAbsolute;
YGNodeStyleSetPositionType(node.y_node, v);
break;
}
case kAttribute::Position:
{
glm::vec4 v;
int n = sscanf(attr->Value(), "%f %f %f %f", &v.x, &v.y, &v.z, &v.w);
if (n == 2)
{
YGNodeStyleSetPosition(node.y_node, YGEdgeLeft, v.x);
YGNodeStyleSetPosition(node.y_node, YGEdgeTop, v.y);
}
else
{
YGNodeStyleSetPadding(node.y_node, YGEdgeLeft, v.x);
YGNodeStyleSetPadding(node.y_node, YGEdgeTop, v.y);
YGNodeStyleSetPadding(node.y_node, YGEdgeRight, v.z);
YGNodeStyleSetPadding(node.y_node, YGEdgeBottom, v.w);
}
break;
}
case kAttribute::Padding:
{
glm::vec4 pad;
int n = sscanf(attr->Value(), "%f %f %f %f", &pad.x, &pad.y, &pad.z, &pad.w);
if (n == 1)
{
YGNodeStyleSetPadding(node.y_node, YGEdgeTop, pad.x);
YGNodeStyleSetPadding(node.y_node, YGEdgeRight, pad.x);
YGNodeStyleSetPadding(node.y_node, YGEdgeBottom, pad.x);
YGNodeStyleSetPadding(node.y_node, YGEdgeLeft, pad.x);
}
else
{
YGNodeStyleSetPadding(node.y_node, YGEdgeTop, pad.x);
YGNodeStyleSetPadding(node.y_node, YGEdgeRight, pad.y);
YGNodeStyleSetPadding(node.y_node, YGEdgeBottom, pad.z);
YGNodeStyleSetPadding(node.y_node, YGEdgeLeft, pad.w);
}
break;
}
case kAttribute::Margin:
{
glm::vec4 pad;
int n = sscanf(attr->Value(), "%f %f %f %f", &pad.x, &pad.y, &pad.z, &pad.w);
if (n == 1)
{
YGNodeStyleSetMargin(node.y_node, YGEdgeTop, pad.x);
YGNodeStyleSetMargin(node.y_node, YGEdgeRight, pad.x);
YGNodeStyleSetMargin(node.y_node, YGEdgeBottom, pad.x);
YGNodeStyleSetMargin(node.y_node, YGEdgeLeft, pad.x);
}
else
{
YGNodeStyleSetMargin(node.y_node, YGEdgeTop, pad.x);
YGNodeStyleSetMargin(node.y_node, YGEdgeRight, pad.y);
YGNodeStyleSetMargin(node.y_node, YGEdgeBottom, pad.z);
YGNodeStyleSetMargin(node.y_node, YGEdgeLeft, pad.w);
}
break;
}
case kAttribute::FloodEvents:
node.m_flood_events = attr->BoolValue();
break;
case kAttribute::MouseCapture:
node.m_force_mouse_capture = attr->BoolValue();
break;
case kAttribute::AspectRatio:
YGNodeStyleSetAspectRatio(node.y_node, attr->FloatValue());
break;
case kAttribute::RTL:
if (strcmp("rtl", attr->Value()) == 0)
node.SetRTL(YGDirectionRTL);
else if (strcmp("ltr", attr->Value()) == 0)
node.SetRTL(YGDirectionLTR);
else if (strcmp("inherit", attr->Value()) == 0)
node.SetRTL(YGDirectionInherit);
else
{
LOG("Attribute %s for RTL unrecognized", attr->Value());
}
default:
break;
}
}
} // namespace pp::panopainter