#include "ui/LoadXML.hpp" #include "gx/Coordinate.hpp" #include "ui/CSimpleFontString.hpp" #include "ui/CSimpleTexture.hpp" #include "util/CStatus.hpp" #include #include int32_t LoadXML_Color(XMLNode* node, CImVector& color) { float r = 0.0f; float g = 0.0f; float b = 0.0f; float a = 1.0f; auto rAttr = node->GetAttributeByName("r"); if (rAttr && *rAttr) { if (SStrToFloat(rAttr) <= 0.0f) { r = 0.0f; } else if (SStrToFloat(rAttr) >= 1.0f) { r = 1.0f; } else { r = SStrToFloat(rAttr); } } auto gAttr = node->GetAttributeByName("g"); if (gAttr && *gAttr) { if (SStrToFloat(gAttr) <= 0.0f) { g = 0.0f; } else if (SStrToFloat(gAttr) >= 1.0f) { g = 1.0f; } else { g = SStrToFloat(gAttr); } } auto bAttr = node->GetAttributeByName("b"); if (bAttr && *bAttr) { if (SStrToFloat(bAttr) <= 0.0f) { b = 0.0f; } else if (SStrToFloat(bAttr) >= 1.0f) { b = 1.0f; } else { b = SStrToFloat(bAttr); } } auto aAttr = node->GetAttributeByName("a"); if (aAttr && *aAttr) { if (SStrToFloat(aAttr) <= 0.0f) { a = 0.0f; } else if (SStrToFloat(aAttr) >= 1.0f) { a = 1.0f; } else { a = SStrToFloat(aAttr); } } color.Set(a, r, g, b); return 1; } int32_t LoadXML_Dimensions(XMLNode* node, float& x, float& y, CStatus* status) { const char* xAttr = node->GetAttributeByName("x"); if (xAttr && *xAttr) { float v18 = SStrToFloat(xAttr); float v6 = v18 / (CoordinateGetAspectCompensation() * 1024.0f); x = NDCToDDCWidth(v6); } const char* yAttr = node->GetAttributeByName("y"); if (yAttr && *yAttr) { float v19 = SStrToFloat(yAttr); float v9 = v19 / (CoordinateGetAspectCompensation() * 1024.0f); y = NDCToDDCWidth(v9); } XMLNode* childNode = node->m_child; if (!childNode) { return yAttr != nullptr; } if (!SStrCmpI(childNode->GetName(), "RelDimension", 0x7FFFFFFF)) { const char* xAttrRel = childNode->GetAttributeByName("x"); if (xAttrRel && *xAttrRel) { x = SStrToFloat(xAttrRel); } const char* yAttrRel = childNode->GetAttributeByName("y"); if (yAttrRel && *yAttrRel) { y = SStrToFloat(yAttrRel); } return 1; } else if (!SStrCmpI(childNode->GetName(), "AbsDimension", 0x7FFFFFFF)) { const char* xAttrAbs = childNode->GetAttributeByName("x"); if (xAttrAbs && *xAttrAbs) { float v20 = SStrToFloat(xAttrAbs); float v13 = v20 / (CoordinateGetAspectCompensation() * 1024.0f); x = NDCToDDCWidth(v13); } const char* yAttrAbs = childNode->GetAttributeByName("y"); if (yAttrAbs && *yAttrAbs) { float v21 = SStrToFloat(yAttrAbs); float v15 = v21 / (CoordinateGetAspectCompensation() * 1024.0f); y = NDCToDDCWidth(v15); } return 1; } else { status->Add( STATUS_WARNING, "Unknown child node in %s element: %s", node->GetName(), childNode->GetName() ); return 0; } } int32_t LoadXML_Insets(XMLNode* node, float& left, float& right, float& top, float& bottom, CStatus* status) { left = 0.0f; right = 0.0f; top = 0.0f; bottom = 0.0f; const char* leftAttr = node->GetAttributeByName("left"); if (leftAttr && *leftAttr) { float l = SStrToFloat(leftAttr); float ndcl = l / (CoordinateGetAspectCompensation() * 1024.0f); left = NDCToDDCWidth(ndcl); } const char* rightAttr = node->GetAttributeByName("right"); if (rightAttr && *rightAttr) { float r = SStrToFloat(rightAttr); float ndcr = r / (CoordinateGetAspectCompensation() * 1024.0f); right = NDCToDDCWidth(ndcr); } const char* topAttr = node->GetAttributeByName("top"); if (topAttr && *topAttr) { float t = SStrToFloat(topAttr); float ndct = t / (CoordinateGetAspectCompensation() * 1024.0f); top = NDCToDDCWidth(ndct); } const char* bottomAttr = node->GetAttributeByName("bottom"); if (bottomAttr && *bottomAttr) { float b = SStrToFloat(bottomAttr); float ndcb = b / (CoordinateGetAspectCompensation() * 1024.0f); bottom = NDCToDDCWidth(ndcb); } auto child = node->m_child; if (!child) { if (!bottomAttr) { status->Add( STATUS_WARNING, "No \"right\", \"left\", \"top\", or \"bottom\" attributes in element: %s", node->GetName() ); return 0; } return 1; } if (!SStrCmpI(child->GetName(), "AbsInset", STORM_MAX_STR)) { const char* leftAttr = child->GetAttributeByName("left"); if (leftAttr && *leftAttr) { float l = SStrToFloat(leftAttr); float ndcl = l / (CoordinateGetAspectCompensation() * 1024.0f); left = NDCToDDCWidth(ndcl); } const char* rightAttr = child->GetAttributeByName("right"); if (rightAttr && *rightAttr) { float r = SStrToFloat(rightAttr); float ndcr = r / (CoordinateGetAspectCompensation() * 1024.0f); right = NDCToDDCWidth(ndcr); } const char* topAttr = child->GetAttributeByName("top"); if (topAttr && *topAttr) { float t = SStrToFloat(topAttr); float ndct = t / (CoordinateGetAspectCompensation() * 1024.0f); top = NDCToDDCWidth(ndct); } const char* bottomAttr = child->GetAttributeByName("bottom"); if (bottomAttr && *bottomAttr) { float b = SStrToFloat(bottomAttr); float ndcb = b / (CoordinateGetAspectCompensation() * 1024.0f); bottom = NDCToDDCWidth(ndcb); } return 1; } if (!SStrCmpI(child->GetName(), "RelInset", STORM_MAX_STR)) { const char* leftAttr = child->GetAttributeByName("left"); if (leftAttr && *leftAttr) { left = SStrToFloat(leftAttr); } const char* rightAttr = child->GetAttributeByName("right"); if (rightAttr && *rightAttr) { right = SStrToFloat(rightAttr); } const char* topAttr = child->GetAttributeByName("top"); if (topAttr && *topAttr) { top = SStrToFloat(topAttr); } const char* bottomAttr = child->GetAttributeByName("bottom"); if (bottomAttr && *bottomAttr) { bottom = SStrToFloat(bottomAttr); } return 1; } status->Add( STATUS_WARNING, "Unknown child node in %s element: %s", child->GetName() ); return 0; } CSimpleFontString* LoadXML_String(XMLNode* node, CSimpleFrame* frame, CStatus* status) { // TODO // auto m = CDataAllocator::GetData(CSimpleFontString::s_allocator, 0, a__avcsimplefon, -2); auto m = SMemAlloc(sizeof(CSimpleFontString), __FILE__, __LINE__, 0x0); auto fontString = new (m) CSimpleFontString(frame, 2, 1); fontString->PreLoadXML(node, status); fontString->LoadXML(node, status); fontString->PostLoadXML(node, status); return fontString; } CSimpleTexture* LoadXML_Texture(XMLNode* node, CSimpleFrame* frame, CStatus* status) { // TODO // auto m = (CSimpleTexture *)CDataAllocator::GetData((int)CSimpleTexture::s_allocator, 0, a__avcsimpletex, -2); auto m = SMemAlloc(sizeof(CSimpleTexture), __FILE__, __LINE__, 0x0); auto texture = new (m) CSimpleTexture(frame, 2, 1); texture->PreLoadXML(node, status); texture->LoadXML(node, status); texture->PostLoadXML(node, status); return texture; } int32_t LoadXML_Value(XMLNode* node, float& value, CStatus* status) { value = 0.0; const char* v4 = node->GetAttributeByName("val"); if (v4 && *v4) { float v = SStrToFloat(v4); float ndc = v / (CoordinateGetAspectCompensation() * 1024.0); value = NDCToDDCWidth(ndc); } XMLNode* child = node->m_child; if (!child) { if (v4) { return 1; } else { status->Add(STATUS_WARNING, "No \"val\" attribute in element: %s", node->GetName()); return 0; } } if (!SStrCmpI(child->GetName(), "AbsValue", 0x7FFFFFFF)) { const char* v9 = child->GetAttributeByName("val"); if (v9 && *v9) { float v = SStrToFloat(v9); float ndc = v / (CoordinateGetAspectCompensation() * 1024.0); value = NDCToDDCWidth(ndc); } return 1; } else if (!SStrCmpI(child->GetName(), "RelValue", 0x7FFFFFFF)) { const char* v11 = child->GetAttributeByName("val"); if (v11 && *v11) { value = SStrToFloat(v11); } return 1; } else { status->Add(STATUS_WARNING, "Unknown child node in %s element: %s", child->GetName(), node->GetName()); return 0; } }