vtengines/videoteleng/Src/Media/CVtEngImageScaler.cpp
changeset 0 ed9695c8bcbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vtengines/videoteleng/Src/Media/CVtEngImageScaler.cpp	Mon Nov 23 14:47:47 2009 +0200
@@ -0,0 +1,314 @@
+/*
+* Copyright (c) 2004 - 2006 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 scaler
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "CVtEngSettings.h"
+#include    "VtEngUtils.h"
+#include    "CVtEngImageScaler.h"
+#include    <cvtimagebitmap.h>
+#include    <fbs.h>
+#include    <videotelephonyvariant.hrh>
+#include    <cvtlogger.h>
+
+// CONSTANTS
+// The number of used bitmaps as scaling targets.
+const TInt KVtEngTargetBitmapCount = 2;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+MVtEngImageScaler* CVtEngImageScaler::NewL(
+    MVtEngScalerObserver& aObserver )
+    {
+    __VTPRINTENTER( "Scaler.NewL" )
+    CVtEngImageScaler* scaler = new ( ELeave ) CVtEngImageScaler( aObserver );
+    CleanupStack::PushL( scaler );
+    scaler->ConstructL();
+    CleanupStack::Pop( scaler );
+    __VTPRINTEXIT( "Scaler.NewL" )
+    return scaler;
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVtEngImageScaler::ConstructL()
+    {
+    iVtScaler = CVtImageScaler::NewL( *this );
+    GetScalingMethodL();
+    iVtScaler->SetQualityL( iScalingMethod );
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::ScaleL
+// Scaling method.
+// -----------------------------------------------------------------------------
+//
+void CVtEngImageScaler::ScaleL(
+            TInt aSourceIndex )
+    {
+    __VTPRINTENTER( "Scaler.ScaleL" )
+    __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL index=%d",
+        aSourceIndex )
+    __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL target index=%d",
+    iTargetBitmapInUse )
+    if ( iVtScaler->IsActive() )
+        {
+        __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL NActive" )
+        User::Leave( KErrInUse );
+        }
+
+    // If there is no bitmaps done, do leave.
+    // The caller should call ConfigureL.
+    if ( iSources.Count() <= 0  || iTargets.Count() <= 0 )
+        {
+        __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleL: not conf" )
+        User::Leave( KErrNotReady );
+        }
+    iVtScaler->ScaleL( *iSources[ aSourceIndex ] ,
+         *iTargets[iTargetBitmapInUse] );
+    __VTPRINTEXIT( "Scaler.ScaleL" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::Configure
+// Configure scaling.
+// -----------------------------------------------------------------------------
+//
+TBool CVtEngImageScaler::ConfigureL(
+    TDisplayMode aDisplayMode,
+    TSize aSize,
+    TInt aSourceHandle1,
+    TInt aSourceHandle2 )
+    {
+    __VTPRINTENTER( "Scaler.ConfigureL" )
+    __VTPRINT( DEBUG_MEDIA , "================== Scaler.Config ==================" )
+    __VTPRINT2( DEBUG_MEDIA, "    aSize.iWidth:%d ", aSize.iWidth)
+    __VTPRINT2( DEBUG_MEDIA, "    aSize.iHeight:%d ", aSize.iHeight )
+    __VTPRINT2( DEBUG_MEDIA, "    aDisplayMode:%d", aDisplayMode )
+    __VTPRINT( DEBUG_MEDIA , "================== Scaler.Config ==================" )
+
+    TInt sourceHandle1( 0 );
+    if ( iSources.Count() > 0 )
+        {
+        CVtImageBitmap* bmp = iSources[ EFirstBitmap ];
+        if ( bmp )
+            {
+            sourceHandle1 = bmp->Bitmap().Handle();
+            }
+        }
+    TInt sourceHandle2( 0 );
+    if ( iSources.Count() > 1 )
+        {
+        CVtImageBitmap* bmp = iSources[ ESecondBitmap ];
+        if ( bmp )
+            {
+            sourceHandle2 = bmp->Bitmap().Handle();
+            }
+        }
+
+    // Do we have to cancel scaling first?
+    TBool cancelled( iVtScaler->IsActive() );
+
+    if ( aSourceHandle1 != sourceHandle1 || aSourceHandle2 != sourceHandle2
+        || aSize != iSize || iMode != aDisplayMode )
+        {
+        if ( cancelled )
+            {
+            __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:Config cancel" )
+            Cancel();
+            }
+        }
+    else
+        {
+        // Do we need the update => NO
+        __VTPRINTEXITR( "Scaler.ConfigureL %d", EFalse )
+        return EFalse;
+        }
+
+    // Store new mode and size.
+    iMode = aDisplayMode;
+    iSize = aSize;
+
+    // The RVD source images have changed.
+    if ( aSourceHandle1 != sourceHandle1 || aSourceHandle2 != sourceHandle2 )
+        {
+        __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL,
+            "Scaler:ConfigureL create bitmaps" )
+        CVtImageBitmap* vtBitmap = CVtImageBitmap::NewL( aSourceHandle1 );
+        CleanupStack::PushL( vtBitmap );
+        CVtImageBitmap* vtBitmap2 = CVtImageBitmap::NewL( aSourceHandle2 );
+        CleanupStack::PushL( vtBitmap2 );
+
+	    __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL source reset" )
+        iSources.ResetAndDestroy();
+        iSources.AppendL( vtBitmap );
+        iSources.AppendL( vtBitmap2 );
+	    CleanupStack::Pop( KVtEngTargetBitmapCount ); // vtBitMaps
+        }
+
+    __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL create targets" )
+    CVtImageBitmap* vtBitmapT =  CVtImageBitmap::NewL( aSize, aDisplayMode );
+    CleanupStack::PushL( vtBitmapT );
+    CVtImageBitmap* vtBitmapT2 = CVtImageBitmap::NewL( aSize, aDisplayMode );
+    CleanupStack::PushL( vtBitmapT2 );
+
+    __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ConfigureL target reset" )
+    iTargets.ResetAndDestroy();
+    iTargets.AppendL( vtBitmapT );
+    iTargets.AppendL( vtBitmapT2 );
+    CleanupStack::Pop( KVtEngTargetBitmapCount ); // vtBitMapTs
+
+    __VTPRINTEXITR( "Scaler.ConfigureL %d", cancelled )
+    return cancelled;
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::ScalingFinished
+// Callback telling that scaling is done.
+// -----------------------------------------------------------------------------
+//
+void CVtEngImageScaler::ScalingFinished( TInt aError )
+    {
+    __VTPRINTENTER( "Scaler.ScalingFinished" )
+
+    __VTPRINT2( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:ScaleFin ", aError )
+
+    if ( aError == KErrNone )
+        {
+        CFbsBitmap& bitmap = iTargets [ iTargetBitmapInUse ]->Bitmap();
+        __VTPRINT2( DEBUG_MEDIA, "Scaler.ScalingFin index", iTargetBitmapInUse )
+
+        if ( iTargetBitmapInUse == EFirstBitmap )
+            {
+            iTargetBitmapInUse = ESecondBitmap;
+            }
+        else
+            {
+            iTargetBitmapInUse = EFirstBitmap;
+            }
+        // Notify client of done scaling
+        iObserver.ScalingCompleted( &bitmap, aError );
+        }
+    else
+        {
+        iObserver.ScalingCompleted( NULL, aError );
+        }
+    __VTPRINTEXIT( "Scaler.ScalingFinished" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::~CVtEngImageScaler
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CVtEngImageScaler::~CVtEngImageScaler()
+    {
+    __VTPRINTENTER( "Scaler.~" )
+
+    __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL, "Scaler:Dtor" )
+    iTargets.ResetAndDestroy();
+    iTargets.Close();
+    iSources.ResetAndDestroy();
+    iSources.Close();
+    delete iVtScaler;
+    __VTPRINTEXIT( "Scaler.~" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::CVtEngImageScaler
+// C++ constructor.
+// -----------------------------------------------------------------------------
+//
+CVtEngImageScaler::CVtEngImageScaler(
+    MVtEngScalerObserver& aObserver ) :
+    iObserver( aObserver ), iTargetBitmapInUse ( EFirstBitmap ),
+    iScalingMethod( CVtImageScaler::EWeightedAverage )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::Release
+// Interface function implementation to delete the implementation.
+// -----------------------------------------------------------------------------
+//
+void CVtEngImageScaler::Release()
+    {
+    // Delete myself
+  __VTPRINTENTER( "Scaler.Release" )
+    delete this;
+    __VTPRINTEXIT( "Scaler.Release" )
+    }
+
+// -----------------------------------------------------------------------------
+// VtEngScalerFactory::CreateScalerL
+// Creates the image scaler.
+// -----------------------------------------------------------------------------
+//
+MVtEngImageScaler* VtEngScalerFactory::CreateScalerL(
+    MVtEngScalerObserver& aObserver )
+    {
+    __VTPRINT( DEBUG_MEDIA | DEBUG_DETAIL,
+        "VtEngScalerFactory::CreateScalerL" )
+    return CVtEngImageScaler::NewL( aObserver );
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::Cancel
+// Cancels the conversion.
+// -----------------------------------------------------------------------------
+//
+TInt CVtEngImageScaler::Cancel()
+    {
+    __VTPRINTENTER( "Scaler.Cancel" )
+    iVtScaler->Cancel();
+    __VTPRINTEXIT( "Scaler.Cancel" )
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngImageScaler::GetScalingMethodL
+// Gets the used scaling method from local variation.
+// -----------------------------------------------------------------------------
+//
+void CVtEngImageScaler::GetScalingMethodL()
+    {
+    __VTPRINTENTER( "Scaler.GetScalingMethodL" )
+    // Check if the scaling method is non-default
+    CVtEngSettings& settings = CVtEngUtility::Settings();
+    if( settings.CheckBits(
+        KVTLVFlagScalingMethodENearest ) )
+        {
+        iScalingMethod = CVtImageScaler::ENearest;
+        }
+    else if ( settings.CheckBits(
+        KVTLVFlagScalingMethodEBilinear ) )
+        {
+        iScalingMethod = CVtImageScaler::EBilinear;
+        }
+    __VTPRINTEXITR( "Scaler.GetScalingMethodL %d", (TInt) iScalingMethod )
+    }
+
+//  End of File