uifw/ganes/src/HgVgEGL.cpp
branchRCL_3
changeset 10 9f56a4e1b8ab
parent 9 aabf2c525e0f
child 25 941195f2d488
--- a/uifw/ganes/src/HgVgEGL.cpp	Fri Mar 12 15:43:43 2010 +0200
+++ b/uifw/ganes/src/HgVgEGL.cpp	Mon Mar 15 12:41:34 2010 +0200
@@ -280,12 +280,11 @@
 // CHgVgEGL::GetSurfaceToBitmap()
 // ---------------------------------------------------------------------------
 //     
-CFbsBitmap* CHgVgEGL::GetSurfaceToBitmap(const TRect& aRect) const
+CFbsBitmap* CHgVgEGL::GetSurfaceToBitmap(const TRect& aRect, TBool aLandscape) const
     {
     // make sure every thing is in back buffer
     vgFinish();
 
-    VGuint dataStride = 4 * aRect.Width();
     
     CFbsBitmap* bitmap = new CFbsBitmap();        
     
@@ -293,23 +292,49 @@
         {
         // create temporary buffer for data
         RBuf8 buf;
-        buf.Create(aRect.Height() * dataStride);
+        buf.Create(aRect.Width() * aRect.Height() * 4);
         buf.Fill(0xFF);
 
-        // read data from vg (this is sloooww)
-        vgReadPixels((void*)buf.Ptr(), 
-                dataStride, VG_sARGB_8888, 0, 0, aRect.Width(), aRect.Height());                
+        // read data back from vg (this is sloooww)
+        VGint dataStride = 0;
+        if (aLandscape)
+            {
+            dataStride = 4 * aRect.Height();
+            vgReadPixels((void*)buf.Ptr(), 
+                    dataStride, VG_sARGB_8888, 0, 0, aRect.Height(), aRect.Width());
+            }
+        else
+            {
+            dataStride = 4 * aRect.Width();
+            vgReadPixels((void*)buf.Ptr(), 
+                    dataStride, VG_sARGB_8888, 0, 0, aRect.Width(), aRect.Height());            
+            }
 
         // because of bug in vg driver we need to swap memory using for loop, because
-        // negative datastrides case crash
+        // negative datastrides cause crash
         bitmap->Create(TSize(aRect.Width(), aRect.Height()), EColor16MA);
         bitmap->BeginDataAccess();
-        TUint8* ptrTrg = (TUint8*)bitmap->DataAddress();
-        TUint8* ptrSrc = (TUint8*)buf.Ptr();
-        for (TInt i = 0; i < aRect.Height(); i++)
+        if (!aLandscape)
             {
-            Mem::Copy(ptrTrg + dataStride * i, 
-                    ptrSrc + dataStride * (aRect.Height() - i - 1), dataStride);
+            TUint8* ptrTrg = (TUint8*)bitmap->DataAddress();
+            TUint8* ptrSrc = (TUint8*)buf.Ptr();
+            for (TInt i = 0; i < aRect.Height(); i++)
+                {
+                Mem::Copy(ptrTrg + dataStride * i, 
+                        ptrSrc + dataStride * (aRect.Height() - i - 1), dataStride);
+                }
+            }
+        else
+            {
+            TUint32* ptrTrg = (TUint32*)bitmap->DataAddress();
+            TUint32* ptrSrc = (TUint32*)buf.Ptr();
+            for (TInt i = 0; i < aRect.Height(); i++)
+                {
+                for (TInt j = 0; j < aRect.Width(); j++)
+                    {
+                    ptrTrg[(aRect.Height() - i - 1)*aRect.Width()+(aRect.Width()-j-1)] = ptrSrc[j*aRect.Height()+i];
+                    }
+                }
             }
         bitmap->EndDataAccess();
         buf.Close();