--- /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;
+ }
+