vtprotocolplugins/DisplaySink/inc/CVtImageScaler.h
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.
*
*/





#ifndef CVTIMAGESCALER_H
#define CVTIMAGESCALER_H

// INCLUDE FILES

#include <e32base.h>

// FORWARD DECLARATIONS

class CVtImageScalerImpl;
class CVtImage;
class CFbsBitmap;

// CLASS DECLARATIONS

/**
*  Image scaler observer interface.
*
*  @lib videosource.lib
*/
class MVtImageScalerObserver
    {
    public:
        /**
        * Callback method that is called by CVtImageScaler when scaling has
        * finished.
        * @param "aError" KErrNone if the scaling was done successfully, one
        * of the system wide error codes otherwise.
        * @return Pointer to newly created instance.
        */
        virtual void ScalingFinished( TInt aError ) = 0;
    };

/**
*  Image scaler.
*
*  @lib videosource.lib
*/
class CVtImageScaler : public CActive
    {
    public:

        /**
        * An enumeration within the CVtImageScaler namespace.
        * It provides a set of panic codes that may happen during
        * scaling process.
        */
        enum TPanics
            {
            /**
            * RotateL() is called while previous rotation process
            * has not yet been finished.
            */
            EBusy = 1
            };

        /**
        * An enumeration within the CVtImageScaler namespace.
        * It provides a set of supported scaling quality settings.
        */
        enum TQuality
            {
            /**
            * Nearest neigbour algorithm. Fast but poor image quality
            * when scale factor exceeds 2x.
            */
            ENearest,

            /**
            * Weighted average algorithm. Slower than Nearest Neighbour
            * but also better image quality when scaling at factor 2x or
            * higher.
            */
            EWeightedAverage,

            /**
            * Bilinear scaling algorithm. Slower than Weighted Average
            * but also better image quality.
            */
            EBilinear
            };

    public:

        /**
        * Creates new instance of CVtImageScaler.
        * @param "aObserver" Reference to instance observer.
        * @param "aQuality" Scaling quality. If this is omitted, then default
        * value of EWeightedAverage is used.
        * @param "aPriority" Active object priority.
        * @exception In error situation leaves with one of the system wide
        * error codes.
        * @return Pointer to newly created instance.
        */
        IMPORT_C static CVtImageScaler* NewL(
            MVtImageScalerObserver& aObserver,
            TQuality aQuality = EWeightedAverage,
            TPriority aPriority = EPriorityStandard );

        /**
        * C++ destructor.
        */
        IMPORT_C ~CVtImageScaler();

        /**
        * Sets scaling quality.
        * @param "aQuality" Scaling quality.
        * @exception In error situation leaves with one of the system wide
        * error codes.
        */
        IMPORT_C void SetQualityL( TQuality aQuality );

        /**
        * Scales image to new size.
        * @param "aSource" Source image that will be scaled.
        * @param "aTarget" Target image that will hold the scaled image. New
        * image's dimensions
        * will be taken from the size of target image.
        * @exception In error situation leaves with one of the system wide
        * error codes.
        */
        IMPORT_C void ScaleL( const CVtImage& aSource, CVtImage& aTarget );

        /**
        * Scales image to new size. Possible error during initialization is
        * returned via MVtImageScalerObserver.
        * @param "aSource" Source image that will be scaled.
        * @param "aTarget" Target image that will hold the scaled image. New
        * image's dimensions will be taken from the size of target image.
        */
        IMPORT_C void Scale( const CVtImage& aSource, CVtImage& aTarget );

        /**
        * Scales image to new size. This scale method is synchronous and
        * aTarget will contain scaled image of aSource on return. This method
        * may leave if aSource and/or aTarget are not suitable for scaling.
        * MVtImageScalerObserver::ScalingFinished is not called when this
        * method is used.
        * @param "aSource" Source image that will be scaled.
        * @param "aTarget" Target image that will hold the scaled image. New
        * image's dimensions will be taken from the size of target image.
        */
        IMPORT_C void ScaleNowL( const CVtImage& aSource, CVtImage& aTarget );

    private: // internal

        /**
        * C++ default constructor.
        */
        CVtImageScaler();

        /**
        * C++ constructor.
        * @param "aObserver" Reference to observer.
        * @param "aPriority" Active object priority.
        * @exception In error situation leaves with one of the system wide
        * error codes.
        */
        CVtImageScaler( MVtImageScalerObserver& aObserver, TPriority aPriority );

        /**
        * Second phase constructor.
        * @param "aQuality" Quality of the scaling.
        * @exception In error situation leaves with one of the system wide
        * error codes.
        */
        void ConstructL( TQuality aQuality );

        /**
        * Sets iStatus to KRequestPending and calls CActive::SetActive().
        */
        void Activate();

        /**
        * Signals this instance AO with given error code.
        * @param "aError" Signalling error code.
        */
        void Signal( TInt aError );

    private: // from CActive

        /**
        * This is defined in CActive. Check CActive for description.
        */
        void RunL();

        /**
        * This is defined in CActive. Check CActive for description.
        */
        void DoCancel();

        /**
        * Scale method called by the CAsyncCallBack.
        */
        static TInt StaticScale( TAny* aPtr );

        /**
        * Scale method called by the StaticScale.
        */
        void DoScale();

    private:

        // Scaling observer
        MVtImageScalerObserver& iObserver;

        // Active quality implementation
        CVtImageScalerImpl* iScalerImpl; // owned

        // Bitmap that will be used for locking global bitmap heap
        CFbsBitmap* iHeapLock; // owned

        // Asynccallback instance
        CAsyncCallBack* iAsyncCallBack; // owned

        // This is set to ETrue in DoCancel() method, and when CAsyncCallBack
        // gets executed, iCancelled is checked whether scaling should be done
        // or not.
        TBool iCancelled;
    };

#endif // CVTIMAGESCALER_H

// End of File