X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fsvg%2Fsvg-rasterize-thread.cpp;h=174183eb7f0222af547205693933c6de4725268a;hp=d32830488c471d9314e04a719c490d7509220de0;hb=5a6809a40da6a50d2edce9202466aa289ad96162;hpb=1972f043026a3e1bdcaad71c17859a8f324d1e6d diff --git a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp index d328304..174183e 100644 --- a/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-rasterize-thread.cpp @@ -18,6 +18,11 @@ // CLASS HEADER #include "svg-rasterize-thread.h" +// EXTERNAL INCLUDES +#include +#include +#include + // INTERNAL INCLUDES #include #include @@ -31,20 +36,49 @@ namespace Toolkit namespace Internal { -RasterizingTask::RasterizingTask( SvgVisual* svgRenderer, NSVGimage* parsedSvg, unsigned int width, unsigned int height ) +namespace +{ +const char * const UNITS("px"); +} + +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 ) { } +void RasterizingTask::Load() +{ + if( mParsedSvg != NULL) + { + return; + } + + if( !mUrl.IsLocalResource() ) + { + Dali::Vector remoteBuffer; + + if( !Dali::FileLoader::DownloadFileSynchronously( mUrl.GetUrl(), remoteBuffer )) + { + DALI_LOG_ERROR("Failed to download file!\n"); + return; + } + + remoteBuffer.PushBack( '\0' ); + mParsedSvg = nsvgParse( reinterpret_cast(remoteBuffer.begin()), UNITS, mDpi ); + } +} + void RasterizingTask::Rasterize( NSVGrasterizer* rasterizer ) { - if( mWidth > 0u && mHeight > 0u ) + if( mParsedSvg != NULL && mWidth > 0u && mHeight > 0u ) { - float scaleX = static_cast( mWidth ) / mParsedSvg->width; - float scaleY = static_cast( mHeight ) / mParsedSvg->height; + 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; @@ -58,6 +92,11 @@ void RasterizingTask::Rasterize( NSVGrasterizer* rasterizer ) } } +NSVGimage* RasterizingTask::GetParsedImage() const +{ + return mParsedSvg; +} + SvgVisual* RasterizingTask::GetSvgVisual() const { return mSvgVisual.Get(); @@ -144,7 +183,7 @@ RasterizingTaskPtr SvgRasterizeThread::NextCompletedTask() return nextTask; } -void SvgRasterizeThread::RemoveTask( SvgVisual* renderer ) +void SvgRasterizeThread::RemoveTask( SvgVisual* visual ) { // Lock while remove task from the queue ConditionalWait::ScopedLock lock( mConditionalWait ); @@ -152,7 +191,7 @@ void SvgRasterizeThread::RemoveTask( SvgVisual* renderer ) { for( std::vector< RasterizingTaskPtr >::iterator it = mRasterizeTasks.begin(), endIt = mRasterizeTasks.end(); it != endIt; ++it ) { - if( (*it) && (*it)->GetSvgVisual() == renderer ) + if( (*it) && (*it)->GetSvgVisual() == visual ) { mRasterizeTasks.erase( it ); break; @@ -221,8 +260,10 @@ void SvgRasterizeThread::AddCompletedTask( RasterizingTaskPtr task ) void SvgRasterizeThread::Run() { + SetThreadName( "SVGThread" ); while( RasterizingTaskPtr task = NextTaskToProcess() ) { + task->Load( ); task->Rasterize( mRasterizer ); AddCompletedTask( task ); }