imagingandcamerafws/imagingfws/src/Test/TImageTran/TImageTran.cpp
branchRCL_3
changeset 50 948c7f65f6d4
parent 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingandcamerafws/imagingfws/src/Test/TImageTran/TImageTran.cpp	Wed Sep 01 12:38:50 2010 +0100
@@ -0,0 +1,489 @@
+// Copyright (c) 2008-2009 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:
+//
+
+#include "TImageTran.h"
+
+/*
+*    Starting point of the application
+*/
+
+TInt E32Main() 
+    {
+    __UHEAP_MARK;
+    // Setup TRAP harness
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    CITArgsandFuncts *iITArgsandFunct = NULL;
+    TRAPD(error, iITArgsandFunct = CITArgsandFuncts::NewL());
+    if(error != KErrNone)
+        {
+        return error;
+        }
+
+    TInt r = KErrNoMemory;
+    if ( cleanup ) 
+        {
+        TRAP(r, iITArgsandFunct->ImageTranMainL());
+        __ASSERT_ALWAYS( !r, User::Invariant() );
+        delete cleanup;
+        }
+    
+    delete  iITArgsandFunct; 
+    // check we didn't leak any memory
+    __UHEAP_MARKEND;
+    return r;
+    }
+
+void CITArgsandFuncts::ConstructL()
+    {
+    
+    }
+        
+CITArgsandFuncts* CITArgsandFuncts::NewL()
+	{
+	CITArgsandFuncts* self = new (ELeave) CITArgsandFuncts();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+    
+/*
+ * Start the image transformation by parsing the commandline arguments
+ */
+void CITArgsandFuncts::ImageTranMainL() 
+    {
+    iConsole = Console::NewL( _L( "iConsole"), TSize( KConsFullScreen,KConsFullScreen ) );
+    CleanupStack::PushL( iConsole );
+    iCmdArgs  = CCommandLineArguments::NewLC();
+    
+    CActiveScheduler* iScheduler =new(ELeave) CActiveScheduler;
+	CleanupStack::PushL(iScheduler);
+	CActiveScheduler::Install(iScheduler);
+    
+    TInt err;
+    TRAP( err, ImageTransformL() ); /*Retrive the command line args, parse args  and transform*/
+    if ( err ) 
+        {
+        iConsole->Printf( _L("TRAP: error code(%d)\n"), err );
+        }
+
+    iConsole->Printf( _L( "[press any key]\n" ) );
+    iConsole->Getch();
+    CleanupStack::PopAndDestroy();
+    CActiveScheduler::Stop();
+    }
+    
+/*
+*  Retrive the command line args, parse args and perform transform
+*  operation based on the option.
+*/
+void CITArgsandFuncts::ImageTransformL() 
+    {
+    iConsole->Printf( _L( "   Image Transformation Tool\n" ) );
+    TInt err = KErrNone;
+ 
+    iToolName.Copy(KToolName);    
+
+    if ( iCmdArgs->Count() >= 0 ) 
+        {
+        iConsole->Printf( _L( "Arguments available\n" ) );
+        
+        for ( int i=0; i < iCmdArgs->Count(); i++ ) 
+            {
+            iArgumentPtr.Set(iCmdArgs->Arg(i));
+            iConsole->Printf(_L("%S "), &iArgumentPtr);
+            iArgBuf.Append( iCmdArgs->Arg(i) );
+            iArgBuf.Append( _L( " " ) );
+            }
+         iConsole->Printf(_L("\n"));
+        //parse switches to get the filenames and the comamnd options
+        ParseSwitches(iCmdArgs->Count());
+
+        //Fecth the image size for autosqueeze purpose
+        if(iTransOpt.iTransform == ITRAN_AUTOSQU)        
+            {
+            Fetch_ImageSize();
+            }
+        
+        //prepare for transformation
+        //RFbsSession::Connect();            
+        User::LeaveIfError( iFs.Connect() );
+        CleanupClosePushL(iFs);
+
+        iImageTransform = CImageTransform::NewL(iFs);
+        TInt fSize = 0;
+        // get the maxinputfileSize
+		RFile file;
+		err = file.Open(iFs, iInputfile, EFileRead);
+		CleanupClosePushL(file);
+		
+		if(err != KErrNone)
+		    {
+		    if(err == KErrNotFound)
+		        {
+                iConsole->Printf(_L("Inputfile doesn't exist in the specified path\n"));
+				ExitImageTranTool();
+		        }
+            else if(err == KErrBadName)    		        
+                {
+                iConsole->Printf(_L("Inputfile name doesn't confirm to required syntax\n"));
+    		    ExitImageTranTool();
+                }
+            else if(err == KErrPathNotFound)    		        
+                {
+                iConsole->Printf(_L("Specified Inputfile path or folder not found\n"));
+    		    ExitImageTranTool();
+                }
+            else if(err == KErrInUse)    		        
+                {
+                iConsole->Printf(_L("Specified Inputfile being opened for another task\n"));
+    		    ExitImageTranTool();
+                }
+			else
+				{
+			    iConsole->Printf(_L("Opening the inputfile has failed with error : %d\n"), err);
+	    		ExitImageTranTool();
+				}                                
+		    }
+
+		// get the filesize
+		file.Size(fSize);
+	    CleanupStack::PopAndDestroy(&file);		
+		if(iProposedSize >= fSize)
+		    {
+		    iConsole->Printf(_L(" Proposed size for squeeze should be less than the input file size\n"));
+            ExitImageTranTool();
+		    }
+        //perform transformations based on command
+        TRAP(err, Peform_TransformationL());
+        if(err != KErrNone)
+	        {
+	        iConsole->Printf(_L(" Transformation failed %d\n"), err);
+            ImageTranUsage();
+	        }
+        CleanupStack::PopAndDestroy(&iFs);
+        }
+    }
+    
+/* Parse optional switches.
+ * Returns iCmdArgs[] index of first file-name argument (== aArgCount if none).
+ * Any file names with indexes <= aLastFileArg are ignored;
+ * they have presumably been processed in a previous iteration.
+ * (Pass 0 for last_file_arg_seen on the first or only iteration.)
+ */
+void CITArgsandFuncts::ParseSwitches ( TInt aArgCount)
+    {
+      int argNum = 1;
+      
+      ReadNextArg(argNum);
+      /* Scan command line options, adjust parameters */
+        if (iArgumentPtr.Left(1).Compare(_L("-")) == 0) 
+            {
+            if (KeywordMatch(iArgumentPtr.Mid(1), _L("squeeze"), 2)) //Squeeze
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseSqueeze parameters */
+                argNum = ParseSqueezeParams(argNum);
+                }
+            else if (KeywordMatch(iArgumentPtr.Mid(1),_L("autosqueeze"), 4)) //Autosqueeze
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseAutoSqueeze parameters */
+                argNum = ParseAutoSqueezeParams(argNum);
+                }  
+            else if (KeywordMatch(iArgumentPtr.Mid(1),_L("flip"),  1)) //Flip
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseFlip parameters */
+                argNum = ParseFlipParams(argNum);
+                } 
+            else if (KeywordMatch(iArgumentPtr.Mid(1),_L("rotate"), 2)) //Rotate
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseRotate parameters */
+                argNum = ParseRotateParams(argNum);
+                }
+			else if (KeywordMatch(iArgumentPtr.Mid(1),_L("transpose"), 2)) //Transpose
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseTranspose parameters */
+                argNum = ParseTransposeParams(argNum);
+                }
+			else if (KeywordMatch(iArgumentPtr.Mid(1),_L("transverse"), 2)) //Transverse
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseTransverse parameters */
+                argNum = ParseTransverseParams(argNum);
+                }
+			else if (KeywordMatch(iArgumentPtr.Mid(1),_L("overlay"), 2)) //Overlay
+                {
+                /* Read Next argument */
+                ReadNextArg(++argNum);
+                /* ParseTransverse parameters */
+                argNum = ParseOverlayParams(argNum);
+                }
+			else if (KeywordMatch(iArgumentPtr.Mid(1),_L("help"), 2)) //Overlay
+                {
+                Select_Transform(ITRAN_HELP);
+                ImageTranUsage();
+                }                                                                  
+            else 
+                {
+                /* unknown switch */
+                iConsole->Printf( _L( "Unknown [switches] in the command\n") );
+                ImageTranUsage();
+                }
+            }
+
+    if(aArgCount <= 1)
+        {
+        iConsole->Printf( _L( "[switches] is missng from the command\n"));
+        ImageTranUsage();
+        }      
+    }
+    
+/*
+* Perform transformations squeeze,autosqueeze,
+* rotation/flip,overlay,
+*/
+void CITArgsandFuncts::Peform_TransformationL()
+    {
+	CActiveTransformListener* listener= new (ELeave) CActiveTransformListener;
+	CleanupStack::PushL(listener);		
+    TInt error = KErrNone;
+   
+    if(iTransOpt.iTransform == ITRAN_SQU)
+        {
+        SetupTransformation(iTransOpt.iTransform);
+        iTransExtn->SetDestSizeInBytes((TInt)iProposedSize);
+        listener->InitialiseActiveListener(iImageTransform);
+        // launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+        }
+    else if(iTransOpt.iTransform == ITRAN_AUTOSQU)
+        {
+        SetupTransformation(iTransOpt.iTransform);
+        /* Set proposed size to destination size */
+        iSqueezeAutoResizeParams.iMaxDestSizeInBytes = (TInt)iProposedSize;
+        iTransExtn->SetAdvancedSqueezeModeL(&iSqueezeAutoResizeParams);
+        listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+        }
+	else if(iTransOpt.iTransform == ITRAN_ROTATE)
+		{
+		SetupTransformation(iTransOpt.iTransform);
+		iTransOrientation->SetOrientationL(iOrientation);
+		listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+		}
+	else if(iTransOpt.iTransform == ITRAN_FLIP)
+		{
+		SetupTransformation(iTransOpt.iTransform);
+		iTransOrientation->SetOrientationL(iOrientation);
+		listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+		}
+	else if(iTransOpt.iTransform == ITRAN_TRANSPOSE)
+		{
+		SetupTransformation(iTransOpt.iTransform);
+		iTransOrientation->SetOrientationL(iOrientation);
+		listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+		}
+	else if(iTransOpt.iTransform == ITRAN_TRANSVERSE)
+		{
+		SetupTransformation(iTransOpt.iTransform);
+		iTransOrientation->SetOrientationL(iOrientation);
+		listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+		}
+	else if(iTransOpt.iTransform == ITRAN_OVERLAY)
+		{
+		SetupOverlayTrans();
+		listener->InitialiseActiveListener(iImageTransform);
+    	// launch the transform
+    	iImageTransform->Transform(listener->iStatus);
+    	CActiveScheduler::Start();
+		}										
+	//check status of transformation
+	error = listener->iStatus.Int();
+	if(error != KErrNone)
+	    {
+	    if(error == KErrArgument)
+		    {
+		    iConsole->Printf(_L("Bad transofrmation arguments in the specified command \n"));
+		    }
+		else if(error == KErrNoMemory)
+			{
+			iConsole->Printf(_L("Transofrmation failed due to not enough memory for processing\n"));		
+			}
+		else if(error == KErrNotSupported)
+			{
+			iConsole->Printf(_L("Transofrmation on the specifed inputfile format/arguments is not supported\n"));				
+			}
+		else
+			{
+			iConsole->Printf(_L("Transformation failed with error : %d\n"), error);				
+			}
+        ExitImageTranTool();
+	    }
+    else
+        {
+	    iConsole->Printf(_L("Transformation is successful\n"));
+        iConsole->Printf( _L( "[press any key]\n" ) );
+        iConsole->Getch();		    
+	    User::Exit(EXIT_SUCCESS);            
+        }		    
+	CleanupStack::PopAndDestroy(listener);
+    }
+    
+/* 
+ * To detect multiple transform options,
+ * and set the transforma option slected 
+ */
+void CITArgsandFuncts::Select_Transform (ITRAN_CODES aTransform)
+    {
+    if (iTransOpt.iTransform == ITRAN_NONE || iTransOpt.iTransform == aTransform) 
+        {
+        iTransOpt.iTransform = aTransform;
+        } 
+    else
+        {
+        iConsole->Printf(_L("%s: can only do one image transformation at a time\n"), &iToolName);
+        ImageTranUsage();
+        }
+    }
+    
+/* 
+* Usage of the Imagetran Command line tool */
+
+void CITArgsandFuncts::ImageTranUsage ()
+    {
+    TKeyCode charKey;
+    
+    iConsole->Printf(_L("usage: %S [switches] [parameters] \n"), &iToolName);
+    iConsole->Printf(_L("Switches for modifying the image:\n"));
+	iConsole->Printf(_L("       -squeeze     : squeeze the image <Press 1 for parameters>\n"));
+	iConsole->Printf(_L("       -autosqueeze : autosqueeze the image <Press 2 for parameters>\n"));
+	iConsole->Printf(_L("       -flip        : flip the image <Press 3 for parameters>\n"));
+	iConsole->Printf(_L("       -rotate      : rotate the image <Press 4 for parameters>\n"));
+	iConsole->Printf(_L("       -transpose   : transpose the image <Press 5 for parameters>\n"));
+	iConsole->Printf(_L("       -transverse  : transverse the image <Press 6 for parameters>\n"));
+	iConsole->Printf(_L("       -overlay     : overlay/replace the image <Press 7 for parameters>\n"));
+	iConsole->Printf(_L(" <Press 1 to 7 for [switch] parameters>\n"));
+	charKey = iConsole->Getch();	    	
+	do
+		{
+	    if(charKey == 49)
+		    {
+			iConsole->Printf(_L("Parameters  for squeeze are.....:\n"));
+			iConsole->Printf(_L("       -p [proposedsizeinbytes]  <proposedszie for autosqueeze>\n"));		    	
+		    }
+	    else if(charKey == 50)
+		    {
+			iConsole->Printf(_L("Parameters  for autosqueeze are.....:\n"));
+			iConsole->Printf(_L("       -p [proposedsizeinbytes]       <proposedszie for autosqueeze>\n"));
+			iConsole->Printf(_L("       -max [maximagesize]            <maximagesize for autosqueeze>\n"));
+			iConsole->Printf(_L("       -min [minimagesize]            <minimagesize for autosqueeze>\n"));
+			iConsole->Printf(_L("       -sqopt [autosqueezeoptions]    <autosqueeze options as mentioned below>\n"));
+			iConsole->Printf(_L("              		0  					<PreserveSourceEncodingQuality>\n"));
+			iConsole->Printf(_L("              		1					<PrioritizeLargeImageize>\n"));
+			iConsole->Printf(_L("              		2					<ResizePrioritizeHighEncodingQuality>\n"));
+			iConsole->Printf(_L("              		4					<MiddleCourse>\n")); 
+			iConsole->Printf(_L("       -mode [colourmodeoptions]             <colourmodeoptions for autosqueeze are as below>\n"));
+			iConsole->Printf(_L("                   0                         <420>\n"));
+			iConsole->Printf(_L("                   1                         <422>\n"));
+			iConsole->Printf(_L("                   2                         <444>\n"));
+			iConsole->Printf(_L("                   3                         <411>\n"));
+			iConsole->Printf(_L("        -q [qualityfactor]             <quality factor for autosqueeze>\n"));
+		    }
+		else if(charKey == 51)
+		    {
+			iConsole->Printf(_L("Parameters  for flip are.....:\n"));
+			iConsole->Printf(_L("       -flipopt [horizontal|vertical] <flip image left-right or top-bottom>\n"));
+		    }
+		else if(charKey == 52)
+		    {
+			iConsole->Printf(_L("Parameters  for rotate are.....:\n"));
+	    	iConsole->Printf(_L("       -ang [0|90|180|270]            <rotate image (degrees clockwise)>\n"));
+		    }
+		else if(charKey == 53)
+		    {
+			iConsole->Printf(_L("Parameters  for transpose are.....:\n"));
+		    }
+		else if(charKey == 54)
+		    {
+			iConsole->Printf(_L("Parameters  for transverse are.....:\n"));
+		    }	    	    	    
+		else if(charKey == 55)
+		    {
+			iConsole->Printf(_L("Parameters  for overlay are.....:\n"));
+			iConsole->Printf(_L("       -flipopt [horizontal|vertical] <flip image left-right or top-bottom>\n"));
+		    iConsole->Printf(_L("       -ovl [overlayfile]             <overlay image of type jpg,png,mbm>\n"));
+	    	iConsole->Printf(_L("       -pos [X,Y]            		   <X and Y co-ordinates of an overlay image>\n"));
+		    }
+	 	iConsole->Printf(_L("Common parameters for all the switches and the only parameters for transpose and transverse switch\n"));
+	    iConsole->Printf(_L("       -i [inputfile]                 <inputfilename for transformation>\n"));
+	    iConsole->Printf(_L("       -o [outputfile]                <outputfilename for transformation>\n"));
+	    iConsole->Printf(_L(" <Press 1 to 7 for [switch] parameters>\n"));
+		charKey = iConsole->Getch();
+		
+		}while(charKey >= 49 && charKey <= 55);
+	if(charKey < 49 || charKey > 55)
+		{
+		iConsole->Printf(_L(" Invalid keypress no switch command available for keypress \n"));
+		iConsole->Getch();
+		}
+	User::Exit(EXIT_SUCCESS);
+    }
+ 
+
+/* Exit from the imagetran tool  */    
+void CITArgsandFuncts::ExitImageTranTool()
+	{
+    iConsole->Printf(_L( "[press any key]\n" ) );
+    iConsole->Getch();    
+    User::Exit(EXIT_FAILURE);		
+	}
+	
+/*
+*   Destructor
+*/    
+CITArgsandFuncts::~CITArgsandFuncts()
+    {
+    delete iImageTransform;
+    delete iCmdArgs;
+    delete iConsole;
+    delete iScheduler;
+    delete iTransExtn;
+    }
+