X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fsvg%2Fsvg-task.cpp;h=0a4ff89d07190b41d2ed2e329771c6040eff69b0;hb=HEAD;hp=67cff0f6390713a1b907409561e68b4a255d0114;hpb=6648cdfb9e2dd90cb8a34da7aaad71fce83ca05b;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/svg/svg-task.cpp b/dali-toolkit/internal/visuals/svg/svg-task.cpp index 67cff0f..0a4ff89 100644 --- a/dali-toolkit/internal/visuals/svg/svg-task.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-task.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 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. @@ -16,25 +16,47 @@ */ // CLASS HEADER -#include "svg-task.h" +#include // EXTERNAL INCLUDES #include #include #include +#include // INTERNAL INCLUDES #include +#ifdef TRACE_ENABLED +#include +#include +#include +#include +#endif + namespace Dali { namespace Toolkit { namespace Internal { +namespace +{ +DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_IMAGE_PERFORMANCE_MARKER, false); + +#ifdef TRACE_ENABLED +uint64_t GetNanoseconds() +{ + // Get the time of a monotonic clock since its epoch. + auto epoch = std::chrono::steady_clock::now().time_since_epoch(); + auto duration = std::chrono::duration_cast(epoch); + return static_cast(duration.count()); +} +#endif +} // namespace -SvgTask::SvgTask(VectorImageRenderer vectorRenderer, CallbackBase* callback) -: AsyncTask(callback), +SvgTask::SvgTask(VectorImageRenderer vectorRenderer, CallbackBase* callback, AsyncTask::PriorityType priorityType) +: AsyncTask(callback, priorityType), mVectorRenderer(vectorRenderer), mHasSucceeded(false) { @@ -55,9 +77,10 @@ VectorImageRenderer SvgTask::GetRenderer() return mVectorRenderer; } -SvgLoadingTask::SvgLoadingTask(VectorImageRenderer vectorRenderer, const VisualUrl& url, float dpi, CallbackBase* callback) -: SvgTask(vectorRenderer, callback), - mUrl(url), +SvgLoadingTask::SvgLoadingTask(VectorImageRenderer vectorRenderer, const VisualUrl& url, EncodedImageBuffer encodedImageBuffer, float dpi, CallbackBase* callback) +: SvgTask(vectorRenderer, callback, url.GetProtocolType() == VisualUrl::ProtocolType::REMOTE ? AsyncTask::PriorityType::LOW : AsyncTask::PriorityType::HIGH), + mImageUrl(url), + mEncodedImageBuffer(encodedImageBuffer), mDpi(dpi) { } @@ -75,34 +98,76 @@ void SvgLoadingTask::Process() return; } +#ifdef TRACE_ENABLED + uint64_t mStartTimeNanoSceonds = 0; + uint64_t mEndTimeNanoSceonds = 0; + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + mStartTimeNanoSceonds = GetNanoseconds(); + std::ostringstream oss; + oss << "[u:" << mImageUrl.GetEllipsedUrl() << "]"; + // DALI_TRACE_BEGIN(gTraceFilter, "DALI_SVG_LOADING_TASK"); ///< TODO : Open it if we can control trace log level + DALI_LOG_RELEASE_INFO("BEGIN: DALI_SVG_LOADING_TASK %s", oss.str().c_str()); + } +#endif + + bool loadFailed = false; + Dali::Vector buffer; - if(!mUrl.IsLocalResource()) + if(mEncodedImageBuffer) { - if(!Dali::FileLoader::DownloadFileSynchronously(mUrl.GetUrl(), buffer)) + // Copy raw buffer. + // TODO : Can't we load svg without copy buffer in future? + buffer = mEncodedImageBuffer.GetRawBuffer(); + + // We don't need to hold image buffer anymore. + mEncodedImageBuffer.Reset(); + } + else if(mImageUrl.IsLocalResource()) + { + if(!Dali::FileLoader::ReadFile(mImageUrl.GetUrl(), buffer)) { - DALI_LOG_ERROR("Failed to download file! [%s]\n", mUrl.GetUrl().c_str()); - return; + DALI_LOG_ERROR("Failed to read file! [%s]\n", mImageUrl.GetUrl().c_str()); + loadFailed = true; } } else { - if(!Dali::FileLoader::ReadFile(mUrl.GetUrl(), buffer)) + if(!Dali::FileLoader::DownloadFileSynchronously(mImageUrl.GetUrl(), buffer)) { - DALI_LOG_ERROR("Failed to read file! [%s]\n", mUrl.GetUrl().c_str()); - return; + DALI_LOG_ERROR("Failed to download file! [%s]\n", mImageUrl.GetUrl().c_str()); + loadFailed = true; } } - buffer.PushBack('\0'); - - if(!mVectorRenderer.Load(buffer, mDpi)) + if(!loadFailed) { - DALI_LOG_ERROR("Failed to load data! [%s]\n", mUrl.GetUrl().c_str()); - return; + buffer.Reserve(buffer.Count() + 1u); + buffer.PushBack('\0'); + + if(!mVectorRenderer.Load(buffer, mDpi)) + { + DALI_LOG_ERROR("Failed to load data! [%s]\n", mImageUrl.GetUrl().c_str()); + loadFailed = true; + } } - mHasSucceeded = true; + mHasSucceeded = !loadFailed; +#ifdef TRACE_ENABLED + if(gTraceFilter && gTraceFilter->IsTraceEnabled()) + { + mEndTimeNanoSceonds = GetNanoseconds(); + std::ostringstream oss; + oss << std::fixed << std::setprecision(3); + oss << "["; + oss << "d:" << static_cast(mEndTimeNanoSceonds - mStartTimeNanoSceonds) / 1000000.0f << "ms "; + oss << "s:" << mHasSucceeded << " "; + oss << "u:" << mImageUrl.GetEllipsedUrl() << "]"; + // DALI_TRACE_END(gTraceFilter, "DALI_SVG_LOADING_TASK"); ///< TODO : Open it if we can control trace log level + DALI_LOG_RELEASE_INFO("END: DALI_SVG_LOADING_TASK %s", oss.str().c_str()); + } +#endif } bool SvgLoadingTask::IsReady() @@ -129,15 +194,38 @@ void SvgRasterizingTask::Process() return; } +#ifdef TRACE_ENABLED + uint64_t mStartTimeNanoSceonds = 0; + uint64_t mEndTimeNanoSceonds = 0; +#endif + DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_SVG_RASTERIZE_TASK", [&](std::ostringstream& oss) { + mStartTimeNanoSceonds = GetNanoseconds(); + oss << "[s:" << mWidth << "x" << mHeight << " "; + oss << "u:" << mImageUrl.GetEllipsedUrl() << "]"; + }); + Devel::PixelBuffer pixelBuffer = mVectorRenderer.Rasterize(mWidth, mHeight); if(!pixelBuffer) { DALI_LOG_ERROR("Rasterize is failed!\n"); + DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_SVG_RASTERIZE_TASK", [&](std::ostringstream& oss) { + oss << "[s:" << mWidth << "x" << mHeight << " "; + oss << "u:" << mImageUrl.GetEllipsedUrl() << "]"; + }); return; } mPixelData = Devel::PixelBuffer::Convert(pixelBuffer); mHasSucceeded = true; + + DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_SVG_RASTERIZE_TASK", [&](std::ostringstream& oss) { + mEndTimeNanoSceonds = GetNanoseconds(); + oss << std::fixed << std::setprecision(3); + oss << "["; + oss << "d:" << static_cast(mEndTimeNanoSceonds - mStartTimeNanoSceonds) / 1000000.0f << "ms "; + oss << "s:" << mWidth << "x" << mHeight << " "; + oss << "u:" << mImageUrl.GetEllipsedUrl() << "]"; + }); } bool SvgRasterizingTask::IsReady()