videditor/VideoEditorCommon/inc/VeiTitleClipGenerator.h
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videditor/VideoEditorCommon/inc/VeiTitleClipGenerator.h	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,586 @@
+/*
+* 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__
+