diff -r edfc90759b9f -r 18b321db4884 imageeditorengine/filters/FilterDraw/Src/cfilterdraw.cpp --- a/imageeditorengine/filters/FilterDraw/Src/cfilterdraw.cpp Fri Jan 29 13:53:17 2010 +0200 +++ b/imageeditorengine/filters/FilterDraw/Src/cfilterdraw.cpp Thu Jun 03 18:57:10 2010 +0800 @@ -1,30 +1,30 @@ /* -* 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: -* Draw filter for Draw UI plugin. -* -*/ - + * 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: + * Draw filter for Draw UI plugin. + * + */ #include #include #include #include "cfilterdraw.h" -const TInt KDrawBitmapWidth(640); -const TInt KDrawBitmapHeight(480); +const TInt KDrawBitmapWidth(480); +const TInt KDrawBitmapHeight(640); +TUint32* CFilterDraw::iData = NULL; // --------------------------------------------------------------------------- // Create // --------------------------------------------------------------------------- @@ -33,7 +33,7 @@ { CFilterDraw* ptr = NULL; TRAP_IGNORE( ptr = NewL() ); - return (TInt)((MImageFilter*)ptr); + return (TInt) ((MImageFilter*) ptr); } // --------------------------------------------------------------------------- @@ -42,7 +42,7 @@ // CFilterDraw* CFilterDraw::NewL() { - return new( ELeave )CFilterDraw(); + return new (ELeave) CFilterDraw(); } // --------------------------------------------------------------------------- @@ -51,22 +51,44 @@ // CFilterDraw::~CFilterDraw() { + if(iData) + { delete[] iData; + iData = NULL; + } iReadyToRender = EFalse; // Close all paths - for( TInt i(0); iViewPortSize(); + return iChild->ViewPortSize(); } // --------------------------------------------------------------------------- // GetBlockL // --------------------------------------------------------------------------- // -TBlock* CFilterDraw::GetBlockL( const TRect& aRect ) +TBlock* CFilterDraw::GetBlockL(const TRect& aRect) { - ASSERT(iChild); - TBlock* pB = iChild->GetBlockL( aRect ); - if( !pB ) return NULL; - TUint32* pD = pB->iData; - - if( iData && iReadyToRender ) - { - // Factor between real and viewed image - TReal realToViewedFactorWidth; - TReal realToViewedFactorHeight; - RealToViewedFactories(realToViewedFactorWidth, realToViewedFactorHeight); - const TInt width( iBitmapSize.iWidth ); // Data bitmap width + ASSERT(iChild); + TBlock* pB = iChild->GetBlockL(aRect); + if (!pB) + return NULL; + TUint32* pD = pB->iData; + + if (iData && iReadyToRender) + { + // Factor between real and viewed image + TReal realToViewedFactorWidth; + TReal realToViewedFactorHeight; + RealToViewedFactories(realToViewedFactorWidth, realToViewedFactorHeight); + const TInt width(iBitmapSize.iWidth); // Data bitmap width - for( TInt y(pB->iRect.iTl.iY); yiRect.iBr.iY; ++y ) - { - TInt realY(y / Scale() + 0.5); - TInt viewY(realY / realToViewedFactorHeight + 0.5); - for( TInt x(pB->iRect.iTl.iX); xiRect.iBr.iX; ++x ) - { - TInt realX(x / Scale() + 0.5); - TInt viewX(realX / realToViewedFactorWidth + 0.5); + for (TInt y(pB->iRect.iTl.iY); y < pB->iRect.iBr.iY; ++y) + { + TInt realY(y / Scale() + 0.5); + TInt viewY(realY / realToViewedFactorHeight + 0.5); + for (TInt x(pB->iRect.iTl.iX); x < pB->iRect.iBr.iX; ++x) + { + TInt realX(x / Scale() + 0.5); + TInt viewX(realX / realToViewedFactorWidth + 0.5); - TUint32 color = iData[ width*viewY + viewX ]; - if( (color & 0xff000000) ) - { - *pD = color; - } - - *pD++; - } - } - } - return pB; + if( viewY >= KDrawBitmapHeight) + { + viewY--; + } + if(iData[width * viewY + viewX]) + { + TUint32 color = iData[width * viewY + viewX]; + if ((color & 0xff000000)) + { + *pD = color; + } + } + *pD++; + } + } + } + + return pB; } // --------------------------------------------------------------------------- // SetParent // --------------------------------------------------------------------------- // -void CFilterDraw::SetParent( MImageFilter* aParent ) +void CFilterDraw::SetParent(MImageFilter* aParent) { ASSERT(aParent); iParent = aParent; @@ -155,7 +185,7 @@ // SetChild // --------------------------------------------------------------------------- // -void CFilterDraw::SetChild( MImageFilter* aChild ) +void CFilterDraw::SetChild(MImageFilter* aChild) { ASSERT(aChild); iChild = aChild; @@ -165,120 +195,163 @@ // CmdL // --------------------------------------------------------------------------- // -TInt CFilterDraw::CmdL( const TDesC16& aCmd ) +TInt CFilterDraw::CmdL(const TDesC16& aCmd) { + TInt bbb(0); + bbb = iPaths.Count(); ASSERT(iChild); - TLex lex (aCmd); - TPoint position(0,0); - // Factor between real and viewed image - TReal realToViewedFactorWidth; - TReal realToViewedFactorHeight; - RealToViewedFactories(realToViewedFactorWidth, realToViewedFactorHeight); - + TLex lex(aCmd); + TPoint position(0, 0); + // Factor between real and viewed image + TReal realToViewedFactorWidth; + TReal realToViewedFactorHeight; + RealToViewedFactories(realToViewedFactorWidth, realToViewedFactorHeight); + // Handle parameters - while( !lex.Eos() ) + while (!lex.Eos()) { + RDebug::RawPrint(aCmd); TPtrC token = lex.NextToken(); - if( token.Compare( _L("x") ) == 0 ) + TInt pathCount(0); + pathCount = iPaths.Count(); + + if (token.Compare(_L("x")) == 0) { + iCanRedo = EFalse; + for (TInt j(0); j < iUndoPaths.Count(); j++) + { + iUndoPaths[j].Close(); + } + iUndoPaths.Close(); iReadyToRender = EFalse; - TReal relscale = Scale(); - TInt param = 0; - lex.Inc (); - lex.Val (param); + TReal relscale = Scale(); + TInt param = 0; + lex.Inc(); + lex.Val(param); // Coordinates on data bitmap - position.iX = (TReal(param) / relscale) / realToViewedFactorWidth + 0.5; + position.iX = (TReal(param) / relscale) / realToViewedFactorWidth + 0.5; } - else if( token.Compare( _L("y") ) == 0 ) + else if (token.Compare(_L("y")) == 0) { - TReal relscale = Scale(); - TInt param = 0; - lex.Inc (); - lex.Val (param); - position.iY = (TReal(param) / relscale) / realToViewedFactorHeight + 0.5; - RDebug::Print(_L("CFilterDraw::CmdL x:%d y:%d Scale:%g Rw:%d Rh:%d Vpw:%d Vph:%d Rtvw:%g Rtvh:%g"), - position.iX, - position.iY, - relscale, - Rect().Size().iWidth, - Rect().Size().iHeight, - ViewPortSize().iWidth, - ViewPortSize().iHeight, - realToViewedFactorWidth, - realToViewedFactorHeight); - - if(!iPaths.Count()) + TReal relscale = Scale(); + TInt param = 0; + lex.Inc(); + lex.Val(param); + position.iY = (TReal(param) / relscale) / realToViewedFactorHeight + 0.5; + RDebug::Print( + _L("CFilterDraw::CmdL x:%d y:%d Scale:%g Rw:%d Rh:%d Vpw:%d Vph:%d Rtvw:%g Rtvh:%g"), + position.iX, position.iY, relscale, Rect().Size().iWidth, + Rect().Size().iHeight, ViewPortSize().iWidth, + ViewPortSize().iHeight, realToViewedFactorWidth, + realToViewedFactorHeight); + + if (!iPaths.Count()) { RDrawPath newPath; - User::LeaveIfError( newPath.Append(position) ); - User::LeaveIfError( iPaths.Append( newPath ) ); + User::LeaveIfError(newPath.Append(position)); + User::LeaveIfError(iPaths.Append(newPath)); } else - { - ASSERT(iPaths.Count()); - RDrawPath& lastPath = iPaths[iPaths.Count()-1]; - User::LeaveIfError( lastPath.Append(position) ); + { + ASSERT(iPaths.Count()); + RDrawPath& lastPath = iPaths[iPaths.Count() - 1]; + User::LeaveIfError(lastPath.Append(position)); } } - else if( token.Compare( _L("color") ) == 0 ) + else if (token.Compare(_L("color")) == 0) { TUint32 color(0); lex.Inc(); - lex.Val( color, EDecimal ); + lex.Val(color, EDecimal); TRgb rgb(color); - TUint32 colorValue = - ( rgb.Red() << 16 ) + ( rgb.Green() << 8 ) + rgb.Blue(); - ASSERT( iPaths.Count() ); - RDrawPath& lastPath = iPaths[iPaths.Count()-1]; - lastPath.SetColor( TRgb(colorValue) ); - } - else if( token.Compare( _L("size") ) == 0 ) + TUint32 colorValue = (rgb.Red() << 16) + (rgb.Green() << 8) + rgb.Blue(); + ASSERT( iPaths.Count() ); + RDrawPath& lastPath = iPaths[iPaths.Count() - 1]; + lastPath.SetColor(TRgb(colorValue)); + } + else if (token.Compare(_L("size")) == 0) { TInt size(0); - lex.Inc (); + lex.Inc(); lex.Val(size); // Scale line size to match bitmap scale TInt sizew( (TReal(size) / realToViewedFactorWidth) + 0.5 ); TInt sizeh( (TReal(size) / realToViewedFactorHeight) + 0.5 ); - - if( !sizew ) - { - sizew++; - } - if( !sizeh ) - { - sizeh++; - } - - if(iPaths.Count()) + + if (!sizew) + { + sizew++; + } + if (!sizeh) { - RDrawPath& lastPath = iPaths[iPaths.Count()-1]; - lastPath.SetSize( TSize(sizew, sizeh) ); + sizeh++; + } + + if (iPaths.Count()) + { + RDrawPath& lastPath = iPaths[iPaths.Count() - 1]; + lastPath.SetSize(TSize(sizew, sizeh)); } } - else if( token.Compare( _L("lastItem") ) == 0 ) - { - ASSERT(iPaths.Count()); - - RDrawPath& lastPath = iPaths[iPaths.Count()-1]; - RDebug::Print(_L("CFilterDraw::CmdL lastItem count:%d size:%d r:%d g:%d b:%d"), - iPaths.Count(), lastPath.Size().iHeight, - lastPath.Color().Red(), - lastPath.Color().Green(), - lastPath.Color().Blue() - ); + else if (token.Compare(_L("lastItem")) == 0) + { + ASSERT(iPaths.Count()); + + RDrawPath& lastPath = iPaths[iPaths.Count() - 1]; + RDebug::Print( + _L("CFilterDraw::CmdL lastItem count:%d size:%d r:%d g:%d b:%d"), + iPaths.Count(), lastPath.Size().iHeight, + lastPath.Color().Red(), lastPath.Color().Green(), + lastPath.Color().Blue()); - RDrawPath newPath; - User::LeaveIfError( iPaths.Append( newPath ) ); - } - else if( token.Compare( _L("done") ) == 0 ) - { - LoadFrameL(); - iReadyToRender = ETrue; - } + RDrawPath newPath; + User::LeaveIfError(iPaths.Append(newPath)); + } + else if (token.Compare(_L("done")) == 0) + { + LoadFrameL(); + iReadyToRender = ETrue; + } + //Undo functionality + else if (token.Compare(_L("Undo")) == 0) + { + TInt count(0); + count = iPaths.Count(); + count = iUndoPaths.Count(); + + if (iPaths.Count() > 1) + { + TInt count = iPaths.Count(); + iUndoPaths.Append(iPaths[iPaths.Count() - 2]); + iPaths.Remove(iPaths.Count() - 2); + iCanRedo = ETrue; + } + count = iPaths.Count(); + count = iUndoPaths.Count(); + } + //Redo functionality + else if (token.Compare(_L("redone")) == 0) + { + TInt count(0); + count = iPaths.Count(); + count = iUndoPaths.Count(); + + if (iCanRedo) + { + if (iUndoPaths.Count()) + { + if (iPaths.Count() >= 1) + { + iPaths.Insert(iUndoPaths[iUndoPaths.Count() - 1],iPaths.Count() - 1); + iUndoPaths.Remove(iUndoPaths.Count() - 1); + } + } + } + count = iPaths.Count(); + count = iUndoPaths.Count(); + } } - - return KErrNone; + return KErrNone; } // --------------------------------------------------------------------------- @@ -295,131 +368,129 @@ // --------------------------------------------------------------------------- // void CFilterDraw::LoadFrameL() - { - RDebug::Print(_L("CFilterDraw::LoadFrameL w:%d h:%d"), - iBitmapSize.iWidth, - iBitmapSize.iHeight); + { + RDebug::Print(_L("CFilterDraw::LoadFrameL w:%d h:%d"), iBitmapSize.iWidth, + iBitmapSize.iHeight); + + TInt xxx(0); + xxx = iPaths.Count(); + // Create a bitmap big enough to hold the drawed lines + CFbsBitmap* bitmap = new (ELeave) CFbsBitmap(); + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(iBitmapSize, EColor16MA)); - // Create a bitmap big enough to hold the drawed lines - CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); - CleanupStack::PushL( bitmap ); - User::LeaveIfError( bitmap->Create( iBitmapSize, EColor16MA ) ); - // create mask - CFbsBitmap* mask = new (ELeave) CFbsBitmap(); - CleanupStack::PushL( mask ); - User::LeaveIfError( mask->Create(iBitmapSize,EColor16MA) ); + CFbsBitmap* mask = new (ELeave) CFbsBitmap(); + CleanupStack::PushL(mask); + User::LeaveIfError(mask->Create(iBitmapSize, EColor16MA)); - CFbsBitmapDevice* maskDevice = CFbsBitmapDevice::NewL( mask ); - CleanupStack::PushL( maskDevice ); + CFbsBitmapDevice* maskDevice = CFbsBitmapDevice::NewL(mask); + CleanupStack::PushL(maskDevice); - CFbsBitGc * maskContext(NULL); - User::LeaveIfError( maskDevice->CreateContext(maskContext) ); - CleanupStack::PushL(maskContext); - maskContext->SetPenStyle(CGraphicsContext::ESolidPen); + CFbsBitGc * maskContext(NULL); + User::LeaveIfError(maskDevice->CreateContext(maskContext)); + CleanupStack::PushL(maskContext); + maskContext->SetPenStyle(CGraphicsContext::ESolidPen); maskContext->SetBrushStyle(CGraphicsContext::ESolidBrush); maskContext->SetBrushColor(KRgbBlack); - - // Create bitmap device and context - CFbsBitmapDevice * bitmapDevice = CFbsBitmapDevice::NewL (bitmap); - CleanupStack::PushL (bitmapDevice); + + // Create bitmap device and context + CFbsBitmapDevice * bitmapDevice = CFbsBitmapDevice::NewL(bitmap); + CleanupStack::PushL(bitmapDevice); // Create bitmap graphics context - CFbsBitGc * bitmapContext(NULL); - User::LeaveIfError (bitmapDevice->CreateContext (bitmapContext)); - CleanupStack::PushL (bitmapContext); - + CFbsBitGc * bitmapContext(NULL); + User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext)); + CleanupStack::PushL(bitmapContext); + TDisplayMode dmode = bitmap->DisplayMode(); - - for(TInt pathNumber(0); pathNumberSetPenStyle (CGraphicsContext::ESolidPen); - bitmapContext->SetBrushStyle (CGraphicsContext::ESolidBrush); + + for (TInt pathNumber(0); pathNumber < iPaths.Count(); pathNumber++) + { + RDrawPath path = iPaths[pathNumber]; + bitmapContext->SetPenStyle(CGraphicsContext::ESolidPen); + bitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush); bitmapContext->SetPenColor(path.Color()); bitmapContext->SetPenSize(path.Size()); - maskContext->SetPenSize(path.Size()); + maskContext->SetPenSize(path.Size()); - RDebug::Print(_L("CFilterDraw::LoadFrameL ps:%dx%d S:%g"), - path.Size().iWidth, - path.Size().iHeight, - Scale()); - + RDebug::Print(_L("CFilterDraw::LoadFrameL ps:%dx%d S:%g"), + path.Size().iWidth, path.Size().iHeight, Scale()); + CArrayFix* pointArray = NULL; RDrawPath2PointArray(path, pointArray); - bitmapContext->DrawPolyLine( pointArray ); - maskContext->DrawPolyLine( pointArray ); + bitmapContext->DrawPolyLine(pointArray); + maskContext->DrawPolyLine(pointArray); delete pointArray; - } - - // Create memory buffer to hold rendered image data - - if( !iData ) - { - iData = new (ELeave) TUint32 [iBitmapSize.iWidth * iBitmapSize.iHeight]; - } - Mem::FillZ(iData, - iBitmapSize.iWidth * iBitmapSize.iHeight * sizeof (TUint32)); + } - TBitmapUtil bm (bitmap); - bm.Begin(TPoint(0,0)); - TBitmapUtil maskbm (mask); - maskbm.Begin(TPoint(0,0)); - TRgb rgb(0); - // Find drawed lines from bitmap - for (TInt y(0); y < iBitmapSize.iHeight - 1; y++ ) - { - for (TInt x(0); x < iBitmapSize.iWidth - 1; x++ ) - { - // Check mask first - maskbm.SetPos(TPoint(x,y)); - if( maskbm.GetPixel() == KRgbBlack.Internal() ) - { - bm.SetPos(TPoint(x,y)); - rgb = bm.GetPixel(); - iData[(iBitmapSize.iWidth*y)+x] = - ( rgb.Red() << 16 ) + ( rgb.Green() << 8 ) + rgb.Blue() | - 0xff000000; - } - } - } + // Create memory buffer to hold rendered image data + + if (!iData) + { + iData = new (ELeave) TUint32[iBitmapSize.iWidth * iBitmapSize.iHeight]; + Mem::FillZ(iData, iBitmapSize.iWidth * iBitmapSize.iHeight + * sizeof(TUint32)); + } + + TBitmapUtil bm(bitmap); + bm.Begin(TPoint(0, 0)); + TBitmapUtil maskbm(mask); + maskbm.Begin(TPoint(0, 0)); + TRgb rgb(0); + + // Find drawed lines from bitmap + for (TInt y(0); y < iBitmapSize.iHeight - 1; y++) + { + for (TInt x(0); x < iBitmapSize.iWidth - 1; x++) + { + // Check mask first + maskbm.SetPos(TPoint(x, y)); + if (maskbm.GetPixel() == KRgbBlack.Internal()) + { + bm.SetPos(TPoint(x, y)); + rgb = bm.GetPixel(); + iData[(iBitmapSize.iWidth * y) + x] = (rgb.Red() << 16) + + (rgb.Green() << 8) + rgb.Blue() | 0xff000000; + } + } + } + bm.End(); maskbm.End(); // bitmapContext, bitmapDevice, maskContext, maskDevice, mask, bitmap - CleanupStack::PopAndDestroy(6, bitmap); - RDebug::Print(_L("CFilterDraw::LoadFrameL - end")); + CleanupStack::PopAndDestroy(6, bitmap); + RDebug::Print(_L("CFilterDraw::LoadFrameL - end")); } - + // --------------------------------------------------------------------------- // RDrawPath2PointArray // --------------------------------------------------------------------------- // -void CFilterDraw::RDrawPath2PointArray( - const RDrawPath& aPath, CArrayFix*& aArrayPtr) const - { - // if allocation fails just do nothing. +1 if count is zero - aArrayPtr = new CArrayFixFlat ( aPath.Count() + 1 ); - if (aArrayPtr) - { - for( TInt i(0); iAppendL( item ) ); - } - } - } +void CFilterDraw::RDrawPath2PointArray(const RDrawPath& aPath, + CArrayFix*& aArrayPtr) const + { + // if allocation fails just do nothing. +1 if count is zero + aArrayPtr = new CArrayFixFlat (aPath.Count() + 1); + if (aArrayPtr) + { + for (TInt i(0); i < aPath.Count(); i++) + { + TPoint item = aPath[i]; + TRAP_IGNORE( aArrayPtr->AppendL( item ) ); + } + } + } // --------------------------------------------------------------------------- // RealToViewedFactories // --------------------------------------------------------------------------- // void CFilterDraw::RealToViewedFactories(TReal& aWidth, TReal& aHeight) - { - // Factor between real and viewed image - aWidth = TReal(ViewPortSize().iWidth) / - TReal(iBitmapSize.iWidth); - aHeight = TReal(ViewPortSize().iHeight) / - TReal(iBitmapSize.iHeight); - } + { + // Factor between real and viewed image + aWidth = TReal(ViewPortSize().iWidth) / TReal(iBitmapSize.iWidth); + aHeight = TReal(ViewPortSize().iHeight) / TReal(iBitmapSize.iHeight); + }