You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
#include "pch.h"
|
|
#include "SVGLength.h"
|
|
#if __has_include("SVGLength.g.cpp")
|
|
#include "SVGLength.g.cpp"
|
|
#endif
|
|
|
|
namespace winrt::RNSVG::implementation {
|
|
SVGLength::SVGLength(float value) : m_value(value), m_unit(RNSVG::LengthType::Number) {}
|
|
|
|
SVGLength::SVGLength(float value, RNSVG::LengthType type) : m_value(value), m_unit(type) {}
|
|
|
|
RNSVG::SVGLength SVGLength::From(std::string value) {
|
|
auto strLength{value.size()};
|
|
if (strLength == 0 || value == "normal") {
|
|
return {0.0, RNSVG::LengthType::Unknown};
|
|
} else if (value.back() == '%') {
|
|
return {std::stof(value.substr(0, strLength - 1), nullptr), RNSVG::LengthType::Percentage};
|
|
} else if (strLength > 2) {
|
|
auto end{strLength - 2};
|
|
auto lastTwo{value.substr(end)};
|
|
|
|
auto unit{RNSVG::LengthType::Unknown};
|
|
if (lastTwo == "px") {
|
|
unit = RNSVG::LengthType::Number;
|
|
} else if (lastTwo == "em") {
|
|
unit = RNSVG::LengthType::EMS;
|
|
} else if (lastTwo == "ex") {
|
|
unit = RNSVG::LengthType::EXS;
|
|
} else if (lastTwo == "cm") {
|
|
unit = RNSVG::LengthType::Centimeter;
|
|
} else if (lastTwo == "mm") {
|
|
unit = RNSVG::LengthType::Millimeter;
|
|
} else if (lastTwo == "in") {
|
|
unit = RNSVG::LengthType::Inch;
|
|
} else if (lastTwo == "pt") {
|
|
unit = RNSVG::LengthType::Point;
|
|
} else if (lastTwo == "pc") {
|
|
unit = RNSVG::LengthType::Pica;
|
|
} else {
|
|
unit = RNSVG::LengthType::Number;
|
|
end = strLength;
|
|
}
|
|
|
|
return {std::stof(value.substr(0, end), nullptr), unit};
|
|
}
|
|
|
|
return {std::stof(value, nullptr), RNSVG::LengthType::Number};
|
|
}
|
|
|
|
RNSVG::SVGLength SVGLength::From(Microsoft::ReactNative::JSValue const &propertyValue) {
|
|
if (propertyValue.IsNull()) {
|
|
return {0.0f, RNSVG::LengthType::Unknown};
|
|
} else if (propertyValue.Type() == Microsoft::ReactNative::JSValueType::String) {
|
|
return SVGLength::From(propertyValue.AsString());
|
|
} else {
|
|
return RNSVG::SVGLength(propertyValue.AsSingle());
|
|
}
|
|
}
|
|
} // namespace winrt::RNSVG::implementation
|