common: version api introduced

@Issue: https://github.com/thorvg/thorvg/issues/2543
This commit is contained in:
Mira Grudzinska 2024-07-13 12:37:28 +02:00 committed by Hermet Park
parent f4e1c13a79
commit 17e0bcd332
2 changed files with 35 additions and 22 deletions

View file

@ -1846,6 +1846,19 @@ public:
*/ */
static Result term(CanvasEngine engine = tvg::CanvasEngine::All) noexcept; 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); _TVG_DISABLE_CTOR(Initializer);
}; };

View file

@ -54,36 +54,30 @@ static constexpr bool operator &(CanvasEngine a, CanvasEngine b)
return int(a) & int(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 VER = THORVG_VERSION_STRING;
auto p = SRC; auto p = VER;
const char* x; const char* x;
char major[3]; if (!(x = strchr(p, '.'))) return false;
x = strchr(p, '.'); uint32_t majorVal = atoi(p);
if (!x) return false;
memcpy(major, p, x - p);
major[x - p] = '\0';
p = x + 1; p = x + 1;
char minor[3]; if (!(x = strchr(p, '.'))) return false;
x = strchr(p, '.'); uint32_t minorVal = atoi(p);
if (!x) return false;
memcpy(minor, p, x - p);
minor[x - p] = '\0';
p = x + 1; p = x + 1;
char micro[3]; uint32_t microVal = atoi(p);
x = SRC + strlen(THORVG_VERSION_STRING);
memcpy(micro, p, x - p);
micro[x - p] = '\0';
char sum[7]; 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); _version = atoi(sum);
if (major) *major = majorVal;
if (minor) *minor = minorVal;
if (micro) *micro = microVal;
return true; return true;
} }
@ -121,7 +115,7 @@ Result Initializer::init(uint32_t threads, CanvasEngine engine) noexcept
if (_initCnt++ > 0) return Result::Success; 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; 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() uint16_t THORVG_VERSION_NUMBER()
{ {
return _version; return _version;
} }