videditor/VideoEditorCommon/inc/VeiTitleClipGenerator.h
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "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:
* Ixonos Plc
*
* Description: 
*
*/



#ifndef __VEITITLECLIPGENERATOR_H__
#define __VEITITLECLIPGENERATOR_H__

#include <e32base.h>

#include <VedVideoClipGenerator.h>

/*
 * UID of this generator. The Uids are only used to identify generators
 * in UI, the Engine does not use Uids for any purpose.
 */
#define KUidTitleClipGenerator TUid::Uid(0x00000002)


// Forward declarations

class CVeiTitleClipGenerator;
//class CVeiTitleClipMainTitleFrameOperation;
//class CVeiTitleClipScrollerFrameOperation;
class CVeiTitleClipImageDecodeOperation;
class CFbsBitmap;
class CBitmapScaler;
class CImageDecoder;
class CFont;

// Enumerations

/**
 * Title clip style.
 */
enum TVeiTitleClipVerticalAlignment 
	{
	EVeiTitleClipVerticalAlignmentTop,
	EVeiTitleClipVerticalAlignmentBottom,
	EVeiTitleClipVerticalAlignmentCenter
	};

/**
 * Title clip justification.
 */
enum TVeiTitleClipHorizontalAlignment
	{
	EVeiTitleClipHorizontalAlignmentLeft,
	EVeiTitleClipHorizontalAlignmentRight,
	EVeiTitleClipHorizontalAlignmentCenter
	};

/**
 * Title clip transition.
 */
enum TVeiTitleClipTransition 
	{
	EVeiTitleClipTransitionNone = 0,
	EVeiTitleClipTransitionScrollLeftToRight,
	EVeiTitleClipTransitionScrollRightToLeft,
	EVeiTitleClipTransitionScrollTopToBottom,
	EVeiTitleClipTransitionScrollBottomToTop,
	EVeiTitleClipTransitionFade
	};



/**
 * Observer for title clip generator.
 */
class MVeiTitleClipGeneratorObserver
	{
public:
	/**
	 * Notifies that the title clip generator has finished loading and
	 * preparing the background image.
	 *
	 * @param aGenerator  generator that caused the event
	 * @param aError      error code
	 */
	virtual void NotifyTitleClipBackgroundImageLoadComplete(CVeiTitleClipGenerator& aGenerator, TInt aError) = 0;
	};

/**
 * Title clip generator.
 */
class CVeiTitleClipGenerator : public CVedVideoClipGenerator
	{
public:

	/* Constructors / destructors. */

	IMPORT_C static CVeiTitleClipGenerator* NewL(const TSize& aMaxResolution, 
		TVeiTitleClipTransition aTransition, 
		TVeiTitleClipHorizontalAlignment aHorizontalAlignment,
		TVeiTitleClipVerticalAlignment aVerticalAlignment);

	IMPORT_C static CVeiTitleClipGenerator* NewLC(const TSize& aMaxResolution,
		TVeiTitleClipTransition aTransition,
		TVeiTitleClipHorizontalAlignment aHorizontalAlignment,
		TVeiTitleClipVerticalAlignment aVerticalAlignment);

	IMPORT_C virtual ~CVeiTitleClipGenerator();

	/* Property methods. */

	IMPORT_C virtual TPtrC DescriptiveName() const;

	IMPORT_C virtual TUid Uid() const;
	
    IMPORT_C virtual TTimeIntervalMicroSeconds Duration() const;


	/* Video frame property methods. */

    IMPORT_C virtual TInt VideoFrameCount() const;

	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameStartTime(TInt aIndex) const;

	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameEndTime(TInt aIndex) const;

	IMPORT_C virtual TTimeIntervalMicroSeconds VideoFrameDuration(TInt aIndex) const;

    IMPORT_C virtual TInt GetVideoFrameIndex(TTimeIntervalMicroSeconds aTime) const;

	IMPORT_C virtual TInt VideoFirstFrameComplexityFactor() const;

	IMPORT_C virtual TInt VideoFrameDifferenceFactor(TInt aIndex) const;


	/* Frame methods. */

	IMPORT_C virtual void GetFrameL(MVedVideoClipGeneratorFrameObserver& aObserver,
                           TInt aIndex,
		                   TSize* const aResolution,
						   TDisplayMode aDisplayMode,
						   TBool aEnhance,
						   TInt aPriority);
    
	IMPORT_C virtual void CancelFrame();
		


	/* New methods. */

	/**
	 * Sets the text for the generator.
	 *
	 * @param aText  text for the generator
	 */
	IMPORT_C void SetTextL(const TDesC& aText);

	/**
	 * Returns the text for this generator.
	 *
	 * @return  text for the generator
	 */
	IMPORT_C TPtrC Text() const;

	/**
	 * Returns the transition of this title screen clip.
	 *
	 * @return  transition
	 */
	IMPORT_C TVeiTitleClipTransition Transition() const;

	/**
	 * Returns the horizontal alignment.
	 * 
	 * @return  horizontal alignment
	 */
	IMPORT_C TVeiTitleClipHorizontalAlignment HorizontalAlignment() const;

	/**
	 * Returns the vertical alignment.
	 * 
	 * @return  vertical alignment
	 */
	IMPORT_C TVeiTitleClipVerticalAlignment VerticalAlignment() const;

	/**
	 * Sets the transiton and alignments. They are all tied together
	 * to allow them to be set at once to avoid generating several 
	 * thumbnails when setting many options at the same time.
	 *
	 * @param aTransition  transition for the generator.
	 * @param aHorizontalAlignment  horizontal alignment
	 * @param aVerticalAlignment  vertical alignment
	 */
	IMPORT_C void SetTransitionAndAlignmentsL(TVeiTitleClipTransition aTransition,
		TVeiTitleClipHorizontalAlignment aHorizontalAlignment,
		TVeiTitleClipVerticalAlignment aVerticalAlignment);

	/**
	 * Returns the background color.
	 *
	 * @return  background color.
	 */
	IMPORT_C TRgb BackgroundColor() const;

	/**
	 * Sets the background color. This is used only if no background image
	 * is set.
	 *
	 * @param aBacgroundColor  background color
	 */ 
	IMPORT_C void SetBackgroundColorL(const TRgb& aBackgroundColor);

	/**
	 * Returns the text color.
	 *
	 * @return  text color.
	 */
	IMPORT_C TRgb TextColor() const;

	/**
	 * Sets the text color. 
	 *
	 * @param aBacgroundColor  text color
	 */ 
	IMPORT_C void SetTextColorL(const TRgb& aTextColor);

	/**
	 * Sets the background image. Transfers the ownership of the bitmap
	 * to the generator.
	 *
	 * @param aBackgroundImage  background image
	 */
	IMPORT_C void SetBackgroundImageL(const CFbsBitmap* aBackgroundImage);

	/**
	 * Sets the background image from the specified file. 
	 *
	 * @param aFilename  filename for the image to load
	 * @param aObserver  observer to notify when loading is complete
	 */
	IMPORT_C void SetBackgroundImageL(const TDesC& aFilename, MVeiTitleClipGeneratorObserver& aObserver);

	/**
	 * Returns the background image.
	 *
	 * @return  background image
	 */
	IMPORT_C CFbsBitmap* BackgroundImage() const;

	/**
	 * Sets the duration.
	 *
	 * @param aDuration  duration
	 */
	IMPORT_C void SetDuration(const TTimeIntervalMicroSeconds& aDuration);

	/**
	 * Sets the descriptive name.
	 *
	 * @param aDescriptiveName  descriptive name
	 */
	IMPORT_C void SetDescriptiveNameL(const TDesC& aDescriptiveName);

private: 
	// from MVedVideoClipGeneratorFrameObserver	
	void NotifyVideoClipGeneratorFrameCompleted(CVedVideoClipGenerator& aGenerator, TInt aError, CFbsBitmap* aBitmap);

private: // constructors
	
	/**
	 * First-phase constructor. 
	 * 
	 * @param aMaxResolution		maximum resolution
	 * @param aTransition			transition
	 * @param aHorizontalAlignment	horizontal alignment
	 * @param aVerticalAlignment	vertical alignment
	 */
	CVeiTitleClipGenerator(const TSize& aMaxResolution, 
						   TVeiTitleClipTransition aTransition, 
						   TVeiTitleClipHorizontalAlignment aHorizontalAlignment,
						   TVeiTitleClipVerticalAlignment aVerticalAlignment);

	/**
	 * Second-phase constructor.
	 */
	void ConstructL();

private: // new methods

	/**
	 * Wrap the input text into lines.
	 */
	void WrapTextToArrayL(const TDesC& aText);

	/**
	 * Updates the first frame complexity factor value.
	 */
	void UpdateFirstFrameComplexityFactorL();

	/**
	 * Calculates the fading transition start and end indices.
	 *
	 * @param  aInEndFrame     for returning the end frame of in-transition
	 * @param  aOutStartFrame  for returning the start frame of out-transition
	 * @param  aNumberOfFrames for returning number of frames
	 */
	void CalculateTransitionFrameIndices(TInt& aInEndFrame, TInt& aOutStartFrame) const;

	/**
	 * Gets the text font suitable for the current frame resolution.
	 */
	void GetTextFont(TInt aFontDivisor = 0);

	/**
	 * Draws wrapped texts on the specified bitmap.
	 *
	 * @param aBitmap       bitmap to draw on
	 * @param aTextPoint    text starting point
	 * @param aTextColor    text color
	 * @param aBgColor      background color
	 * @param aShadowColor  shadow color
	 */
	void DrawWrappedTextL(CFbsBitmap& aBitmap, const TPoint& aTextPoint, const TRgb& aTextColor,
		const TRgb& aBgColor, const TRgb& aShadowColor, TBool aDrawBackground);

	/**
	 * Finishes the GetFrameL() call.
	 */
	CFbsBitmap* FinishGetFrameL(TInt aError = KErrNone);

	/**
	 * Synchronous method for getting the first frame for complexity
	 * calculation.
	 *
	 * @return  first frame
	 */
	CFbsBitmap* GetFirstFrameL();

	/**
	 * Draws the main title frame on a specified bitmap.
	 *
	 * @param aBitmap  bitmap to draw on
	 * @param aIndex   index of the frame to draw
	 */
	void DrawMainTitleFrameL(CFbsBitmap& aBitmap, TInt aIndex);

	/**
	 * Draws the scroll title frame on a specified bitmap.
	 *
	 * @param aBitmap  bitmap to draw on
	 * @param aIndex   index of the frame to draw
	 */
	void DrawScrollTitleFrameL(CFbsBitmap& aBitmap, TInt aIndex);

	/**
	 * Get the maximum frame rate, which is either the movie's 
	 * frame rate, of the hard-coded maximum value.
	 *
	 * @return  max frames per second
	 */
	TInt MaximumFramerate() const;

private:
    // Member variables

	/** First frame complexity factor. */
	TInt iFirstFrameComplexityFactor;

	/** Text. */
	HBufC* iText;

	/** Font for the text */
	const CFont* iTextFont;

	/** Resolution used to calculate font size. */
	TSize iGetFontResolution;

	/** Desciptive name. */
	HBufC* iDescriptiveName;

	/** Wrapped text pointer array. */
	CArrayFix<TPtrC>* iWrappedArray;

	/** Height of the wrapped text box. */
	TInt iWrappedTextBoxHeight;

	/** Resolution. */
	TSize iMaxResolution;

	/** Duration. */
	TTimeIntervalMicroSeconds iDuration;

	/** Transition. */
	TVeiTitleClipTransition iTransition;

	/** Horizontal alignment. */
	TVeiTitleClipHorizontalAlignment iHorizontalAlignment;

	/** Vertical alignment. */
	TVeiTitleClipVerticalAlignment iVerticalAlignment;

	/** Background image decode operation. */
	CVeiTitleClipImageDecodeOperation* iDecodeOperation;
	
	/** Background color. */
	TRgb iBackgroundColor;
	
	/** Text color. */
	TRgb iTextColor;

	/** Flag for notifying setting change. */
	TBool iSettingsChanged;

	/** Background image. */
	CFbsBitmap* iBackgroundImage;

	/** Scaled background image. */
	CFbsBitmap* iScaledBackgroundImage;

	/** Flag indicating that we should use the scaled bitmap. */
	TBool iUseScaledImage;


	/* 
	 * Following member variables are temporary storage for the two-phase 
	 * GetFrameL. 
	 */

	/** Observer. */
	MVedVideoClipGeneratorFrameObserver* iGetFrameObserver;
	/**	Index. */
    TInt iGetFrameIndex;
	/** Resolution. */
	TSize iGetFrameResolution;
	/** DisplayMode. */
	TDisplayMode iGetFrameDisplayMode;
	/** Enhance flag. */
	TBool iGetFrameEnhance;
	/** Priority. */
	TInt iGetFramePriority;

	/* Operation classes need to be our friends. */
	friend class CVeiTitleClipImageDecodeOperation;
	};

/**
 * Image decode operation. Helper class for decoding the image and 
 * performing first-stage resizing.
 */
class CVeiTitleClipImageDecodeOperation : public CActive
	{
	public: 
		/**
		 * Factory constructor method. Constructs a decode operation.
		 *
		 * @param aGenerator  generator that owns this operation 
		 * @param aObserver   observer that will be notified when the
		 *                    operation is complete
		 * @param aFilename   filename of the image to be decoded
		 * @param aPriority   priority of the active object
		 *
		 * @return  constructed instance of decode operation
		 */
		static CVeiTitleClipImageDecodeOperation* NewL(CVeiTitleClipGenerator& aGenerator,
													   MVeiTitleClipGeneratorObserver& aObserver,
													   const TDesC& aFilename,
													   TInt aPriority = CActive::EPriorityStandard);


		/**
		 * Factory constructor method. Constructs a decode operation.
		 *
		 * @param aGenerator  generator that owns this operation 
		 * @param aSourceBitmap source bitmap
		 * @param aPriority   priority of the active object
		 *
		 * @return  constructed instance of decode operation
		 */
		static CVeiTitleClipImageDecodeOperation* NewL(CVeiTitleClipGenerator& aGenerator,
													   CFbsBitmap* aSourceBitmap,
													   TInt aPriority = CActive::EPriorityStandard);

		/**
		 * Destructor.
		 */
		virtual ~CVeiTitleClipImageDecodeOperation();

		virtual void RunL();
		virtual void DoCancel();
		virtual TInt RunError(TInt aError);

		/**
		 * Starts the loading operation. 
		 * 
		 * @param aMaxResolution  maximum resolution that will be used
		 */
		void StartLoadOperationL(const TSize& aMaxResolution);

		/**
		 * Starts the scaling operation. 
		 * 
		 * @param aResolution  resolution for the image
		 */
		void StartScalingOperationL(const TSize& aResolution);

	private: // methods
		/**
		 * EPOC first-phase constructor.
		 *
		 * @param aGenerator  generator that owns this decode operation
		 * @param aObserver   observer to notify when the operation is
		 *                    complete
		 * @param aPriority   priority for the active object
		 */
		CVeiTitleClipImageDecodeOperation(CVeiTitleClipGenerator& aGenerator,
										  MVeiTitleClipGeneratorObserver& aObserver,
										  TInt aPriority = CActive::EPriorityStandard);

		/**
		 * EPOC first-phase constructor.
		 *
		 * @param aGenerator    generator that owns this decode operation
		 * @param aSourceBitmap source bitmap
		 * @param aPriority     priority for the active object
		 */
		CVeiTitleClipImageDecodeOperation(CVeiTitleClipGenerator& aGenerator, 
										  CFbsBitmap* aSourceBitmap,
										  TInt aPriority = CActive::EPriorityStandard);
		/**
		 * EPOC second-phase constructor.
		 * 
		 * @param aFilename  filename to decode.
		 */
		void ConstructL(const TDesC& aFilename);

	private: // members

		/**
		 * Enumeration for the decode phase.
		 */
		enum TDecodePhase 
			{
			EPhaseNotStarted = 0,
			EPhaseLoading,
			EPhaseScaling,
			EPhaseComplete
			};

		/** Decode phase. */
		TDecodePhase iDecodePhase;

		/** Generator that owns this decoder operation. */
		CVeiTitleClipGenerator& iGenerator;

		/** Observer.*/
		MVeiTitleClipGeneratorObserver* iObserver;

		/** Decoder. */
		CImageDecoder* iDecoder;

		/** Bitmap. */
		CFbsBitmap* iBitmap;

		/** Scaler. */
		CBitmapScaler* iScaler;

		/** Flag indicating whether to notify observer. */
		TBool iNotifyObserver;
	};




#endif // __VEITITLECLIPGENERATOR_H__