X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali-toolkit%2Finternal%2Fvisuals%2Fsvg%2Fsvg-rasterize-thread.cpp;h=8bd9f0a02ed8e91e1be6cc469eea81eb17366709;hb=2038d8cd8f472a8264498556ff949446313b57c3;hp=151eda857d6e029651dfe75f717412c755c45bc8;hpb=f11be450471738b68f98fa4c552b3a22482ae4de;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp index 151eda8..8bd9f0a 100644 --- a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -21,12 +21,10 @@ // EXTERNAL INCLUDES #include #include +#include #include // INTERNAL INCLUDES -#ifdef NO_THORVG -#include -#endif /* NO_THORVG */ #include namespace Dali @@ -38,23 +36,6 @@ namespace Toolkit namespace Internal { -namespace -{ -const char * const UNITS("px"); -} - -#ifdef NO_THORVG -RasterizingTask::RasterizingTask( SvgVisual* svgRenderer, NSVGimage* parsedSvg, const VisualUrl& url, float dpi, unsigned int width, unsigned int height) -: mSvgVisual( svgRenderer ), - mParsedSvg( parsedSvg ), - mUrl( url ), - mDpi( dpi ), - mWidth( width ), - mHeight( height ) -{ - mRasterizer = nsvgCreateRasterizer(); -} -#else /* NO_THORVG */ RasterizingTask::RasterizingTask( SvgVisual* svgRenderer, VectorImageRenderer vectorRenderer, const VisualUrl& url, float dpi, unsigned int width, unsigned int height, bool loaded) : mSvgVisual( svgRenderer ), mVectorRenderer( vectorRenderer ), @@ -66,116 +47,60 @@ RasterizingTask::RasterizingTask( SvgVisual* svgRenderer, VectorImageRenderer ve { } -#endif /* NO_THORVG */ RasterizingTask::~RasterizingTask() { -#ifdef NO_THORVG - nsvgDeleteRasterizer( mRasterizer ); -#endif /* NO_THORVG */ } void RasterizingTask::Load() { -#ifdef NO_THORVG - if( mParsedSvg != NULL) - { - return; - } - - if( !mUrl.IsLocalResource() ) + if(!mLoaded && !mUrl.IsLocalResource()) { Dali::Vector remoteBuffer; - - if( !Dali::FileLoader::DownloadFileSynchronously( mUrl.GetUrl(), remoteBuffer )) + if(!Dali::FileLoader::DownloadFileSynchronously(mUrl.GetUrl(), remoteBuffer)) { - DALI_LOG_ERROR("Failed to download file!\n"); + DALI_LOG_ERROR("RasterizingTask::Load: Failed to download file! [%s]\n", mUrl.GetUrl().c_str()); return; } - remoteBuffer.PushBack( '\0' ); - mParsedSvg = nsvgParse( reinterpret_cast(remoteBuffer.begin()), UNITS, mDpi ); - } -#else /* NO_THORVG */ - if( !mLoaded && !mUrl.IsLocalResource() ) - { - Dali::Vector remoteBuffer; - - if( !Dali::FileLoader::DownloadFileSynchronously( mUrl.GetUrl(), remoteBuffer )) - { - DALI_LOG_ERROR("Failed to download file!\n"); - return; - } + remoteBuffer.PushBack('\0'); - remoteBuffer.PushBack( '\0' ); - char *data = reinterpret_cast(remoteBuffer.begin()); - if ( !mVectorRenderer.Load( data, remoteBuffer.Size())) + if(!mVectorRenderer.Load(remoteBuffer, mDpi)) { - DALI_LOG_ERROR( "Failed to load data!\n" ); + DALI_LOG_ERROR("RasterizingTask::Load:Failed to load data! [%s]\n", mUrl.GetUrl().c_str()); return; } mLoaded = true; } -#endif /* NO_THORVG */ } -void RasterizingTask::Rasterize( ) +void RasterizingTask::Rasterize() { -#ifdef NO_THORVG - if( mParsedSvg != NULL && mWidth > 0u && mHeight > 0u ) - { - float scaleX = static_cast( mWidth ) / mParsedSvg->width; - float scaleY = static_cast( mHeight ) / mParsedSvg->height; - float scale = scaleX < scaleY ? scaleX : scaleY; - unsigned int bufferStride = mWidth*Pixel::GetBytesPerPixel( Pixel::RGBA8888 ); - unsigned int bufferSize = bufferStride * mHeight; - - unsigned char* buffer = new unsigned char [bufferSize]; - nsvgRasterize(mRasterizer, mParsedSvg, 0.f,0.f,scale, - buffer, mWidth, mHeight, - bufferStride ); - - mPixelData = Dali::PixelData::New( buffer, bufferSize, mWidth, mHeight, Pixel::RGBA8888, Dali::PixelData::DELETE_ARRAY ); - } -#else /* NO_THORVG */ - if ( mWidth <= 0u || mHeight <= 0u ) + if(mWidth <= 0u || mHeight <= 0u) { - DALI_LOG_ERROR( "Size is zero!\n" ); + DALI_LOG_ERROR("RasterizingTask::Rasterize: Size is zero!\n"); return; } - Devel::PixelBuffer pixelBuffer = Devel::PixelBuffer::New( mWidth, mHeight, Dali::Pixel::RGBA8888 ); - mVectorRenderer.SetBuffer( pixelBuffer ); - { - uint32_t defaultWidth, defaultHeight; - mVectorRenderer.GetDefaultSize( defaultWidth, defaultHeight ); + Devel::PixelBuffer pixelBuffer = Devel::PixelBuffer::New(mWidth, mHeight, Dali::Pixel::RGBA8888); - float scaleX = static_cast( mWidth ) / static_cast( defaultWidth ); - float scaleY = static_cast( mHeight ) / static_cast( defaultHeight ); - float scale = scaleX < scaleY ? scaleX : scaleY; + uint32_t defaultWidth, defaultHeight; + mVectorRenderer.GetDefaultSize(defaultWidth, defaultHeight); - if ( !mVectorRenderer.Render( scale ) ) - { - DALI_LOG_ERROR( "SVG Render Fail!\n" ); - return; - } + float scaleX = static_cast(mWidth) / static_cast(defaultWidth); + float scaleY = static_cast(mHeight) / static_cast(defaultHeight); + float scale = scaleX < scaleY ? scaleX : scaleY; - mPixelData = Devel::PixelBuffer::Convert( pixelBuffer ); - if ( !mPixelData ) - { - DALI_LOG_ERROR( "Pixel Data is null\n" ); - } + if(!mVectorRenderer.Rasterize(pixelBuffer, scale)) + { + DALI_LOG_ERROR("RasterizingTask::Rasterize: Rasterize is failed! [%s]\n", mUrl.GetUrl().c_str()); + return; } -#endif /* NO_THORVG */ -} -#ifdef NO_THORVG -NSVGimage* RasterizingTask::GetParsedImage() const -{ - return mParsedSvg; + mPixelData = Devel::PixelBuffer::Convert(pixelBuffer); } -#else /* NO_THORVG */ + VectorImageRenderer RasterizingTask::GetVectorRenderer() const { return mVectorRenderer; @@ -185,7 +110,6 @@ bool RasterizingTask::IsLoaded() const { return mLoaded; } -#endif /* NO_THORVG */ SvgVisual* RasterizingTask::GetSvgVisual() const { @@ -197,15 +121,20 @@ PixelData RasterizingTask::GetPixelData() const return mPixelData; } -SvgRasterizeThread::SvgRasterizeThread( EventThreadCallback* trigger ) -: mTrigger( trigger ), - mIsThreadWaiting( false ) +SvgRasterizeThread::SvgRasterizeThread() +: mTrigger( new EventThreadCallback( MakeCallback( this, &SvgRasterizeThread::ApplyRasterizedSVGToSampler ) ) ), + mLogFactory( Dali::Adaptor::Get().GetLogFactory() ), + mIsThreadWaiting( false ), + mProcessorRegistered( false ) { } SvgRasterizeThread::~SvgRasterizeThread() { - delete mTrigger; + if( mProcessorRegistered ) + { + Adaptor::Get().UnregisterProcessor( *this ); + } } void SvgRasterizeThread::TerminateThread( SvgRasterizeThread*& thread ) @@ -244,6 +173,12 @@ void SvgRasterizeThread::AddTask( RasterizingTaskPtr task ) } } mRasterizeTasks.push_back( task ); + + if( !mProcessorRegistered ) + { + Adaptor::Get().RegisterProcessor( *this ); + mProcessorRegistered = true; + } } if( wasEmpty) @@ -285,24 +220,10 @@ void SvgRasterizeThread::RemoveTask( SvgVisual* visual ) } } } -} -#ifdef NO_THORVG -void SvgRasterizeThread::DeleteImage( NSVGimage* parsedSvg ) -{ - // Lock while adding image to the delete queue - ConditionalWait::ScopedLock lock( mConditionalWait ); - - if( mIsThreadWaiting ) // no rasterization is ongoing, save to delete - { - nsvgDelete( parsedSvg ); - } - else // wait to delete until current rasterization completed. - { - mDeleteSvg.PushBack( parsedSvg ); - } + UnregisterProcessor(); } -#else /* NO_THORVG */ + void SvgRasterizeThread::DeleteImage( VectorImageRenderer vectorRenderer ) { // Lock while adding image to the delete queue @@ -317,7 +238,6 @@ void SvgRasterizeThread::DeleteImage( VectorImageRenderer vectorRenderer ) mDeleteSvg.PushBack( &vectorRenderer ); } } -#endif /* NO_THORVG */ RasterizingTaskPtr SvgRasterizeThread::NextTaskToProcess() { @@ -327,14 +247,6 @@ RasterizingTaskPtr SvgRasterizeThread::NextTaskToProcess() // Delete the image here to make sure that it is not used in the nsvgRasterize() if( !mDeleteSvg.Empty() ) { -#ifdef NO_THORVG - for( Vector< NSVGimage* >::Iterator it = mDeleteSvg.Begin(), endIt = mDeleteSvg.End(); - it != endIt; - ++it ) - { - nsvgDelete( *it ); - } -#endif /* NO_THORVG */ mDeleteSvg.Clear(); } @@ -367,6 +279,8 @@ void SvgRasterizeThread::AddCompletedTask( RasterizingTaskPtr task ) void SvgRasterizeThread::Run() { SetThreadName( "SVGThread" ); + mLogFactory.InstallLogFunction(); + while( RasterizingTaskPtr task = NextTaskToProcess() ) { task->Load( ); @@ -375,6 +289,34 @@ void SvgRasterizeThread::Run() } } +void SvgRasterizeThread::ApplyRasterizedSVGToSampler() +{ + while( RasterizingTaskPtr task = NextCompletedTask() ) + { + task->GetSvgVisual()->ApplyRasterizedImage(task->GetVectorRenderer(), task->GetPixelData(), task->IsLoaded()); + } + + UnregisterProcessor(); +} + +void SvgRasterizeThread::Process() +{ + ApplyRasterizedSVGToSampler(); +} + +void SvgRasterizeThread::UnregisterProcessor() +{ + if ( mProcessorRegistered ) + { + if( mRasterizeTasks.empty() && mCompletedTasks.empty() ) + { + Adaptor::Get().UnregisterProcessor( *this ); + mProcessorRegistered = false; + } + } +} + + } // namespace Internal } // namespace Toolkit