vtprotocolplugins/DisplaySink/src/CVtImageScaler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Image Transforms subsystem.
*
*/


// INCLUDE FILES

#include <e32svr.h>
#include <fbs.h>

#include "CVtImageScaler.h"
#include "CVtImageScalerImpl.h"
#include "CVtImageScalerImplNearest.h"
#include "CVtImageScalerImplWeightedAverage.h"
#include "CVtImageScalerImplBilinear.h"

// CONSTANTS

_LIT( KModuleName, "CVtImageScaler" );

// MACROS

#ifdef _DEBUG
#    define __IF_DEBUG(t) {RDebug::t;}
#else
#    define __IF_DEBUG(t)
#endif

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CVtImageScaler::NewL( MVtImageScalerObserver& aObserver, TQuality aQuality,
//   TPriority aPriority )
// -----------------------------------------------------------------------------
EXPORT_C CVtImageScaler* CVtImageScaler::NewL(
    MVtImageScalerObserver& aObserver,
    TQuality aQuality,
    TPriority aPriority )
    {
    CVtImageScaler* self = new ( ELeave ) CVtImageScaler( aObserver, aPriority );
    CleanupStack::PushL( self );
    self->ConstructL( aQuality );
    CleanupStack::Pop(); // self
    return self;
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::~CVtImageScaler()
// -----------------------------------------------------------------------------
EXPORT_C CVtImageScaler::~CVtImageScaler()
    {
	Cancel();
    delete iAsyncCallBack;
    delete iHeapLock;
    delete iScalerImpl;
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::SetQualityL( TQuality aQuality )
// -----------------------------------------------------------------------------
EXPORT_C void CVtImageScaler::SetQualityL( TQuality aQuality )
    {
    delete iScalerImpl;
    iScalerImpl = 0;

    switch( aQuality )
        {
        case ENearest:
            iScalerImpl = new ( ELeave ) CVtImageScalerImplNearest();
            break;

        case EWeightedAverage:
            iScalerImpl = new ( ELeave ) CVtImageScalerImplWeightedAverage();
            break;

        case EBilinear:
            iScalerImpl = new ( ELeave ) CVtImageScalerImplBilinear();
            break;
        }
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::ScaleL( const CVtImage& aSource, CVtImage& aTarget )
// -----------------------------------------------------------------------------
EXPORT_C void CVtImageScaler::ScaleL(
    const CVtImage& aSource,
    CVtImage& aTarget )
    {
    if( !IsActive() )
        {
        if( !iScalerImpl )
            {
            User::Leave( KErrNotReady );
            }
        iScalerImpl->SetSourceTargetL( aSource, aTarget );
        iCancelled = EFalse;
        Activate();
        iAsyncCallBack->CallBack();
        }
    else
        {
        User::Panic( KModuleName(), EBusy );
        }
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::Scale( const CVtImage& aSource, CVtImage& aTarget )
// -----------------------------------------------------------------------------
EXPORT_C void CVtImageScaler::Scale(
    const CVtImage& aSource,
    CVtImage& aTarget )
    {
    TRAPD( result, ScaleL( aSource, aTarget ) );
    if( result != KErrNone )
        {
        Activate();
        Signal( result );
        }
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::ScaleNowL( const CVtImage& aSource, CVtImage& aTarget )
// -----------------------------------------------------------------------------
EXPORT_C void CVtImageScaler::ScaleNowL(
    const CVtImage& aSource, CVtImage& aTarget )
    {
    if( !iScalerImpl )
        {
        User::Leave( KErrNotReady );
        }

    iScalerImpl->SetSourceTargetL( aSource, aTarget );

    TInt result;
    TBool more;
    TBool needsLock( iScalerImpl->NeedHeapLock() );
    do
        {

        if ( needsLock )
            {
            iHeapLock->LockHeap( ETrue );
            }

        result = iScalerImpl->Scale( more );

        if ( needsLock )
            {
            iHeapLock->UnlockHeap( ETrue );
            }

        } while ( more && ( result == KErrNone ) );

    User::LeaveIfError( result );
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::CVtImageScaler()
// -----------------------------------------------------------------------------
CVtImageScaler::CVtImageScaler( MVtImageScalerObserver& aObserver, TPriority aPriority )
: CActive( aPriority ), iObserver( aObserver )
    {
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::ConstructL( TQuality aQuality )
// -----------------------------------------------------------------------------
void CVtImageScaler::ConstructL( TQuality aQuality )
    {
    SetQualityL( aQuality );
    iHeapLock = new ( ELeave ) CFbsBitmap();
    iHeapLock->Create( TSize( 1, 1 ), EColor256 );
    iAsyncCallBack = new ( ELeave )
        CAsyncCallBack( TCallBack( StaticScale, this ), Priority() );
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::Activate
// -----------------------------------------------------------------------------
void CVtImageScaler::Activate()
    {
    iStatus = KRequestPending;
    SetActive();
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::Signal( TInt aError )
// -----------------------------------------------------------------------------
void CVtImageScaler::Signal( TInt aError )
    {
    TRequestStatus* pStatus = &iStatus;
    User::RequestComplete( pStatus, aError );
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::RunL()
// -----------------------------------------------------------------------------
void CVtImageScaler::RunL()
    {
    iObserver.ScalingFinished( iStatus.Int() );
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::DoCancel()
// -----------------------------------------------------------------------------
void CVtImageScaler::DoCancel()
    {
    if ( iStatus == KRequestPending )
        {
        iCancelled = ETrue;
        Signal( KErrCancel );
        iObserver.ScalingFinished( KErrCancel );
        }
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::StaticScale()
// -----------------------------------------------------------------------------
TInt CVtImageScaler::StaticScale( TAny* aPtr )
    {
    CVtImageScaler* self = reinterpret_cast< CVtImageScaler* >( aPtr );
    self->DoScale();
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CVtImageScaler::DoScale
// -----------------------------------------------------------------------------
void CVtImageScaler::DoScale()
    {
    if ( !iCancelled )
        {
        TBool more;
        TBool needsLock = iScalerImpl->NeedHeapLock();
        if ( needsLock )
            {
            iHeapLock->LockHeap( ETrue );
            }
        TInt result = iScalerImpl->Scale( more );
        if ( needsLock )
            {
            iHeapLock->UnlockHeap( ETrue );
            }
        if ( !more || ( result != KErrNone ) )
            {
            Signal( result );
            }
        else
            {
            iAsyncCallBack->CallBack();
            }
        }
    }

// ========================== OTHER EXPORTED FUNCTIONS =========================

// End of File