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 |