uifw/ganes/src/HgVgMediaWallRenderer.cpp
changeset 47 2f0c06423c72
parent 46 0e1e0022bd03
child 53 3c67ea82fafc
equal deleted inserted replaced
46:0e1e0022bd03 47:2f0c06423c72
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 
       
    20 #include "HgVgMediaWallRenderer.h"
       
    21 #include "HgVgHelper.h"
       
    22 #include "HgConstants.h"
       
    23 #include "HgVgConstants.h"
       
    24 
       
    25 #include <VG/vgu.h>
       
    26 #include <ganes/HgVgItem.h>
       
    27 #include <AknUtils.h>
       
    28 #include <layoutmetadata.cdl.h>
       
    29 #include <AknLayout2ScalableDef.h>
       
    30 #include <AknsDrawUtils.h>
       
    31 #include <e32math.h>
       
    32 
       
    33 using namespace HgVgConstants;
       
    34 
       
    35 const VGfloat KColorByteToFloat(255.0f);
       
    36 // Ending position of the left album stack
       
    37 const VGfloat KLeftStackEndX(-1.04);//-235.0f);
       
    38 // Ending position of the right album stack
       
    39 const VGfloat KRightStackStartX(1.04);//235.0f);
       
    40 
       
    41 // Space between albums in stacks
       
    42 const VGfloat KSpaceBetween(1.04);//235);
       
    43 
       
    44 const TInt KGroundHeightFactor(2);
       
    45 const TInt KNumGroundGradientValues(4);
       
    46 const VGfloat KGroundGradient[] = {
       
    47         0.0f, 0.0f, 0.0f, 1.0f
       
    48 };
       
    49 const TInt KGroundVerticesHint(4);
       
    50 const TInt KGroundSegmentsHint(4);
       
    51 const VGfloat KGroundScale(1.0f);
       
    52 const VGfloat KGroundBias(0.0f);
       
    53 
       
    54 const VGfloat KFov(PI/2);
       
    55 
       
    56 const VGfloat KFlipAngle(PI);
       
    57 
       
    58 const VGfloat KQuadVerts[] =
       
    59             {
       
    60                     -1.0f, -1.0f, 0.0f,
       
    61                     1.0f, -1.0f, 0.0f,
       
    62                     1.0f, 1.0f, 0.0f,
       
    63                     -1.0f, 1.0f, 0.0f
       
    64             };
       
    65 
       
    66 
       
    67 // ============================ MEMBER FUNCTIONS ===============================
       
    68 
       
    69 // -----------------------------------------------------------------------------
       
    70 // CHgVgCoverflowRenderer::NewL()
       
    71 // -----------------------------------------------------------------------------
       
    72 //
       
    73 CHgVgMediaWallRenderer* CHgVgMediaWallRenderer::NewL(TInt aMaxQuads, const TRect& aRect, 
       
    74         const TRect& aFrontRect, TReal aZOffset )
       
    75     {
       
    76     CHgVgMediaWallRenderer* self = new (ELeave) CHgVgMediaWallRenderer( aRect, 
       
    77             aFrontRect, aZOffset);
       
    78     CleanupStack::PushL( self );
       
    79     self->ConstructL(aMaxQuads);
       
    80     CleanupStack::Pop( self );
       
    81     return self;
       
    82     }
       
    83 
       
    84 // -----------------------------------------------------------------------------
       
    85 // CHgVgMediaWallRenderer::ConstructL()
       
    86 // Symbian 2nd phase constructor can leave.
       
    87 // -----------------------------------------------------------------------------
       
    88 //
       
    89 void CHgVgMediaWallRenderer::ConstructL (TInt aMaxQuads)
       
    90     {
       
    91     for (TInt i = 0; i < aMaxQuads; i++)
       
    92         {
       
    93         TQuad* q = new (ELeave)TQuad;
       
    94         q->iItemIndex = -1;
       
    95         iQuads.Append(q);
       
    96         }
       
    97     CreateGround();
       
    98     }
       
    99 
       
   100 // -----------------------------------------------------------------------------
       
   101 // CHgVgMediaWallRenderer::CHgVgMediaWallRenderer()
       
   102 // C++ default constructor can NOT contain any code, that might leave.
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 CHgVgMediaWallRenderer::CHgVgMediaWallRenderer(
       
   106         const TRect& aWindowRect, 
       
   107         const TRect& aFrontRect, 
       
   108         TReal aZOffset) :
       
   109         iRect(aWindowRect),
       
   110         iReflectionsEnabled(ETrue), 
       
   111         iSelectedItemIndex(KSelectedItemIndex),
       
   112         iLeftStackEndX(KLeftStackEndX),
       
   113         iRightStackStartX(KRightStackStartX),
       
   114         iSpaceBetween(KSpaceBetween),
       
   115         iFov(KFov),
       
   116         iFlipAngle(KFlipAngle)
       
   117     {
       
   118     AdjustSettingsBasedOnRects(aFrontRect, aZOffset);
       
   119     }
       
   120         
       
   121 // -----------------------------------------------------------------------------
       
   122 // CHgVgScrollBar::~CHgVgScrollBar()
       
   123 // Destructor.
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 CHgVgMediaWallRenderer::~CHgVgMediaWallRenderer ( )
       
   127     {
       
   128     if (iDefaultImage != VG_INVALID_HANDLE)
       
   129         vgDestroyImage(iDefaultImage);
       
   130     
       
   131     if (iChildBlurImage != VG_INVALID_HANDLE)
       
   132         vgDestroyImage(iChildBlurImage);
       
   133     
       
   134     if (iBlurImage != VG_INVALID_HANDLE)
       
   135         vgDestroyImage(iBlurImage);
       
   136     
       
   137     vgDestroyPaint(iGroundPaint);
       
   138     vgDestroyPath(iGroundPath);
       
   139     
       
   140     iQuads.ResetAndDestroy();
       
   141     iSortedQuads.Reset();
       
   142     }
       
   143 
       
   144 // -----------------------------------------------------------------------------
       
   145 // CHgMediaWallRenderer::SetDefaultImage()
       
   146 // Setter for default image used to draw quads.
       
   147 // -----------------------------------------------------------------------------
       
   148 //
       
   149 void CHgVgMediaWallRenderer::SetDefaultIconL(const CGulIcon& aIcon)
       
   150     {    
       
   151     iDefaultImage = HgVgHelper::CreateVgImageFromIconL(aIcon);
       
   152     }
       
   153 
       
   154 // -----------------------------------------------------------------------------
       
   155 // CHgMediaWallRenderer::SetCameraPosition()
       
   156 // Setter for camera position modifier.
       
   157 // -----------------------------------------------------------------------------
       
   158 //
       
   159 void CHgVgMediaWallRenderer::SetCameraPosition(TReal aX, TReal aY, TReal aZ)
       
   160     {
       
   161     iCameraX = aX;
       
   162     iCameraY = aY;
       
   163     iCameraZ = aZ;
       
   164     }
       
   165 
       
   166 // -----------------------------------------------------------------------------
       
   167 // CHgMediaWallRenderer::SetCameraRotation()
       
   168 // -----------------------------------------------------------------------------
       
   169 //
       
   170 void CHgVgMediaWallRenderer::SetCameraRotation(TReal aAngle)
       
   171     {
       
   172     iCameraRotation = aAngle;
       
   173     }
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // CHgVgScrollBar::SortQuads
       
   177 // Sorts quads from iQuads to iSortedQuads.
       
   178 // -----------------------------------------------------------------------------
       
   179 //
       
   180 void CHgVgMediaWallRenderer::SortQuads(TInt aNumQuads)
       
   181     {
       
   182     
       
   183     iSortedQuads.Reset();
       
   184     
       
   185     for(TInt i = 0; i < aNumQuads; ++i)
       
   186         {
       
   187         iSortedQuads.Append(iQuads[i]);
       
   188         }
       
   189     
       
   190     for (TInt i = 1; i < aNumQuads; i++)
       
   191         {
       
   192         for (int j = 0; j < aNumQuads; j++)
       
   193             {
       
   194             if( iSortedQuads[i]->iZ > iSortedQuads[j]->iZ )
       
   195                 {
       
   196                 TQuad* q1 = iSortedQuads[i];
       
   197                 TQuad* q2 = iSortedQuads[j];
       
   198                 iSortedQuads[i] = q2;
       
   199                 iSortedQuads[j] = q1;
       
   200                 }
       
   201             }
       
   202         }
       
   203         
       
   204     }
       
   205 
       
   206 
       
   207 // -----------------------------------------------------------------------------
       
   208 // CHgVgScrollBar::GetItemIndex
       
   209 // gets index of the item under pointer position.
       
   210 // -----------------------------------------------------------------------------
       
   211 //
       
   212 TInt CHgVgMediaWallRenderer::GetItemIndex(const TPoint& aPointerPosition) const
       
   213     {
       
   214     for (TInt i = 0; i < iSortedQuads.Count(); i++)
       
   215         {
       
   216         VGfloat* verts = iSortedQuads[iSortedQuads.Count()-i-1]->iPoints;
       
   217         TRect rect;
       
   218         HgVgHelper::CalculateBoundingRect(rect, verts, 4, iRect);
       
   219         if (rect.Contains(aPointerPosition))
       
   220             {
       
   221             TInt index = iSortedQuads.Count()-i-1;
       
   222             return iSortedQuads[index]->iItemIndex;
       
   223             }
       
   224         }
       
   225     return KErrNotFound;    
       
   226     }
       
   227 
       
   228 
       
   229 // -----------------------------------------------------------------------------
       
   230 // CHgVgScrollBar::TransformQuads
       
   231 // Draws quads using OpenVG.
       
   232 // -----------------------------------------------------------------------------
       
   233 //
       
   234 void CHgVgMediaWallRenderer::TransformQuads(TInt aNumVisibleQuads,
       
   235         TBool aMirrored, VGfloat aFov, CHgVgMediaWall::THgVgOpeningAnimationType aOpeningAnimationType)
       
   236     {
       
   237 
       
   238     VGfloat scW = (VGfloat) iRect.Width();
       
   239     VGfloat scH = (VGfloat) iRect.Height();
       
   240         
       
   241     VGfloat imW = (VGfloat)iImageSize.iWidth;
       
   242     VGfloat imH = (VGfloat)iImageSize.iHeight;
       
   243   
       
   244     // construct mirror matrix
       
   245     HgVgHelper::TMatrix mirrorMatrix;
       
   246     mirrorMatrix.Scale(1, -1, 1);
       
   247 
       
   248     // construct camera rotation matrix
       
   249     HgVgHelper::TMatrix cameraRotMatrix;    
       
   250     if (iFlipXY)
       
   251         {
       
   252         cameraRotMatrix.RotationX(iCameraRotation);
       
   253         }
       
   254     else
       
   255         {
       
   256         cameraRotMatrix.RotationY(iCameraRotation);
       
   257         }
       
   258 
       
   259     // mat[0] = transform
       
   260     // mat[1] = mirrored transform
       
   261     HgVgHelper::TMatrix mat[2];
       
   262     
       
   263     VGfloat cameraX = iCameraBaseX + iCameraX;
       
   264     VGfloat cameraY = iCameraBaseY + iCameraY;
       
   265     VGfloat cameraZ = iCameraBaseZ + iCameraZ;
       
   266     
       
   267     if (iFlipXY)
       
   268         {
       
   269         VGfloat foobar = cameraX;
       
   270         cameraX = cameraY;
       
   271         cameraY = foobar;
       
   272         }
       
   273         
       
   274     // scaling matrix is used to set correct size for the 
       
   275     // quad by image size
       
   276     VGfloat hImW = (VGfloat)KWorldQuadWidth * 0.5f;
       
   277     VGfloat hImH = (VGfloat)imH * (KWorldQuadWidth / imW) * 0.5f;
       
   278     VGfloat oldHImH = hImH;
       
   279     
       
   280     // flips image upside down
       
   281     HgVgHelper::TMatrix scaleMatrix;
       
   282     scaleMatrix.Scale(hImW, -hImH, 1); // negative scale because our all images are updaside down.
       
   283 
       
   284     TBool deform = 
       
   285             (aOpeningAnimationType == CHgVgMediaWall::EHgVgOpeningAnimationFlipToFront) ||
       
   286             (aOpeningAnimationType == CHgVgMediaWall::EHgVgOpeningAnimationZoomToFront);
       
   287     
       
   288     for (TInt j = 0; j < aNumVisibleQuads; j++)
       
   289         {
       
   290         TQuad* q = iQuads[j];
       
   291                                 
       
   292         if (q->iFlipped && deform)
       
   293             {
       
   294             // animate scaling to flipped rect size
       
   295             VGfloat newH = (VGfloat)iFlippedHeight * (KWorldQuadWidth / iFlippedWidth) * 0.5f;
       
   296             hImH = HgVgHelper::Lerp(hImH, newH, iBlurAlpha);
       
   297             mat[0].Identity();
       
   298             mat[0].Scale(hImW, -hImH, 1);
       
   299             }
       
   300         else
       
   301             {
       
   302             // restore old normal half image height
       
   303             hImH = oldHImH;
       
   304             mat[0] = scaleMatrix;        
       
   305             }
       
   306 
       
   307         // rotMatrix rotates by quads angle
       
   308         HgVgHelper::TMatrix rotMatrix;
       
   309         rotMatrix.RotationY(-q->iAngle);
       
   310 
       
   311         // trMatrix translates by quads position
       
   312         HgVgHelper::TMatrix trMatrix;
       
   313         trMatrix.Translation(q->iX, q->iY + hImH, q->iZ);
       
   314                                 
       
   315         // then rotate
       
   316         if (q->iAngle != 0)
       
   317             {
       
   318             mat[0].Multiply(rotMatrix);
       
   319             }
       
   320         
       
   321         // then translate to position
       
   322         mat[0].Multiply(trMatrix);
       
   323                 
       
   324         // construct mirroring matrix
       
   325         if (aMirrored)
       
   326             {
       
   327             mat[1] = mat[0];
       
   328             mat[1].Multiply(mirrorMatrix);
       
   329             }
       
   330         
       
   331         // construct camera translation matrix
       
   332         HgVgHelper::TMatrix cameraMatrix;
       
   333         cameraMatrix.Translation(-cameraX, -cameraY - hImH, -cameraZ);
       
   334 
       
   335         // apply camera movement
       
   336         mat[0].Multiply(cameraMatrix);
       
   337 
       
   338         // apply camera rotation hack
       
   339         mat[0].Multiply(cameraRotMatrix);
       
   340         
       
   341         // apply to mirror matrix also
       
   342         if (aMirrored)
       
   343             {
       
   344             mat[1].Multiply(cameraMatrix);
       
   345             mat[1].Multiply(cameraRotMatrix);
       
   346             }
       
   347 
       
   348         // transform all points by resulting transformation matrix
       
   349         // and project to screen coordinates.
       
   350         TInt count = aMirrored ? 2 : 1;
       
   351         for (TInt k = 0; k < count; k++)            
       
   352             {
       
   353             VGfloat* tverts = NULL;
       
   354             VGfloat* tm = NULL; 
       
   355             
       
   356             if (k == 0)
       
   357                 {
       
   358                 tverts = q->iPoints;
       
   359                 tm = q->iTM;
       
   360                 }
       
   361             else
       
   362                 {
       
   363                 tverts = q->iMirroredPoints;
       
   364                 tm = q->iMirroredTM;
       
   365                 }
       
   366 
       
   367             for (TInt i = 0; i < 4; i++)
       
   368                 {
       
   369                 
       
   370                 HgVgHelper::TVertex v;
       
   371     
       
   372                 v.iX = KQuadVerts[i*3+0];
       
   373                 v.iY = KQuadVerts[i*3+1];
       
   374                 v.iZ = KQuadVerts[i*3+2];
       
   375     
       
   376                 v.TransformPoint(mat[k]);
       
   377                 
       
   378                 v.ProjectPoint(scW, scH, aFov);
       
   379                 
       
   380                 tverts[i*2+0] = v.iScreenX;
       
   381                 tverts[i*2+1] = v.iScreenY;
       
   382                 
       
   383                 }
       
   384 
       
   385             VGImage image = q->iNoImage ? iDefaultImage : q->iImage;
       
   386             VGfloat pxWidth = vgGetParameteri(image, VG_IMAGE_WIDTH);
       
   387             VGfloat pxHeight = vgGetParameteri(image, VG_IMAGE_HEIGHT); 
       
   388             
       
   389             // use screen coordinates to build warp matrix
       
   390             // for rendering the image
       
   391             vguComputeWarpQuadToQuad(tverts[0], tverts[1], tverts[2], tverts[3],
       
   392                     tverts[4], tverts[5], tverts[6], tverts[7], 0, 0, pxWidth, 0,
       
   393                     pxWidth, pxHeight, 0, pxHeight, tm);
       
   394 
       
   395             }
       
   396         }    
       
   397     }
       
   398 
       
   399 // -----------------------------------------------------------------------------
       
   400 // CHgVgScrollBar::DrawQuads
       
   401 // Draws quads using OpenVG.
       
   402 // -----------------------------------------------------------------------------
       
   403 //
       
   404 void CHgVgMediaWallRenderer::DrawQuads(TBool aDrawMirrored)
       
   405     {    
       
   406 
       
   407     VGfloat values[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 };
       
   408                 
       
   409     vgSeti(VG_COLOR_TRANSFORM, VG_TRUE);
       
   410     
       
   411     for (TInt j = 0; j < iSortedQuads.Count(); j++)
       
   412         {
       
   413         TQuad* q = iSortedQuads[j];
       
   414         
       
   415         if (q->iAlpha < 0.01f)
       
   416             continue;
       
   417 
       
   418         values[3] = q->iAlpha;
       
   419         
       
   420         vgSetfv(VG_COLOR_TRANSFORM_VALUES, 8, values);
       
   421         
       
   422         if (q->iZ < 0)
       
   423             continue;
       
   424         
       
   425         DrawQuad(q, aDrawMirrored);
       
   426         
       
   427         }
       
   428 
       
   429     vgSeti(VG_COLOR_TRANSFORM, VG_FALSE);
       
   430 
       
   431     }
       
   432 
       
   433 // -----------------------------------------------------------------------------
       
   434 // CHgVgMediaWallRenderer::DrawQuad
       
   435 // -----------------------------------------------------------------------------
       
   436 //
       
   437 void CHgVgMediaWallRenderer::DrawQuad(CHgVgMediaWallRenderer::TQuad* q, TBool aDrawMirrored)
       
   438     {
       
   439     vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
       
   440     vgLoadIdentity();
       
   441     
       
   442     //vgTranslate(iOffset.iX, iOffset.iY);
       
   443 
       
   444     VGImage image = q->iImage;
       
   445     if (q->iNoImage)
       
   446         {
       
   447         image = iDefaultImage;
       
   448         }
       
   449 
       
   450     if (aDrawMirrored)
       
   451         {
       
   452         vgMultMatrix(q->iMirroredTM);
       
   453         }
       
   454     else
       
   455         {
       
   456         vgMultMatrix(q->iTM);
       
   457         if ((iBlurImage != VG_INVALID_HANDLE) && (iChildBlurImage != VG_INVALID_HANDLE) && q->iFlipped)
       
   458             {
       
   459             vgGaussianBlur(iChildBlurImage, image, iBlurDeviationX*iBlurAlpha, 
       
   460                     iBlurDeviationY*iBlurAlpha, VG_TILE_PAD);
       
   461             image = iChildBlurImage;
       
   462             }
       
   463         }
       
   464     
       
   465     
       
   466     vgDrawImage(image);    
       
   467     }
       
   468 
       
   469 
       
   470 // -----------------------------------------------------------------------------
       
   471 // CHgVgScrollBar::Draw()
       
   472 // -----------------------------------------------------------------------------
       
   473 //
       
   474 void CHgVgMediaWallRenderer::Draw(RPointerArray<CHgVgItem>& aItems,
       
   475         TInt aSelectedIndex, TReal aNextIndex,
       
   476         TReal aViewPosition,
       
   477         TReal aAnimationAlpha,
       
   478         CHgVgMediaWall::THgVgAnimationState aState, 
       
   479         CHgVgMediaWall::THgVgOpeningAnimationType aSelectionAnimationType, 
       
   480         CHgVgMediaWall::THgVgMediaWallStyle /*aStyle*/)
       
   481     { 
       
   482     
       
   483     TInt itemsOnScreen = 0;
       
   484     itemsOnScreen = SetupQuads(aItems,
       
   485             aSelectedIndex, aNextIndex,
       
   486             aViewPosition,
       
   487             aAnimationAlpha,
       
   488             aState, aSelectionAnimationType);
       
   489     
       
   490     TransformAndDraw(itemsOnScreen, aSelectionAnimationType);
       
   491     }
       
   492 
       
   493 
       
   494 // ---------------------------------------------------------------------------
       
   495 // CHgVgMediaWallRenderer::DrawGrid()
       
   496 // ---------------------------------------------------------------------------
       
   497 //     
       
   498 void CHgVgMediaWallRenderer::DrawGrid(
       
   499         TInt aRowCount, 
       
   500         RPointerArray<CHgVgItem>& aItems, 
       
   501         TReal aViewX, TReal aViewY, 
       
   502         TInt aCurItem, TInt aPrevItem, 
       
   503         TReal aAnimationAlpha,
       
   504         CHgVgMediaWall::THgVgAnimationState aAnimationState, 
       
   505         TInt aPickedItem, 
       
   506         CHgVgMediaWall::THgVgOpeningAnimationType aAnimationType)
       
   507     {
       
   508     TInt itemsOnScreen = 0;
       
   509 
       
   510     for (TInt i = 0; i < aRowCount; i++)
       
   511         {
       
   512         SetupQuadsToRow(i, aRowCount, itemsOnScreen, 
       
   513                 aItems, aViewX, aViewY, aCurItem, aPrevItem, 
       
   514                 aAnimationAlpha, aAnimationState, aPickedItem,
       
   515                 aAnimationType);
       
   516         }
       
   517     
       
   518     TransformAndDraw(itemsOnScreen, aAnimationType);
       
   519     }
       
   520 
       
   521 
       
   522 TReal CHgVgMediaWallRenderer::GetWorldSpaceRowHeight() const
       
   523     {
       
   524     return (120.0 / 90.0 * 0.25 + 0.02);
       
   525     }
       
   526 
       
   527 
       
   528 // ---------------------------------------------------------------------------
       
   529 // CHgVgCoverflowRenderer::CreateGround()
       
   530 // ---------------------------------------------------------------------------
       
   531 //     
       
   532 void CHgVgMediaWallRenderer::CreateGround()
       
   533 {
       
   534     iGroundPath = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, KGroundScale, KGroundBias, 
       
   535             KGroundVerticesHint, KGroundSegmentsHint, (unsigned int)VG_PATH_CAPABILITY_ALL);
       
   536     
       
   537     vguRect(iGroundPath, 0, 0, 1, 1);
       
   538         
       
   539     VGfloat gradientStops[] = {
       
   540             0, 0.0f, 0.0f, 0.0f, 1.0f,
       
   541             0.01f, 0.0f, 0.0f, 0.0f, 0.95f,
       
   542             1.0f, 0.0f, 0.0f, 0.0f, 0.0f
       
   543     };
       
   544     
       
   545     VGfloat groundColor[4];
       
   546     GetGroundColorFromSkin(groundColor);
       
   547 
       
   548     gradientStops[1] = groundColor[0]; 
       
   549     gradientStops[2] = groundColor[1]; 
       
   550     gradientStops[3] = groundColor[2]; 
       
   551     
       
   552     gradientStops[6] = groundColor[0]; 
       
   553     gradientStops[7] = groundColor[1]; 
       
   554     gradientStops[8] = groundColor[2]; 
       
   555 
       
   556     gradientStops[11] = groundColor[0]; 
       
   557     gradientStops[12] = groundColor[1]; 
       
   558     gradientStops[13] = groundColor[2]; 
       
   559 
       
   560     iGroundPaint = vgCreatePaint();
       
   561             
       
   562     vgSetParameteri(iGroundPaint, VG_PAINT_TYPE, 
       
   563         VG_PAINT_TYPE_LINEAR_GRADIENT);
       
   564         
       
   565     vgSetParameterfv(iGroundPaint, VG_PAINT_LINEAR_GRADIENT,
       
   566         KNumGroundGradientValues, KGroundGradient);
       
   567     
       
   568     vgSetParameteri(iGroundPaint, VG_PAINT_COLOR_RAMP_SPREAD_MODE,
       
   569             VG_COLOR_RAMP_SPREAD_PAD);
       
   570     
       
   571     vgSetParameterfv(iGroundPaint, VG_PAINT_COLOR_RAMP_STOPS,
       
   572         5*3, gradientStops);
       
   573 
       
   574 
       
   575 }
       
   576 
       
   577 // ---------------------------------------------------------------------------
       
   578 // CHgVgCoverflowRenderer::DrawGround()
       
   579 // ---------------------------------------------------------------------------
       
   580 //     
       
   581 void CHgVgMediaWallRenderer::DrawGround(TInt aWidth, TInt aHeight)
       
   582     {
       
   583     vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
       
   584     vgLoadIdentity();
       
   585     //vgTranslate(iOffset.iX, iOffset.iY);
       
   586     vgScale(aWidth, aHeight);
       
   587     vgSetPaint(iGroundPaint, VG_FILL_PATH);            
       
   588     vgDrawPath(iGroundPath, VG_FILL_PATH);
       
   589     }
       
   590 
       
   591 
       
   592 
       
   593 // ---------------------------------------------------------------------------
       
   594 // CHgVgMediaWallRenderer::SetupQuadsToRow()
       
   595 // ---------------------------------------------------------------------------
       
   596 //
       
   597 void CHgVgMediaWallRenderer::SetupQuadsToRow(
       
   598         TInt aRow,
       
   599         TInt aRowCount,
       
   600         TInt &aItemsOnScreen,
       
   601         RPointerArray<CHgVgItem>& aItems,
       
   602         TReal aViewX, TReal aViewY,
       
   603         TInt aCurItem, TInt aPrevItem, 
       
   604         TReal aAnimationAlpha,
       
   605         CHgVgMediaWall::THgVgAnimationState aState, 
       
   606         TInt aPickedItem, 
       
   607         CHgVgMediaWall::THgVgOpeningAnimationType aAnimationType)
       
   608     {
       
   609         
       
   610     if (aItems.Count() <= 0)
       
   611         return;
       
   612         
       
   613     TReal src = aViewX;
       
   614     TReal frac;
       
   615     Math::Frac(frac, src);
       
   616     VGfloat fDiff = frac;
       
   617 
       
   618     TBool isSelectionToFocusedItem = 
       
   619         (
       
   620         (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateOpening) ||
       
   621         (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateClosing) ||
       
   622         (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateItemOpened)
       
   623         ) &&
       
   624         (aAnimationType != CHgVgMediaWall::EHgVgOpeningAnimationNone);
       
   625 
       
   626     TReal selectionAnimationAlpha = aAnimationAlpha;
       
   627     if (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateItemOpened)
       
   628         selectionAnimationAlpha = 1.0f;
       
   629 
       
   630     VGfloat leftIndex = (VGfloat)(iSelectedItemIndex - 1);
       
   631     VGfloat leftX = iLeftStackEndX;
       
   632     VGfloat step = iSpaceBetween;
       
   633     
       
   634     if (AknLayoutUtils::LayoutMirrored())
       
   635         {
       
   636         leftX = iRightStackStartX;
       
   637         step = -step;
       
   638         }
       
   639 
       
   640     TInt i = 0;
       
   641     
       
   642     TInt currentRow = ((TInt)aViewX - (iSelectedItemIndex)) * aRowCount; 
       
   643         
       
   644     VGfloat zFar = iZNear;
       
   645     VGfloat zNear = zFar - 0.8;
       
   646     
       
   647     TInt itemsOnRow = 0;
       
   648     
       
   649     TInt selX = aCurItem / 3;
       
   650     TInt selY = aCurItem % 3;
       
   651         
       
   652     TReal div = (TReal)(iQuads.Count()/aRowCount/2-1);
       
   653     
       
   654     while (itemsOnRow < (iQuads.Count()/aRowCount))
       
   655         {
       
   656                                             
       
   657         TInt itemIndex = currentRow + i * 3 + aRow;
       
   658         
       
   659         if (itemIndex < 0)
       
   660             {
       
   661             i++;
       
   662             continue;
       
   663             }
       
   664         
       
   665         // all items drawn and at the end of the list, lets bail out.
       
   666         if (itemIndex >= aItems.Count())
       
   667             {
       
   668             break;
       
   669             }
       
   670 
       
   671         TQuad* q = iQuads[aItemsOnScreen + itemsOnRow];        
       
   672 
       
   673         q->iZ = zFar;
       
   674         q->iAngle = 0;
       
   675         q->iFlipped = EFalse;
       
   676         
       
   677         VGfloat fi = (VGfloat)i - fDiff;
       
   678                         
       
   679         q->iX = leftX - step * (leftIndex - fi);
       
   680         q->iAlpha = 1;
       
   681         
       
   682         q->iItemIndex = itemIndex;
       
   683         
       
   684         if  (aItems[itemIndex]->VgImage() == VG_INVALID_HANDLE)
       
   685             {
       
   686             q->iNoImage = ETrue;
       
   687             }
       
   688         else
       
   689             {
       
   690             q->iNoImage = EFalse;
       
   691             q->iImage = aItems[itemIndex]->VgImage();
       
   692             }
       
   693 
       
   694                         
       
   695         VGfloat imW = (VGfloat) iImageSize.iWidth;
       
   696         VGfloat imH = (VGfloat) iImageSize.iHeight;
       
   697 
       
   698         // width is constant but same aspect ratio must be preserved
       
   699         VGfloat worldImageHeight = imH * (KWorldQuadWidth / imW);
       
   700         
       
   701         q->iY = (2 - aRow) * (worldImageHeight + KSpaceBetweenGridItems);
       
   702         
       
   703         if (aCurItem != KErrNotFound && itemIndex == aCurItem)
       
   704             {
       
   705             TReal alphaX = 1.0 - Min(Abs(aViewX - (TReal)selX), 1);
       
   706             TReal alphaY = 1.0 - Min(Abs(aViewY - (TReal)selY), 1);
       
   707 
       
   708             q->iZ = HgVgHelper::Lerp(zFar, zNear, Min(alphaX, alphaY));            
       
   709             }
       
   710         else if (aPrevItem != KErrNotFound && itemIndex == aPrevItem)
       
   711             {
       
   712             TReal alphaX = 1.0 - Min(Abs(aViewX - (TReal)selX), 1);
       
   713             TReal alphaY = 1.0 - Min(Abs(aViewY - (TReal)selY), 1);
       
   714             
       
   715             q->iZ = HgVgHelper::Lerp(zFar, zNear, 1.0f - Min(alphaX, alphaY));
       
   716             }
       
   717         
       
   718         q->iAlpha = HgVgHelper::Lerp(1, 0, Max(0.0, (Abs(q->iX)-1.0) / div));         
       
   719 
       
   720         if (isSelectionToFocusedItem && (itemIndex == aPickedItem))
       
   721             {
       
   722             q->iAlpha = 1;
       
   723             q->iFlipped = ETrue;
       
   724             iBlurAlpha = selectionAnimationAlpha;
       
   725             ApplyOpeningAnimation(q, selectionAnimationAlpha, zFar, 
       
   726                     CHgVgMediaWall::EHgVgMediaWallStyleGrid, 
       
   727                     aAnimationType);
       
   728             }
       
   729         
       
   730         if (iFlipXY)
       
   731             {
       
   732             VGfloat temp = q->iX;
       
   733             q->iX = q->iY;
       
   734             q->iY = -temp;
       
   735             }
       
   736         
       
   737         i++;
       
   738         itemsOnRow++;
       
   739         }
       
   740         
       
   741     aItemsOnScreen += itemsOnRow;
       
   742     
       
   743     }
       
   744 
       
   745 
       
   746 
       
   747 // ---------------------------------------------------------------------------
       
   748 // CHgVgMediaWallRenderer::SetupQuads()
       
   749 // ---------------------------------------------------------------------------
       
   750 //
       
   751 TInt CHgVgMediaWallRenderer::SetupQuads(RPointerArray<CHgVgItem>& aItems,
       
   752         TInt aSelectedIndex, TReal aNextIndex,
       
   753         VGfloat aViewPosition,
       
   754         VGfloat aAnimationAlpha,
       
   755         CHgVgMediaWall::THgVgAnimationState aState, 
       
   756         CHgVgMediaWall::THgVgOpeningAnimationType aOpeningAnimationType)
       
   757     {
       
   758     
       
   759     
       
   760     if (aItems.Count() <= 0)
       
   761         return 0;
       
   762            
       
   763     VGfloat selectionAnimationAlpha = aAnimationAlpha;
       
   764 
       
   765     TBool isSelectionToFocusedItem = 
       
   766         ((aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateOpening) ||
       
   767         (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateClosing) ||
       
   768         (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateItemOpened)) &&
       
   769         (aOpeningAnimationType != CHgVgMediaWall::EHgVgOpeningAnimationNone);
       
   770 
       
   771     if (aState == CHgVgMediaWall::EHgVgMediaWallAnimationStateItemOpened)
       
   772         selectionAnimationAlpha = 1.0f;
       
   773         
       
   774     TReal src = aViewPosition;
       
   775     TReal frac;
       
   776     Math::Frac(frac, src);
       
   777     VGfloat fDiff = frac;
       
   778             
       
   779     VGfloat zFar = iZFar;
       
   780     VGfloat leftIndex = (VGfloat)(iSelectedItemIndex - 1);
       
   781     VGfloat rightIndex = (VGfloat)(iSelectedItemIndex + 1);
       
   782     VGfloat centerIndex = (VGfloat)iSelectedItemIndex;
       
   783     VGfloat leftX = iLeftStackEndX;
       
   784     VGfloat rightX = iRightStackStartX;
       
   785     VGfloat step = iSpaceBetween;
       
   786     VGfloat centerX = 0;
       
   787     
       
   788     if (AknLayoutUtils::LayoutMirrored())
       
   789         {
       
   790         rightX = iLeftStackEndX;
       
   791         leftX = iRightStackStartX;
       
   792         step = -step;
       
   793         }
       
   794         
       
   795     TInt i = 0;
       
   796     TInt itemsOnScreen = 0;
       
   797     TInt currentRow = (TInt)aViewPosition - KSelectedItemIndex;
       
   798     
       
   799     TReal dist = Min(Max(0, Abs(aNextIndex - aViewPosition) - 1.0f), 1.0f);
       
   800     VGfloat zNear = HgVgHelper::Lerp(iZNear, iZFar, dist);
       
   801     
       
   802     while (itemsOnScreen < iQuads.Count())
       
   803         {
       
   804         TInt itemIndex = currentRow + i;
       
   805         
       
   806         if (itemIndex < 0)
       
   807             {
       
   808             i++;
       
   809             continue;
       
   810             }
       
   811         
       
   812         if (itemIndex  >= aItems.Count())
       
   813             {
       
   814             break;
       
   815             }
       
   816 
       
   817         TQuad* q = iQuads[itemsOnScreen];        
       
   818 
       
   819         q->iY = 0;
       
   820         q->iZ = zFar;
       
   821         q->iAngle = 0;
       
   822         q->iFlipped = EFalse;
       
   823             
       
   824         VGfloat fi = (VGfloat)i - fDiff;
       
   825         
       
   826         if (fi < leftIndex)
       
   827             {
       
   828             q->iX = leftX - step * (leftIndex - fi);
       
   829             }
       
   830         else if (fi >= leftIndex && fi < centerIndex)
       
   831             {
       
   832             q->iX = HgVgHelper::Lerp(leftX, centerX, fi - leftIndex);
       
   833             q->iZ = HgVgHelper::Lerp(zFar, zNear, fi - leftIndex);                                            
       
   834             }
       
   835         else if (fi >= centerIndex && fi < rightIndex)
       
   836             {
       
   837             q->iX = HgVgHelper::Lerp(centerX, rightX, fi - centerIndex);
       
   838             q->iZ = HgVgHelper::Lerp(zNear, zFar, fi - centerIndex);            
       
   839             }
       
   840         else if (fi >= rightIndex)
       
   841             {
       
   842             q->iX = rightX + step * (fi - rightIndex);
       
   843             }
       
   844         
       
   845         q->iAlpha = HgVgHelper::Lerp(1, 0, Max(0.0, (Abs(q->iX)-2.0) / (TReal)(iQuads.Count()/2-2)));         
       
   846             
       
   847         
       
   848         q->iItemIndex = itemIndex;
       
   849         
       
   850         if  (aItems[itemIndex]->VgImage() == VG_INVALID_HANDLE)
       
   851             {
       
   852             q->iNoImage = ETrue;
       
   853             }
       
   854         else
       
   855             {
       
   856             q->iNoImage = EFalse;
       
   857             q->iImage = aItems[itemIndex]->VgImage();
       
   858             }
       
   859 
       
   860         if (isSelectionToFocusedItem && (itemIndex == aSelectedIndex))
       
   861             {
       
   862             q->iAlpha = 1;
       
   863             q->iFlipped = ETrue;
       
   864             iBlurAlpha = selectionAnimationAlpha;
       
   865             ApplyOpeningAnimation(q, selectionAnimationAlpha, zNear, 
       
   866                     CHgVgMediaWall::EHgVgMediaWallStyleCoverflowFullScreen, 
       
   867                     aOpeningAnimationType);
       
   868             }
       
   869 
       
   870         i++;
       
   871         itemsOnScreen++;
       
   872         }
       
   873         
       
   874     return itemsOnScreen;
       
   875     }
       
   876 
       
   877 
       
   878 // ---------------------------------------------------------------------------
       
   879 // CHgVgMediaWallRenderer::ApplyFlipAnimation()
       
   880 // ---------------------------------------------------------------------------
       
   881 //
       
   882 void CHgVgMediaWallRenderer::ApplyOpeningAnimation(CHgVgMediaWallRenderer::TQuad* aQuad, 
       
   883         TReal aAnimationAlpha, TReal aZNear, CHgVgMediaWall::THgVgMediaWallStyle /*aMediaWallStyle*/, 
       
   884         CHgVgMediaWall::THgVgOpeningAnimationType aAnimationStyle)
       
   885     {
       
   886     VGfloat wz = 0.0f;
       
   887     VGfloat wy = (iCameraBaseY + iCameraY);
       
   888     VGfloat wx = (iCameraBaseX + iCameraX);
       
   889     VGfloat angle = 0;
       
   890     
       
   891     if (aAnimationStyle == CHgVgMediaWall::EHgVgOpeningAnimationFlipToFront)
       
   892         {    
       
   893         wz = iFlippedZ;    
       
   894         angle = iFlipAngle;
       
   895         wx += iFlippedX;
       
   896         wy += iFlippedY;
       
   897         }
       
   898     else if (aAnimationStyle == CHgVgMediaWall::EHgVgOpeningAnimationZoomToFront)
       
   899         {
       
   900         wz = iFlippedZ;    
       
   901         wx += iFlippedX;
       
   902         wy += iFlippedY;    
       
   903         }
       
   904     
       
   905     if (iBlurImage != VG_INVALID_HANDLE)
       
   906         {
       
   907         VGImage image = aQuad->iNoImage ? iDefaultImage : aQuad->iImage;
       
   908         UpdateBlurChildImage(image);
       
   909         }
       
   910 
       
   911     aQuad->iZ = HgVgHelper::Lerp(aZNear, wz, aAnimationAlpha);                
       
   912     aQuad->iX = HgVgHelper::Lerp(aQuad->iX, wx, aAnimationAlpha);
       
   913     aQuad->iY = HgVgHelper::Lerp(aQuad->iY, wy, aAnimationAlpha);
       
   914     aQuad->iAngle = -aAnimationAlpha * angle;
       
   915     }
       
   916 
       
   917 // ---------------------------------------------------------------------------
       
   918 // CHgVgMediaWallRenderer::GetGroundColorFromSkin()
       
   919 // ---------------------------------------------------------------------------
       
   920 //
       
   921 void CHgVgMediaWallRenderer::GetGroundColorFromSkin(VGfloat* aColor)
       
   922     {
       
   923     TRgb color(KRgbBlack);
       
   924     // get text color from skin
       
   925     if ( AknsUtils::AvkonSkinEnabled() )
       
   926         {
       
   927         // this does not modify color unless it gets a correct one
       
   928         // no real need to check errors
       
   929         AknsUtils::GetCachedColor( 
       
   930                 AknsUtils::SkinInstance(),
       
   931                 color,
       
   932                 KAknsIIDQsnTextColors,
       
   933                 EAknsCIQsnTextColorsCG6 );
       
   934         }
       
   935     
       
   936     if (color.Blue() < 128)
       
   937         color = KRgbWhite;
       
   938     else
       
   939         color = KRgbBlack;
       
   940     
       
   941     aColor[0] = (VGfloat)color.Red() / KColorByteToFloat;
       
   942     aColor[1] = (VGfloat)color.Green() / KColorByteToFloat;
       
   943     aColor[2] = (VGfloat)color.Blue() / KColorByteToFloat;
       
   944     aColor[3] = 1.0f;
       
   945     }
       
   946 
       
   947 // ---------------------------------------------------------------------------
       
   948 // CHgVgMediaWallRenderer::HandleSkinChange()
       
   949 // ---------------------------------------------------------------------------
       
   950 //
       
   951 void CHgVgMediaWallRenderer::HandleSkinChange()
       
   952     {
       
   953     vgDestroyPaint(iGroundPaint);
       
   954     vgDestroyPath(iGroundPath);
       
   955     CreateGround();    
       
   956     }
       
   957 
       
   958 // ---------------------------------------------------------------------------
       
   959 // CHgVgMediaWallRenderer::AdjustSettingsBaseOnFrontRect()
       
   960 // ---------------------------------------------------------------------------
       
   961 //
       
   962 void CHgVgMediaWallRenderer::AdjustSettingsBasedOnRects(const TRect& aFrontRect, 
       
   963         TReal aZOffset)
       
   964     {
       
   965     
       
   966     // size of the images should be the same as given for aFrontRect
       
   967     iImageSize = aFrontRect.Size();
       
   968     
       
   969     // calculate screen center point
       
   970     TPoint center(iRect.Width()/2, iRect.Height()/2);
       
   971         
       
   972     // near z coordinate is calculated so that the size of the quad at front matches
       
   973     // aFrontRect
       
   974     iZNear = GetZInWorldSpaceBasedOnWidth(aFrontRect.Width());
       
   975     iZFar = iZNear + aZOffset;
       
   976 
       
   977     // width is always constant
       
   978     VGfloat ImW = KWorldQuadWidth;
       
   979     // height is altered by image aspect ratio
       
   980     VGfloat ImH = (VGfloat)(iImageSize.iHeight) * (KWorldQuadWidth / (VGfloat)iImageSize.iWidth);    
       
   981     
       
   982     // camera coordinates are altered so that the front quad 
       
   983     // is at correct place
       
   984     VGfloat deltaX = aFrontRect.Center().iX - center.iX;
       
   985     VGfloat deltaY = aFrontRect.Center().iY - center.iY;
       
   986 
       
   987     iCameraBaseX = ImW * (deltaX / (VGfloat)iImageSize.iWidth);
       
   988     iCameraBaseY = ImH * (deltaY / (VGfloat)iImageSize.iHeight);
       
   989     iCameraBaseZ = 0;
       
   990 
       
   991     }
       
   992 
       
   993 
       
   994 void CHgVgMediaWallRenderer::TransformAndDraw(TInt itemsOnScreen, 
       
   995         CHgVgMediaWall::THgVgOpeningAnimationType aOpeningAnimationType)
       
   996     {
       
   997 /*    
       
   998     vgSeti( VG_SCISSORING, VG_TRUE );
       
   999     VGfloat rects[4];
       
  1000     rects[0]= 0;
       
  1001     rects[1]= 0;
       
  1002     rects[2]= iRect.Width();
       
  1003     rects[3]= iRect.Height();
       
  1004     vgSetfv( VG_SCISSOR_RECTS, 4, rects );
       
  1005 */    
       
  1006     vgSeti( VG_SCISSORING, VG_FALSE );    
       
  1007 
       
  1008     if (itemsOnScreen > 0)
       
  1009         {    
       
  1010 
       
  1011         // draw reflections
       
  1012         
       
  1013         TransformQuads(itemsOnScreen, 
       
  1014                 iReflectionsEnabled, iFov, aOpeningAnimationType);
       
  1015 
       
  1016         SortQuads(itemsOnScreen);
       
  1017         
       
  1018         if (iReflectionsEnabled)
       
  1019             DrawQuads(ETrue);
       
  1020     
       
  1021         DrawGround(iRect.Width(), iRect.Height() / KGroundHeightFactor);
       
  1022     
       
  1023         DrawQuads(EFalse);
       
  1024                 
       
  1025         }
       
  1026     else
       
  1027         {
       
  1028        
       
  1029         // if no items exists, just draw ground plane.
       
  1030         DrawGround(iRect.Width(), iRect.Height() / KGroundHeightFactor);
       
  1031         
       
  1032         }
       
  1033     
       
  1034     //vgSeti( VG_SCISSORING, VG_FALSE );    
       
  1035 
       
  1036     }
       
  1037 
       
  1038 void CHgVgMediaWallRenderer::SetReflections(TBool aEnabled)
       
  1039     {
       
  1040     iReflectionsEnabled = aEnabled;
       
  1041     }
       
  1042 
       
  1043 TBool CHgVgMediaWallRenderer::ReflectionsEnabled() const
       
  1044     {
       
  1045     return iReflectionsEnabled;
       
  1046     }
       
  1047 
       
  1048 TSize CHgVgMediaWallRenderer::ImageSize() const
       
  1049     {
       
  1050     return iImageSize;
       
  1051     }
       
  1052 
       
  1053 
       
  1054 void CHgVgMediaWallRenderer::SetFlippedRect(const TRect& aFlippedRect)
       
  1055     {
       
  1056     iFlippedWidth = aFlippedRect.Width();
       
  1057     iFlippedHeight = aFlippedRect.Height();
       
  1058     iFlippedZ = GetZInWorldSpaceBasedOnWidth(aFlippedRect.Width());
       
  1059     TPoint center = iRect.Center();
       
  1060     
       
  1061     VGfloat ImW = KWorldQuadWidth;
       
  1062     VGfloat ImH = (VGfloat)(iImageSize.iHeight) * (KWorldQuadWidth / (VGfloat)iImageSize.iWidth);    
       
  1063     VGfloat deltaX = aFlippedRect.Center().iX - center.iX;
       
  1064     VGfloat deltaY = aFlippedRect.Center().iY - center.iY;
       
  1065     
       
  1066     iFlippedY = -ImH * (deltaY / (VGfloat)aFlippedRect.Height());
       
  1067     iFlippedX = ImW * (deltaX / (VGfloat)aFlippedRect.Width());
       
  1068     }
       
  1069 
       
  1070 VGfloat CHgVgMediaWallRenderer::GetZInWorldSpaceBasedOnWidth(VGfloat aWidth)
       
  1071     {
       
  1072     
       
  1073     // calculate screen center point
       
  1074     TPoint center(iRect.Width()/2, iRect.Height()/2);
       
  1075     
       
  1076     // Z-coordinate is set so that the front quad has 
       
  1077     // the correct size
       
  1078     TReal hw = iRect.Width() * 0.5f;
       
  1079     TReal alpha = iFov / 2.0f;
       
  1080     TReal tanAlpha;
       
  1081     Math::Tan(tanAlpha, alpha);
       
  1082     TReal d = hw / tanAlpha;    
       
  1083 
       
  1084     return (d * (-KWorldQuadWidth/2)) / ((TReal)(center.iX - aWidth/2) - hw);    
       
  1085 
       
  1086     }
       
  1087 
       
  1088 void CHgVgMediaWallRenderer::SetFlipAngle(TReal aAngle)
       
  1089     {
       
  1090     iFlipAngle = aAngle;
       
  1091     }
       
  1092 
       
  1093 
       
  1094 void CHgVgMediaWallRenderer::EnableBlurOnFlip(TBool aEnabled, TReal aBlurX, TReal aBlurY)
       
  1095     {
       
  1096     if (iBlurImage != VG_INVALID_HANDLE)
       
  1097         {        
       
  1098         vgDestroyImage(iBlurImage);
       
  1099         iBlurImage = VG_INVALID_HANDLE;
       
  1100         }
       
  1101     if (aEnabled)
       
  1102         {
       
  1103         iBlurDeviationX = aBlurX;
       
  1104         iBlurDeviationY = aBlurY;
       
  1105         iBlurImage = vgCreateImage(VG_sRGBA_8888_PRE, iImageSize.iWidth, iImageSize.iHeight, 
       
  1106                 VG_IMAGE_QUALITY_NONANTIALIASED);
       
  1107         }
       
  1108     }
       
  1109 
       
  1110 void CHgVgMediaWallRenderer::UpdateBlurChildImage(VGImage aImage)
       
  1111     {
       
  1112     VGint width = vgGetParameteri(aImage, VG_IMAGE_WIDTH);
       
  1113     VGint height = vgGetParameteri(aImage, VG_IMAGE_HEIGHT);
       
  1114 
       
  1115     if (iBlurImageWidth != width || iBlurImageHeight != height)
       
  1116         {                
       
  1117         vgDestroyImage(iChildBlurImage);            
       
  1118         iChildBlurImage = vgChildImage(iBlurImage, 0, 0, width, height);    
       
  1119         iBlurImageWidth = width;
       
  1120         iBlurImageHeight = height;
       
  1121         }    
       
  1122     }
       
  1123 
       
  1124 
       
  1125 void CHgVgMediaWallRenderer::SetOffset(const TPoint& aOffset)
       
  1126     {
       
  1127     iOffset = aOffset;
       
  1128     }
       
  1129 
       
  1130 void CHgVgMediaWallRenderer::EnableFlipXY(TBool aEnabled)
       
  1131     {
       
  1132     iFlipXY = aEnabled;
       
  1133     }
       
  1134 
       
  1135 // End of File