From 17e0bcd332df5bbfb0a56619eb662c93a842f38f Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Sat, 13 Jul 2024 12:37:28 +0200 Subject: [PATCH] common: version api introduced @Issue: https://github.com/thorvg/thorvg/issues/2543 --- inc/thorvg.h | 13 ++++++++++ src/renderer/tvgInitializer.cpp | 44 ++++++++++++++++----------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/inc/thorvg.h b/inc/thorvg.h index 0487d1aa..00197c29 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -1846,6 +1846,19 @@ public: */ static Result term(CanvasEngine engine = tvg::CanvasEngine::All) noexcept; + /** + * @brief Retrieves the version of the TVG engine. + * + * @param[out] major A major version number. + * @param[out] minor A minor version number. + * @param[out] micro A micro version number. + * + * @return The version of the engine in the format major.minor.micro, or a @p nullptr in case of an internal error. + * + * @note Experimental API + */ + static const char* version(uint32_t* major, uint32_t* minor, uint32_t* micro) noexcept; + _TVG_DISABLE_CTOR(Initializer); }; diff --git a/src/renderer/tvgInitializer.cpp b/src/renderer/tvgInitializer.cpp index 74e2aa65..8c7ae5ef 100644 --- a/src/renderer/tvgInitializer.cpp +++ b/src/renderer/tvgInitializer.cpp @@ -54,36 +54,30 @@ static constexpr bool operator &(CanvasEngine a, CanvasEngine b) return int(a) & int(b); } -static bool _buildVersionInfo() +static bool _buildVersionInfo(uint32_t* major, uint32_t* minor, uint32_t* micro) { - auto SRC = THORVG_VERSION_STRING; //ex) 0.3.99 - auto p = SRC; + auto VER = THORVG_VERSION_STRING; + auto p = VER; const char* x; - char major[3]; - x = strchr(p, '.'); - if (!x) return false; - memcpy(major, p, x - p); - major[x - p] = '\0'; + if (!(x = strchr(p, '.'))) return false; + uint32_t majorVal = atoi(p); p = x + 1; - char minor[3]; - x = strchr(p, '.'); - if (!x) return false; - memcpy(minor, p, x - p); - minor[x - p] = '\0'; + if (!(x = strchr(p, '.'))) return false; + uint32_t minorVal = atoi(p); p = x + 1; - char micro[3]; - x = SRC + strlen(THORVG_VERSION_STRING); - memcpy(micro, p, x - p); - micro[x - p] = '\0'; + uint32_t microVal = atoi(p); char sum[7]; - snprintf(sum, sizeof(sum), "%s%s%s", major, minor, micro); - + snprintf(sum, sizeof(sum), "%d%02d%02d", majorVal, minorVal, microVal); _version = atoi(sum); + if (major) *major = majorVal; + if (minor) *minor = minorVal; + if (micro) *micro = microVal; + return true; } @@ -121,7 +115,7 @@ Result Initializer::init(uint32_t threads, CanvasEngine engine) noexcept if (_initCnt++ > 0) return Result::Success; - if (!_buildVersionInfo()) return Result::Unknown; + if (!_buildVersionInfo(nullptr, nullptr, nullptr)) return Result::Unknown; if (!LoaderMgr::init()) return Result::Unknown; @@ -170,8 +164,14 @@ Result Initializer::term(CanvasEngine engine) noexcept } +const char* Initializer::version(uint32_t* major, uint32_t* minor, uint32_t* micro) noexcept +{ + if ((!major && ! minor && !micro) || _buildVersionInfo(major, minor, micro)) return THORVG_VERSION_STRING; + return nullptr; +} + + uint16_t THORVG_VERSION_NUMBER() { return _version; -} - +} \ No newline at end of file