diff -r 61bc0f252b2b -r bac7acad7cb3 camerauis/cameraapp/generic/inc/CamZoomModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraapp/generic/inc/CamZoomModel.h Wed Sep 01 12:30:54 2010 +0100 @@ -0,0 +1,442 @@ +/* +* Copyright (c) 2007 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: Controls the state of the zoom* +*/ + + + +#ifndef CAMZOOMMODEL_H +#define CAMZOOMMODEL_H + +// INCLUDES +#include +#include "CamPSI.h" +#include "CamAppController.h" +#include "CamControllerObservers.h" // MCamControllerObserver +#include "CamZoomUpdateManager.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +class CCamZoomPane; + +// CLASS DECLARATION + +/** +* This class contains the logic for handling zoom operations +* with support for Optical, Digital and Extended Digital zoom +* +* @since 3.0 +*/ +class CCamZoomModel : public CBase, + public MCamControllerObserver + { + // ========================================================================= + // Types + public: + + enum TCamZoomModelState + { + ECamZoomModelStateZoomNone, + ECamZoomModelStateZoomIn, + ECamZoomModelStateZoomOut, + ECamZoomModelStateZoomTo + }; + + /* Moved to CamSettingsInternal.hrh + // Used to represent the current zoom mode used with the Engine + enum TCamZoomMode + { + ECamZoomModeUndefined, + ECamZoomModeOptical, + ECamZoomModeDigital, + ECamZoomModeExtended + }; */ + + // Used to describe the current zoom mode boundary. + enum TCamZoomBoundary + { + ECamZoomBoundaryUndefined, // Not checked yet for current zoom step + ECamZoomBoundaryNone, // Checked, but not at a boundary + ECamZoomBoundaryOptDig, // Checked, and at Optical/Digital boundary + ECamZoomBoundaryDigExt // Checked, and at Digital/Extended boundary + }; + + // PauseState represents handling of pausing zooming in at + // zoom mode boundarys (between optical/digital and digital/extended) + enum TPauseState + { + EPauseStateNone, // Not at a boundary + EPauseStatePaused, // Just hit a boundary, all zoom-in events ignored until released + EPauseStateReleased // Just released zoom key, allow next zoom + }; + + // ========================================================================= + // Methods + + // ------------------------------------------------------------------------- + // Constructors and destructor + public: + + /** + * Two-phased constructor. + */ + static CCamZoomModel* NewL( CCamAppController& aController, CCamZoomPane* aZoomPane ); + + /** + * Destructor. + */ + virtual ~CCamZoomModel(); + + // ------------------------------------------------------------------------- + // From CCamAppControllerBase + public: + + /** + * Handle controller event. + * @since 3.0 + * @param aEvent the controller event that has occurred + * @param aError any reported error + */ + virtual void HandleControllerEventL( TCamControllerEvent aEvent, + TInt aError ); + + + + + // ------------------------------------------------------------------------- + // New functions + public: + + /** + * Attempts to zoom in one step, if possible. + * Zooming will continue until StopZoom() is called. + * @since 3.0 + */ + void ZoomIn( TBool aOneClick = EFalse ); + + /** + * Attempts to zoom out one step, if possible. + * Zooming will continue until StopZoom() is called. + * @since 3.0 + */ + void ZoomOut( TBool aOneClick = EFalse ); + + /** + * Attempts to zoom to a specific point, if possible. + * + * @since 5.0 + */ + void ZoomTo( TInt aValue ); + + /** + * Stops an ongoing zoom in/out operation + * @since 3.0 + */ + void StopZoom(); + + /** + * Checks the current state of the Camera application, and adjusts the + * min/max range of the zoom pane accordingly. + * @since 3.0 + */ + void RefreshSettings(); + + /** + * Timer callback, used during a zoom in/out to trigger repeat + * zoom steps while the key is held down. + * @param aObject Pointer to a CCamZoomModel object + * @return TInt KErrNone if ok + * @since 3.0 + */ + static TInt ZoomTimerCallback( TAny* aObject ); + + /** + * Returns whether the zoom model is currently zooming in or out + * @since 3.0 + * @return ETrue if zooming, else EFalse + */ + TBool IsCurrentlyZooming() const; + + /** + * Returns zoom model state + * @since S60 v5.0 + * @return TCamZoomModelState + */ + TCamZoomModelState ZoomingState(); + + /** + * Indicates that the zoom level should be reset to default + * when the engine is next prepared + * @since 2.8 + * @param aReset ETrue if the zoom pane should be reset, else EFalse + */ + void ResetToDefaultAfterPrepare( TBool aReset ); + + /** + * Indicates whether or not the zoom level is waiting to be reset to default + * @since 3.0 + * @return TBool ETrue if a reset is pending, othewise EFalse + */ + TBool IsResetPending() const; + + /*** + * Resets the zoom (digital, and, if available, optical) to 1x + * @since 3.0 + */ + void ResetZoomTo1x(); + + /*** + * Use an external zoom multiplier factor to zoom quickly + * with lesser number of transitions + * @since 5.1 + */ + void SetZoomMultiplier( TInt aZoomStepMultiplier ); + + private: + + /** + * Called by the timer callback function to perform + * the operation of one timer "tick". Will zoom in or out + * one step to continue the ongoing zoom operation. + * @since 3.0 + */ + void ZoomTimerTick(); + + /** + * Starts the zoom timer if not already running. + * @since 3.0 + */ + void StartZoomTimer(); + + /** + * Returns the maximum zoom step from the supplied step array. + * The returned step takes into account the currently active + * camera and capture mode. + * @param aStepArray The step array from the PSI + * @since 3.0 + * @return The maximum step from the array. + */ + TInt MaxZoomStep( const TCamMaxZoomSteps& aStepArray ) const; + + /*** + * Checks the zoom mode is that expected. If not, will be set. + * @param aMode The zoom mode to check for + * @since 3.0 + */ + void CheckZoomMode( TCamZoomMode aMode ); + + /*** + * Reads the digital zoom setting and updates internal state + * @since 3.0 + */ + void ReadDigitalZoomSetting(); + + /*** + * Reads the optical zoom setting and updates internal state + * @since 3.0 + */ + void ReadOpticalZoomSetting(); + + /*** + * Checks that the current zoom levels for optical/digital zoom + * do not exceed current limits. If they do, the level is set + * to the available limit. + * @since 3.0 + */ + void CheckZoomLimit(); + + /*** + * Returns whether EXTENDED zoom is allowed based on + * settings for the current resolution, and user options. + * @since 3.0 + * @returns ETrue if allowed, else EFalse + */ + TBool AllowExtZoom() const; + + /*** + * Returns whether OPTICAL zoom is allowed based on + * settings for the current resolution, and user options. + * @since 3.0 + * @returns ETrue if allowed, else EFalse + */ + TBool AllowOptZoom() const; + + /*** + * Returns whether DIGITAL zoom is allowed based on + * settings for the current resolution, and user options. + * @since 3.0 + * @returns ETrue if allowed, else EFalse + */ + TBool AllowDigZoom() const; + + /*** + * Returns whether zooming should be paused at the + * specified zoom boundary. + * @since 3.0 + * @param aBoundary + * @returns ETrue if pause required, else EFalse + */ + TBool PauseAtBoundary( TCamZoomBoundary aBoundary ) const; + + /*** + * Checks whether doing the next zoom operation will move + * from one type of zoom to another. + * + * Will return any of: + * - ECamZoomBoundaryNone (not on a boundary) + * - ECamZoomBoundaryOptDig (on optical/digital boundary) + * - ECamZoomBoundaryDigExt (on digital/extended boundary) + * + * @since 3.0 + * @returns The current zoom boundary state + */ + TCamZoomBoundary CheckBoundary() const; + + /*** + * Returns the current zoom type (Optical/Digital/Extended), based + * on the current zoom level. Optionally takes a parameter, to + * see what zoom type would be used if zoom level adjusted by + * the stepmodifier (positive or negative) + * @since 3.0 + * @param aStepModifier Value to add to current zoom + * @returns The zoom mode of current zoom value + step modifier + */ + TCamZoomMode CurrentZoomType( TInt aStepModifier = 0 ) const; + + /*** + * Returns the number of zoom steps that the next zoom will jump. + * @since 3.0 + * @returns The number of zoom steps to jump. + */ + TInt ZoomStepsToJump() const; + + /*** + * Returns (via references) how the zoom steps should be split up + * between the optical, digital and extended zoom modes. + * @since 3.0 + * @param aOpt The optical steps to move. + * @param aDig The digital steps to move. + * @param aExt The extended steps to move. + */ + void ZoomStepsToJump( TInt& aOpt, TInt& aDig, TInt& aExt ) const; + + /** + * Returns the current combined (optical + digital) zoom + * for the current zoom model state. + * @since 3.0 + * @returns The current combined zoom + */ + TInt CurrentZoom() const; + + /** + * Read the current resolution id. + * + */ + void ReadCurrentResolution(); + + // ------------------------------------------------------------------------- + // Private constructors + private: + + /** + * C++ default constructor. + */ + CCamZoomModel( CCamAppController& aController, CCamZoomPane* aPane ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + + // ========================================================================= + // Data + private: + + // Arrays from the PSI, describing maximum zoom steps for + // different zoom modes and different resolutions and media + TCamMaxZoomSteps iOptZoomSteps; // Optical zoom steps + TCamMaxZoomSteps iDigZoomSteps; // Standard digital zoom steps + TCamMaxZoomSteps iExtZoomSteps; // Extended digital zoom steps + + // These values are the maximum zoom steps for different zoom modes. + // Will be updated when RefreshSettings() is called. + TInt iMaxZoomStepOpt; // Max Optical step + TInt iMaxZoomStepDig; // Max Digital step + TInt iMaxZoomStepExt; // Max Extended step + + // Zoom setting: Allow digital and/or extended, where to pause. + TCamSettingsDigitalZoom iZoomSetting; + + // Whether to allow Optical zoom during video + TBool iAllowOptZoom; + + // The current optical and digital zoom steps + TInt iCurZoomStepOptical; + TInt iCurZoomStepDigital; + + // Max allowed zoom step (taking into account optical, digital and extended) + TInt iMaxZoomStep; + + // Zoom step/jump multiplier for skipping some zoom levels + // (for quick zooming to max and min zoom levels) + TInt iZoomStepMultiplier; + + // Stores the current state of the model, and the last-notified + // engine state. + TCamZoomModelState iState; + // TCamEngineState iEngineState; + TUint iCameraState; + + // Stores the latest video or image resolution id. + TInt iCurrentResolution; + + // Reference to the controller used for setting the zoom step and mode. + CCamAppController& iController; + + // Update manager is used to minimize amount of updates sent to driver. + CCamZoomUpdateManager* iCamZoomUpdateManager; + + // Timer for zooming smoothly + CPeriodic* iZoomTimer; + CCamZoomPane* iPane; + + // Keeps track of the current zoom mode + TCamZoomMode iZoomMode; + + // Stores a look-and-feel structure for the zoom bar. + TCamZoomLAF iZoomLAF; + + // The current pause state (none/paused/released) + TPauseState iPauseState; + + // Whether the camera app is currently recording video + // Used to identify when we *stop* recording + TBool iRecordingVideo; + + // Whether or not the zoompane should reset to default value on next prepare + TBool iResetPending; + + // ========================================================================= + }; + +#endif // CAMZOOMMODEL_H + +// End of File