19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "dsa.h"
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "sdlepocapi.h"
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <cdsb.h>
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TInt BytesPerPixel(TDisplayMode aMode)
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return ((TDisplayModeUtils::NumDisplayModeBitsPerPixel(aMode) - 1) >> 3) + 1;
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////////////////////////////
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsaA) : public CDsa
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDsaA(RWsSession& aSession);
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		~CDsaA();
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TUint8* LockSurface();
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void UnlockHWSurfaceRequestComplete();
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void UnlockHwSurface();
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void CreateSurfaceL();
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Wipe(TInt aLength);
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void RecreateL();
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Free();
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt ExternalUpdate() {return 0;}
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CFbsBitmap* iBmp;
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaA::CDsaA(RWsSession& aSession) : CDsa(aSession)
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::Free()
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iBmp;
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp = NULL;
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaA::~CDsaA()
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	__ASSERT_DEBUG(iBmp == NULL, PANIC(KErrNotReady));
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsaA::LockSurface()
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp->LockHeap();
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return reinterpret_cast<TUint8*>(iBmp->DataAddress());
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::UnlockHWSurfaceRequestComplete()
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	PANIC(KErrNotSupported);
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::UnlockHwSurface()
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp->UnlockHeap();
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetUpdating(EFalse);
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Dsa().Gc()->BitBlt(HwRect().iTl, iBmp);
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Dsa().ScreenDevice()->Update();
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::CreateSurfaceL()
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iBmp;
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp = NULL;
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp  = new (ELeave) CFbsBitmap();
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	User::LeaveIfError(iBmp->Create(HwRect().Size(), DisplayMode()));
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::Wipe(TInt aLength) //dont call in drawing
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp->LockHeap();
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Mem::FillZ(iBmp->DataAddress(), aLength);
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBmp->UnlockHeap();
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaA::RecreateL()
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(MDsbObs)
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		virtual void SurfaceReady() = 0;
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		virtual CDirectScreenBitmap& Dsb() = 0;
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsbSurface) : public CActive
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDsbSurface(MDsbObs& aDsb);
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TUint8* Address();
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Complete();
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		~CDsbSurface();
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void RunL();
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void DoCancel();
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		MDsbObs& iDsb;
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TUint8* iAddress;
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsbSurface::CDsbSurface(MDsbObs& aDsb) : CActive(CActive::EPriorityHigh) , iDsb(aDsb)
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CActiveScheduler::Add(this);
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsbSurface::~CDsbSurface()
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Cancel();
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::Complete()
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iAddress != NULL && !IsActive())
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iAddress = NULL;
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		SetActive();
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iDsb.Dsb().EndUpdate(iStatus);
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsbSurface::Address()
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iAddress == NULL && !IsActive())
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TAcceleratedBitmapInfo info;
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(KErrNone == iDsb.Dsb().BeginUpdate(info))
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iAddress = info.iAddress;
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iAddress;
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::RunL()
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iDsb.SurfaceReady();
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsbSurface::DoCancel()
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//empty
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CDsaB) : public CDsa, public MDsbObs
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDsaB(RWsSession& aSession);
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		~CDsaB();
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TUint8* LockSurface();
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void UnlockHWSurfaceRequestComplete();
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void UnlockHwSurface();
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void CreateSurfaceL();
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Wipe(TInt aLength);
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void RecreateL();
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice);
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Free();
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDirectScreenBitmap& Dsb();
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void SurfaceReady();
1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt ExternalUpdate() {return 0;}
1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDsbSurface* iSurface1;
1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDsbSurface* iSurface2;
1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDirectScreenBitmap* iDsb;
1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaB::CDsaB(RWsSession& aSession) : CDsa(aSession)
1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::Free()
1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::UnlockHWSurfaceRequestComplete()
1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSurface1->Complete();
1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSurface2->Complete();
1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::CreateSurfaceL()
1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::Wipe(TInt aLength) //dont call in drawing
1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint8* addr = LockSurface();
1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(addr != NULL)
1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Mem::FillZ(addr, aLength);
1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		UnlockHwSurface();
1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::UnlockHwSurface()
2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	EpocSdlEnv::Request(CDsa::ERequestUpdate);
2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsaB::LockSurface()
2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint8* addr =  iSurface1->Address();
2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(addr == NULL)
2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		addr =  iSurface2->Address();
2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetUpdating(addr == NULL);
2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return addr;
2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::SurfaceReady()
2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetUpdating(EFalse);
2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDirectScreenBitmap& CDsaB::Dsb()
2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return *iDsb;
2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice)
2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iDsb == NULL)
2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iDsb = CDirectScreenBitmap::NewL();
2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CDsa::ConstructL(aWindow, aDevice);
2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSurface1 = new (ELeave) CDsbSurface(*this);
2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSurface2 = new (ELeave) CDsbSurface(*this);
2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsaB::~CDsaB()
2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iSurface1;
2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iSurface2;
2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iDsb;
2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsaB::RecreateL()
2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iDsb->Close();
2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iDsb->Create(HwRect(), CDirectScreenBitmap::EDoubleBuffer);
2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/////////////////////////////////////////////////////////////////////////////////////////////////////
2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSize CDsa::WindowSize() const
2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TSize size = HwRect().Size();
2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation90)
2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TInt tmp = size.iWidth;
2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		size.iWidth = size.iHeight;
2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		size.iHeight = tmp;
2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return size;
2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetSuspend()
2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags |= ESdlThreadSuspend;
2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ReleaseStop()
2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags &= ~ESdlThreadExplicitStop;
2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::Stopped() const
2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return (iStateFlags & ESdlThreadExplicitStop);
2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetOrientation(CSDL::TOrientationMode aOrientation)
2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt flags = 0;
2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	switch(aOrientation)
2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case CSDL::EOrientation90:
2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags = EOrientation90;
2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case CSDL::EOrientation180:
2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags = EOrientation180;
2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case CSDL::EOrientation270:
2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags = EOrientation90 | EOrientation180;
2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case CSDL::EOrientation0:
2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags = 0;
2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(flags != (iStateFlags & EOrientationFlags))
2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags |= EOrientationChanged;
2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iNewFlags = flags; //cannot be set during drawing...
3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa::~CDsa()
3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iDsa != NULL)
3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        iDsa->Cancel();
3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    delete iDsa;
3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::Free(iLut256);
3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ConstructL(RWindow& aWindow, CWsScreenDevice& aDevice)
3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iDsa != NULL)
3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iDsa->Cancel();
3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	delete iDsa;
3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iDsa = NULL;
3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iDsa = CDirectScreenAccess::NewL(
3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    				iSession,
3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					aDevice,
3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					aWindow,
3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					*this);
3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iLut256 == NULL)
3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iLut256 = (TUint32*) User::AllocL(256 * sizeof(TUint32));
3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iTargetMode = aWindow.DisplayMode();
3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iTargetBpp = BytesPerPixel(DisplayMode());
3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iTargetRect = TRect(aWindow.Position(), aWindow.Size());
3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    RestartL();
3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::LockPalette(TBool aLock)
3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aLock)
3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags |= EPaletteLocked;
3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags &= ~EPaletteLocked;
3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::SetPalette(TInt aFirst, TInt aCount, TUint32* aPalette)
3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iLut256 == NULL)
3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrNotFound;
3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt count = aCount - aFirst;
3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(count > 256)
3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrArgument;
3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EPaletteLocked)
3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrNone;
3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(TInt i = aFirst; i < count; i++) //not so busy here:-)
3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iLut256[i] = aPalette[i];
3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNone;
3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RestartL()
3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    //const TBool active = iDsa->IsActive();
3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    //if(!active)
3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iDsa->StartL();
3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    RRegion* r = iDsa->DrawingRegion();
3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iDsa->Gc()->SetClippingRegion(r);
3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TRect rect = r->BoundingRect();
3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(rect.IsEmpty())
3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	return;
3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iScreenRect = rect; //to ensure properly set, albeit may not(?) match to value SDL has - therefore may has to clip
3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	RecreateL();
3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iStateFlags |= ERunning;
3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//    iScanLineWidth = iTargetBpp * HwRect().Width();
3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ReleaseStop();
3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iStateFlags & ESdlThreadSuspend)
3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	EpocSdlEnv::Resume();
3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iStateFlags &= ~ ESdlThreadSuspend;
3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa::CDsa(RWsSession& aSession) :
3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSession(aSession),
3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  	iStateFlags(0)
3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//	CActiveScheduler::Add(this);
3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[0] = CopyMem;
3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[1] = CopyMemFlipReversed;
4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[2] = CopyMemReversed;
4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[3] = CopyMemFlip;
4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[4] = Copy256;
4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[5] = Copy256FlipReversed;
4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[6] = Copy256Reversed;
4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[7] = Copy256Flip;
4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[8] = CopySlow;
4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[9] = CopySlowFlipReversed;
4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[10] = CopySlowReversed;
4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCFTable[11] = CopySlowFlip;
4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallRWsSession& CDsa::Session()
4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iSession;
4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* CDsa::LockHwSurface()
4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if((iStateFlags & EUpdating) == 0) //else frame is skipped
4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return LockSurface();
4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RunL()
4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags &= ~EUpdating;
4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DoCancel()
4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags &= ~EUpdating;
4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//nothing can do, just wait?
4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::AllocSurface(TBool aHwSurface, const TSize& aSize, TDisplayMode aMode)
4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aHwSurface && aMode != DisplayMode())
4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrArgument;
4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSourceMode = aMode;
4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSourceBpp = BytesPerPixel(aMode);
4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TSize size = WindowSize();
4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aSize.iWidth > size.iWidth)
4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrTooBig;
4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aSize.iHeight > size.iHeight)
4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrTooBig;
4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRAPD(err, CreateSurfaceL());
4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(err != KErrNone)
4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return err;
4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetCopyFunction();
4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowReserved);
4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNone;
4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid SaveBmp(const TDesC& aName, const TAny* aData, TInt aLength, const TSize& aSz, TDisplayMode aMode)
4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CFbsBitmap* s = new CFbsBitmap();
4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Create(aSz, aMode);
4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->LockHeap();
4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* addr = s->DataAddress();
4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Mem::Copy(addr, aData, aLength);
4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->UnlockHeap();
4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Save(aName);
4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Reset();
4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete s;
4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid SaveBmp(const TDesC& aName, const TUint32* aData, const TSize& aSz)
4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CFbsBitmap* s = new CFbsBitmap();
4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Create(aSz, EColor64K);
4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TBitmapUtil bmp(s);
4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	bmp.Begin(TPoint(0, 0));
4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(TInt j = 0; j < aSz.iHeight; j++)
4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		bmp.SetPos(TPoint(0, j));
4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		for(TInt i = 0; i < aSz.iWidth; i++)
4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			bmp.SetPixel(*aData);
4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			aData++;
5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			bmp.IncXPos();
5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	bmp.End();
5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Save(aName);
5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	s->Reset();
5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete s;
5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBuf<16> FooName(TInt aFoo)
5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TBuf<16> b;
5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	b.Format(_L("C:\\pic%d.mbm"), aFoo);
5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return b;
5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::ClipCopy(TUint8* aTarget, const TUint8* aSource, const TRect& aRect, const TRect& aTargetPos) const
5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint8* target = aTarget;
5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint8* source = aSource;
5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt lineWidth = aRect.Width();
5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	source += iSourceBpp * (aRect.iTl.iY * lineWidth);
5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt sourceStartOffset = iSourceBpp *  aRect.iTl.iX;
5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	source += sourceStartOffset;
5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	target += iTargetBpp * ((aTargetPos.iTl.iY + aRect.iTl.iY ) * lineWidth);
5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt targetStartOffset = iTargetBpp * (aRect.iTl.iX + aTargetPos.iTl.iX);
5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	target += targetStartOffset;
5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* targetPtr = reinterpret_cast<TUint32*>(target);
5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt targetWidth = HwRect().Size().iWidth;
5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt height = aRect.Height();
5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt lineMove = iStateFlags & EOrientation90 ? 1 : lineWidth;
5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation180)
5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		targetPtr += targetWidth *  (height - 1);
5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		for(TInt i = 0; i < height; i++) //source is always smaller
5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iCopyFunction(*this, targetPtr, source, lineWidth, height);
5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			source += lineMove;
5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			targetPtr -= targetWidth;
5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		for(TInt i = 0; i < height; i++) //source is always smaller
5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iCopyFunction(*this, targetPtr, source, lineWidth, height);
5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			source += lineMove;
5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			targetPtr += targetWidth;
5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Wipe() //dont call in drawing
5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(IsDsaAvailable())
5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Wipe(iTargetBpp * iScreenRect.Width() * iScreenRect.Height());
5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetCopyFunction()
5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//calculate offset to correct function in iCFTable according to given parameters
5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt function = 0;
5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KCopyFunctions = 4;
5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KOffsetToNative = 0;
5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KOffsetTo256 = KOffsetToNative + KCopyFunctions;
5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KOffsetToOtherModes = KOffsetTo256 + KCopyFunctions;
5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KOffsetTo90Functions = 1;
5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt KOffsetTo180Functions = 2;
5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iSourceMode == DisplayMode())
5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		function = KOffsetToNative; 		//0
5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else if(iSourceMode == EColor256)
5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		function = KOffsetTo256;			//4
5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		function = KOffsetToOtherModes; 	//8
5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation90)
5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		function += KOffsetTo90Functions; 	// + 1
5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation180)
5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		function += KOffsetTo180Functions; 	//+ 2
5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCopyFunction = iCFTable[function];
5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Wipe();
5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline void Rotate(TRect& aRect)
5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt dx = aRect.iBr.iX - aRect.iTl.iX;
5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt dy = aRect.iBr.iY - aRect.iTl.iY;
6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	aRect.iBr.iX = aRect.iTl.iX + dy;
6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	aRect.iBr.iY = aRect.iTl.iY + dx;
6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt tmp = aRect.iTl.iX;
6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	aRect.iTl.iX = aRect.iTl.iY;
6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	aRect.iTl.iY = tmp;
6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallint bar = 0;
6119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::AddUpdateRect(const TUint8* aBits, const TRect& aUpdateRect, const TRect& aRect)
6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientationChanged)
6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags &= ~EOrientationFlags;
6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags |= iNewFlags;
6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		SetCopyFunction();
6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags &= ~EOrientationChanged;
6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    EpocSdlEnv::WaitDeviceChange();
6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    return EFalse; //skip this frame as data is may be changed
6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iTargetAddr == NULL)
6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iTargetAddr = LockHwSurface();
6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint8* target = iTargetAddr;
6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(target == NULL)
6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return EFalse;
6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRect targetRect = HwRect();
6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRect sourceRect = aRect;
6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRect updateRect = aUpdateRect;
6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation90)
6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Rotate(sourceRect);
6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Rotate(updateRect);
6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iSourceMode != DisplayMode() ||  targetRect != sourceRect || targetRect != updateRect || ((iStateFlags & EOrientationFlags) != 0))
6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		sourceRect.Intersection(targetRect); //so source always smaller or equal than target
6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		updateRect.Intersection(targetRect);
6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		ClipCopy(target, aBits, updateRect, sourceRect);
6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TInt byteCount = aRect.Width() * aRect.Height() * iSourceBpp; //this could be stored
6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Mem::Copy(target, aBits, byteCount);
6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return ETrue;
6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCDsa* CDsa::CreateL(RWsSession& aSession)
6609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(EpocSdlEnv::Flags(CSDL::EDrawModeDSB))
6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt flags = CDirectScreenBitmap::ENone;
6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBDoubleBuffer))
6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags |= CDirectScreenBitmap::EDoubleBuffer;
6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(EpocSdlEnv::Flags(CSDL::EDrawModeDSBIncrentalUpdate))
6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			flags |= CDirectScreenBitmap::EIncrementalUpdate;
6689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return new (ELeave) CDsaB(aSession);
6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    else
6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        return new (ELeave) CDsaA(aSession);
6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CreateZoomerL(const TSize& aSize)
6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSwSize = aSize;
6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags |= EResizeRequest;
6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CreateSurfaceL();
6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetTargetRect();
6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTPoint CDsa::WindowCoordinates(const TPoint& aPoint) const
6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TPoint pos = aPoint - iScreenRect.iTl;
6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TSize asz = iScreenRect.Size();
6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation180)
6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		pos.iX = asz.iWidth - pos.iX;
6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		pos.iY = asz.iHeight - pos.iY;
6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EOrientation90)
6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		pos.iX = aPoint.iY;
6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		pos.iY = aPoint.iX;
6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iX <<= 16;
6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iY <<= 16;
6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iX /= asz.iWidth;
6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iY /= asz.iHeight;
7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iX *= iSwSize.iWidth;
7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iY *= iSwSize.iHeight;
7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iX >>= 16;
7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pos.iY >>= 16;
7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return pos;
7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetTargetRect()
7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iTargetRect = iScreenRect;
7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStateFlags & EResizeRequest && EpocSdlEnv::Flags(CSDL::EAllowImageResizeKeepRatio))
7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TSize asz = iScreenRect.Size();
7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TSize sz = iSwSize;
7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TRect rect;
7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TInt dh = (sz.iHeight << 16) / sz.iWidth;
7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if((asz.iWidth * dh ) >> 16 <= asz.iHeight)
7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			rect.SetRect(TPoint(0, 0), TSize(asz.iWidth, (asz.iWidth * dh) >> 16));
7229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
7239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		else
7249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
7259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			const TInt dw = (sz.iWidth << 16) / sz.iHeight;
7269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    	rect.SetRect(TPoint(0, 0), TSize((asz.iHeight * dw) >> 16, asz.iHeight));
7279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
7289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		rect.Move((asz.iWidth - rect.Size().iWidth) >> 1, (asz.iHeight - rect.Size().iHeight) >> 1);
7299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iTargetRect = rect;
7319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iTargetRect.Move(iScreenRect.iTl);
7329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!(iStateFlags & EResizeRequest))
7359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iSwSize = iScreenRect.Size();
7369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//	iScanLineWidth = /*iTargetBpp **/ SwSize().iWidth;
7379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::RecreateL()
7409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Free()
7449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::UpdateSwSurface()
7489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iTargetAddr = NULL;
7509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	UnlockHwSurface();	//could be faster if does not use AO, but only check status before redraw, then no context switch needed
7519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::SetBlitter(MBlitter* aBlitter)
7549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iBlitter = aBlitter;
7569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DrawOverlays()
7599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt last = iOverlays.Count() - 1;
7619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(TInt i = last; i >= 0 ; i--)
7629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iOverlays[i].iOverlay->Draw(*iDsa->Gc(), HwRect(), SwSize());
7639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::AppendOverlay(MOverlay& aOverlay, TInt aPriority)
7669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt i;
7689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(i = 0; i < iOverlays.Count() && iOverlays[i].iPriority < aPriority; i++)
7699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{}
7709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TOverlay overlay = {&aOverlay, aPriority};
7719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iOverlays.Insert(overlay, i);
7729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::RemoveOverlay(MOverlay& aOverlay)
7759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(TInt i = 0; i < iOverlays.Count(); i++)
7779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(iOverlays[i].iOverlay == &aOverlay)
7799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
7809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iOverlays.Remove(i);
7819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			return KErrNone;
7829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
7839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotFound;
7859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CDsa::RedrawRequest()
7889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!(iStateFlags & (EUpdating) && (iStateFlags & ERunning)))
7909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return ExternalUpdate();
7929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotReady;
7949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Resume()
7989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(Stopped())
8009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		Restart(RDirectScreenAccess::ETerminateRegion);
8019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::DoStop()
8049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(IsDsaAvailable())
8069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStateFlags |= ESdlThreadExplicitStop;
8079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Stop();
8089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Stop()
8119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags &= ~ERunning;
8139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//	Cancel(); //can be called only from main!
8149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iDsa->Cancel();
8159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)
8189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//	iStateFlags |= EChangeNotify;
8209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Stop();
8219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Restart(RDirectScreenAccess::TTerminationReasons aReason)
8249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aReason == RDirectScreenAccess::ETerminateRegion) //auto restart
8269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TRAPD(err, RestartL());
8289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		PANIC_IF_ERROR(err);
8299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*)
8329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CDsa::ChangeTrigger()
8339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TBool change = iStateFlags & EChangeNotify;
8359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStateFlags &= ~EChangeNotify;
8369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return change;
8379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
8399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
8409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
8429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* target = aTarget;
8449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* endt = target + aBytes;
8459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint8* source = aSource;
8469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
8479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*target++ = aDsa.iLut256[*source++];
8499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256Reversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
8539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* target = aTarget;
8559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = aTarget + aBytes;
8569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint8* source = aSource;
8579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
8589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*(--endt) = aDsa.iLut256[*source++];
8609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256Flip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
8649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* target = aTarget;
8669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* endt = target + aBytes;
8679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint8* column = aSource;
8689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
8709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*target++ = aDsa.iLut256[*column];
8729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		column += aLineLen;
8739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::Copy256FlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
8779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* target = aTarget;
8799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = aTarget + aBytes;
8809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint8* column = aSource;
8819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
8839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*(--endt) = aDsa.iLut256[*column];
8859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		column += aLineLen;
8869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMem(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
8909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Mem::Copy(aTarget, aSource, aBytes);
8929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemFlip(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
8959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* target = aTarget;
8979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* endt = target + aBytes;
8989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* column = reinterpret_cast<const TUint32*>(aSource);
8999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
9019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*target++ = *column;
9039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		column += aLineLen;
9049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
9089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* target = aTarget;
9109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = aTarget + aBytes;
9119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* source = reinterpret_cast<const TUint32*>(aSource);
9129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
9139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*(--endt) = *source++;
9159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopyMemFlipReversed(const CDsa& /*aDsa*/, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
9209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* target = aTarget;
9229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = aTarget + aBytes;
9239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TUint32* column = reinterpret_cast<const TUint32*>(aSource);
9249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(target < endt)
9269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		*(--endt) = *column;
9289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		column += aLineLen;
9299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef TRgb (*TRgbFunc) (TInt aValue);
9349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TRgb rgb16MA(TInt aValue)
9369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return TRgb::Color16MA(aValue);
9389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(MRgbCopy)
9419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
9439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	virtual void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed) = 0;
9449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	virtual void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed) = 0;
9459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
9469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T>
9479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(TRgbCopy) : public MRgbCopy
9489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
9509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRgbCopy(TDisplayMode aMode);
9519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	void* operator new(TUint aBytes, TAny* aMem);
9529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	void Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed);
9539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	void FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed);
9549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
9559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TRgbFunc iFunc;
9569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
9579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T>
9599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid* TRgbCopy<T>::operator new(TUint /*aBytes*/, TAny* aMem)
9609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return aMem;
9629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T>
9659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTRgbCopy<T>::TRgbCopy(TDisplayMode aMode)
9669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	switch(aMode)
9689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EGray256 : iFunc = TRgb::Gray256; break;
9709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor256 : iFunc = TRgb::Color256; break;
9719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor4K : iFunc = TRgb::Color4K; break;
9729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor64K : iFunc = TRgb::Color64K; break;
9739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor16M : iFunc = TRgb::Color16M; break;
9749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor16MU : iFunc = TRgb::Color16MU; break;
9759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	case EColor16MA : iFunc = rgb16MA; break;
9769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	default:
9779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		PANIC(KErrNotSupported);
9789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T>
9829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TRgbCopy<T>::Copy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TBool aReversed)
9839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const T* source = reinterpret_cast<const T*>(aSource);
9859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* target = aTarget;
9869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = target + aBytes;
9879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aReversed)
9899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		while(target < endt)
9919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
9929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			TUint32 value = *source++;
9939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			*(--endt) = iFunc(value).Value();
9949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
9959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
9979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		while(target < endt)
9999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
10009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			TUint32 value = *source++;
10019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			*target++ = iFunc(value).Value();
10029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
10039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltemplate <class T>
10079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TRgbCopy<T>::FlipCopy(TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen, TBool aReversed)
10089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const T* column = reinterpret_cast<const T*>(aSource);
10109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* target = aTarget;
10119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TUint32* endt = target + aBytes;
10129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aReversed)
10149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
10159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		while(target < endt)
10169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
10179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			*(--endt) = iFunc(*column).Value();
10189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			column += aLineLen;
10199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
10209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
10229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
10239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		while(target < endt)
10249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
10259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			*target++ = iFunc(*column).Value();
10269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			column += aLineLen;
10279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
10289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Halltypedef TUint64 TStackMem;
10339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C MRgbCopy* GetCopy(TAny* mem, TDisplayMode aMode)
10359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aMode == EColor256 || aMode == EGray256)
10379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
10389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return new (mem) TRgbCopy<TUint8>(aMode);
10399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aMode == EColor4K || aMode == EColor64K)
10419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
10429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return new (mem) TRgbCopy<TUint16>(aMode);
10439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aMode == EColor16M || aMode == EColor16MU || aMode == EColor16MA)
10459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
10469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return new (mem) TRgbCopy<TUint32>(aMode);
10479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
10489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	PANIC(KErrNotSupported);
10499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return NULL;
10509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowFlipReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
10549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TStackMem mem = 0;
10569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, ETrue);
10579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowFlip(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt aLineLen)
10609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TStackMem mem = 0;
10629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	GetCopy(&mem, aDsa.iSourceMode)->FlipCopy(aTarget, aSource, aBytes, aLineLen, EFalse);
10639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlow(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
10669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TStackMem mem = 0;
10689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, EFalse);
10699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CDsa::CopySlowReversed(const CDsa& aDsa, TUint32* aTarget, const TUint8* aSource, TInt aBytes, TInt)
10729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TStackMem mem = 0;
10749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	GetCopy(&mem, aDsa.iSourceMode)->Copy(aTarget, aSource, aBytes, ETrue);
10759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}