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