X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fimage-loader%2Fimage-load-thread.cpp;h=deb01781ed5cab893d3546ab88b1500f9a2eeb10;hp=f687af6cb7236eb7756b51bd0ab57f51ab8a63bb;hb=HEAD;hpb=246cad9dd94fc8b5f7114b0e5eb8841a6cd970c9 diff --git a/dali-toolkit/internal/image-loader/image-load-thread.cpp b/dali-toolkit/internal/image-loader/image-load-thread.cpp deleted file mode 100644 index f687af6..0000000 --- a/dali-toolkit/internal/image-loader/image-load-thread.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) 2019 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include "image-load-thread.h" - -// EXTERNAL INCLUDES -#include -#include -#include - -namespace Dali -{ - -namespace Toolkit -{ - -namespace Internal -{ - -LoadingTask::LoadingTask( uint32_t id, const VisualUrl& url, ImageDimensions dimensions, - FittingMode::Type fittingMode, SamplingMode::Type samplingMode, bool orientationCorrection, DevelAsyncImageLoader::PreMultiplyOnLoad preMultiplyOnLoad ) -: pixelBuffer(), - url( url ), - id( id ), - dimensions( dimensions ), - fittingMode( fittingMode ), - samplingMode( samplingMode ), - orientationCorrection( orientationCorrection ), - preMultiplyOnLoad( preMultiplyOnLoad ), - isMaskTask( false ), - maskPixelBuffer(), - contentScale( 1.0f ), - cropToMask( false ) -{ -} - -LoadingTask::LoadingTask( uint32_t id, Devel::PixelBuffer pixelBuffer, Devel::PixelBuffer maskPixelBuffer, float contentScale, bool cropToMask ) -: pixelBuffer( pixelBuffer ), - url( "" ), - id( id ), - dimensions(), - fittingMode(), - samplingMode(), - orientationCorrection(), - preMultiplyOnLoad(), - isMaskTask( true ), - maskPixelBuffer( maskPixelBuffer ), - contentScale( contentScale ), - cropToMask( cropToMask ) -{ -} - -void LoadingTask::Load() -{ - if( url.IsLocalResource() ) - { - pixelBuffer = Dali::LoadImageFromFile( url.GetUrl(), dimensions, fittingMode, samplingMode, orientationCorrection ); - } - else - { - pixelBuffer = Dali::DownloadImageSynchronously ( url.GetUrl(), dimensions, fittingMode, samplingMode, orientationCorrection ); - } - - if( pixelBuffer && Pixel::HasAlpha( pixelBuffer.GetPixelFormat() ) ) - { - if( preMultiplyOnLoad == DevelAsyncImageLoader::PreMultiplyOnLoad::ON ) - { - pixelBuffer.MultiplyColorByAlpha(); - } - } -} - -void LoadingTask::ApplyMask() -{ - pixelBuffer.ApplyMask( maskPixelBuffer, contentScale, cropToMask ); -} - -ImageLoadThread::ImageLoadThread( EventThreadCallback* trigger ) -: mTrigger( trigger ), - mLogFactory( Dali::Adaptor::Get().GetLogFactory() ) -{ -} - -ImageLoadThread::~ImageLoadThread() -{ - // add an empty task would stop the thread from conditional wait. - AddTask( NULL ); - // stop the thread - Join(); - - delete mTrigger; -} - -void ImageLoadThread::Run() -{ - SetThreadName( "ImageLoadThread" ); - mLogFactory.InstallLogFunction(); - - while( LoadingTask* task = NextTaskToProcess() ) - { - if( !task->isMaskTask ) - { - task->Load(); - } - else - { - task->ApplyMask(); - } - - AddCompletedTask( task ); - } -} - -void ImageLoadThread::AddTask( LoadingTask* task ) -{ - bool wasEmpty = false; - - { - // Lock while adding task to the queue - ConditionalWait::ScopedLock lock( mConditionalWait ); - wasEmpty = mLoadQueue.Empty(); - mLoadQueue.PushBack( task ); - } - - if( wasEmpty ) - { - // wake up the image loading thread - mConditionalWait.Notify(); - } -} - -LoadingTask* ImageLoadThread::NextCompletedTask() -{ - // Lock while popping task out from the queue - Mutex::ScopedLock lock( mMutex ); - - if( mCompleteQueue.Empty() ) - { - return NULL; - } - - Vector< LoadingTask* >::Iterator next = mCompleteQueue.Begin(); - LoadingTask* nextTask = *next; - mCompleteQueue.Erase( next ); - - return nextTask; -} - -bool ImageLoadThread::CancelTask( uint32_t loadingTaskId ) -{ - // Lock while remove task from the queue - ConditionalWait::ScopedLock lock( mConditionalWait ); - - for( Vector< LoadingTask* >::Iterator iter = mLoadQueue.Begin(); iter != mLoadQueue.End(); ++iter ) - { - if( (*iter)->id == loadingTaskId ) - { - delete (*iter); - mLoadQueue.Erase( iter ); - return true; - } - } - - return false; -} - - -void ImageLoadThread::CancelAll() -{ - // Lock while remove task from the queue - ConditionalWait::ScopedLock lock( mConditionalWait ); - - for( Vector< LoadingTask* >::Iterator iter = mLoadQueue.Begin(); iter != mLoadQueue.End(); ++iter ) - { - delete ( *iter ); - } - mLoadQueue.Clear(); -} - -LoadingTask* ImageLoadThread::NextTaskToProcess() -{ - // Lock while popping task out from the queue - ConditionalWait::ScopedLock lock( mConditionalWait ); - - while( mLoadQueue.Empty() ) - { - mConditionalWait.Wait( lock ); - } - - Vector< LoadingTask* >::Iterator next = mLoadQueue.Begin(); - LoadingTask* nextTask = *next; - mLoadQueue.Erase( next ); - - return nextTask; -} - -void ImageLoadThread::AddCompletedTask( LoadingTask* task ) -{ - // Lock while adding task to the queue - Mutex::ScopedLock lock( mMutex ); - mCompleteQueue.PushBack( task ); - - // wake up the main thread - mTrigger->Trigger(); -} - -} // namespace Internal - -} // namespace Toolkit - -} // namespace Dali