--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditorengine/filters/FilterFrame/Src/CFilterFrame.cpp Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,257 @@
+/*
+* 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 <fbs.h>
+#include <e32math.h>
+#include "CFilterFrame.h"
+
+const TInt KScaleBits = 12;
+
+EXPORT_C TInt CFilterFrame::Create()
+ {
+ CFilterFrame* ptr = NULL;
+ TRAPD( error, ptr = NewL(); );
+ if( error != KErrNone )
+ {
+ ptr = NULL;
+ }
+ return (TInt)((MImageFilter*)ptr);
+ }
+
+
+
+CFilterFrame* CFilterFrame::NewL()
+ {
+ CFilterFrame* self = new( ELeave )CFilterFrame();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+
+CFilterFrame::~CFilterFrame()
+ {
+ delete[] iData;
+ }
+
+
+
+CFilterFrame::CFilterFrame()
+ {
+
+ }
+
+
+
+void CFilterFrame::ConstructL()
+ {
+
+ }
+
+
+
+TRect CFilterFrame::Rect()
+ {
+ return iChild->Rect();
+ }
+
+TReal CFilterFrame::Scale()
+ {
+ return iChild->Scale();
+ }
+
+TSize CFilterFrame::ViewPortSize()
+{
+ return iChild->ViewPortSize();
+}
+
+TBlock * CFilterFrame::GetBlockL ( const TRect & aRect )
+{
+ TBlock * pB = iChild->GetBlockL (aRect);
+ if (!pB) return NULL;
+ TUint32 * pD = pB->iData;
+
+ for (TInt i = pB->iRect.iTl.iY; i < pB->iRect.iBr.iY; ++i)
+ {
+
+ TInt y = ((i - iOffset.iY) * iScale.iY) >> KScaleBits;
+
+ for (TInt j = pB->iRect.iTl.iX; j < pB->iRect.iBr.iX; ++j, ++pD)
+ {
+
+ TInt x = ((j - iOffset.iX) * iScale.iX) >> KScaleBits;
+
+ if ( x >= 0 && x < iSize.iWidth && y >= 0 && y < iSize.iHeight )
+ {
+ TUint32 pixel = *pD;
+ TUint32 frame = iData[y * iSize.iWidth + x];
+ TUint8 alpha = (TUint8)(iData[y * iSize.iWidth + x] >> 24);
+
+ if (alpha == 255)
+ {
+ *pD = frame;
+ }
+ else
+ {
+ TInt cc1 = (frame & 0xff00ff) * alpha + (pixel & 0xff00ff) * (255 - alpha);
+ TInt cc2 = (frame & 0xff00) * alpha + (pixel & 0xff00) * (255 - alpha);
+ *pD = (( cc1 >> 8 ) & 0xff00ff) + ((cc2 >> 8) & 0xff00);
+ }
+ }
+ }
+ }
+ return pB;
+}
+
+
+
+void CFilterFrame::SetParent( MImageFilter* aParent )
+ {
+ iParent = aParent;
+ }
+
+
+
+
+void CFilterFrame::SetChild( MImageFilter* aChild )
+ {
+ iChild = aChild;
+ }
+
+
+
+TInt CFilterFrame::CmdL( const TDesC16& aCmd )
+{
+ TLex lex (aCmd);
+
+ // Handle parameters
+ while ( !lex.Eos() )
+ {
+ TPtrC token = lex.NextToken();
+
+ if ( token.Compare( _L("file") ) == 0 )
+ {
+ TPtrC namec = lex.NextToken();
+ TPtrC name (namec.Ptr() + 1, namec.Length() - 2);
+ iFile.Copy (name);
+ }
+ else if( token.Compare( _L("frame") ) == 0 )
+ {
+ lex.Inc ();
+ lex.Val( iFrameInd );
+ }
+ else if( token.Compare( _L("mask") ) == 0 )
+ {
+ lex.Inc();
+ lex.Val( iMaskInd );
+ }
+ else if( token.Compare( _L("load") ) == 0 )
+ {
+ LoadFrameL();
+ iOrigRect = iChild->Rect();
+ TReal relscale = iChild->Scale();
+ iOrigRect.iTl.iX = (TInt)((iOrigRect.iTl.iX / relscale) + 0.5);
+ iOrigRect.iTl.iY = (TInt)((iOrigRect.iTl.iY / relscale) + 0.5);
+ iOrigRect.iBr.iX = (TInt)((iOrigRect.iBr.iX / relscale) + 0.5);
+ iOrigRect.iBr.iY = (TInt)((iOrigRect.iBr.iY / relscale) + 0.5);
+ }
+ }
+
+ TReal relscale = iChild->Scale();
+ TRect rect = iChild->Rect();
+ rect.iTl.iX = (TInt)((rect.iTl.iX / relscale) + 0.5);
+ rect.iTl.iY = (TInt)((rect.iTl.iY / relscale) + 0.5);
+ rect.iBr.iX = (TInt)((rect.iBr.iX / relscale) + 0.5);
+ rect.iBr.iY = (TInt)((rect.iBr.iY / relscale) + 0.5);
+
+ TRect framerect;
+ framerect.iTl.iX = ((rect.iTl.iX - iOrigRect.iTl.iX) * (iSize.iWidth - 1)) / iOrigRect.Width();
+ framerect.iTl.iY = ((rect.iTl.iY - iOrigRect.iTl.iY) * (iSize.iHeight - 1)) / iOrigRect.Height();
+ framerect.iBr.iX = ((rect.iBr.iX - iOrigRect.iTl.iX) * (iSize.iWidth - 1)) / iOrigRect.Width();
+ framerect.iBr.iY = ((rect.iBr.iY - iOrigRect.iTl.iY) * (iSize.iHeight - 1)) / iOrigRect.Height();
+
+ rect = iChild->Rect();
+ iScale.iX = (framerect.Width() << KScaleBits) / rect.Width();
+ iScale.iY = (framerect.Height() << KScaleBits) / rect.Height();
+
+ iOffset.iX = (TInt)(iOrigRect.iTl.iX * relscale + 0.5);
+ iOffset.iY = (TInt)(iOrigRect.iTl.iY * relscale + 0.5);
+
+ return 0;
+}
+
+const char* CFilterFrame::Type()
+ {
+ return "frame";
+ }
+
+void CFilterFrame::LoadFrameL()
+{
+
+ CFbsBitmap * frame = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL (frame);
+ User::LeaveIfError ( frame->Load (iFile, iFrameInd) );
+
+ CFbsBitmap * mask = new (ELeave) CFbsBitmap;
+ CleanupStack::PushL (mask);
+ User::LeaveIfError ( mask->Load (iFile, iMaskInd) );
+
+ // Get frame size
+ iSize = frame->SizeInPixels();
+
+ // Create frame buffer
+ delete iData;
+ iData = NULL;
+ iData = new (ELeave) TUint32 [iSize.iWidth * iSize.iHeight];
+
+ // Copy frame data
+ frame->LockHeapLC();
+
+ TInt wsf = frame->ScanLineLength (iSize.iWidth, frame->DisplayMode());
+ TInt wsm = mask->ScanLineLength (iSize.iWidth, mask->DisplayMode());
+
+ TUint8 * pfos = (TUint8 *)frame->DataAddress();
+ TUint8 * pmos = (TUint8 *)mask->DataAddress();
+ for ( TInt i = 0, k = 0; i < iSize.iHeight; ++i )
+ {
+ TUint8 * pd = pfos;
+ pfos += wsf;
+
+ TUint8 * pm = pmos;
+ pmos += wsm;
+
+ for ( TInt j = 0; j < iSize.iWidth; ++j )
+ {
+ iData[k++] = (TUint32)(*pd | (*(pd + 1) << 8) | (*(pd + 2) << 16) | (*pm++ << 24));
+ pd += 3;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(3); // LockHeapLC, mask, frame
+}
+
+
+#if !defined(EKA2)
+GLDEF_C TInt E32Dll( TDllReason )
+ {
+ return KErrNone;
+ }
+#endif