diff --git a/source/util-math.cpp b/source/util-math.cpp index 836e3391..cc69e742 100644 --- a/source/util-math.cpp +++ b/source/util-math.cpp @@ -20,8 +20,10 @@ #include "util-math.h" #include "util-memory.h" #include +#include +#include -void* util::vec3a::operator new(size_t count){ +void* util::vec3a::operator new(size_t count) { return _aligned_malloc(count, 16); } @@ -37,7 +39,7 @@ void util::vec3a::operator delete[](void* p) { _aligned_free(p); } -void* util::vec4a::operator new(size_t count){ +void* util::vec4a::operator new(size_t count) { return _aligned_malloc(count, 16); } @@ -52,3 +54,42 @@ void util::vec4a::operator delete(void* p) { void util::vec4a::operator delete[](void* p) { _aligned_free(p); } + +std::pair util::SizeFromString(std::string text, bool allowSquare) { + int64_t width, height; + + const char* begin = text.c_str(); + const char* end = text.c_str() + text.size() + 1; + char* here = const_cast(end); + + long long res = strtoll(begin, &here, 0); + if (errno == ERANGE) { + return { 0, 0 }; + } + width = res; + + while (here != end) { + if (isdigit(*here) || (*here == '-') || (*here == '+')) { + break; + } + here++; + } + if (here == end) { + // Are we allowed to return a square? + if (allowSquare) { + // Yes: Return width,width. + return { width, width }; + } else { + // No: Return width,0. + return { width, 0 }; + } + } + + res = strtoll(here, nullptr, 0); + if (errno == ERANGE) { + return { width, 0 }; + } + height = res; + + return { width, height }; +} diff --git a/source/util-math.h b/source/util-math.h index 479f4c1e..53f9b145 100644 --- a/source/util-math.h +++ b/source/util-math.h @@ -20,6 +20,8 @@ #pragma once #include #include +#include +#include // OBS #include @@ -60,4 +62,6 @@ namespace util { static void vec4a::operator delete(void* p); static void vec4a::operator delete[](void* p); }; + + std::pair SizeFromString(std::string text, bool allowSquare = true); }