uifw/ganes/src/HgVgEGL.cpp
branchRCL_3
changeset 10 9f56a4e1b8ab
parent 9 aabf2c525e0f
child 25 941195f2d488
equal deleted inserted replaced
9:aabf2c525e0f 10:9f56a4e1b8ab
   278 
   278 
   279 // ---------------------------------------------------------------------------
   279 // ---------------------------------------------------------------------------
   280 // CHgVgEGL::GetSurfaceToBitmap()
   280 // CHgVgEGL::GetSurfaceToBitmap()
   281 // ---------------------------------------------------------------------------
   281 // ---------------------------------------------------------------------------
   282 //     
   282 //     
   283 CFbsBitmap* CHgVgEGL::GetSurfaceToBitmap(const TRect& aRect) const
   283 CFbsBitmap* CHgVgEGL::GetSurfaceToBitmap(const TRect& aRect, TBool aLandscape) const
   284     {
   284     {
   285     // make sure every thing is in back buffer
   285     // make sure every thing is in back buffer
   286     vgFinish();
   286     vgFinish();
   287 
   287 
   288     VGuint dataStride = 4 * aRect.Width();
       
   289     
   288     
   290     CFbsBitmap* bitmap = new CFbsBitmap();        
   289     CFbsBitmap* bitmap = new CFbsBitmap();        
   291     
   290     
   292     if (bitmap)
   291     if (bitmap)
   293         {
   292         {
   294         // create temporary buffer for data
   293         // create temporary buffer for data
   295         RBuf8 buf;
   294         RBuf8 buf;
   296         buf.Create(aRect.Height() * dataStride);
   295         buf.Create(aRect.Width() * aRect.Height() * 4);
   297         buf.Fill(0xFF);
   296         buf.Fill(0xFF);
   298 
   297 
   299         // read data from vg (this is sloooww)
   298         // read data back from vg (this is sloooww)
   300         vgReadPixels((void*)buf.Ptr(), 
   299         VGint dataStride = 0;
   301                 dataStride, VG_sARGB_8888, 0, 0, aRect.Width(), aRect.Height());                
   300         if (aLandscape)
       
   301             {
       
   302             dataStride = 4 * aRect.Height();
       
   303             vgReadPixels((void*)buf.Ptr(), 
       
   304                     dataStride, VG_sARGB_8888, 0, 0, aRect.Height(), aRect.Width());
       
   305             }
       
   306         else
       
   307             {
       
   308             dataStride = 4 * aRect.Width();
       
   309             vgReadPixels((void*)buf.Ptr(), 
       
   310                     dataStride, VG_sARGB_8888, 0, 0, aRect.Width(), aRect.Height());            
       
   311             }
   302 
   312 
   303         // because of bug in vg driver we need to swap memory using for loop, because
   313         // because of bug in vg driver we need to swap memory using for loop, because
   304         // negative datastrides case crash
   314         // negative datastrides cause crash
   305         bitmap->Create(TSize(aRect.Width(), aRect.Height()), EColor16MA);
   315         bitmap->Create(TSize(aRect.Width(), aRect.Height()), EColor16MA);
   306         bitmap->BeginDataAccess();
   316         bitmap->BeginDataAccess();
   307         TUint8* ptrTrg = (TUint8*)bitmap->DataAddress();
   317         if (!aLandscape)
   308         TUint8* ptrSrc = (TUint8*)buf.Ptr();
   318             {
   309         for (TInt i = 0; i < aRect.Height(); i++)
   319             TUint8* ptrTrg = (TUint8*)bitmap->DataAddress();
   310             {
   320             TUint8* ptrSrc = (TUint8*)buf.Ptr();
   311             Mem::Copy(ptrTrg + dataStride * i, 
   321             for (TInt i = 0; i < aRect.Height(); i++)
   312                     ptrSrc + dataStride * (aRect.Height() - i - 1), dataStride);
   322                 {
       
   323                 Mem::Copy(ptrTrg + dataStride * i, 
       
   324                         ptrSrc + dataStride * (aRect.Height() - i - 1), dataStride);
       
   325                 }
       
   326             }
       
   327         else
       
   328             {
       
   329             TUint32* ptrTrg = (TUint32*)bitmap->DataAddress();
       
   330             TUint32* ptrSrc = (TUint32*)buf.Ptr();
       
   331             for (TInt i = 0; i < aRect.Height(); i++)
       
   332                 {
       
   333                 for (TInt j = 0; j < aRect.Width(); j++)
       
   334                     {
       
   335                     ptrTrg[(aRect.Height() - i - 1)*aRect.Width()+(aRect.Width()-j-1)] = ptrSrc[j*aRect.Height()+i];
       
   336                     }
       
   337                 }
   313             }
   338             }
   314         bitmap->EndDataAccess();
   339         bitmap->EndDataAccess();
   315         buf.Close();
   340         buf.Close();
   316         }
   341         }
   317     
   342