/*
* Copyright (c) 2008 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:   
*
*/



#ifndef HUIFXLAYER_
#define HUIFXLAYER_

#include "HuiFxEngine.h"
#include "HuiFxRenderbuffer.h"

//FORWARD DECLARATIONS
class MHuiEffectable;

class CHuiFxLayer: public CBase
    {
public:
    IMPORT_C virtual ~CHuiFxLayer();

    IMPORT_C virtual TBool PrepareDrawL(CHuiFxEngine& aEngine);
    IMPORT_C virtual void ReleaseAllCachedRenderTargets(CHuiFxEngine& aEngine);
    virtual TBool Draw(CHuiFxEngine& aEngine, CHuiGc& aGc, CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource, TBool aHasSurface) = 0;
    IMPORT_C virtual TBool VisualArea(TRect& aRect);
    IMPORT_C virtual TBool Margin( TMargins &m );
    IMPORT_C virtual void AdvanceTime(TReal32 aElapsedTime);
    IMPORT_C virtual TBool Changed() const;
    
    IMPORT_C THuiFxLayerType Type();
    
    IMPORT_C void SetBlendingMode(THuiFxBlendingMode aOp);
    IMPORT_C THuiFxBlendingMode BlendingMode() const;

    IMPORT_C void SetDisplayArea(const TRect& aRect);
    IMPORT_C void SetSourceRect(const TRect& aRect);
    IMPORT_C void SetTargetRect(const TRect& aRect);
    IMPORT_C void SetVisualRect(const TRect& aRect);

    IMPORT_C const TRect& SourceRect() const;
    IMPORT_C const TRect& TargetRect() const;
    IMPORT_C const TRect& VisualRect() const;
public: // effect cache
    IMPORT_C virtual CHuiFxLayer *CloneL() const=0;
    IMPORT_C virtual void SetExtRect( TRect *aExtRect )=0;
    IMPORT_C virtual void SetVisual( CHuiVisual *aVisual )=0;
    IMPORT_C virtual void SetVisual( MHuiEffectable *aVisual )=0;
    virtual TBool FxmlUsesOpaqueHint() const { return EFalse; }
    IMPORT_C void CopyFromL(const CHuiFxLayer *aOldLayer);


    // Internal flag to tell wheter layer is animated
    virtual TBool IsAnimated() const;
    void SetAnimated(TBool aAnimated);

    // Internal flag to tell wheter layer is transformed
    virtual TBool IsTransformed() const; 
    void SetTransformed(TBool aTransformed);

    // Internal flag to tell wheter layer is filtered
    virtual TBool IsFiltered() const; 

    // Internal flag to tell wheter margin is enabled
    void EnableMargin(TBool aEnable);
    virtual void EnableMarginApplyChildren(TBool aEnable);
    TBool IsMarginEnabled() const;
    
    // Internal
    virtual void SetVisualContentState(TBool aChanged, TBool aOpaque);
    
    // Internal flag to tell wheter transparency is enabled
    virtual TBool IsSemitransparent() const;
    
    virtual void FxmlVisualInputs(RArray<THuiFxVisualSrcType> & /*aArray*/) { }
    
    TBool AlwaysReadSurfacePixels() const;
    virtual void SetAlwaysReadSurfacePixels(TBool aAlwaysReadSurfacePixels);
    
protected:
    IMPORT_C CHuiFxLayer();
    IMPORT_C void ConstructL( THuiFxLayerType aType );

protected:
    TRect               iDisplayArea; // used for clipping the effects to the real display area
    
private:
    THuiFxBlendingMode  iBlendingOp;
    THuiFxLayerType     iLayerType;
    TRect               iSourceRect;
    TRect               iTargetRect;
    TRect               iVisualRect;
    TBool               iAnimated;
    TBool               iTransformed;
    TBool               iMarginEnabled;
    TBool               iAlwaysReadSurfacePixels;
    };

#endif /*HUIFXLAYER_*/
