AppSrc/CDrawOneByOne.cpp
changeset 3 93fff7023be8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppSrc/CDrawOneByOne.cpp	Fri Oct 15 10:18:29 2010 +0900
@@ -0,0 +1,909 @@
+/*
+* Copyright (c) 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: Juha Kauppinen, Mika Hokkanen
+* 
+* Description: Photo Browser
+*
+*/
+
+#include "CDrawOneByOne.h"
+#include "TextureLoader.h"
+#include "DrawUtility.h"
+#include "ImagicConsts.h"
+
+#define IS_NOT_IN_ZOOM_ONEBYONE ((iDrawOneByOneTargetZoom) < (iContainer->KDoubleTapZoomOneByOne1 + 0.01f))
+#define IS_ALMOST_ZERO (0.001)
+
+
+const float CDrawOneByOne::KMaxMagGlassZoomFactor = 2.2;//2.0;
+const float KOneByOneSlideSpeed = 0.24;
+
+
+CDrawOneByOne::CDrawOneByOne(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex):
+    iContainer(aContainer)//,
+    {
+    iMagGlassOn = EFalse;
+    iMagGlassOnPrev = EFalse;
+    }
+
+CDrawOneByOne::~CDrawOneByOne()
+    {
+    delete iMagGlass;
+    }
+
+CDrawOneByOne* CDrawOneByOne::NewLC(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
+    {
+    CDrawOneByOne* self = new (ELeave) CDrawOneByOne(aContainer, aCurrentIndex);
+    CleanupStack::PushL(self);
+    self->ConstructL(aContainer, aCurrentIndex);
+    return self;
+    }
+
+CDrawOneByOne* CDrawOneByOne::NewL(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
+    {
+    CDrawOneByOne* self = CDrawOneByOne::NewLC(aContainer, aCurrentIndex);
+    CleanupStack::Pop(); // self;
+    return self;
+    }
+
+void CDrawOneByOne::ConstructL(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
+    {
+    iMagGlass = CDrawMagGlass::NewL(iContainer, this);
+    }
+
+float CDrawOneByOne::GetMovingStep()
+    {
+    //iMovingStep = 0.01/(iDrawOneByOneZoom/8.0);
+    iMovingStep = 0.015/(iDrawOneByOneZoom/8.0);
+    return iMovingStep;
+    }
+
+float CDrawOneByOne::GetImgeFlowLocation()
+    {
+    return iOneByOneFlow;
+    }
+
+void CDrawOneByOne::SetImgeFlowLocation(float aValue)
+    {
+    iOneByOneFlow = aValue;
+    }
+
+TDrawOneByOneXY CDrawOneByOne::GetDrawOneByOneXY()
+    {
+    return iDrawOneByOneXY;
+    }
+
+TDrawOneByOneXY CDrawOneByOne::GetDrawOneByOneTargetXY()
+    {
+    return iDrawOneByOneTargetXY;
+    }
+
+void CDrawOneByOne::SetDrawOneByOneTargetXY(TDrawOneByOneXY aValue)
+    {
+    iDrawOneByOneTargetXY = aValue;
+    }
+
+void CDrawOneByOne::ChangeDrawOneByOneTargetX(float aValue)
+    {
+    iDrawOneByOneTargetXY.iX += aValue;
+    }
+
+void CDrawOneByOne::ChangeDrawOneByOneTargetY(float aValue)
+    {
+    iDrawOneByOneTargetXY.iY += aValue;
+    }
+
+float CDrawOneByOne::GetDrawOneByOneZoom()
+    {
+    return iDrawOneByOneZoom;
+    }
+
+void CDrawOneByOne::SetDrawOneByOneZoom(float aValue)
+    {
+    iDrawOneByOneZoom = aValue;
+    }
+
+float CDrawOneByOne::GetDrawOneByOneTargetZoom()
+    {
+    return iDrawOneByOneTargetZoom;
+    }
+
+void CDrawOneByOne::SetDrawOneByOneTargetZoom(float aValue)
+    {
+    iDrawOneByOneTargetZoom = aValue;
+    }
+
+float CDrawOneByOne::GetDrawOneByOneWidth()
+    {
+    return iDrawOnebyOneW;
+    }
+
+void CDrawOneByOne::SetDrawOneByOneWidth(float aValue)
+    {
+    iDrawOnebyOneW = aValue;
+    }
+
+float CDrawOneByOne::GetDrawOneByOneHeight()
+    {
+    return iDrawOnebyOneH;
+    }
+
+void CDrawOneByOne::SetDrawOneByOneHeight(float aValue)
+    {
+    iDrawOnebyOneH = aValue;
+    }
+
+TBool CDrawOneByOne::IsMagGlassOn()
+    {
+    return iMagGlassOn;
+    }
+
+void CDrawOneByOne::SetMagGlassStatus(TBool aValue)
+    {
+    iMagGlassOn = aValue;
+    iMagGlass->InitDrawMagGlass();
+    }
+
+TBool CDrawOneByOne::IsMagGlassPrevStateOn()
+    {
+    return iMagGlassOnPrev;
+    }
+
+void CDrawOneByOne::SetMagGlassPrevStatus(TBool aValue)
+    {
+    iMagGlassOnPrev = aValue;
+    }
+
+CDrawMagGlass* CDrawOneByOne::GetMagGlass()
+    {
+    return iMagGlass;
+    }
+
+void CDrawOneByOne::KeyPressed()
+    {
+    iMenuAlpha = 1;
+    }
+
+void CDrawOneByOne::KeyReleased()
+    {
+    iMenuAlpha = 0.99;
+    }
+
+void CDrawOneByOne::KeyEvent()
+    {
+    //iMenuAlpha = 1;
+    }
+
+/*----------------------------------------------------------------------*/
+// Initializes one by one view
+//
+void CDrawOneByOne::InitDrawOnebyOne(TReal aDrawZoom, TReal aInPictureX, TReal aInPictureY)
+    {
+    DP0_IMAGIC(_L("CDrawOneByOne::InitDrawOnebyOne"));
+    
+    //iDrawOneByOneXY.iX = 0;
+    //iDrawOneByOneXY.iY = 0;
+    iDrawOneByOneXY.iX = aInPictureX;
+    iDrawOneByOneXY.iY = aInPictureY;
+    iDrawOneByOneTargetXY.iX = 0;
+    iDrawOneByOneTargetXY.iY = 0;
+    
+    //iDrawOneByOneZoom = 0.1;
+    //if(aDrawZoom == 1)
+        iDrawOneByOneZoom = aDrawZoom;
+    /*else
+        iDrawOneByOneZoom = 0.4;*/
+    
+    iDrawOneByOneTargetZoom = 1;
+    TSize size = iContainer->Size();
+    iContainer->CalculateImageSize(iDrawOnebyOneW, iDrawOnebyOneH, (float)size.iWidth/(float)size.iHeight);
+    
+    iZoomingStep = 0.1 * iDrawOneByOneTargetZoom;
+    iZoomingSpeed = 0.2; // unno 2.5*iTimeDiff;
+    iScalingSpeed = 0.3;
+    iOneByOneFlow = 0;
+    iMagGlassOn = EFalse;
+    iMagGlassOnPrev = EFalse;
+#ifdef HOLD_SELECTION_ONDRAG
+    iContainer->iOneByOneSlideByDrag = EFalse;
+#endif
+    
+    iBorder = 0.03;
+    iScreenW = 0;
+    iScreenH = 0;
+    iInPictureX = 0;
+    iInPictureY = 0;
+    
+    //iContainer->iDrawFunction = CImagicContainerBrowser::EOneByOne;
+    iContainer->SetDrawMode(CImagicContainerBrowser::EOneByOne);
+    iContainer->iKeyPressedDown=EFalse;
+    //iContainer->iZoomInKey=EFalse;
+    //iContainer->iZoomOutKey=EFalse;
+    
+    
+    iMagGlass->InitDrawMagGlass();
+    
+    }
+/*----------------------------------------------------------------------*/
+//Draws one by one view
+// 
+void CDrawOneByOne::DrawOnebyOneL(const TSize &aSize)
+    {
+    DP0_IMAGIC(_L("CDrawOneByOne::DrawOnebyOne"));
+    //RDebug::Print(_L("CDrawOneByOne::DrawOnebyOne"));
+    
+    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
+    
+    // Calculate screen size
+    iContainer->CalculateImageSize(iImageWidth, iImageHeight, (float)aSize.iWidth/(float)aSize.iHeight);
+    
+    //Interpolate current screen size into the new one
+    //if(iContainer->iLastEventFromKeys)
+        {
+        iContainer->Interpolate(iDrawOnebyOneW, iImageWidth, 0.55);
+        iContainer->Interpolate(iDrawOnebyOneH, iImageHeight, 0.55);
+        }
+    /*else//faster interpolation for touch bcos slide speed is also faster
+        {
+        iContainer->Interpolate(iDrawOnebyOneW, iImageWidth, 0.85);
+        iContainer->Interpolate(iDrawOnebyOneH, iImageHeight, 0.85);  
+        }*/
+    //iContainer->Interpolate(iDrawOnebyOneW, iImageWidth, 0.55);
+    //iContainer->Interpolate(iDrawOnebyOneH, iImageHeight, 0.55);
+    
+    
+    //Use orthogonal projection in OneByOne mode
+    glLoadIdentity();
+    glOrthof(-iDrawOnebyOneW, iDrawOnebyOneW, -iDrawOnebyOneH, iDrawOnebyOneH, -1,1);
+    
+    //iContainer->Interpolate(iContainer->iDisplayRotation, iContainer->iDisplayRotationTarget, 0.2);
+    float tmp = iContainer->GetDisplayRotAngle();
+    iContainer->Interpolate(tmp, iContainer->GetDisplayRotTargetAngle(), 0.2);
+    iContainer->SetDisplayRotAngle(tmp);
+    glRotatef(iContainer->GetDisplayRotAngle(), 0,0,1);
+        
+    // Handle keys----------------------->
+    HandleMovingKeysOnebyOne();
+    
+    // Calculate picture size
+    iContainer->CalculateImageSize(iImageWidth, iImageHeight, imageData->GetAspectRatio());
+    
+    //Here we check that we do not go over the picture boundaries
+    CheckImageLocation();
+    
+    
+    //Move in picture------------------------>
+    iDrawOneByOneTargetXY.iX = iInPictureX / iDrawOneByOneTargetZoom;
+    iDrawOneByOneTargetXY.iY = iInPictureY / iDrawOneByOneTargetZoom;
+
+    //iMovingStep = 0.01/(iDrawOneByOneZoom/8);
+    
+    iContainer->Interpolate(iDrawOneByOneXY.iX,iDrawOneByOneTargetXY.iX, iMovingSpeed);
+    iContainer->Interpolate(iDrawOneByOneXY.iY,iDrawOneByOneTargetXY.iY, iMovingSpeed);
+    
+    // Zooming-------------------------------->
+    if(iContainer->iKeyPressedDown)
+        {
+        if(iContainer->GetKeyData().iZoomInKey)
+            iDrawOneByOneTargetZoom += iZoomingStep*2;//zoom in
+        else if(iContainer->GetKeyData().iZoomOutKey)
+            iDrawOneByOneTargetZoom -= iZoomingStep*4;//zoom out
+        }
+    
+    
+    //Limit zooming range
+    iContainer->CheckLimits(iDrawOneByOneTargetZoom, CImagicContainerBrowser::KMinOneByOneZoom, CImagicContainerBrowser::KMaxOneByOneZoom);
+    
+    // Interpolate to new zoom value
+    if(iDrawOneByOneZoom < 0.99)
+        iContainer->Interpolate(iDrawOneByOneZoom, iDrawOneByOneTargetZoom, iScalingSpeed);
+    else
+        iContainer->Interpolate(iDrawOneByOneZoom, iDrawOneByOneTargetZoom, iZoomingSpeed);
+    
+    // Rotation
+    iContainer->HandleRotationKeys();
+    iContainer->HandleRotation(imageData->iGridData.iRotationAngle, imageData->iGridData.iTargetRotationAngle);
+    
+    
+    //Load image ----------------------------------->
+    // Load high res picture if possible
+    //if(iOneByOneFlow < IS_ALMOST_ZERO)//when not zero, images are moving
+    if(iOneByOneFlow == 0)//when not zero, images are moving in oneByOne flow
+        {
+        iContainer->LoadHighResImage(imageData, iContainer->GetCurrentIndex());
+        }
+        
+    
+    //Bind and Draw ------------------------------------->
+    //Bind to Grid low res texture index. If high res is not available, so we have always some picture to bind and draw it
+    // Determine image indexes, -1 means no image
+    TInt imageIndexes[3]={-1,iContainer->GetCurrentIndex(),-1};
+    
+    //Do not draw other images when not sliding and we are in zoomed into picture
+    //if(iOneByOneFlow != 0)//when not zero, images are moving    
+    //if(!iMagGlassOn || IS_NOT_IN_ZOOM_ONEBYONE)
+        {
+        if (iContainer->GetCurrentIndex()>0)
+            imageIndexes[0]=iContainer->GetCurrentIndex()-1;
+        if (iContainer->GetCurrentIndex() < iContainer->iIEngine->GetTotalNumOfImages()-1)
+            imageIndexes[2]=iContainer->GetCurrentIndex()+1;
+        }
+    
+    //Fade side images when flow goes 70% of image width
+    if(Abs(iOneByOneFlow) > 0.25)
+        {
+        iFadeColor=1;
+        glColor4f(iFadeColor,iFadeColor,iFadeColor, 1);
+        }
+    if(iOneByOneFlow < 0.5)
+        {
+        //if(iContainer->iLastEventFromKeys)
+            iContainer->Interpolate(iFadeColor, 0, 0.25);
+        /*else
+            iContainer->Interpolate(iFadeColor, 0, 0.35);*/
+        
+        glColor4f(iFadeColor,iFadeColor,iFadeColor, 1);
+        }
+    
+    /*if(iFadeColor == 0)
+        {
+        // Determine image indexes, -1 means no image
+        TInt imageIndexes[3]={-1,iContainer->GetCurrentIndex(),-1};
+        }*/
+    
+    //Move to zero coordinate, which is selected image coordinate
+#ifdef HOLD_SELECTION_ONDRAG
+    //Stop interpolation when user is dragging
+    if(iContainer->iHoldSelection == EFalse)
+        {
+#endif
+        if(iContainer->iLastEventFromKeys)
+            iContainer->Interpolate(iOneByOneFlow, 0, KOneByOneSlideSpeed);//sliding speed
+        else
+            iContainer->Interpolate(iOneByOneFlow, 0, KOneByOneSlideSpeed*1.3);//sliding speed
+        }
+    
+    //glColor4f(1,1,1, 1);
+    glPushMatrix();
+    glScalef(iDrawOneByOneZoom, iDrawOneByOneZoom, iDrawOneByOneZoom);
+    //Move to first image location (= current-1)
+    glTranslatef(iOneByOneFlow-iContainer->KOneByOneSpacing,0,0);
+    
+    TInt currentIndexTexture=0;
+    for(TInt i=0; i<3; i++)
+        {
+        // Check that image index is valid
+        if (imageIndexes[i]!=-1)
+            {
+            //Bind to best picture
+            CImageData* data=iContainer->iIEngine->GetImageData(imageIndexes[i]);
+            if(i==1)
+                {
+                iContainer->iCurrentBindedIndex = data->iGridData.BestImage();
+                //Bind to 512 res image when not zoomed for better image scaling quality
+                if(IS_NOT_IN_ZOOM_ONEBYONE && data->iGridData.iGlHQ512TextIndex!=0 && !iMagGlassOn) 
+                    iContainer->iCurrentBindedIndex = data->iGridData.iGlHQ512TextIndex;
+                }
+            //Side images gets only 128x128 tn because of perf reason
+            else
+                iContainer->iCurrentBindedIndex = data->iGridData.iGlLQ128TextIndex;
+            if(!iContainer->iCurrentBindedIndex)
+                iContainer->iCurrentBindedIndex = data->iGridData.iGlLQ32TextIndex;
+            
+            
+            //If no images ready, bind with loading tn
+            if (iContainer->iCurrentBindedIndex == 0)
+                iContainer->iCurrentBindedIndex = iContainer->iLoadingTextureIndex;
+            
+            glBindTexture(GL_TEXTURE_2D, iContainer->iCurrentBindedIndex);
+            
+            if(i==1){
+                currentIndexTexture=iContainer->iCurrentBindedIndex;
+            }
+            iContainer->SetMinMagFilterLinearDo(iContainer->iMinMagFilterSetting);
+            
+            //Store matrix and rotate picture
+            glPushMatrix();
+               
+            if(i==1 && iMagGlassOn)
+                {
+                glColor4f(1,1,1, 1);
+                glTranslatef(iDrawOneByOneXY.iX, -iDrawOneByOneXY.iY, 0);
+                glRotatef(data->iGridData.iRotationAngle, 0,0,1);
+                iMagGlass->DrawMagGlass(aSize, data->GetAspectRatio());
+                }
+            else
+                {
+                //Set Draw color to white when drawing selection or if we drag images 
+                if(i==1 || (iContainer->iHoldSelection && !iMagGlassOn))
+                    glColor4f(1,1,1, 1);
+                else//othervise "fade" images
+                    glColor4f(iFadeColor,iFadeColor,iFadeColor, 1);
+                
+                glTranslatef(-iDrawOneByOneXY.iX, iDrawOneByOneXY.iY, 0);
+                glRotatef(data->iGridData.iRotationAngle, 0,0,1);
+                // Set vertixes and draw
+                GLfixed vertices[8];
+                iContainer->SetPictureVertices(data, vertices);
+                glVertexPointer( 2, GL_FIXED, 0, vertices );
+                glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+#ifdef EMPTY_IMAGE_AS_WIREFRAME
+                // Draw black frame with white borders
+                if (iContainer->iCurrentBindedIndex == 0)
+                    {
+                    glScalef(0.92, 0.92, 0.92);
+                    glColor4f(0,0,0,1);
+                    glDrawArrays(GL_TRIANGLE_STRIP,0,4);
+                    }
+#endif                
+                
+                }
+
+#ifdef RD_FACEFRAME
+            //if (i==1 && iDrawFaceFrame) DrawFaceFrame();
+#endif
+            
+            //Remove rotation
+            glPopMatrix();
+            }
+        // Move to next image position
+        glTranslatef(iContainer->KOneByOneSpacing,0,0);
+        }
+    glPopMatrix();
+
+    if(currentIndexTexture!=iContainer->iCurrentBindedIndex)
+        {
+        iContainer->iCurrentBindedIndex = currentIndexTexture;
+        glBindTexture(GL_TEXTURE_2D, iContainer->iCurrentBindedIndex);
+        iContainer->SetMinMagFilterLinearDo(iContainer->iMinMagFilterSetting);
+        }
+
+#ifdef SCR_DRAW_DEBUG
+    iDrawUtility->Update();
+    iDrawUtility->Draw(Size());
+#endif
+    
+    
+    
+    //iContainer->iDrawUtility->DrawMenuIndicators(iContainer->Size());
+    
+    
+#ifdef RD_ZOOMICON
+    //Draw moving direction arrays when sliding in OnByOne mode
+    if(!iMagGlassOn && iFadeColor!=0 || iOneByOneFlow != 0)
+        iContainer->iDrawUtility->DrawMovingArrow(ETrue, EFalse, iContainer->Size());
+    
+    //Draw moving direction arrays when zoomed in
+    if (!IS_NOT_IN_ZOOM_ONEBYONE && 
+        (iDrawOneByOneXY.iX != iDrawOneByOneTargetXY.iX || 
+         iDrawOneByOneXY.iY != iDrawOneByOneTargetXY.iY || 
+         iDrawOneByOneZoom != iDrawOneByOneTargetZoom ||
+         imageData->iGridData.iRotationAngle != imageData->iGridData.iTargetRotationAngle ||
+         iContainer->iOnTheEdge))
+        {
+        /*if(!iMagGlassOn)
+            {
+            iContainer->iDrawUtility->DrawMovingArrow(ETrue, !IS_NOT_IN_ZOOM_ONEBYONE, iContainer->Size());
+            }*/
+        
+        iContainer->iDrawUtility->DrawZoomIcon( imageData,
+                                                iContainer->Size(), 
+                                                -iDrawOneByOneXY.iX, 
+                                                iDrawOneByOneXY.iY,
+                                                iDrawOnebyOneW/iImageWidth, 
+                                                iDrawOnebyOneH/iImageHeight,
+                                                ETrue);
+        }
+#endif    
+
+#if 0
+    if(iMenuAlpha < 1)
+        {
+        iMenuAlpha-=0.3;
+        if(iMenuAlpha < 0)
+            iMenuAlpha = 0;
+        }
+
+    iContainer->iDrawUtility->DrawIcon2(iContainer->Size(), iContainer->iMenuTextureIndex, iMenuAlpha);
+#endif   
+    iContainer->DynamicLoadingL();
+    }
+
+
+TBool CDrawOneByOne::IsDrawingNeededOneByOne()
+    {
+    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
+    
+#if 0
+    if(iMenuAlpha != 0)
+        {
+        return ETrue;
+        }
+#endif
+    
+    if(Abs(iOneByOneFlow) > 0.01)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 2"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(iOneByOneFlow!=0)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 3"));
+        iOneByOneFlow=0;
+        //if(imageData->iGridData.iGlHQ512TextIndex != 0)
+        //iContainer->iDrawOneMoreTime = ETrue;
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+    
+    if(iMagGlassOnPrev != iMagGlassOn)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 4"));
+        iMagGlassOnPrev = iMagGlassOn;
+        //SetMinMagFilterLinear(ETrue);
+        //iContainer->iDrawOneMoreTime = ETrue;
+        return ETrue;
+        }
+    
+    if(iMagGlassOn && (iMagGlass->GetMagGlassZoomFactor() < KMaxMagGlassZoomFactor-0.1))
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 5"));
+        DP1_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - magGlass: %f"), iMagGlass->GetMagGlassZoomFactor());
+        iMagGlassOnPrev = iMagGlassOn;
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+        
+    if(Abs(iContainer->GetDisplayRotAngle() - iContainer->GetDisplayRotTargetAngle()) > 1)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 6"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(iContainer->GetDisplayRotAngle() != iContainer->GetDisplayRotTargetAngle())
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 6.1"));
+        iContainer->SetDisplayRotAngle(iContainer->GetDisplayRotTargetAngle());
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+    
+    if(Abs(imageData->iGridData.iRotationAngle - imageData->iGridData.iTargetRotationAngle) > 1)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 7"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(imageData->iGridData.iRotationAngle != imageData->iGridData.iTargetRotationAngle)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 7.1"));
+        imageData->iGridData.iRotationAngle = imageData->iGridData.iTargetRotationAngle;
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+    
+    if(Abs(iDrawOneByOneZoom - iDrawOneByOneTargetZoom) > 0.01)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 9"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(iDrawOneByOneZoom != iDrawOneByOneTargetZoom)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 9.1"));
+        iDrawOneByOneZoom = iDrawOneByOneTargetZoom;
+        //iContainer->iDrawOneMoreTime = ETrue;
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+
+    if(Abs(iDrawOneByOneXY.iX-iDrawOneByOneTargetXY.iX) > 0.001)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 11"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(iDrawOneByOneXY.iX != iDrawOneByOneTargetXY.iX)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 11.1"));
+        iDrawOneByOneXY.iX = iDrawOneByOneTargetXY.iX;
+        //iContainer->iDrawOneMoreTime = ETrue;
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+    
+    if(Abs(iDrawOneByOneXY.iY-iDrawOneByOneTargetXY.iY) > 0.001)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 12"));
+        iContainer->SetMinMagFilterLinear(EFalse);
+        return ETrue;
+        }
+    else if(iDrawOneByOneXY.iY != iDrawOneByOneTargetXY.iY)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 12.1"));
+        iDrawOneByOneXY.iY = iDrawOneByOneTargetXY.iY;
+        //iContainer->iDrawOneMoreTime = ETrue;
+        iContainer->SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }
+    
+    /*if(iPreviousTexNum != iCurrentTexNum && !iDrawOneMoreTime)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 13.0"));
+        //iDrawOneMoreTime = ETrue;
+        SetMinMagFilterLinear(ETrue);
+        return ETrue;
+        }*/
+    
+    /*if(imageData->GetAspectRatio() > iScreenAspectRatio && (iDrawOneByOneZoom-1) < 0.01)
+        if(Abs(iDrawOnebyOneW-iImageWidth*2) > 0.01)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 13.1"));
+            DP2_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - iDrawOnebyOneW: %f, iImageWidth: %f"),iDrawOnebyOneW, iImageWidth);
+            SetMinMagFilterLinear(EFalse);
+            //iDrawOneMoreTime = ETrue;
+            return ETrue;
+            }
+        else if(iDrawOnebyOneW != iImageWidth*2)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 13.2"));
+            DP2_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - iDrawOnebyOneW: %f, iImageWidth: %f"),iDrawOnebyOneW, iImageWidth);
+            iDrawOnebyOneW = iImageWidth*2;
+            iDrawOneMoreTime = ETrue;
+            SetMinMagFilterLinear(ETrue);
+            return ETrue;
+            }*/
+    
+    /*
+    if(imageData->GetAspectRatio() < iContainer->iScreenAspectRatio && (iDrawOneByOneZoom-1) < 0.01)
+        if(Abs(iDrawOnebyOneH-iImageHeight) > 0.01)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 13.3"));
+            DP2_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - iDrawOnebyOneH: %f, iImageHeight: %f"),iDrawOnebyOneH, iImageHeight);
+            iContainer->SetMinMagFilterLinear(EFalse);
+            //iDrawOneMoreTime = ETrue;
+            return ETrue;
+            }
+        else if(Abs(iDrawOnebyOneH - iImageHeight) > IS_ALMOST_ZERO)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 13.4"));
+            DP2_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - iDrawOnebyOneH: %f, iImageHeight: %f"),iDrawOnebyOneH, iImageHeight);
+            iDrawOnebyOneH = iImageHeight;
+            //iContainer->iDrawOneMoreTime = ETrue;
+            iContainer->SetMinMagFilterLinear(ETrue);
+            return ETrue;
+            }
+    */
+    
+    /*if(iContainer->iDrawOneMoreTime)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 14"));
+        iContainer->iDrawOneMoreTime = EFalse;
+        iContainer->SetMinMagFilterLinear(ETrue);//Draw one more time to change for Linear rendering mode
+        return ETrue;
+        }*/
+    
+    if(!iContainer->iMagFilterLinear)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 15"));
+        iContainer->SetMinMagFilterLinear(ETrue);
+        //iContainer->iDrawOneMoreTime = ETrue;
+        }
+        
+    if(Abs(iOneByOneFlow) < 0.7)
+        if(iFadeColor > 0.1)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 16"));
+            iContainer->SetMinMagFilterLinear(EFalse);
+            return ETrue;
+            }
+        else if(iFadeColor!=0)
+            {
+            DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 17"));
+            iFadeColor = 0;
+            iContainer->SetMinMagFilterLinear(ETrue);
+            return ETrue;
+            }
+
+    if(iContainer->iDrawNow)
+        {
+        DP0_IMAGIC(_L("CDrawOneByOne::IsDrawingNeededOneByOne - 1"));
+        if(iMagGlassOn)
+            {
+            if(!iContainer->IsTouchPointThresholdExeed())//moved >2 pixel
+                iContainer->SetMinMagFilterLinear(ETrue);
+            else
+                iContainer->SetMinMagFilterLinear(EFalse);
+            }
+        else
+            {
+            iContainer->SetMinMagFilterLinear(ETrue);
+            }
+        
+        iContainer->iDrawNow = EFalse;
+        return ETrue;
+        }
+    
+    return EFalse;
+    }
+
+//Here we check that we do not go over the picture boundaries
+void CDrawOneByOne::CheckImageLocation(/*float& aImageWidth, float& aImageHeight*/)
+    {
+    
+    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
+    
+    // Change landscape<->portrait if pic is rotated 90 or 270
+    TInt angle = imageData->iGridData.iTargetRotationAngle;
+    if(angle % 90 == 0 && angle % 180 != 0)
+        {
+        if(imageData->GetAspectRatio() > 1)
+            {
+            /*iImageWidth /= imageData->GetAspectRatio();
+            iImageWidth -= (iImageWidth-iDrawOnebyOneW);*/
+            iImageHeight *= imageData->GetAspectRatio();
+            iImageHeight -= (iImageHeight-iDrawOnebyOneH);
+            iImageWidth = iImageHeight / imageData->GetAspectRatio();
+            
+            }
+        else
+            {
+            /*iImageWidth/= imageData->GetAspectRatio();
+            iImageWidth-= (iImageWidth-iDrawOnebyOneW);*/
+            iImageHeight *= imageData->GetAspectRatio();
+            iImageHeight -= (iImageHeight-iDrawOnebyOneH);
+            iImageWidth = iImageHeight / imageData->GetAspectRatio();
+            }
+        }
+    
+    
+    iImageWidth *= iDrawOneByOneTargetZoom;
+    iImageHeight *= iDrawOneByOneTargetZoom;
+    
+    //Calculate location/coordinates in screen
+    iInPictureX = iDrawOneByOneTargetXY.iX * iDrawOneByOneTargetZoom; 
+    iInPictureY = iDrawOneByOneTargetXY.iY * iDrawOneByOneTargetZoom;
+        
+    //Lets move in picture little bit over the border
+    if(iDrawOneByOneTargetZoom==1)
+        {
+        iBorder=0;
+        iDrawOneByOneTargetXY.iX = 0;
+        iDrawOneByOneTargetXY.iY = 0;
+        }
+    else
+		{
+        iBorder=0.015; // was 0.1. Changed to 0 to limit just at the edge of image in zoom
+		}
+    
+    //Calculate screen size
+    iScreenW = iDrawOnebyOneW - iBorder;
+    iScreenH = iDrawOnebyOneH - iBorder;
+        
+        
+    if (iImageWidth > iScreenW)
+        {
+        if (iInPictureX-iScreenW < -iImageWidth)
+            iInPictureX=-iImageWidth+iScreenW;
+        if (iInPictureX+iScreenW > iImageWidth)
+            iInPictureX=iImageWidth-iScreenW;
+        }
+    else
+        {
+        iInPictureX=0;
+        }
+    if (iImageHeight > iScreenH)
+        {
+        if (iInPictureY-iScreenH < -iImageHeight)
+            iInPictureY=-iImageHeight+iScreenH;
+        if (iInPictureY+iScreenH > iImageHeight)
+            iInPictureY=iImageHeight-iScreenH;
+        }
+    else
+        {
+        iInPictureY=0;
+        }
+    
+    if(IS_NOT_IN_ZOOM_ONEBYONE)
+        {
+        iInPictureY=0;
+        iInPictureX=0;
+        }
+    }
+
+void CDrawOneByOne::HandleMovingKeysOnebyOne()
+    {
+    // Handle keys----------------------->
+    CKeyData keyData = iContainer->GetKeyData();
+    CKeyData touchData = iContainer->GetTouchData();
+    iFlowThresHold=0.8;
+    
+    //Handle keydata and touchdata
+    ChangeDrawOneByOneTargetX(keyData.iRight * GetMovingStep());
+    ChangeDrawOneByOneTargetX(-keyData.iLeft * GetMovingStep());
+    ChangeDrawOneByOneTargetY(keyData.iDown * GetMovingStep());
+    ChangeDrawOneByOneTargetY(-keyData.iUp * GetMovingStep());
+    
+    ChangeDrawOneByOneTargetX(touchData.iRight * GetMovingStep());
+    ChangeDrawOneByOneTargetX(-touchData.iLeft * GetMovingStep());
+    ChangeDrawOneByOneTargetY(touchData.iDown * GetMovingStep());
+    ChangeDrawOneByOneTargetY(-touchData.iUp * GetMovingStep());
+    
+    if(touchData.iRight || touchData.iLeft || touchData.iDown || touchData.iUp)
+        //iMovingSpeed = 2.2;
+        iMovingSpeed = 100;
+    else
+        iMovingSpeed = 0.15;
+        //iMovingSpeed = 0.01;
+        
+    //Calculate new index from movement keys to change picture in onebyone mode
+    //but only if zooming is not done
+    //And we have started sliding/moving
+#ifdef HOLD_SELECTION_ONDRAG
+    if(GetDrawOneByOneTargetZoom()==1 && 
+       //((Abs(GetImgeFlowLocation())<0.99) || 
+       ((Abs(GetImgeFlowLocation())<iFlowThresHold) ||
+       iContainer->GetSlideByDragValue()) &&
+       !IsMagGlassOn())
+       
+#else
+    if(iDrawOneByOneTargetZoom==1 && Abs(iOneByOneFlow)<0.2 && !iMagGlassOn)
+#endif
+        {
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() + keyData.iY);
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() + keyData.iX);
+        
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() + touchData.iY);
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() + touchData.iX);
+        }
+    
+    // Check that index is in grid area
+    while(iContainer->GetCurrentIndex() >= iContainer->iIEngine->GetTotalNumOfImages())
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() - iContainer->iIEngine->GetTotalNumOfImages());
+    while(iContainer->GetCurrentIndex() < 0)
+        iContainer->SetCurrentIndex(iContainer->GetCurrentIndex() + iContainer->iIEngine->GetTotalNumOfImages());
+    
+    // Update selected picture index
+    if(iContainer->GetPrevIndex() != iContainer->GetCurrentIndex())
+        {
+        //iContainer->iTextureLoader->ReleaseHQ512Textures();
+        
+        //iMagGlassOn = EFalse;
+        SetMagGlassStatus(EFalse);
+        
+        iContainer->iImagicAppUi->SetImageIndex(iContainer->GetCurrentIndex());
+        
+        // Set new flow coordinate
+        if (keyData.iLeft || touchData.iLeft)
+            {
+            float tmp = GetImgeFlowLocation();
+            tmp-=CImagicContainerBrowser::KOneByOneSpacing;
+            SetImgeFlowLocation(tmp);
+            //iOneByOneFlow-=KOneByOneSpacing;
+            }
+        if (keyData.iRight || touchData.iRight)
+            {
+            float tmp = GetImgeFlowLocation();
+            tmp+=CImagicContainerBrowser::KOneByOneSpacing;
+            SetImgeFlowLocation(tmp);
+            //iOneByOneFlow+=KOneByOneSpacing;
+            }
+        
+        //Cancel SuperZoom image loading, if it was started
+        iContainer->iIEngine->CancelFullSizeLoading();
+        }
+    iContainer->SetPrevIndex(iContainer->GetCurrentIndex());
+    
+    iContainer->ResetKeyData();
+    iContainer->ResetTouchData();
+    }