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