19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "dsa.h" 29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "sdlepocapi.h" 39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <cdsb.h> 49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TInt BytesPerPixel(TDisplayMode aMode) 79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return ((TDisplayModeUtils::NumDisplayModeBitsPerPixel(aMode) - 1) >> 3) + 1; 99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(TDsa) 139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall inline TDsa(const CDsa& aDsa); 169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall inline TBool IsFlip() const; 179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall inline TBool IsTurn() const; 189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall inline const TSize& SwSize() const; 199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall inline void Copy(TUint32* aTarget, const TUint8* aSrc, TInt aBytes, TInt aHeight) const; 209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const CDsa& iDsa; 229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline TDsa::TDsa(const CDsa& aDsa) : iDsa(aDsa) 269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline TBool TDsa::IsTurn() const 309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iDsa.iStateFlags & CDsa::EOrientation90; 329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline TBool TDsa::IsFlip() const 359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iDsa.iStateFlags & CDsa::EOrientation180; 379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline const TSize& TDsa::SwSize() const 409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iDsa.SwSize(); 429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline void TDsa::Copy(TUint32* aTarget, const TUint8* aSrc, TInt aBytes, TInt aHeight) const 459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa.iCopyFunction(iDsa, aTarget, aSrc, aBytes, aHeight); 479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate<class T, class S> 509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid ClipCopy(const TDsa& iDsa, TUint8* aTarget, 519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* aSource, 529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aUpdateRect, 539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aSourceRect) 549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const S* source = reinterpret_cast<const S*>(aSource); 569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineWidth = aSourceRect.Width(); 579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += (aUpdateRect.iTl.iY * lineWidth); 599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt sourceStartOffset = aUpdateRect.iTl.iX; 609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += sourceStartOffset; 619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall T* targetPtr = reinterpret_cast<T*>(aTarget); 639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt scanLineWidth = iDsa.SwSize().iWidth; 659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += (aSourceRect.iTl.iY + aUpdateRect.iTl.iY ) * scanLineWidth; 679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetStartOffset = (aUpdateRect.iTl.iX + aSourceRect.iTl.iX); 689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetStartOffset; 709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt height = aUpdateRect.Height(); 739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineMove = iDsa.IsTurn() ? 1 : lineWidth; 759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt copyLen = aUpdateRect.Width(); 769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iDsa.IsFlip()) 799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += scanLineWidth * (height - 1); 829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa.Copy(reinterpret_cast<TUint32*>(targetPtr), reinterpret_cast<const TUint8*>(source), copyLen, height); 869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr -= scanLineWidth; 889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa.Copy(reinterpret_cast<TUint32*>(targetPtr), reinterpret_cast<const TUint8*>(source), copyLen, height); 979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += scanLineWidth; // >> 2; 999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsaA) : public CDsa 1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsaA(RWsSession& aSession); 1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ~CDsaA(); 1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* LockSurface(); 1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void UnlockHWSurfaceRequestComplete(); 1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void UnlockHwSurface(); 1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void CreateSurfaceL(); 1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Wipe(TInt aLength); 1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Free(); 1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Update(CFbsBitmap& aBmp); 1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice); 1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt ExternalUpdate(); 1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // void ExternalUpdate(); 1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall protected: 1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CFbsBitmap* iBmp; 1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CFbsBitmap* iCopyBmp; 1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaA::CDsaA(RWsSession& aSession) : CDsa(aSession) 1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::Free() 1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iBmp; 1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp = NULL; 1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaA::~CDsaA() 1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall __ASSERT_DEBUG(iBmp == NULL, PANIC(KErrNotReady)); 1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iCopyBmp; 1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsaA::LockSurface() 1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp->LockHeap(); 1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return reinterpret_cast<TUint8*>(iBmp->DataAddress()); 1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::UnlockHWSurfaceRequestComplete() 1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall PANIC(KErrNotSupported); 1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::UnlockHwSurface() 1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp->UnlockHeap(); 1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetUpdating(EFalse); 1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Update(*iBmp); 1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::Update(CFbsBitmap& aBmp) 1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(!Blitter(aBmp)) 1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(SwSize() == HwRect().Size()) 1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Dsa().Gc()->BitBlt(HwRect().iTl, &aBmp); 1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Dsa().Gc()->DrawBitmap(HwRect(), &aBmp); 1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DrawOverlays(); 1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Dsa().ScreenDevice()->Update(); 1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::CreateSurfaceL() 1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iBmp; 1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp = NULL; 1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp = new (ELeave) CFbsBitmap(); 1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall User::LeaveIfError(iBmp->Create(SwSize(), DisplayMode())); 1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::Wipe(TInt aLength) //dont call in drawing 1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp->LockHeap(); 1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::FillZ(iBmp->DataAddress(), aLength); 1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBmp->UnlockHeap(); 1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsaA::ExternalUpdate() 1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iCopyBmp->Handle() == 0) 1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt err = iCopyBmp->Duplicate(iBmp->Handle()); 1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(err != KErrNone) 1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return err; 1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Update(*iCopyBmp); 2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) 2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyBmp = new (ELeave) CFbsBitmap(); 2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsa::ConstructL(aWindow, aDevice); 2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(MDsbObs) 2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall virtual void SurfaceReady() = 0; 2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall virtual CDirectScreenBitmap& Dsb() = 0; 2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsbSurface) : public CActive 2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsbSurface(MDsbObs& aDsb); 2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* Address(); 2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Complete(); 2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ~CDsbSurface(); 2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void RunL(); 2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void DoCancel(); 2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall MDsbObs& iDsb; 2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* iAddress; 2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsbSurface::CDsbSurface(MDsbObs& aDsb) : CActive(CActive::EPriorityHigh) , iDsb(aDsb) 2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CActiveScheduler::Add(this); 2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsbSurface::~CDsbSurface() 2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Cancel(); 2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::Complete() 2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iAddress != NULL && !IsActive()) 2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iAddress = NULL; 2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetActive(); 2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsb.Dsb().EndUpdate(iStatus); 2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsbSurface::Address() 2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iAddress == NULL && !IsActive()) 2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TAcceleratedBitmapInfo info; 2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(KErrNone == iDsb.Dsb().BeginUpdate(info)) 2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iAddress = info.iAddress; 2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iAddress; 2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::RunL() 2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsb.SurfaceReady(); 2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::DoCancel() 2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //empty 2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsaB) : public CDsa, public MDsbObs 2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsaB(RWsSession& aSession, TInt aFlags); 2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ~CDsaB(); 2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* LockSurface(); 2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void UnlockHWSurfaceRequestComplete(); 2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void UnlockHwSurface(); 2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void CreateSurfaceL(); 2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Wipe(TInt aLength); 2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void RecreateL(); 2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice); 2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDirectScreenBitmap& Dsb(); 2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void SurfaceReady(); 2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt ExternalUpdate(); 2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsbSurface* iSurface1; 2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsbSurface* iSurface2; 2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDirectScreenBitmap* iDsb; 2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt iType; 2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaB::CDsaB(RWsSession& aSession, TInt aFlags) : CDsa(aSession), iType(aFlags) 3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::UnlockHWSurfaceRequestComplete() 3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSurface1->Complete(); 3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSurface2 != NULL) 3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSurface2->Complete(); 3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::CreateSurfaceL() 3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall __ASSERT_ALWAYS(SwSize() == HwRect().Size(), PANIC(KErrNotSupported)); 3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::Wipe(TInt aLength) //dont call in drawing 3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* addr = LockSurface(); 3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(addr != NULL) 3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::FillZ(addr, aLength); 3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockHwSurface(); 3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::UnlockHwSurface() 3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall EpocSdlEnv::Request(CDsa::ERequestUpdate); 3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsaB::LockSurface() 3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* addr = iSurface1->Address(); 3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(addr == NULL && iSurface2 != NULL) 3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall addr = iSurface2->Address(); 3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetUpdating(addr == NULL); 3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return addr; 3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::SurfaceReady() 3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetUpdating(EFalse); 3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDirectScreenBitmap& CDsaB::Dsb() 3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return *iDsb; 3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) 3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iDsb == NULL) 3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsb = CDirectScreenBitmap::NewL(); 3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CDsa::ConstructL(aWindow, aDevice); 3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSurface1 == NULL) 3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSurface1 = new (ELeave) CDsbSurface(*this); 3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSurface2 == NULL && iType & CDirectScreenBitmap::EDoubleBuffer) 3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSurface2 = new (ELeave) CDsbSurface(*this); 3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaB::~CDsaB() 3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iSurface1; 3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iSurface2; 3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iDsb; 3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::RecreateL() 3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsb->Close(); 3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsb->Create(HwRect(), CDirectScreenBitmap::TSettingsFlags(iType)); 3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsaB::ExternalUpdate() 3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(LockSurface()) 3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockHWSurfaceRequestComplete(); 3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNotReady; 3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall///////////////////////////////////////////////////////////////////////////////////////////////////// 3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa* CDsa::CreateL(RWsSession& aSession) 3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(EpocSdlEnv::Flags(CSDL::EDrawModeDSB)) 3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt flags = CDirectScreenBitmap::ENone; 3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBDoubleBuffer)) 3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags |= CDirectScreenBitmap::EDoubleBuffer; 3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBIncrentalUpdate)) 3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags |= CDirectScreenBitmap::EIncrementalUpdate; 3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return new (ELeave) CDsaB(aSession, flags); 4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return new (ELeave) CDsaA(aSession); 4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RecreateL() 4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Free() 4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSize CDsa::WindowSize() const 4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TSize size = iSwSize; 4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation90) 4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt tmp = size.iWidth; 4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall size.iWidth = size.iHeight; 4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall size.iHeight = tmp; 4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return size; 4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetSuspend() 4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= ESdlThreadSuspend; 4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ReleaseStop() 4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~ESdlThreadExplicitStop; 4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::Stopped() const 4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return (iStateFlags & ESdlThreadExplicitStop); 4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetOrientation(CSDL::TOrientationMode aOrientation) 4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt flags = 0; 4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall switch(aOrientation) 4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case CSDL::EOrientation90: 4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags = EOrientation90; 4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case CSDL::EOrientation180: 4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags = EOrientation180; 4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case CSDL::EOrientation270: 4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags = EOrientation90 | EOrientation180; 4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case CSDL::EOrientation0: 4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall flags = 0; 4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(flags != (iStateFlags & EOrientationFlags)) 4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= EOrientationChanged; 4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iNewFlags = flags; //cannot be set during drawing... 4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa::~CDsa() 4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iDsa != NULL) 4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa->Cancel(); 4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iOverlays.Close(); 4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iDsa; 4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall User::Free(iLut256); 4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice) 4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iDsa != NULL) 4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa->Cancel(); 4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete iDsa; 4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa = NULL; 4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa = CDirectScreenAccess::NewL( 4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSession, 4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aDevice, 4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aWindow, 4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *this); 4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iLut256 == NULL) 4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iLut256 = (TUint32*) User::AllocL(256 * sizeof(TUint32)); 4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetMode = aWindow.DisplayMode(); 4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetBpp = BytesPerPixel(DisplayMode()); 4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iScreenRect = TRect(aWindow.Position(), aWindow.Size()); 4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetTargetRect(); 4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RestartL(); 5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DrawOverlays() 5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt last = iOverlays.Count() - 1; 5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = last; i >= 0 ; i--) 5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iOverlays[i].iOverlay->Draw(*iDsa->Gc(), HwRect(), SwSize()); 5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::AppendOverlay(MOverlay& aOverlay, TInt aPriority) 5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt i; 5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(i = 0; i < iOverlays.Count() && iOverlays[i].iPriority < aPriority; i++) 5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall {} 5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TOverlay overlay = {&aOverlay, aPriority}; 5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iOverlays.Insert(overlay, i); 5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::RemoveOverlay(MOverlay& aOverlay) 5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < iOverlays.Count(); i++) 5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iOverlays[i].iOverlay == &aOverlay) 5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iOverlays.Remove(i); 5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNotFound; 5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::LockPalette(TBool aLock) 5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aLock) 5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= EPaletteLocked; 5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EPaletteLocked; 5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::SetPalette(TInt aFirst, TInt aCount, TUint32* aPalette) 5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iLut256 == NULL) 5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNotFound; 5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt count = aCount - aFirst; 5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(count > 256) 5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrArgument; 5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EPaletteLocked) 5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = aFirst; i < count; i++) //not so busy here:-) 5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iLut256[i] = aPalette[i]; 5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RestartL() 5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //const TBool active = iDsa->IsActive(); 5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //if(!active) 5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa->StartL(); 5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const RRegion* r = iDsa->DrawingRegion(); 5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect rect = r->BoundingRect(); 5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa->Gc()->SetClippingRegion(r); 5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(rect != iScreenRect) 5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // iDsa->Cancel(); 5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return ; 5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //iScreenRect = rect; //to ensure properly set, albeit may not(?) match to value SDL has - therefore may has to clip 5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //targetrect shall no change 5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetTargetRect(); 5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RecreateL(); 5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= ERunning; 5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ReleaseStop(); 5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & ESdlThreadSuspend) 5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall EpocSdlEnv::Resume(); 5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~ ESdlThreadSuspend; 5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowReserved); 5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa::CDsa(RWsSession& aSession) : 5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSession(aSession), 5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags(0) 5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// CActiveScheduler::Add(this); 5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[0] = CopyMem; 5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[1] = CopyMemFlipReversed; 5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[2] = CopyMemReversed; 6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[3] = CopyMemFlip; 6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[4] = Copy256; 6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[5] = Copy256FlipReversed; 6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[6] = Copy256Reversed; 6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[7] = Copy256Flip; 6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[8] = CopySlow; 6099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[9] = CopySlowFlipReversed; 6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[10] = CopySlowReversed; 6119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCFTable[11] = CopySlowFlip; 6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallRWsSession& CDsa::Session() 6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return iSession; 6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::RedrawRequest() 6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(!(iStateFlags & (EUpdating) && (iStateFlags & ERunning))) 6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return ExternalUpdate(); 6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNotReady; 6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsa::LockHwSurface() 6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if((iStateFlags & EUpdating) == 0) //else frame is skipped 6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return LockSurface(); 6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RunL() 6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EUpdating; 6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DoCancel() 6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EUpdating; 6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //nothing can do, just wait? 6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::AllocSurface(TBool aHwSurface, const TSize& aSize, TDisplayMode aMode) 6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aHwSurface && aMode != DisplayMode()) 6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrArgument; 6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSourceMode = aMode; 6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSourceBpp = BytesPerPixel(aMode); 6609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TSize size = WindowSize(); 6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aSize.iWidth > size.iWidth) 6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrTooBig; 6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aSize.iHeight > size.iHeight) 6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrTooBig; 6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRAPD(err, CreateSurfaceL()); 6689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(err != KErrNone) 6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return err; 6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetCopyFunction(); 6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return KErrNone; 6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CreateZoomerL(const TSize& aSize) 6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSwSize = aSize; 6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= EResizeRequest; 6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CreateSurfaceL(); 6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetTargetRect(); 6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid SaveBmp(const TDesC& aName, const TAny* aData, TInt aLength, const TSize& aSz, TDisplayMode aMode) 6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CFbsBitmap* s = new CFbsBitmap(); 6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Create(aSz, aMode); 6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->LockHeap(); 6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* addr = s->DataAddress(); 6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::Copy(addr, aData, aLength); 6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->UnlockHeap(); 6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Save(aName); 6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Reset(); 6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete s; 6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid SaveBmp(const TDesC& aName, const TUint32* aData, const TSize& aSz) 7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CFbsBitmap* s = new CFbsBitmap(); 7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Create(aSz, EColor64K); 7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TBitmapUtil bmp(s); 7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bmp.Begin(TPoint(0, 0)); 7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt j = 0; j < aSz.iHeight; j++) 7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bmp.SetPos(TPoint(0, j)); 7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < aSz.iWidth; i++) 7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bmp.SetPixel(*aData); 7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aData++; 7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bmp.IncXPos(); 7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bmp.End(); 7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Save(aName); 7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall s->Reset(); 7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall delete s; 7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBuf<16> FooName(TInt aFoo) 7239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TBuf<16> b; 7259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall b.Format(_L("C:\\pic%d.mbm"), aFoo); 7269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return b; 7279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid ClipCopy(TUint8* aTarget, const TUint8* aSource, const TRect& aRect, const TPoint& aTargetPos) 7309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt iSourceBpp = 1; 7329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt iTargetBpp = 4; 7339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt iScanLineWidth = 800; 7349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* target = aTarget; 7369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* source = aSource; 7379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineWidth = aRect.Width(); 7389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += iSourceBpp * (aRect.iTl.iY * lineWidth); 7399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt sourceStartOffset = iSourceBpp * aRect.iTl.iX; 7409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += sourceStartOffset; 7419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall target += iTargetBpp * ((aTargetPos.iY + aRect.iTl.iY ) * lineWidth); 7429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetStartOffset = iTargetBpp * (aRect.iTl.iX + aTargetPos.iX); 7439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall target += targetStartOffset; 7449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* targetPtr = reinterpret_cast<TUint32*>(target); 7459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetWidth = iScanLineWidth >> 2; 7469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt height = aRect.Height(); 7479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 7499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 7509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ClipCopy(TUint8* aTarget, 7519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* aSource, 7529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aUpdateRect, 7539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aSourceRect) const 7549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //TUint8* target = aTarget; 7569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* source = (const TUint32*) aSource; 7579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineWidth = aSourceRect.Width(); 7589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += (aUpdateRect.iTl.iY * lineWidth); 7609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt sourceStartOffset = aUpdateRect.iTl.iX; 7619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += sourceStartOffset; 7629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* targetPtr = reinterpret_cast<TUint32*>(aTarget); 7649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += (aSourceRect.iTl.iY + aUpdateRect.iTl.iY ) * SwSize().iWidth; 7669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetStartOffset = (aUpdateRect.iTl.iX + aSourceRect.iTl.iX); 7679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetStartOffset; 7699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// TUint32* targetPtr = reinterpret_cast<TUint32*>(target); 7719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetWidth32 = SwSize().iWidth; 7739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt height = aUpdateRect.Height(); 7759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineMove = iStateFlags & EOrientation90 ? 1 : lineWidth; 7779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt copyLen = aUpdateRect.Width(); 7789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation180) 7819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetWidth32 * (height - 1); 7849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 7869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyFunction(*this, targetPtr, (TUint8*)source, copyLen, height); 7889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 7899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr -= targetWidth32; 7909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 7929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 7939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 7979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 7989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyFunction(*this, targetPtr, (TUint8*)source, copyLen, height); 7999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 8009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetWidth32; // >> 2; 8019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 8079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ClipCopy(TUint8* aTarget, const TUint8* aSource, const TRect& aRect, const TPoint& aTargetPos) const 8099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* target = aTarget; 8119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* source = aSource; 8129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt lineWidth = aRect.Width(); 8139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += iSourceBpp * (aRect.iTl.iY * lineWidth); 8149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt sourceStartOffset = iSourceBpp * aRect.iTl.iX; 8159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += sourceStartOffset; 8169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall target += iTargetBpp * ((aTargetPos.iY + aRect.iTl.iY ) * lineWidth); 8179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt targetStartOffset = iTargetBpp * (aRect.iTl.iX + aTargetPos.iX); 8189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall target += targetStartOffset; 8199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* targetPtr = reinterpret_cast<TUint32*>(target); 8209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt targetWidth = iScanLineWidth >> 2; 8219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt height = aRect.Height(); 8229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt lineMove = iStateFlags & EOrientation90 ? 1 : lineWidth; 8249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation180) 8269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetWidth * (height - 1); 8299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 8319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyFunction(*this, targetPtr, source, lineWidth, height); 8339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 8349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr -= targetWidth; 8359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 8389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for(TInt i = 0; i < height; i++) //source is always smaller 8429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyFunction(*this, targetPtr, source, lineWidth, height); 8449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall source += lineMove; 8459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall targetPtr += targetWidth; 8469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* 8549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ClipCopy(TUint8* aTarget, 8559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* aSource, 8569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aUpdateRect, 8579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TRect& aSourceRect) const 8589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TDsa dsa(*this); 8609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall switch(iSourceBpp) 8619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case 1: 8639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ::ClipCopy<TUint32, TUint8>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); 8649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 8659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case 2: 8669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ::ClipCopy<TUint32, TUint16>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); 8679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 8689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case 4: 8699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ::ClipCopy<TUint32, TUint32>(dsa, aTarget, aSource, aUpdateRect, aSourceRect); 8709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall break; 8719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 8769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Wipe() //dont call in drawing 8809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(IsDsaAvailable()) 8829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Wipe(iTargetBpp * SwSize().iWidth * SwSize().iHeight); 8839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 8849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetCopyFunction() 8869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 8879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //calculate offset to correct function in iCFTable according to given parameters 8889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt function = 0; 8899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KCopyFunctions = 4; 8909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KOffsetToNative = 0; 8919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KOffsetTo256 = KOffsetToNative + KCopyFunctions; 8929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KOffsetToOtherModes = KOffsetTo256 + KCopyFunctions; 8939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KOffsetTo90Functions = 1; 8949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt KOffsetTo180Functions = 2; 8959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSourceMode == DisplayMode()) 8979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall function = KOffsetToNative; //0 8989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else if(iSourceMode == EColor256) 8999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall function = KOffsetTo256; //4 9009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 9019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall function = KOffsetToOtherModes; //8 9029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation90) 9049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall function += KOffsetTo90Functions; // + 1 9059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation180) 9069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall function += KOffsetTo180Functions; //+ 2 9079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iCopyFunction = iCFTable[function]; 9099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Wipe(); 9119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline void Rotate(TRect& aRect) 9149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt dx = aRect.iBr.iX - aRect.iTl.iX; 9169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt dy = aRect.iBr.iY - aRect.iTl.iY; 9179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aRect.iBr.iX = aRect.iTl.iX + dy; 9199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aRect.iBr.iY = aRect.iTl.iY + dx; 9209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt tmp = aRect.iTl.iX; 9229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aRect.iTl.iX = aRect.iTl.iY; 9239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall aRect.iTl.iY = tmp; 9249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 9279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallint bar = 0; 9289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 9299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 9309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect) 9319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientationChanged) 9349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EOrientationFlags; 9369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= iNewFlags; 9379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetCopyFunction(); 9389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EOrientationChanged; 9399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall EpocSdlEnv::WaitDeviceChange(); 9409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return EFalse; //skip this frame as data is may be changed 9419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iTargetAddr == NULL) 9449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetAddr = LockHwSurface(); 9469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* target = iTargetAddr; 9499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(target == NULL) 9509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return EFalse; 9519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect targetRect = TRect(TPoint(0, 0), SwSize()); 9549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect sourceRect = aRect; 9569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect updateRect = aUpdateRect; 9579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// TPoint move(0, 0); 9599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation90) 9629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Rotate(sourceRect); 9649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Rotate(updateRect); 9659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSourceMode != DisplayMode() || targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0)) 9689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sourceRect.Intersection(targetRect); //so source always smaller or equal than target 9709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //updateRect.Intersection(targetRect); 9719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ClipCopy(target, aBits, updateRect, sourceRect); 9729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 9749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored 9769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::Copy(target, aBits, byteCount); 9779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return ETrue; 9809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 9829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect) 9849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientationChanged) 9879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EOrientationFlags; 9899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= iNewFlags; 9909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall SetCopyFunction(); 9919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EOrientationChanged; 9929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall EpocSdlEnv::WaitDeviceChange(); 9939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return EFalse; //skip this frame as data is may be changed 9949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iTargetAddr == NULL) 9979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 9989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetAddr = LockHwSurface(); 9999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint8* target = iTargetAddr; 10019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(target == NULL) 10029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return EFalse; 10039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect targetRect = Rect(); 10069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect sourceRect = aRect; 10079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect updateRect = aUpdateRect; 10089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation90) 10109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Rotate(sourceRect); 10129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Rotate(updateRect); 10139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iSourceMode != DisplayMode() || targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0)) 10169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall sourceRect.Intersection(targetRect); //so source always smaller or equal than target 10189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall updateRect.Intersection(targetRect); 10199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ClipCopy(target, aBits, updateRect, sourceRect.iTl); 10209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 10229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored 10249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::Copy(target, aBits, byteCount); 10259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return ETrue; 10289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::UpdateSwSurface() 10309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetAddr = NULL; 10329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall UnlockHwSurface(); //could be faster if does not use AO, but only check status before redraw, then no context switch needed 10339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Resume() 10379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(Stopped()) 10399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Restart(RDirectScreenAccess::ETerminateRegion); 10409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DoStop() 10439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(IsDsaAvailable()) 10459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags |= ESdlThreadExplicitStop; 10469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Stop(); 10479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Stop() 10509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~ERunning; 10529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// Cancel(); //can be called only from main! 10539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iDsa->Cancel(); 10549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/) 10579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// iStateFlags |= EChangeNotify; 10599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Stop(); 10609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Restart(RDirectScreenAccess::TTerminationReasons aReason) 10639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aReason == RDirectScreenAccess::ETerminateRegion) //auto restart 10659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRAPD(err, RestartL()); 10679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall PANIC_IF_ERROR(err); 10689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetBlitter(MBlitter* aBlitter) 10729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iBlitter = aBlitter; 10749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTPoint CDsa::WindowCoordinates(const TPoint& aPoint) const 10789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TPoint pos = aPoint - iScreenRect.iTl; 10809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TSize asz = iScreenRect.Size(); 10819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation180) 10829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX = asz.iWidth - pos.iX; 10849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY = asz.iHeight - pos.iY; 10859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EOrientation90) 10879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 10889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX = aPoint.iY; 10899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY = aPoint.iX; 10909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 10919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX <<= 16; 10929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY <<= 16; 10939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX /= asz.iWidth; 10949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY /= asz.iHeight; 10959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX *= iSwSize.iWidth; 10969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY *= iSwSize.iHeight; 10979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iX >>= 16; 10989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall pos.iY >>= 16; 10999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return pos; 11009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetTargetRect() 11039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetRect = iScreenRect; 11059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(iStateFlags & EResizeRequest && EpocSdlEnv::Flags(CSDL::EAllowImageResizeKeepRatio)) 11069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TSize asz = iScreenRect.Size(); 11089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TSize sz = iSwSize; 11099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRect rect; 11119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt dh = (sz.iHeight << 16) / sz.iWidth; 11139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if((asz.iWidth * dh ) >> 16 <= asz.iHeight) 11159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall rect.SetRect(TPoint(0, 0), TSize(asz.iWidth, (asz.iWidth * dh) >> 16)); 11179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 11199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TInt dw = (sz.iWidth << 16) / sz.iHeight; 11219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall rect.SetRect(TPoint(0, 0), TSize((asz.iHeight * dw) >> 16, asz.iHeight)); 11229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall rect.Move((asz.iWidth - rect.Size().iWidth) >> 1, (asz.iHeight - rect.Size().iHeight) >> 1); 11249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetRect = rect; 11269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iTargetRect.Move(iScreenRect.iTl); 11279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(!(iStateFlags & EResizeRequest)) 11309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iSwSize = iScreenRect.Size(); 11319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// iScanLineWidth = /*iTargetBpp **/ SwSize().iWidth; 11329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*) 11359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::ChangeTrigger() 11369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TBool change = iStateFlags & EChangeNotify; 11389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall iStateFlags &= ~EChangeNotify; 11399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return change; 11409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 11429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 11459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* target = aTarget; 11479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* endt = target + aBytes; 11489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* source = aSource; 11499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 11509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *target++ = aDsa.iLut256[*source++]; 11529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256Reversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 11569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* target = aTarget; 11589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = aTarget + aBytes; 11599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* source = aSource; 11609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 11619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = aDsa.iLut256[*source++]; 11639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256Flip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 11679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* target = aTarget; 11699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* endt = target + aBytes; 11709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* column = aSource; 11719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 11739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *target++ = aDsa.iLut256[*column]; 11759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 11769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256FlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 11809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* target = aTarget; 11829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = aTarget + aBytes; 11839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint8* column = aSource; 11849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 11869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = aDsa.iLut256[*column]; 11889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 11899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMem(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 11939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 11949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* src = reinterpret_cast<const TUint32*>(aSource); 11959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall Mem::Copy(aTarget, src, aBytes << 2); 11969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 11979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemFlip(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 11999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* target = aTarget; 12019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* endt = target + aBytes; 12029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* column = reinterpret_cast<const TUint32*>(aSource); 12039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 12059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *target++ = *column; 12079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 12089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 12129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* target = aTarget; 12149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = aTarget + aBytes; 12159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* source = reinterpret_cast<const TUint32*>(aSource); 12169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 12179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = *source++; 12199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemFlipReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 12249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* target = aTarget; 12269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = aTarget + aBytes; 12279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32* column = reinterpret_cast<const TUint32*>(aSource); 12289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 12309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = *column; 12329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 12339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 12379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TRgb rgb16MA(TInt aValue) 12399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return TRgb::Color16MA(aValue); 12419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/ 12439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(MRgbCopy) 12449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 12469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall virtual void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) = 0; 12479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall virtual void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) = 0; 12489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 12499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> 12519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(TRgbCopy) : public MRgbCopy 12529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall public: 12549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRgbCopy(TDisplayMode aMode); 12559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void* operator new(TUint aBytes, TAny* aMem); 12569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed); 12579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed); 12589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Gray256(const TUint8& aPixel); 12599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color256(const TUint8& aPixel); 12609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color4K(const TUint16& aPixel); 12619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color64K(const TUint16& aPixel); 12629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color16M(const TUint32& aPixel); 12639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color16MU(const TUint32& aPixel); 12649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall static TUint32 Color16MA(const TUint32& aPixel); 12659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall private: 12669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall typedef TUint32 (*TRgbFunc) (const T& aValue); 12679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TRgbFunc iFunc; 12689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall }; 12699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> 12729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid* TRgbCopy<T>::operator new(TUint /*aBytes*/, TAny* aMem) 12739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return aMem; 12759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> 12789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTRgbCopy<T>::TRgbCopy(TDisplayMode aMode) 12799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall switch(aMode) 12819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EGray256 : iFunc = (TRgbFunc) Gray256; break; 12839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor256 : iFunc = (TRgbFunc) Color256; break; 12849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor4K : iFunc = (TRgbFunc) Color4K; break; 12859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor64K : iFunc = (TRgbFunc) Color64K; break; 12869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor16M : iFunc = (TRgbFunc) Color16M; break; 12879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor16MU : iFunc = (TRgbFunc) Color16MU; break; 12889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall case EColor16MA : iFunc = (TRgbFunc) Color16MA; break; 12899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall default: 12909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall PANIC(KErrNotSupported); 12919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> 12959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TRgbCopy<T>::Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) 12969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 12979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const T* source = reinterpret_cast<const T*>(aSource); 12989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* target = aTarget; 12999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = target + aBytes; 13009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aReversed) 13029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 13049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const T value = *source++; 13069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = iFunc(value);//iFunc(value).Value(); 13079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 13109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 13129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const T value = *source++; 13149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *target++ = iFunc(value);//iFunc(value).Value(); 13159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> 13209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TRgbCopy<T>::FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) 13219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const T* column = reinterpret_cast<const T*>(aSource); 13239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* target = aTarget; 13249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32* endt = target + aBytes; 13259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aReversed) 13279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 13299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *(--endt) = iFunc(*column); 13319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 13329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall else 13359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall while(target < endt) 13379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *target++ = iFunc(*column); 13399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall column += aLineLen; 13409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Gray256(const TUint8& aPixel) 13459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall const TUint32 px = aPixel << 16 | aPixel << 8 | aPixel; 13479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return px; 13489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color256(const TUint8& aPixel) 13519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return TRgb::Color256(aPixel).Value(); 13539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color4K(const TUint16& aPixel) 13569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32 col = (aPixel & 0xF00) << 12; 13589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0xF00) << 8; 13599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x0F0) << 8; 13619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x0F0); 13629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x00F) << 4; 13649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x00F); 13659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return col; 13679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color64K(const TUint16& aPixel) 13709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TUint32 col = (aPixel & 0xF800)<< 8; 13729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0xE000) << 3; 13739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x07E0) << 5; 13759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0xC0) >> 1; 13769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x07E0) << 3; 13789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall col |= (aPixel & 0x1C) >> 2; 13799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return col; 13819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color16M(const TUint32& aPixel) 13849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return TRgb::Color16M(aPixel).Value(); 13869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color16MU(const TUint32& aPixel) 13899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return TRgb::Color16MU(aPixel).Value(); 13919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T> TUint32 TRgbCopy<T>::Color16MA(const TUint32& aPixel) 13949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 13959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return TRgb::Color16MA(aPixel).Value(); 13969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 13979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef TUint64 TStackMem; 13999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C MRgbCopy* GetCopy(TAny* mem, TDisplayMode aMode) 14019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aMode == EColor256 || aMode == EGray256) 14039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return new (mem) TRgbCopy<TUint8>(aMode); 14059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aMode == EColor4K || aMode == EColor64K) 14079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return new (mem) TRgbCopy<TUint16>(aMode); 14099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(aMode == EColor16M || aMode == EColor16MU || aMode == EColor16MA) 14119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return new (mem) TRgbCopy<TUint32>(aMode); 14139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall PANIC(KErrNotSupported); 14159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return NULL; 14169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowFlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 14209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TStackMem mem = 0; 14229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, ETrue); 14239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowFlip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen) 14269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TStackMem mem = 0; 14289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, EFalse); 14299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlow(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 14329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TStackMem mem = 0; 14349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, EFalse); 14359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt) 14389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall { 14399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TStackMem mem = 0; 14409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, ETrue); 14419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 14429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////////////////////////////////////////////7 1444