diff -r aabf2c525e0f -r 9f56a4e1b8ab uifw/ganes/src/HgVgEGL.cpp --- 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();