diff -r 57d4cdd99204 -r edfc90759b9f imageeditorengine/filters/FilterJpegTarget/Src/CFilterJpegTarget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageeditorengine/filters/FilterJpegTarget/Src/CFilterJpegTarget.cpp Fri Jan 29 13:53:17 2010 +0200 @@ -0,0 +1,310 @@ +/* +* 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: +* +*/ + + +#include +#include "CFilterJpegTarget.h" +#include "MJpegSave.h" +#include "JpegSaveFactory.h" + +const TInt KSaveBufferLength = 0x40000; // 256 kilobytes + +EXPORT_C TInt CFilterJpegTarget::Create() + { + CFilterJpegTarget* ptr = NULL; + TRAPD( error, ptr = NewL(); ); + if( error != KErrNone ) + { + ptr = NULL; + } + return (TInt)((MImageFilter*)ptr); + } + + + +CFilterJpegTarget* CFilterJpegTarget::NewL() + { + CFilterJpegTarget* self = new( ELeave )CFilterJpegTarget(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + + +CFilterJpegTarget::~CFilterJpegTarget() + { + delete iJpegSave; + iFile.Close(); + iFs.Close(); + } + + + +CFilterJpegTarget::CFilterJpegTarget() + { + } + + + +void CFilterJpegTarget::ConstructL() + { + User::LeaveIfError( iFs.Connect() ); + } + + + +TRect CFilterJpegTarget::Rect() + { + TRect rect; + + rect.iTl.iX = 0; + rect.iTl.iY = 0; + rect.iBr.iX = iSize.iWidth; + rect.iBr.iY = iSize.iHeight; + + return rect; + } + +TReal CFilterJpegTarget::Scale() + { + return iChild->Scale(); + } + +TSize CFilterJpegTarget::ViewPortSize() +{ + return iChild->ViewPortSize(); +} + +TBlock * CFilterJpegTarget::GetBlockL ( const TRect & /*aRect*/ ) +{ + return NULL; +} + +void CFilterJpegTarget::SetParent( MImageFilter* aParent ) + { + iParent = aParent; + } + + + + +void CFilterJpegTarget::SetChild( MImageFilter* aChild ) + { + iChild = aChild; + } + + + +TInt CFilterJpegTarget::CmdL( const TDesC16& aCmd ) + { + + TInt exifData = 0; + TInt exifLength = 0; + + TLex lex( aCmd ); + while( ! lex.Eos() ) + { + TPtrC token = lex.NextToken(); + if( token.Compare( _L("width") ) == 0 ) + { + lex.Inc(); + lex.Val( iSize.iWidth ); + } + else if( token.Compare( _L("height") ) == 0 ) + { + lex.Inc(); + lex.Val( iSize.iHeight ); + } + else if( token.Compare( _L("exifdata") ) == 0 ) + { + lex.Inc(); + lex.Val( exifData ); + } + else if( token.Compare( _L("exiflen") ) == 0 ) + { + lex.Inc(); + lex.Val( exifLength ); + } + else if( token.Compare( _L("file") ) == 0 ) + { + // + // Starts saving, gets filename in parenthesis: file "file.jpg" + // !! lexer cuts with space in filename + // + + if ( iSize.iWidth == 0 || iSize.iHeight == 0 ) + { + iRect = iChild->Rect(); + iSize.iWidth = iRect.iBr.iX - iRect.iTl.iX; + iSize.iHeight = iRect.iBr.iY - iRect.iTl.iY; + } + else + { + iRect.iTl.iX = 0; + iRect.iTl.iY = 0; + iRect.iBr.iX = iSize.iWidth; + iRect.iBr.iY = iSize.iHeight; + } + + TPtrC filec = lex.NextToken(); + TPtrC file( filec.Ptr()+1, filec.Length()-2 ); + iFileName.Copy( file ); + iFile.Replace( iFs, iFileName, EFileWrite | EFileShareAny ); + + iJpegSave = JpegSaveFactory::CreateJpegSaveL( &iFs, &iFile ); + + TPtr8 exifPtr( (TUint8*)exifData, exifLength ); + exifPtr.SetLength( exifLength ); + + iJpegSave->StartSaveL( iSize, exifPtr, KSaveBufferLength, 90 ); + + iBm.iData = new( ELeave )TUint32[ 128 ]; + iBm.iSize = TSize (16,8); + iBm.iDrawRect = iBm.iSize; + iBm.iType = E16MColor; + + + iBlockWidth = 16; + iBlockHeight = 8; + iBlockY = 0; + } + else if( token.Compare( _L("store") ) == 0 ) + { + + TInt height = iRect.iBr.iY - iRect.iTl.iY; + TInt progress = (iBlockY * 100) / height; + if( iBlockY >= height) + { + iJpegSave->FinalizeSave(); + delete iBm.iData; + progress = 100; + iFile.Close(); + } + else + { + TPoint tl (iRect.iTl.iX, iBlockY + iRect.iTl.iY); + TPoint br = tl + TPoint (iBlockWidth, iBlockHeight); + + while ( tl.iX < iRect.iBr.iX ) + { + // Get block + TBlock * pB = iChild->GetBlockL ( TRect(tl, br) ); + + if (pB) + { + TUint32 * ps = + pB->iData + + (tl.iY - pB->iRect.iTl.iY) * pB->iWidth + + (tl.iX - pB->iRect.iTl.iX); + TUint32 * pd = (TUint32*)iBm.iData; + TInt datalength = iBlockWidth * sizeof(TUint32); + for (TInt i = 0; i < iBlockHeight; ++i) + { + Mem::Copy (pd, ps, datalength); + ps += pB->iWidth; + pd += iBlockWidth; + } + + delete pB; + pB = NULL; + + } + else + { + Mem::FillZ ((TUint8 *)iBm.iData, iBlockWidth * iBlockHeight * sizeof(TUint32)); + } +/* + CFbsBitmap * bitmap = new (ELeave) CFbsBitmap; + CleanupStack::PushL(bitmap); + TSize blocksize (iBm.iSize); + User::LeaveIfError(bitmap->Create(blocksize, EColor16M)); + TBitmapUtil bm (bitmap); + bm.Begin(TPoint(0,0)); + TUint8 * pDOS = (TUint8 *)bitmap->DataAddress(); + TUint32 * pS = (TUint32 *)iBm.iData; + TInt ws = CFbsBitmap::ScanLineLength(blocksize.iWidth, EColor16M); + for (TInt ii = 0; ii < blocksize.iHeight; ++ii) + { + TUint8 * pD = pDOS; + pDOS += ws; + for (TInt j = 0; j < blocksize.iWidth; ++j) + { + TUint32 c = *pS++; + *pD++ = c & 0xFF; + c >>= 8; + *pD++ = c & 0xFF; + c >>= 8; + *pD++ = c & 0xFF; + } + } + bm.End(); + TFileName filename; + filename.Copy (_L("c:\\nokia\\images\\sf_")); + filename.AppendNum(tl.iY); + filename.Append(_L("_")); + filename.AppendNum(tl.iX); + filename.Append(_L(".mbm")); + bitmap->Save(filename); + + CleanupStack::PopAndDestroy(); // bitmap +*/ + + iJpegSave->SaveBlock( iBm ); + + + tl.iX += iBlockWidth; + br.iX += iBlockWidth; + + } + iBlockY += iBlockHeight; + + } + return progress; + } + + else if( token.Compare( _L("abort") ) == 0 ) + { + if (iBm.iData) + { + delete iBm.iData; + iBm.iData = NULL; + } + + iFile.Close(); + } + } + + return 0; + } + + + +const char* CFilterJpegTarget::Type() + { + return "jpegtarget"; + } + + +#if !defined(EKA2) +GLDEF_C TInt E32Dll( TDllReason ) + { + return KErrNone; + } +#endif