X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fvisual-url.cpp;h=30d9c0248f62ce8da505a7d2fa352c54bf1bf6da;hb=HEAD;hp=af3b04ca3daed873b5e56b143bcd3460ef81f305;hpb=83f07832660fe04b89a0e20945041721bff43748;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/visual-url.cpp b/dali-toolkit/internal/visuals/visual-url.cpp index af3b04c..2f16427 100644 --- a/dali-toolkit/internal/visuals/visual-url.cpp +++ b/dali-toolkit/internal/visuals/visual-url.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ #include // EXTERNAL HEADERS +#include #include // for toupper() namespace Dali @@ -28,6 +29,10 @@ namespace Internal { namespace { +constexpr uint32_t URL_ELLIPSED_LENGTH = 20u; + +static_assert(URL_ELLIPSED_LENGTH < URL_ELLIPSED_LENGTH + 3u); ///< Guard overflow cases. (for svace) + VisualUrl::ProtocolType ResolveLocation(const std::string& url) { const char* urlCStr = url.c_str(); @@ -104,8 +109,8 @@ VisualUrl::ProtocolType ResolveLocation(const std::string& url) VisualUrl::Type ResolveType(const std::string& url) { // if only one char in string, can only be regular image - const std::size_t count = url.size(); - VisualUrl::Type returnType = VisualUrl::REGULAR_IMAGE; + const std::size_t count = url.size(); + VisualUrl::Type returnType = VisualUrl::REGULAR_IMAGE; if(count > 0) { // parsing from the end for better chance of early outs @@ -218,21 +223,23 @@ VisualUrl::Type ResolveType(const std::string& url) VisualUrl::VisualUrl() : mUrl(), mType(VisualUrl::REGULAR_IMAGE), - mLocation(VisualUrl::LOCAL) + mLocation(VisualUrl::LOCAL), + mUrlHash(0ull) { } VisualUrl::VisualUrl(const std::string& url) : mUrl(url), mType(VisualUrl::REGULAR_IMAGE), - mLocation(VisualUrl::LOCAL) + mLocation(VisualUrl::LOCAL), + mUrlHash(0ull) { if(!url.empty()) { mLocation = ResolveLocation(url); - if(VisualUrl::TEXTURE != mLocation && VisualUrl::BUFFER != mLocation) + if(VisualUrl::TEXTURE != mLocation) { - // TEXTURE and BUFFER location url doesn't need type resolving, REGULAR_IMAGE is fine + // TEXTURE location url doesn't need type resolving, REGULAR_IMAGE is fine mType = ResolveType(url); } } @@ -241,8 +248,18 @@ VisualUrl::VisualUrl(const std::string& url) VisualUrl::VisualUrl(const VisualUrl& url) : mUrl(url.mUrl), mType(url.mType), - mLocation(url.mLocation) + mLocation(url.mLocation), + mUrlHash(url.mUrlHash) +{ +} + +VisualUrl::VisualUrl(VisualUrl&& url) noexcept +: mUrl(std::move(url.mUrl)), + mType(std::move(url.mType)), + mLocation(std::move(url.mLocation)), + mUrlHash(std::move(url.mUrlHash)) { + url.mUrlHash = 0ull; } VisualUrl::~VisualUrl() @@ -256,6 +273,21 @@ VisualUrl& VisualUrl::operator=(const VisualUrl& url) mUrl = url.mUrl; mType = url.mType; mLocation = url.mLocation; + mUrlHash = url.mUrlHash; + } + return *this; +} + +VisualUrl& VisualUrl::operator=(VisualUrl&& url) noexcept +{ + if(&url != this) + { + mUrl = std::move(url.mUrl); + mType = std::move(url.mType); + mLocation = std::move(url.mLocation); + mUrlHash = std::move(url.mUrlHash); + + url.mUrlHash = 0ull; } return *this; } @@ -265,6 +297,22 @@ const std::string& VisualUrl::GetUrl() const return mUrl; } +std::string VisualUrl::GetEllipsedUrl() const +{ + if(mUrl.size() > URL_ELLIPSED_LENGTH + 3) + { + std::string ellipsedUrl = "..."; + ellipsedUrl += mUrl.substr(mUrl.size() - URL_ELLIPSED_LENGTH); + return ellipsedUrl; + } + return mUrl; +} + +std::uint64_t VisualUrl::GetUrlHash() const +{ + return DALI_UNLIKELY(mUrlHash == 0) ? (mUrlHash = Dali::CalculateHash(mUrl)) : mUrlHash; +} + VisualUrl::Type VisualUrl::GetType() const { return mType; @@ -295,14 +343,19 @@ std::string VisualUrl::GetLocation() const return GetLocation(mUrl); } +std::string VisualUrl::GetLocationWithoutExtension() const +{ + return GetLocationWithoutExtension(mUrl); +} + std::string VisualUrl::CreateTextureUrl(const std::string& location) { return "dali://" + location; } -std::string VisualUrl::CreateBufferUrl(const std::string& location) +std::string VisualUrl::CreateBufferUrl(const std::string& location, const std::string_view& extension) { - return "enbuf://" + location; + return "enbuf://" + location + std::string(extension); } VisualUrl::ProtocolType VisualUrl::GetProtocolType(const std::string& url) @@ -320,6 +373,18 @@ std::string VisualUrl::GetLocation(const std::string& url) return url; } +std::string VisualUrl::GetLocationWithoutExtension(const std::string& url) +{ + const auto location = url.find("://"); + if(std::string::npos != location) + { + const auto extension = url.find_last_of("."); // Find last position of '.' keyword. + const auto locationLength = extension != std::string::npos ? extension - (location + 3u) : std::string::npos; + return url.substr(location + 3u, locationLength); // 3 characters forwards from the start of ://, and end of last '.' keyword. + } + return url; +} + } // namespace Internal } // namespace Toolkit