AppSrc/CDrawFaceBrowsing.cpp
author jkauppin
Fri, 15 Oct 2010 10:18:29 +0900
changeset 3 93fff7023be8
permissions -rw-r--r--
Initial version

/*
* 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 "CDrawFaceBrowsing.h"
#include "TextureLoader.h"
#include "DrawUtility.h"
#include "ImagicConsts.h"

#define IS_ALMOST_ZERO (0.001)


CDrawFaceBrowsing::CDrawFaceBrowsing(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex):
    iContainer(aContainer)//,
    //iCurrentIndex(aCurrentIndex)
    {
    // No implementation required
    }

CDrawFaceBrowsing::~CDrawFaceBrowsing()
    {
    iCoordinates.Close();
    iFloatCoordinates.Close();
    }

CDrawFaceBrowsing* CDrawFaceBrowsing::NewLC(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
    {
    CDrawFaceBrowsing* self = new (ELeave) CDrawFaceBrowsing(aContainer,aCurrentIndex);
    CleanupStack::PushL(self);
    self->ConstructL(aContainer,aCurrentIndex);
    return self;
    }

CDrawFaceBrowsing* CDrawFaceBrowsing::NewL(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
    {
    CDrawFaceBrowsing* self = CDrawFaceBrowsing::NewLC(aContainer,aCurrentIndex);
    CleanupStack::Pop(); // self;
    return self;
    }

void CDrawFaceBrowsing::ConstructL(CImagicContainerBrowser* aContainer, TInt& aCurrentIndex)
    {
    //iContainer = aContainer;
    }

void CDrawFaceBrowsing::KeyPressed()
    {
    iMenuAlpha = 1;
    }

void CDrawFaceBrowsing::KeyReleased()
    {
    iMenuAlpha = 0.99;
    }

void CDrawFaceBrowsing::KeyEvent()
    {
    //iMenuAlpha = 1;
    }

void CDrawFaceBrowsing::GetFBZoomAndLocation(TReal& aDrawZoom, TReal& aInPictureX, TReal& aInPictureY)
    {
    aDrawZoom = iDrawZoom;
    aInPictureX = iInPictureX;
    aInPictureY = iInPictureY;
    }



void CDrawFaceBrowsing::InitFaceBrowsing()
    {
    //iFBMovingSpeed = 1.4*iContainer->iTimeDiff;
    iFBMovingSpeed = 0.1;
    iFBRectCounter = 0;
    //iContainer->iDrawOneByOneTargetZoom=1;
    iDrawZoom=1;
    iDrawFBTargetZoom=1;
    iFBZoomingSpeed = 1.2*iContainer->iTimeDiff;
    iDrawX=0;
    iDrawY=0;
    iDrawTargetX=0;
    iDrawTargetY=0;
    //iInPictureX, iInPictureY
    
    }


/*----------------------------------------------------------------------*/
// Draws FaceBrowser view
//
void CDrawFaceBrowsing::DrawFaceBrowsing(const TSize &aSize)
    {
    DP0_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceBrowsing"));

    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
    
    
#ifdef SUPERZOOM
    if(imageData->iGridData.iGlSuperHQTextIndex == 0)
        {
        TRAPD(err, iContainer->iTextureLoader->LoadL(imageData, EFullSize));
        }
#endif
    
    //Calculate screen size
    iContainer->CalculateImageSize(iImageWidth, iImageHeight, (float)aSize.iWidth/(float)aSize.iHeight);
    
    if(imageData->iGridData.iRotationAngle != imageData->iGridData.iTargetRotationAngle)
        iContainer->HandleRotation(imageData->iGridData.iRotationAngle, imageData->iGridData.iTargetRotationAngle);
        
    
    //Interpolate current screen size into the new one
    iContainer->Interpolate(iDrawWidth, iImageWidth, 0.75);
    iContainer->Interpolate(iDrawHeight, iImageHeight, 0.75);
    
    //Set orthigonal projection
    glLoadIdentity();
    glOrthof(-iDrawWidth,iDrawWidth, -iDrawHeight, iDrawHeight, -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 coordinates----------------------->
    if(iFaceNro < 0)
        iFaceNro = iCoordinates.Count()-1;
    if(iFaceNro >= iCoordinates.Count())
        iFaceNro = 0;
    
    
    // Interpolate to new zoom value
    if( iContainer->iView->GetFaceBrowsingMode() != EFaceBrowsingShowRect )
        iContainer->Interpolate(iDrawZoom, iDrawFBTargetZoom, iFBZoomingSpeed);
    
    //Convert coordinates from corner to center of screen
    if(iCoordinates.Count() >= 1)
        {
        //Convert integer coords to OpenGL float coords and fill array
        for(TInt i=0; iFloatCoordinates.Count() < iCoordinates.Count();i++)
            {
            iFloatCoordinates.Append(ConvertCoordsFromAlgo2OGl(iCoordIndex));
            iCoordIndex++;
            }
        
        iDrawTargetX = iFloatCoordinates[iFaceNro].iX;
        iDrawTargetY = iFloatCoordinates[iFaceNro].iY;
        
        //Calculate face width and use that for zooming in factor
        float faceWidth = (iCoordinates[iFaceNro].iBr.iX - iCoordinates[iFaceNro].iTl.iX);
        float zoomFactor = faceWidth/20;
        
        if(iContainer->GetScreenOrientation())
            iDrawFBTargetZoom = 4.6;
        else
            iDrawFBTargetZoom = 5.4;

        iDrawFBTargetZoom /= zoomFactor;
        if(iDrawFBTargetZoom <=1.6)
            iDrawFBTargetZoom = 1.6;
        
        }
    
    /*iContainer->iTouchMoveData.iX=0;
    iContainer->iTouchMoveData.iY=0;*///mika. to test doe this make anything at all????
    
    
    // Calculate picture size
    iContainer->CalculateImageSize(iImageWidth, iImageHeight, imageData->GetAspectRatio());
    
    iImageWidth*=iDrawFBTargetZoom;
    iImageHeight*=iDrawFBTargetZoom;
    
    //Calculate location/coordinates in screen
    iInPictureX = iDrawTargetX * iDrawFBTargetZoom;
    iInPictureY = iDrawTargetY * iDrawFBTargetZoom;
    
    iDrawTargetX = iInPictureX / iDrawFBTargetZoom;
    iDrawTargetY = iInPictureY / iDrawFBTargetZoom;
    
    if(!iContainer->GetScreenOrientation())
        {
        float temp = iDrawTargetX;
        iDrawTargetX = iDrawTargetY;
        iDrawTargetY = -temp ;
        }
        
    // Move in picture------------------------>
    if( iContainer->iView->GetFaceBrowsingMode() != EFaceBrowsingShowRect )
        {
        TInt imageRotation = 0 - (TReal)imageData->GetOrientation();
        imageRotation%=360;
        
        if(imageRotation == 0)
            {
            iContainer->Interpolate(iDrawX,iDrawTargetX, iFBMovingSpeed);
            iContainer->Interpolate(iDrawY,iDrawTargetY, iFBMovingSpeed);
            }
        else if(imageRotation == -90)
            {
            iContainer->Interpolate(iDrawX,iDrawTargetY, iFBMovingSpeed);
            iContainer->Interpolate(iDrawY,-iDrawTargetX, iFBMovingSpeed);
            }
        else if(imageRotation == -180)
            {
            iContainer->Interpolate(iDrawX,-iDrawTargetX, iFBMovingSpeed);
            iContainer->Interpolate(iDrawY,-iDrawTargetY, iFBMovingSpeed);
            }
        else if(imageRotation == -270)
            {
            iContainer->Interpolate(iDrawX,-iDrawTargetY, iFBMovingSpeed);
            iContainer->Interpolate(iDrawY,iDrawTargetX, iFBMovingSpeed);
            }
        }
    
    iContainer->iCurrentBindedIndex = imageData->iGridData.BestImage();
    glBindTexture( GL_TEXTURE_2D, iContainer->iCurrentBindedIndex);
    iContainer->SetMinMagFilterLinearDo(iContainer->iMinMagFilterSetting);
    
    // Calculate picture vertices
    GLfixed vertices[8];
    iContainer->SetPictureVertices(imageData, vertices);
    glVertexPointer( 2, GL_FIXED, 0, vertices );
    glColor4f(1,1,1, 1);
    glPushMatrix();
    glScalef(iDrawZoom, iDrawZoom, iDrawZoom);
    glTranslatef(-iDrawX, iDrawY, 0);
    glRotatef(imageData->iGridData.iRotationAngle, 0,0,1);
    glDrawArrays(GL_TRIANGLE_STRIP,0,4);

#ifdef RD_FACEFRAME
    if( iContainer->iView->GetFaceBrowsingMode() == EFaceBrowsingShowRect )
        DrawFaceFrame(-1);
        
    if(ShowUtilities())
        DrawFaceFrame(iFaceNro);
    
    //Draw face rects for ~ 0.5s time
    if(iFBRectCounter > 6)
        iContainer->iView->SetFaceBrowsingMode(EFaceBrowsing);
    else
        iFBRectCounter++;
#endif

    glPopMatrix();
    
#ifdef RD_ZOOMICON
    if(ShowUtilities())
        {
        //Draw moving direction arrays
        if(iFloatCoordinates.Count() >1)
            {
            TInt imageRotation = 0 - (TReal)imageData->GetOrientation();
            
            if(iContainer->GetScreenOrientation())
                {
                if(imageRotation == 0 || imageRotation == -180)
                    {
                    iContainer->iDrawUtility->DrawMovingArrow(ETrue, EFalse, iContainer->Size());
                    }
                else if(imageRotation == -90 || imageRotation == -270)
                    {
                    iContainer->iDrawUtility->DrawMovingArrow(EFalse, ETrue, iContainer->Size());
                    }    
                }
            
            if(!iContainer->GetScreenOrientation())
                {
                if(imageRotation == 0 || imageRotation == -180)
                    {
                    iContainer->iDrawUtility->DrawMovingArrow(EFalse, ETrue, iContainer->Size());
                    }
                else if(imageRotation == -90 || imageRotation == -270)
                    {
                    iContainer->iDrawUtility->DrawMovingArrow(EFalse, ETrue, iContainer->Size());
                    }    
                }
            
            //iContainer->iDrawUtility->DrawMovingArrow(iContainer->GetScreenOrientation(), !iContainer->GetScreenOrientation(), iContainer->Size());
            }
            
            
        iContainer->iDrawUtility->DrawZoomIcon( imageData,
                                                iContainer->Size(), 
                                                -iDrawX, 
                                                iDrawY,
                                                iDrawWidth/iImageWidth, 
                                                iDrawHeight/iImageHeight,
                                                iContainer->iView->GetFaceBrowsingMode()==EFaceBrowsing);
        }
    
#endif
    
#if 0
    if(iMenuAlpha < 1)
        {
        iMenuAlpha-=0.2;
        if(iMenuAlpha < 0)
            iMenuAlpha = 0;
        }

    iContainer->iDrawUtility->DrawIcon2(iContainer->Size(), iContainer->iLoadingTextureIndex, iMenuAlpha);
#endif   
    }


TBool CDrawFaceBrowsing::ShowUtilities()
    {
    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
    TInt imageRotation = 0 - (TReal)imageData->GetOrientation();
    
    if(imageRotation == -90 || imageRotation == -270)
        {
        if(Abs(iDrawX) != Abs(iDrawTargetY) || 
           Abs(iDrawY) != Abs(iDrawTargetX) || 
           iDrawZoom != iDrawFBTargetZoom ||
           Abs(imageData->iGridData.iRotationAngle) != Abs(imageData->iGridData.iTargetRotationAngle) )
            {
            return ETrue;
            }
        else
            {
            return EFalse;
            }
        }
    else
        {
        if(Abs(iDrawX) != Abs(iDrawTargetX) || 
           Abs(iDrawY) != Abs(iDrawTargetY) || 
           iDrawZoom != iDrawFBTargetZoom ||
           Abs(imageData->iGridData.iRotationAngle) != Abs(imageData->iGridData.iTargetRotationAngle) )
            {
            return ETrue;
            }
        else
            {
            return EFalse;
            }
        }
    }

void CDrawFaceBrowsing::DrawFaceFrame(TInt aFace2bDrawn)
    {
    DP0_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceFrame++"));

    
    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
    RArray<TRect> facecoords;
    facecoords.Reset();
    
    //if(imageData->IsImageReady(ESize512x512))
        {
        for(TInt i=0; i< iCoordinates.Count();i++)
            facecoords.Append(iCoordinates[i]);    
        
        
        GLfixed vertices[8];
        glPushMatrix();
        glDisable(GL_TEXTURE_2D);
        glTranslatef(0, 0, 0.01f);
        glColor4f(0,0.7,0,1);
        glLineWidth(3.0f);
        glVertexPointer(2, GL_FIXED, 0, vertices);

        for(TInt i=0; i< facecoords.Count();i++)
            {
            GLfixed vx = (1<<15) * Abs(facecoords[i].iBr.iX + facecoords[i].iTl.iX);
            GLfixed vy = (1<<15) * Abs(facecoords[i].iBr.iY + facecoords[i].iTl.iY);
            GLfixed fW = (1<<16) * Abs(facecoords[i].iBr.iX - facecoords[i].iTl.iX);
            GLfixed fH = (1<<16) * Abs(facecoords[i].iBr.iY - facecoords[i].iTl.iY);

            DP5_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceFrame face:%d (%d,%d), W/H=%d,%d"), i, vx, vy, fW, fH);
            
            vx /= 320; // Coords are given in 320x320 coords
            vy /= 320; // convert to OpenGL 1.0x1.0 coords
            fW /= 320;
            fH /= 320;

            float ar = imageData->GetAspectRatio();

            if(ar > 1)
                {
                vx -= (1<<15);
                vy -= (0.5/ar)*(1<<16);
                }
            else
                {
                vx -= (0.5*ar)*(1<<16);
                vy -= (1<<15);
                }

            GLfixed x1 =  vx-fW/2, x2 =  vx+fW/2;
            GLfixed y1 = -vy-fH/2, y2 = -vy+fH/2; // -vy since y-coord in OpenGL is so

            DP5_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceFrame face:%d (%d,%d), W/H=%d,%d"), i, vx, vy, fW, fH);
            DP4_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceFrame xy12 (%d,%d), (%d,%d)"), x1, y1, x2, y2);

            vertices[0*2+0] = x1;    vertices[0*2+1] = y1;
            vertices[1*2+0] = x2;    vertices[1*2+1] = y1;
            vertices[2*2+0] = x2;    vertices[2*2+1] = y2;
            vertices[3*2+0] = x1;    vertices[3*2+1] = y2;
            
            if(i == aFace2bDrawn || aFace2bDrawn == -1)
                glDrawArrays(GL_LINE_LOOP,0,4);
            }

        glColor4f(1,1,1,1);
        glEnable(GL_TEXTURE_2D);
        glPopMatrix();
        }

    DP0_IMAGIC(_L("CDrawFaceBrowsing::DrawFaceFrame--"));
    }


TBool CDrawFaceBrowsing::IsDrawingNeededFaceBrowsing()
    {
    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
    
    if(Abs(iContainer->GetDisplayRotAngle() - iContainer->GetDisplayRotTargetAngle()) > 1)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 6"));
        iContainer->SetMinMagFilterLinear(EFalse);
        return ETrue;
        }
    else if(iContainer->GetDisplayRotAngle() != iContainer->GetDisplayRotTargetAngle())
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 6.1"));
        //iContainer->iDisplayRotation = iContainer->iDisplayRotationTarget;
        iContainer->SetDisplayRotAngle(iContainer->GetDisplayRotTargetAngle());
        //iContainer->iDrawOneMoreTime = ETrue;
        iContainer->SetMinMagFilterLinear(ETrue);
        return ETrue;
        }
    
    if(Abs(imageData->iGridData.iRotationAngle - imageData->iGridData.iTargetRotationAngle) > 1)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 7"));
        iContainer->SetMinMagFilterLinear(EFalse);
        return ETrue;
        }
    else if(imageData->iGridData.iRotationAngle != imageData->iGridData.iTargetRotationAngle)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 7.1"));
        imageData->iGridData.iRotationAngle = imageData->iGridData.iTargetRotationAngle;
        iContainer->SetMinMagFilterLinear(ETrue);
        //iContainer->iDrawOneMoreTime = ETrue;
        return ETrue;
        }
    
    if(Abs(iDrawZoom - iDrawFBTargetZoom) > 0.01)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 10"));
        iContainer->SetMinMagFilterLinear(EFalse);
        return ETrue;
        }
    else if(iDrawZoom != iDrawFBTargetZoom)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 10.1"));
        iDrawZoom = iDrawFBTargetZoom;
        //iContainer->iDrawOneMoreTime = ETrue;
        iContainer->SetMinMagFilterLinear(ETrue);
        return ETrue;
        }
    
    
    TInt imageRotation = 0 - (TReal)imageData->GetOrientation();
    
    if(imageRotation == -90 || imageRotation == -270)
        {
        if(Abs(Abs(iDrawX)-Abs(iDrawTargetY)) > 0.001)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 11"));
            iContainer->SetMinMagFilterLinear(EFalse);
            return ETrue;
            }
        else if(Abs(iDrawX) != Abs(iDrawTargetY))
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 11.1"));
            if(iDrawX < 0)
                iDrawX = 0-Abs(iDrawTargetY);
            else
                iDrawX = Abs(iDrawTargetY);
            //iContainer->iDrawOneMoreTime = ETrue;
            iContainer->SetMinMagFilterLinear(ETrue);
            return ETrue;
            }
    
        if(Abs(Abs(iDrawY)-Abs(iDrawTargetX)) > 0.001)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 12"));
            iContainer->SetMinMagFilterLinear(EFalse);
            return ETrue;
            }
        else if(Abs(iDrawY) != Abs(iDrawTargetX))
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 12.1"));
            if(iDrawY < 0)
                iDrawY = 0-Abs(iDrawTargetX);
            else
                iDrawY = Abs(iDrawTargetX);
            //iContainer->iDrawOneMoreTime = ETrue;
            iContainer->SetMinMagFilterLinear(ETrue);
            return ETrue;
            }
        }
    else
        {
        if(Abs(iDrawX-iDrawTargetX) > 0.001)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 11"));
            iContainer->SetMinMagFilterLinear(EFalse);
            return ETrue;
            }
        else if(iDrawX != iDrawTargetX)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 11.1"));
            iDrawX = iDrawTargetX;
            //iContainer->iDrawOneMoreTime = ETrue;
            iContainer->SetMinMagFilterLinear(ETrue);
            return ETrue;
            }
    
        if(Abs(iDrawY-iDrawTargetY) > 0.001)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 12"));
            iContainer->SetMinMagFilterLinear(EFalse);
            return ETrue;
            }
        else if(iDrawY != iDrawTargetY)
            {
            DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 12.1"));
            iDrawY = iDrawTargetY;
            //iContainer->iDrawOneMoreTime = ETrue;
            iContainer->SetMinMagFilterLinear(ETrue);
            return ETrue;
            }
        }
    
    /*if(iContainer->iDrawOneMoreTime)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::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("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 15"));
        iContainer->SetMinMagFilterLinear(ETrue);
        //iContainer->iDrawOneMoreTime = ETrue;
        }
        
    if(iContainer->iDrawNow)
        {
        DP0_IMAGIC(_L("CDrawFaceBrowsing::IsDrawingNeededOneByOne - 1"));
        /*if(iContainer->iMagGlassOn)
            {
            if(!iContainer->iTouchPointThreshold)//moved >2 pixel
                iContainer->SetMinMagFilterLinear(ETrue);
            else
                iContainer->SetMinMagFilterLinear(EFalse);
            }
        else*/
            {
            iContainer->SetMinMagFilterLinear(ETrue);
            }
        
        //iDrawOneMoreTime = ETrue;
        iContainer->iDrawNow = EFalse;
        return ETrue;
        }
    
    return EFalse;
    }


/*----------------------------------------------------------------------*/
// Calculate coords coords from alogorith to OpenGL -0.5 - +0.5 coords
//
FloatCoords CDrawFaceBrowsing::ConvertCoordsFromAlgo2OGl(const TInt aFaceIndex)
    {
    CImageData* imageData = iContainer->iIEngine->GetImageData(iContainer->GetCurrentIndex());
    
    TInt pictureWidth, pictureHeigth;
    //We use always qvga image for Face detection
    pictureWidth=320;
    pictureHeigth=320;
    //landscape
    if(imageData->GetAspectRatio() > 1)
        pictureHeigth=pictureWidth/imageData->GetAspectRatio();
    else//portrait
        pictureWidth=pictureHeigth*imageData->GetAspectRatio();
        
    //calculate midpoint from face rect
    TInt xAvegCoord = (iCoordinates[aFaceIndex].iTl.iX + iCoordinates[aFaceIndex].iBr.iX)/2;
    TInt yAvegCoord = (iCoordinates[aFaceIndex].iTl.iY + iCoordinates[aFaceIndex].iBr.iY)/2;
    //and then convert coordinate zero point to center of screen 
    xAvegCoord-=(pictureWidth/2);
    yAvegCoord-=(pictureHeigth/2);
    
    //Calculate coords coords from alogorith to OpenGL -0.5 - +0.5 coords and fill the array
    FloatCoords tmp;
    if(imageData->GetAspectRatio() > 1)
        {
        tmp.iX = (xAvegCoord * 0.5) / (pictureWidth/2);
        tmp.iY = (yAvegCoord * (0.5/imageData->GetAspectRatio())) / (pictureHeigth/2);
        }
    else//portrait
        {
        tmp.iX = (xAvegCoord * (0.5*imageData->GetAspectRatio())) / (pictureWidth/2);
        tmp.iY = (yAvegCoord * 0.5) / (pictureHeigth/2);
        }

    return tmp;
    }


/*----------------------------------------------------------------------*/
// Draws one by one view
//
void CDrawFaceBrowsing::GetFaceCoordinatesL(TRect& aRect, TFileName& aFilename)
    {
    iContainer->iImagicAppUi->GetEngine()->GetFileNameL(iContainer->GetCurrentIndex(), ESize512x512, aFilename);
    
    if(iFaceNro < iCoordinates.Count() && iFaceNro >= 0)
        {
        aRect.iTl.iX = iCoordinates[iFaceNro].iTl.iX;
        aRect.iTl.iY = iCoordinates[iFaceNro].iTl.iY;
        aRect.iBr.iX = iCoordinates[iFaceNro].iBr.iX;
        aRect.iBr.iY = iCoordinates[iFaceNro].iBr.iY;
        }
    }

/*----------------------------------------------------------------------*/
// Draws one by one view
//
TInt CDrawFaceBrowsing::GetNumberOfFaces()
    {
    return iCoordinates.Count();
    }

/*----------------------------------------------------------------------*/
// Draws one by one view
//
void CDrawFaceBrowsing::SetCurrentFaceNro(TInt aNro)
    {
    iFaceNro = aNro;
    
    if(iFaceNro < 0)
        iFaceNro = 0;
    if(iFaceNro >= iCoordinates.Count())
        iFaceNro = 0;
    }

/*----------------------------------------------------------------------*/
// Gets current face nro
//
TInt CDrawFaceBrowsing::GetCurrentFaceNro()
    {
    return iFaceNro;
    }

void CDrawFaceBrowsing::SetFaceCoords(RArray<TRect>& aCoordinates)
    {
    ClearFaceArray();
    
    for(TInt i = 0; i < aCoordinates.Count(); i++)
        {
        iCoordinates.Append(aCoordinates[i]);        
        }

    iDrawFBTargetZoom = 0;
    iFaceNro = 0;
    }

void CDrawFaceBrowsing::ClearFaceArray()
    {
    //iCoordinates.Reset();
    TInt tmp = iCoordinates.Count();
    //delete array if we had old data there
    for(TInt i = 0; i < tmp; i++)
        {
        iCoordinates.Remove(0);
        }
    
    tmp = iFloatCoordinates.Count();
    for(TInt i = 0; i < tmp; i++)
        {
        iFloatCoordinates.Remove(0);
        }
    iCoordIndex=0;
    }

TInt CDrawFaceBrowsing::GetFaceCount()
    {
    return iCoordinates.Count();
    }

void CDrawFaceBrowsing::IncFaceNumber()
    {
    iFaceNro++;
    }

void CDrawFaceBrowsing::DecFaceNumber()
    {
    iFaceNro--;
    }