windowing/windowserver/tauto/TAlphaChannel.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/TAlphaChannel.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1936 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// An alpha channel test case. 
+// Output different graphics primitives in each window using three graphics modes
+// for pen and brush : semi-transparent,transparent, opaque
+// Test also exercises anti-aliasing and fading for 16MA display mode
+// Moves sprite on the window. Tests a sprite functionality.
+// Creates RBackedUpWindow window and moves it over transparent window,
+// hides and shows it.
+// Moves windows on the screen, overlaps them
+// Actions:
+// Create a background window, and five foreground windows:
+// -transparent and semi-transparent 
+// -transparent with transparency factor
+// -not transparent
+// 
+//
+
+#include "TAlphaChannel.H"
+
+const TInt KWindowIndention = 2;
+const TInt KSizeKoeff = 15;
+
+
+LOCAL_D TPtrC ColumnName[]={
+	_L("Opaque"),
+	_L("Semi-transparent"),
+	_L("Transparent"),
+	_L(""),
+	_L(""),
+	_L(""),
+	};
+
+LOCAL_D TPtrC RowName[]={
+	_L("n"),
+	_L("and"),
+	_L("or"),
+	_L("xor"),
+	_L(""),
+	_L(""),
+	};
+
+
+//
+//
+CTAlphaChannel::CTAlphaChannel(CTestStep* aStep):
+	CTWsGraphicsBase(aStep), iArrWindow(8)
+	{
+	}
+
+CTAlphaChannel::~CTAlphaChannel()
+	{
+	delete iBitmap64K_1;
+	delete iBitmap16MA_1;
+	delete iBitmap64K_2;
+	delete iBitmap16MA_2;
+	delete iBitmap64K_3;
+	delete iBitmap16MA_3;
+
+	delete iBitmapMask;
+	delete iBitmapGray256Mask;
+	
+	delete iBitmapContext64K_1;
+	delete iBitmapContext16MA_1;
+	delete iBitmapContext64K_2;
+	delete iBitmapContext16MA_2;
+	delete iBitmapContext64K_3;
+	delete iBitmapContext16MA_3;
+
+	delete iBitmapDevice64K_1;
+	delete iBitmapDevice16MA_1;
+	delete iBitmapDevice64K_2;
+	delete iBitmapDevice16MA_2;
+	delete iBitmapDevice64K_3;
+	delete iBitmapDevice16MA_3;
+
+	delete iBackgroundWindow;
+	
+	
+	iArrWindow.ResetAndDestroy();
+	
+	if(iFont)
+		TheClient->iScreen->ReleaseFont(iFont);
+	if(iFont1)
+		TheClient->iScreen->ReleaseFont(iFont1);
+	
+	BaseWin->SetVisible(ETrue);
+	TestWin->SetVisible(ETrue);
+	}
+
+void CTAlphaChannel::ConstructL()
+	{
+	const TInt KIndent = 10;
+	BaseWin->SetVisible(EFalse);
+	TestWin->SetVisible(EFalse);
+
+	iText = _L("This is a text");
+	iBrushStyle = CGraphicsContext::ESolidBrush;
+	iPenTable = KRgbBlack;
+
+	TSize screenSize=TheClient->iGroup->Size();
+	TInt winWidth=(screenSize.iWidth)-KIndent;
+	TInt winHeight=screenSize.iHeight-KIndent;
+	TDisplayMode dispMode = EColor64K;
+	
+	//background opaque window
+	iBackgroundWindow = new (ELeave) CTWinAlpha();
+	iBackgroundWindow->SetUpL(TPoint(5,5),TSize(winWidth,winHeight),TheClient->iGroup,*TheClient->iGc, &dispMode);
+	RWindow *theWin = (RWindow*) (iBackgroundWindow->DrawableWin());
+	theWin->SetBackgroundColor(TRgb(255, 0, 0));
+	iBackgroundWindow->DrawNow();
+
+	iSizeForegroundWindow.iWidth = (winWidth - KWindowIndention * 4) / 5 ;
+	iSizeForegroundWindow.iHeight = winHeight;
+	
+	CalculateSizePrimitives(iSizeForegroundWindow);
+
+	//-------------create bitmaps
+	//create 64K bitmap
+	iBitmap64K_1 = new (ELeave) CFbsBitmap ;
+	iBitmap64K_1->Create(iBitmapSize,EColor64K);
+	iBitmap64K_2 = new (ELeave) CFbsBitmap ;
+	iBitmap64K_2->Create(iBitmapSize,EColor64K);
+	iBitmap64K_3 = new (ELeave) CFbsBitmap ;
+	iBitmap64K_3->Create(iBitmapSize,EColor64K);
+	iBitmapDevice64K_1 = CFbsBitmapDevice::NewL(iBitmap64K_1);
+	iBitmapDevice64K_1->CreateContext(iBitmapContext64K_1);
+	iBitmapDevice64K_2 = CFbsBitmapDevice::NewL(iBitmap64K_2);
+	iBitmapDevice64K_2->CreateContext(iBitmapContext64K_2);
+	iBitmapDevice64K_3 = CFbsBitmapDevice::NewL(iBitmap64K_3);
+	iBitmapDevice64K_3->CreateContext(iBitmapContext64K_3);
+	
+	//create 16MA bitmap
+	iBitmap16MA_1 = new (ELeave) CFbsBitmap ;
+	iBitmap16MA_1->Create(iBitmapSize, EColor16MA);
+	iBitmap16MA_2 = new (ELeave) CFbsBitmap ;
+	iBitmap16MA_2->Create(iBitmapSize, EColor16MA);
+	iBitmap16MA_3 = new (ELeave) CFbsBitmap ;
+	iBitmap16MA_3->Create(iBitmapSize, EColor16MA);
+
+	iBitmapDevice16MA_1 = CFbsBitmapDevice::NewL(iBitmap16MA_1);
+	iBitmapDevice16MA_1->CreateContext(iBitmapContext16MA_1);
+	iBitmapDevice16MA_2 = CFbsBitmapDevice::NewL(iBitmap16MA_2);
+	iBitmapDevice16MA_2->CreateContext(iBitmapContext16MA_2);
+	iBitmapDevice16MA_3 = CFbsBitmapDevice::NewL(iBitmap16MA_3);
+	iBitmapDevice16MA_3->CreateContext(iBitmapContext16MA_3);
+
+	//create mask bitmap
+	iBitmapMask = new (ELeave) CFbsBitmap ;
+	iBitmapMask->Create(iBitmapSize, EGray2);
+	
+	CFbsBitmapDevice* theBitmapDevice = CFbsBitmapDevice::NewL(iBitmapMask);
+	CGraphicsContext*  theBitmapContext = NULL;
+	theBitmapDevice->CreateContext(theBitmapContext);
+	TRect rect = TRect(iBitmapMask->SizeInPixels());
+	theBitmapContext->SetBrushColor(KRgbWhite);
+   	theBitmapContext->SetPenColor(KRgbWhite);
+   	theBitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	theBitmapContext->DrawRect(rect);
+
+	rect.Shrink(4, 4);
+	theBitmapContext->SetBrushColor(KRgbBlack);
+	theBitmapContext->SetPenColor(KRgbBlack);
+	theBitmapContext->DrawEllipse(rect);
+	delete theBitmapContext;
+	delete theBitmapDevice;
+	
+	//create 256gray bitmap mask
+	iBitmapGray256Mask = new (ELeave) CFbsBitmap;
+	iBitmapGray256Mask->Create(iBitmapSize, EGray256);
+	theBitmapDevice = CFbsBitmapDevice::NewL(iBitmapGray256Mask);
+	theBitmapDevice->CreateContext(theBitmapContext);
+	
+	if(iBitmapSize != TSize(0, 0))
+		{
+	//fill bitmap with 256 gradation of gray
+		TInt theStep = 256 / iBitmapGray256Mask->SizeInPixels().iWidth;
+	
+		for(TInt ii = 0; ii < iBitmapGray256Mask->SizeInPixels().iWidth; ii++)
+			{
+			TInt theSingleCol = theStep * ii; 
+			TRgb theCol(theSingleCol, theSingleCol, theSingleCol);
+			theBitmapContext->SetBrushColor(theCol);
+			theBitmapContext->SetPenColor(theCol);
+			TPoint ptFrom(ii, 0);
+			TPoint ptTo(ii, iBitmapGray256Mask->SizeInPixels().iHeight);
+			theBitmapContext->DrawLine(ptFrom, ptTo);
+			}
+		}
+	delete theBitmapContext;
+	delete theBitmapDevice;
+	//--------------
+	TFontSpec fontSpec(KTestFontTypefaceName,600);
+
+	fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
+	fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
+	
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips(iFont, fontSpec));
+	
+	TFontSpec fontSpec1(KTestFontTypefaceName,100);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips(iFont1, fontSpec1));
+	}
+
+void CTAlphaChannel::CalculateSizePrimitives(const TSize& aSize)
+	{
+	TInt theLen = aSize.iWidth / KSizeKoeff;
+	
+	iBitmapSize = TSize(2 * theLen, 2 * theLen);
+	iRectangleSize = TSize(2 * theLen, 2 * theLen);
+	iEllipseSize = TSize(4 * theLen, 2 * theLen);
+	iTriangleSize = TSize(3 * theLen, 2 * theLen);
+	iFirstCellWidth = static_cast <TInt> (1.2 * theLen);
+	iFirstCellHeight = static_cast <TInt> (1.5 * theLen);
+	}
+
+void CTAlphaChannel::DrawOffscreenBitmapsL(const TRgb& /*aPen*/, const TRgb& aBrush,
+										CGraphicsContext* aBitmapContext64K, CGraphicsContext* aBitmapContext16MA, 
+										CFbsBitmap* aBitmap64K, CFbsBitmap* aBitmap16MA)
+	{
+
+	if(aBitmapContext64K && aBitmap64K)
+		{
+		SEpocBitmapHeader header = aBitmap64K->Header();
+		TInt source_buffer_size = header.iBitmapSize / header.iSizeInPixels.iHeight * header.iBitsPerPixel ;
+		TUint8* buffer = new(ELeave) TUint8[source_buffer_size];
+		TPtr8 source_ptr(buffer, source_buffer_size, source_buffer_size);
+		
+		TUint16* bufferCur = reinterpret_cast<TUint16*> (buffer);
+		TInt ii;
+		for(ii = 0; ii < header.iSizeInPixels.iWidth; ++ii)
+			{
+			*bufferCur = aBrush._Color64K();
+			bufferCur ++;
+			}
+	
+		for(ii = 0; ii < header.iSizeInPixels.iHeight; ++ii)
+			{
+			aBitmap64K -> SetScanLine(source_ptr, ii);
+			}
+		
+		delete [] buffer;
+		}
+		
+	if(aBitmapContext16MA && aBitmap16MA)
+		{
+		SEpocBitmapHeader header = aBitmap16MA -> Header();
+		TInt source_buffer_size = header.iBitmapSize / header.iSizeInPixels.iHeight * header.iBitsPerPixel ;
+		TUint8* buffer = new(ELeave) TUint8[source_buffer_size];
+		TPtr8 source_ptr(buffer, source_buffer_size, source_buffer_size);
+		
+		TUint32* bufferCur = reinterpret_cast<TUint32*> (buffer);
+		TInt ii;
+		for(ii = 0; ii < header.iSizeInPixels.iWidth; ++ii)
+			{
+			*bufferCur = aBrush._Color16MA();
+			bufferCur ++;
+			}
+	
+		for(ii = 0; ii < header.iSizeInPixels.iHeight; ++ii)
+			{
+			aBitmap16MA -> SetScanLine(source_ptr, ii);
+			}
+		
+		delete [] buffer;
+		}
+	
+	}
+
+enum {EOpaque, ESemiTrans, ETrans};
+
+TRgb CTAlphaChannel::GetBrush(TInt aIndex) const
+	{
+	switch(aIndex)
+		{
+			case EOpaque:
+			return TRgb(0, 0, 255, 255);
+			case ESemiTrans:
+			return TRgb(0, 0, 255, 128);
+			case ETrans:
+			return TRgb(0, 0, 255, 0);
+			default : break;
+		}
+		
+	return 	TRgb(0, 0, 255, 255);
+	}
+
+TRgb CTAlphaChannel::GetPen(TInt aIndex) const
+	{
+	switch(aIndex)
+		{
+			case EOpaque:
+			return TRgb(0, 0, 255, 255);
+			case ESemiTrans:
+			return TRgb(0, 0, 255, 128);
+			case ETrans:
+			return TRgb(0, 0, 255, 0);
+			default : break;
+		}
+		
+	return 	TRgb(0, 0, 255, 255);
+	}
+   
+CGraphicsContext::TDrawMode CTAlphaChannel::GetDrawMode(TInt /*aIndex*/) const
+	{
+	return CGraphicsContext::EDrawModePEN;
+	}
+
+enum {EAll64K, EAll16MA, EAllDifferent};// later may add EAll16M
+void CTAlphaChannel::SetDisplayModeConfiguration(TInt aConfig)
+	{
+	switch (aConfig)
+		{
+	case EAll64K:
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetDisplayMode(EColor64K);
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetDisplayMode(EColor64K);
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetDisplayMode(EColor64K);
+		break;
+	case EAll16MA:
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetDisplayMode(EColor16MA);
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetDisplayMode(EColor16MA);
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetDisplayMode(EColor16MA);
+		break;
+	case EAllDifferent:
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetDisplayMode(EColor256);
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetDisplayMode(EColor64K);
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetDisplayMode(EColor16MA);
+		break;
+		}
+	}
+
+enum {ETiled, EOverlapping};
+
+void CTAlphaChannel::SetPositionConfiguration(TInt aConfig)
+	{
+	TSize screenSize=TheClient->iGroup->Size();
+	TInt winWidth=(screenSize.iWidth)-10;
+	TInt winHeight=screenSize.iHeight-10;
+	if (aConfig==ETiled)
+		{
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetPos(TPoint(winWidth/5, 0));
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetPos(TPoint(2*winWidth/5, 0));
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetPos(TPoint(3*winWidth/5, 0));
+		}
+	else
+		{
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetPos(TPoint(winWidth/3, -winHeight/3));
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetPos(TPoint(2*winWidth/5, winHeight/3));
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetPos(TPoint(winWidth/2, -winHeight/3));
+		}
+	if (iForegroundWindowBottom)
+		iForegroundWindowBottom->SetPos(TPoint(0, 0));
+	if (iForegroundWindowTop)
+		iForegroundWindowTop->SetPos(TPoint(4*winWidth/5, 0));
+	}
+
+enum {EVaryingTransparency, EVaryingColour};
+
+void CTAlphaChannel::SetColourConfiguration(TInt aConfig)
+	{
+	RWindow* win;
+	if (aConfig==EVaryingTransparency)
+		{
+		// red background, green foregrounds of varying transparency
+		win = (RWindow*)(iBackgroundWindow->DrawableWin());
+		win->SetBackgroundColor(TRgb(255,0,0,255));
+
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetBackgroundColor(TRgb(0,255,0,255));
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetBackgroundColor(TRgb(0,255,0,128));
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetBackgroundColor(TRgb(0,255,0,0));
+		}
+	else
+		{
+		// white background, semi-transparent foregrounds in primary colours
+		win = (RWindow*)(iBackgroundWindow->DrawableWin());
+		win->SetBackgroundColor(TRgb(255,255,255,255));
+
+		if(iForegroundWindowOpaque)
+			iForegroundWindowOpaque->SetBackgroundColor(TRgb(255,0,0,128));
+		if(iForegroundWindowSemiTrans)
+			iForegroundWindowSemiTrans->SetBackgroundColor(TRgb(0,255,0,128));
+		if(iForegroundWindowTrans)
+			iForegroundWindowTrans->SetBackgroundColor(TRgb(0,0,255,128));
+		}
+	}
+
+void CTAlphaChannel::DoMoving()
+	{
+	TPoint pos;
+	for (TInt i = 0; i<20; i++)
+		{
+		if (iForegroundWindowBottom)
+			{
+			pos = iForegroundWindowBottom->Position();
+			pos += TPoint(1,5);
+			iForegroundWindowBottom->SetPos(pos);
+			}
+
+		if (iForegroundWindowOpaque)
+			{
+			pos = iForegroundWindowOpaque->Position();
+			pos += TPoint(1,5);
+			iForegroundWindowOpaque->SetPos(pos);
+			}
+
+		if (iForegroundWindowSemiTrans)
+			{
+			pos = iForegroundWindowSemiTrans->Position();
+			pos += TPoint(1,5);
+			iForegroundWindowSemiTrans->SetPos(pos);
+			}
+
+		if (iForegroundWindowTrans)
+			{
+			pos = iForegroundWindowTrans->Position();
+			pos += TPoint(1,5);
+			iForegroundWindowTrans->SetPos(pos);
+			}
+
+		if (iForegroundWindowTop)
+			{
+			pos = iForegroundWindowTop->Position();
+			pos += TPoint(1,5);
+			iForegroundWindowTop->SetPos(pos);
+			}
+
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(50000));
+		}
+
+	}
+
+void CTAlphaChannel::DoMoveBehind()
+	{
+	TPoint pos = iBackgroundWindow->Position();
+	for (TInt i = 0; i<20; i++)
+		{
+		pos += TPoint(0,5);
+		iBackgroundWindow->SetPos(pos);
+
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(50000));
+		}
+	iBackgroundWindow->SetPos(TPoint(5,5));
+	}
+
+void CTAlphaChannel::DoInvisibility()
+	{
+	RWindow* win;
+	if (iForegroundWindowBottom)
+		{
+		win = (RWindow*)(iForegroundWindowBottom->DrawableWin());
+		win->SetVisible(EFalse);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		win->SetVisible(ETrue);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	if (iForegroundWindowOpaque)
+		{
+		win = (RWindow*)(iForegroundWindowOpaque->DrawableWin());
+		win->SetVisible(EFalse);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		win->SetVisible(ETrue);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	if (iForegroundWindowSemiTrans)
+		{
+		win = (RWindow*)(iForegroundWindowSemiTrans->DrawableWin());
+		win->SetVisible(EFalse);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		win->SetVisible(ETrue);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	if (iForegroundWindowTrans)
+		{
+		win = (RWindow*)(iForegroundWindowTrans->DrawableWin());
+		win->SetVisible(EFalse);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		win->SetVisible(ETrue);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	if (iForegroundWindowTop)
+		{
+		win = (RWindow*)(iForegroundWindowTop->DrawableWin());
+		win->SetVisible(EFalse);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		win->SetVisible(ETrue);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0328
+  	
+  	@SYMTestCaseDesc			Testing a Fading.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Set fading parameters. Draw all graphics primitives and bitmaps with 
+		 various transparency				.
+ 
+  	@SYMTestExpectedResults
+ 				All windows should be drawn according their fading values. 
+ */
+
+void CTAlphaChannel::TestFading()
+	{
+	iIsFading = ETrue;
+	iBlackFading = 0;
+	iWhiteFading = 128;
+	iText.Format(_L("Fading. %dX%d"), iBlackFading, iWhiteFading);
+	INFO_PRINTF1(iText);
+	DrawTestWindowsNow();
+
+	User::After(TTimeIntervalMicroSeconds32(1000000 * 1));
+	iIsFading = EFalse;
+	DrawTestWindowsNow();
+	iIsFading = ETrue;
+	iBlackFading = 128;
+	iWhiteFading = 255;
+	iText.Format(_L("Fading. %dX%d"), iBlackFading, iWhiteFading);
+	INFO_PRINTF1(iText);
+	DrawTestWindowsNow();
+
+	iIsFading = EFalse;
+	}
+	
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0329
+  	
+  	@SYMTestCaseDesc			Tests moving of foreground windows.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Set fading parameters. Set position of foreground windows as tile				.
+ 
+  	@SYMTestExpectedResults
+ 			Foreground window has to be redrawn properly.
+ */
+
+void CTAlphaChannel::TestMoving()
+	{
+	SetPositionConfiguration(ETiled);
+	DoMoving();
+	SetPositionConfiguration(ETiled);
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0330
+  	
+  	@SYMTestCaseDesc			Tests moving of foreground windows.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Set fading parameters. Moves foreground windows over the screen			.
+ 
+  	@SYMTestExpectedResults
+ 			Foreground window has to be redrawn properly.
+ */
+
+
+void CTAlphaChannel::TestMovingOverlapping()
+	{
+	TPoint pos;
+
+	for (TInt i = 0; i < 20; i++)
+		{
+		if (iForegroundWindowOpaque)
+			{
+			pos = iForegroundWindowOpaque->Position();
+			pos += TPoint(3,0);
+			iForegroundWindowOpaque->SetPos(pos);
+			}
+		if (iForegroundWindowTrans)
+			{
+			pos = iForegroundWindowTrans->Position();
+			pos -= TPoint(3,0);
+			iForegroundWindowTrans->SetPos(pos);
+			}
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(50000));
+		}
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0331
+  	
+  	@SYMTestCaseDesc			Testing transparency factor for windows with alpha channel.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Sets background colour with various level of transparency			.
+ 
+  	@SYMTestExpectedResults
+ 			Foreground window must be redrawn properly.
+ */
+void CTAlphaChannel::TestChangingTransparencyFactor()
+	{
+	TInt i = 0;
+	while (i <= 255)
+		{
+		iForegroundWindowOpaque->SetBackgroundColor(TRgb(0,255,0,255-i));
+		iForegroundWindowTrans->SetBackgroundColor(TRgb(0,255,0,i));
+		iForegroundWindowOpaque->DrawNow();
+		iForegroundWindowTrans->DrawNow();
+		i+=15;
+		}
+	i=0;
+	while (i <= 255)
+		{
+		iForegroundWindowOpaque->SetBackgroundColor(TRgb(0,255,0,i));
+		iForegroundWindowTrans->SetBackgroundColor(TRgb(0,255,0,255-i));
+		iForegroundWindowOpaque->DrawNow();
+		iForegroundWindowTrans->DrawNow();
+		User::After(TTimeIntervalMicroSeconds32(50000));// 20 frames per second
+		i+=15;
+		}
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0332
+  	
+  	@SYMTestCaseDesc			Testing redrawing of foreground windows while their positions and 
+  				invisibility have been changed.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Sets position of the foreground windows as overlapping, tiled.
+		Change visability of semi transparent foreground window.		.
+ 
+  	@SYMTestExpectedResults
+ 		Foreground window must be redrawn properly.
+ */
+
+void CTAlphaChannel::TestInvisibility()
+	{
+	RWindow* win = (RWindow*)(iForegroundWindowSemiTrans->DrawableWin());
+	SetPositionConfiguration(EOverlapping);
+	TheClient->iWs.Flush();	
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+
+	win->SetVisible(EFalse);
+	TheClient->iWs.Flush();	
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+
+	win->SetVisible(ETrue);
+	TheClient->iWs.Flush();	
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+
+	SetPositionConfiguration(ETiled);
+
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0333
+  	
+  	@SYMTestCaseDesc			Testing redrawing of foreground windows after a 
+  				background window has been moved.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Sets position of the foreground windows as tiled.
+		Moves background window.
+ 
+  	@SYMTestExpectedResults
+ 		Foreground windows must be redrawn properly.
+ */
+void CTAlphaChannel::TestMoveUnderneath()
+	{
+	SetPositionConfiguration(ETiled);
+	DoMoveBehind();
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0334
+  	
+  	@SYMTestCaseDesc			Testing redrawing of foreground windows after a 
+  				background window has been moved.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Sets different position of the foreground windows: tiled, overlapping.
+		Moves background window.
+ 
+  	@SYMTestExpectedResults
+ 		Foreground windows has to be redrawn properly.
+ */
+
+void CTAlphaChannel::TestMoveBehindInvisible()
+	{
+	SetPositionConfiguration(ETiled);
+	RWindow* win;
+	win = (RWindow*)(iForegroundWindowOpaque->DrawableWin());
+	win->SetVisible(EFalse);
+	win = (RWindow*)(iForegroundWindowSemiTrans->DrawableWin());
+	win->SetVisible(EFalse);
+	win = (RWindow*)(iForegroundWindowTrans->DrawableWin());
+	win->SetVisible(EFalse);
+	TheClient->iWs.Flush();
+
+	DoMoveBehind();
+
+	SetPositionConfiguration(EOverlapping);
+	DoMoveBehind();
+
+	win = (RWindow*)(iForegroundWindowOpaque->DrawableWin());
+	win->SetVisible(ETrue);
+	win = (RWindow*)(iForegroundWindowSemiTrans->DrawableWin());
+	win->SetVisible(ETrue);
+	win = (RWindow*)(iForegroundWindowTrans->DrawableWin());
+	win->SetVisible(ETrue);
+	TheClient->iWs.Flush();
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0335
+  	
+  	@SYMTestCaseDesc			Testing redrawing of foreground windows.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Redraws background window
+ 
+  	@SYMTestExpectedResults
+ 		Foreground windows should be redrawn properly, if background window 
+  		 has been redrawn.
+ */
+void CTAlphaChannel::TestRedrawBehind()
+	{
+	TheClient->iWs.Flush();	
+	iBackgroundWindow->iState += 1;
+	iBackgroundWindow->DrawNow();
+	TheClient->iWs.Flush();	
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0336
+  	
+  	@SYMTestCaseDesc			Testing transparency with RWsSprite class.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Creates RBackedUpWindow window and moves it over transparent window
+		appears and dissapears set up window as transparent
+ 
+  	@SYMTestExpectedResults
+ 			Must work with transparent windows. 
+ */
+
+void CTAlphaChannel::TestAnimationL()
+	{
+	for(TInt ii = 0; ii < iArrWindow.Count(); ii++)
+		{
+		iArrWindow[ii]->StartAnimationL();
+		}
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0337
+  	
+  	@SYMTestCaseDesc			Testing transparency with RBackedUpWindow window class.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Creates RBackedUpWindow window and moves it over transparent window
+		appears and dissapears set up transparent window as transparent
+ 
+  	@SYMTestExpectedResults
+ 				Do not expect correct work of alpha channel with 
+ 				RBackedUpWindow window class. 
+*/
+void CTAlphaChannel::TestBackedWindowL()
+	{
+	for(TInt ii = 0; ii < iArrWindow.Count(); ii++)
+		{
+		iArrWindow[ii]->CreateBackedWindowL();
+		}
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0338
+  	
+  	@SYMTestCaseDesc			Implication of setting SetDrawOpaque on drawing with alpha channel.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 Change graphic context to opaque and none opaque and rewdraw all test windows
+ 
+  	@SYMTestExpectedResults
+ 				must not impact on output with alpha channel 
+ */
+
+void CTAlphaChannel::TestEffectSetOpaque()
+	{
+	for(TInt ii = 0; ii < 3; ii++)
+		{
+		
+		for(TInt ii = 0; ii < iArrWindow.Count(); ii++)
+			{
+			iArrWindow[ii]->SetDrawOpaque(EFalse);
+			}
+	
+		DrawTestWindowsNow();
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+
+		for(TInt jj = 0; jj < iArrWindow.Count(); jj++)
+			{
+			iArrWindow[jj]->SetDrawOpaque(ETrue);
+			}
+
+		DrawTestWindowsNow();
+		User::After(TTimeIntervalMicroSeconds32(1000000));
+		}
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0339
+  	
+  	@SYMTestCaseDesc			Redrawing of child windows with transparency.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 	Creates a few child windows with various levels of transparency.
+		Moves parent window over the screen.
+  	@SYMTestExpectedResults
+ 				Child and parent windows must be redrawn properly 
+ */
+
+void CTAlphaChannel::TestChildWindowL()
+	{
+	SetPositionConfiguration(ETiled);
+	SetColourConfiguration(EVaryingColour);
+	DrawTestWindowsNow(ETrue);
+	TDisplayMode mode = EColor64K;
+	CTWinAlphaForeground* childWin[] = {NULL, NULL, NULL, NULL, NULL};
+	if (iForegroundWindowBottom)
+		{
+		childWin[0] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowBottom,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+		childWin[0]->DrawNow();
+		}
+	if (iForegroundWindowOpaque)
+		{
+		childWin[1] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowOpaque,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ETransparencyFactor);
+		childWin[1]->DrawNow();
+		}
+	if (iForegroundWindowSemiTrans)
+		{
+		childWin[2] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowSemiTrans,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ETransparencyAlpha);
+		childWin[2]->DrawNow();
+		}
+	if (iForegroundWindowTrans)
+		{
+		childWin[3] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowTrans,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+		childWin[3]->DrawNow();
+		}
+	if (iForegroundWindowTop)
+		{
+		childWin[4] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowTop,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+		childWin[4]->DrawNow();
+		}
+	TheClient->iWs.Flush();	
+
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+	DoMoving();
+
+	delete childWin[0];
+	delete childWin[1];
+	delete childWin[2];
+	delete childWin[3];
+	delete childWin[4];
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0340
+  	
+  	@SYMTestCaseDesc			Redrawing of multiple child windows with transparency.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 	Creates multiple child windows with various levels of transparency.
+		Moves parent windows over the screen.
+  	@SYMTestExpectedResults
+ 				Child and parent windows must be redrawn properly 
+ */
+
+void CTAlphaChannel::TestMultipleChildrenL()
+	{
+	SetPositionConfiguration(ETiled);
+	SetColourConfiguration(EVaryingColour);
+	TDisplayMode mode = EColor64K;
+	CTWinAlphaForeground* childWin[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
+	if (iForegroundWindowBottom)
+		{
+		childWin[0] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(50,50),iForegroundWindowBottom,*TheClient->iGc, &mode, TRgb(255, 255, 255,128), ETransparencyFactor);
+		childWin[1] = CTWinAlphaForeground::NewL(*this, TPoint(20,20),TSize(50,50),childWin[0],*TheClient->iGc, &mode, TRgb(255, 255, 255,128), ENonTransparentAlpha);
+		childWin[0]->DrawNow();
+		childWin[1]->DrawNow();
+		}
+	if (iForegroundWindowOpaque)
+		{
+		childWin[4] = CTWinAlphaForeground::NewL(*this, TPoint(0,0),TSize(100,100),iForegroundWindowOpaque,*TheClient->iGc, &mode, TRgb(255, 255, 255,128), ETransparencyAlpha);
+		childWin[5] = CTWinAlphaForeground::NewL(*this, TPoint(20,80),TSize(50,50),iForegroundWindowOpaque,*TheClient->iGc, &mode, TRgb(255, 255, 255,128), ENonTransparentAlpha);
+		childWin[6] = CTWinAlphaForeground::NewL(*this, TPoint(20,20),TSize(60,60),childWin[4],*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+		childWin[7] = CTWinAlphaForeground::NewL(*this, TPoint(20,20),TSize(50,50),childWin[6],*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+		childWin[4]->DrawNow();
+		childWin[5]->DrawNow();
+		childWin[6]->DrawNow();
+		childWin[7]->DrawNow();
+		}
+	DrawTestWindowsNow(ETrue);
+
+	TestMoving();
+
+	delete childWin[0];
+	delete childWin[1];
+	delete childWin[2];
+	delete childWin[3];
+	delete childWin[4];
+	delete childWin[5];
+	delete childWin[6];
+	delete childWin[7];
+	}
+
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0341
+  	
+  	@SYMTestCaseDesc			Test transparent window which positioned under opaque.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 	Creates an opaque window on the topt of transparent windows.
+		Moves transparent windows over the screen.
+  	@SYMTestExpectedResults
+ 				Transparent windows must be redrawn properly 
+ */
+
+void CTAlphaChannel::TestTransparentMovingUnderOpaqueL()
+	{
+	SetColourConfiguration(EVaryingColour);
+	TDisplayMode mode = EColor64K;
+	CTWinAlphaForeground* win = CTWinAlphaForeground::NewL(*this, TPoint(0,100),TSize(600,40),TheClient->iGroup,*TheClient->iGc, &mode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+	win->DrawNow();
+
+	TestMoving();
+
+	delete win;
+	}
+/** 
+	@SYMTestCaseID	GRAPHICS-WSERV-0342
+  	
+  	@SYMTestCaseDesc			Changing orinary position of the foreground windows.
+  	
+  	@SYMTestPriority			High
+  	
+  	@SYMTestStatus      		Implemented
+  	
+  	@SYMTestActions		
+		 	Set ordinal position of foreground windows.
+  	@SYMTestExpectedResults
+ 				Foreground windows must be redrawn properly 
+ */
+
+void CTAlphaChannel::TestSetOrdinalPosition()
+	{
+	SetColourConfiguration(EVaryingColour);
+	SetPositionConfiguration(EOverlapping);
+	DrawTestWindowsNow(ETrue);
+	TheClient->iWs.Flush();	
+	User::After(TTimeIntervalMicroSeconds32(1000000));
+	RWindow* win;
+	for (TInt i=0; i<3; i++)
+		{
+		if (iForegroundWindowOpaque)
+			{
+			win = (RWindow*)(iForegroundWindowOpaque->DrawableWin());
+			win->SetOrdinalPosition(0);
+			TheClient->iWs.Flush();	
+			User::After(TTimeIntervalMicroSeconds32(1000000));
+			}
+		if (iForegroundWindowSemiTrans)
+			{
+			win = (RWindow*)(iForegroundWindowSemiTrans->DrawableWin());
+			win->SetOrdinalPosition(0);
+			TheClient->iWs.Flush();	
+			User::After(TTimeIntervalMicroSeconds32(1000000));
+			}
+		if (iForegroundWindowTrans)
+			{
+			win = (RWindow*)(iForegroundWindowTrans->DrawableWin());
+			win->SetOrdinalPosition(0);
+			TheClient->iWs.Flush();	
+			User::After(TTimeIntervalMicroSeconds32(1000000));
+			}
+		}
+	}
+
+void CTAlphaChannel::RunTestCaseL(TInt aCurTestCase)
+	{
+	User::After(TTimeIntervalMicroSeconds32(1000000 * 2));
+	
+	((CTAlphaChannelStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch (aCurTestCase)
+		{
+		case 1:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			CreateForegroundWindowsL(iSizeForegroundWindow, EColor16MU);
+			break;
+		case 2:
+			{
+			CreateForegroundWindowsL(iSizeForegroundWindow, EColor64K);
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0339"));
+			TestChildWindowL();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0340"));
+			TestMultipleChildrenL();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0342"));
+			TestSetOrdinalPosition();
+			}
+			break;
+		case 3: 
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0336"));
+			TestAnimationL();
+		case 4: 
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0337"));
+			TestBackedWindowL();
+			break;
+		case 5: 
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0338"));
+			TestEffectSetOpaque();
+			break;
+		case 6:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			iIsFading = EFalse;
+			DrawTestWindowsNow();
+			INFO_PRINTF1(_L("Anti-aliasing"));
+			iIsFading = EFalse;
+			iDrawText = ETrue;
+			DrawTestWindowsNow();
+			break;
+		case 7:	
+			SetColourConfiguration(EVaryingColour);
+			SetPositionConfiguration(EOverlapping);
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0335"));
+			TestRedrawBehind();		
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0329"));
+			TestMoving();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0330"));
+			TestMovingOverlapping();		
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0341"));
+			TestMoveBehindInvisible();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0334"));
+			TestTransparentMovingUnderOpaqueL();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0331"));
+			TestInvisibility();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0332"));
+			TestChangingTransparencyFactor();
+			break;
+		case 8:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0328"));
+			TestFading();
+			break;
+		case 9:
+			{
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			iDrawText = EFalse;
+			SetDisplayModeConfiguration(EAll16MA);
+			}
+			break;
+		case 10:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			iIsFading = EFalse;
+			DrawTestWindowsNow();
+			INFO_PRINTF1(_L("Anti-aliasing"));
+			iIsFading = EFalse;
+			iDrawText = ETrue;
+			DrawTestWindowsNow();
+			break;
+		case 11:
+			SetColourConfiguration(EVaryingColour);
+			SetPositionConfiguration(EOverlapping);
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0333"));
+			TestMoveUnderneath();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0335"));
+			TestRedrawBehind();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0329"));
+			TestMoving();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0332"));
+			TestInvisibility();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0331"));
+			TestChangingTransparencyFactor();
+			break;
+		case 12:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0328"));
+			TestFading();
+			break;
+		case 13:
+			SetDisplayModeConfiguration(EAllDifferent);
+			SetColourConfiguration(EVaryingColour);
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0333"));
+			TestMoveUnderneath();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0335"));
+			TestRedrawBehind();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0332"));
+			TestInvisibility();
+			((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0329"));
+			TestMoving();
+			break;
+		case 14:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0336"));
+			TestAnimationL();
+			break;
+		case 15:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0337"));
+			TestBackedWindowL();
+			break;
+		case 16:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0338"));
+			TestEffectSetOpaque();
+			break;
+		case 17:
+			((CTAlphaChannelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			((CTAlphaChannelStep*)iStep)->CloseTMSGraphicsStep();
+			TestComplete();
+			break;
+		}
+	((CTAlphaChannelStep*)iStep)->RecordTestResultL();
+	}
+	
+/** Calculate foreground windows margin and create them*/
+void CTAlphaChannel::CreateForegroundWindowsL(const TSize& aSize, TDisplayMode aMode)
+	{
+	TPoint pt = TPoint(5, 5);
+	
+	//creating foreground windows
+	//bottom window
+	TDisplayMode dispMode = aMode;
+	iForegroundWindowBottom = CTWinAlphaForeground::NewL(*this, pt,aSize,TheClient->iGroup,*TheClient->iGc, &dispMode, TRgb(0, 255, 0,128), ETransparencyFactor);
+	iArrWindow.AppendL( iForegroundWindowBottom);
+
+	//dispMode = EColor16MA;
+	pt.iX += aSize.iWidth + KWindowIndention;
+	//opaque window
+	iForegroundWindowOpaque = CTWinAlphaForeground::NewL(*this, pt,aSize,TheClient->iGroup,*TheClient->iGc, &dispMode, TRgb(0, 255, 0, 255), ETransparencyAlpha);
+	iArrWindow.AppendL( iForegroundWindowOpaque);
+
+	pt.iX += aSize.iWidth + KWindowIndention;
+	//semi-transparent window
+	iForegroundWindowSemiTrans = CTWinAlphaForeground::NewL(*this, pt,aSize,TheClient->iGroup,*TheClient->iGc, &dispMode, TRgb(0, 255, 0, 128), ETransparencyAlpha);
+	iArrWindow.AppendL( iForegroundWindowSemiTrans);
+
+	//transparent window
+	pt.iX += aSize.iWidth + KWindowIndention;
+	iForegroundWindowTrans = CTWinAlphaForeground::NewL(*this, pt,aSize,TheClient->iGroup,*TheClient->iGc, &dispMode, TRgb(0, 255, 0, 0), ETransparencyAlpha);
+	iArrWindow.AppendL( iForegroundWindowTrans);
+
+	// top window
+	pt.iX += aSize.iWidth + KWindowIndention;
+	iForegroundWindowTop = CTWinAlphaForeground::NewL(*this, pt,aSize,TheClient->iGroup,*TheClient->iGc, &dispMode, TRgb(0, 255, 0,128), ENonTransparentAlpha);
+	iArrWindow.AppendL( iForegroundWindowTop);
+	}
+
+void CTAlphaChannel::DestroyForegroundWindows()
+	{
+	iArrWindow.ResetAndDestroy();
+	iForegroundWindowBottom = NULL;
+	iForegroundWindowOpaque = NULL;
+	iForegroundWindowSemiTrans = NULL;
+	iForegroundWindowTrans = NULL;
+	iForegroundWindowTop = NULL;
+	}
+
+/** Draw all foreground windows */
+void CTAlphaChannel::DrawTestWindowsNow(TBool aDrawBackgroundWin)
+	{
+	if(iBackgroundWindow && aDrawBackgroundWin)
+		{
+		iBackgroundWindow->DrawNow();
+		}
+
+	for(TInt ii = 0; ii < iArrWindow.Count(); ii++)
+		{
+		iArrWindow[ii]->DrawNow();
+		}
+	}
+	
+//-------------
+
+CTWinAlphaForeground* CTWinAlphaForeground::NewL(CTAlphaChannel& aTest, TPoint aPos, TSize aSize, CTWinBase *aParent, CWindowGc &aGc, TDisplayMode *aMode, TRgb aCol, TInt aTransparencyType)
+	{
+	CTWinAlphaForeground* theWin = new(ELeave) CTWinAlphaForeground(aTest);
+	
+	theWin->ConstructL(*aParent);
+	if (aMode)
+		theWin->SetDisplayMode(*aMode);
+	theWin->SetExtL(aPos, aSize);
+	theWin->AssignGC(aGc);
+	theWin->PrepareForDrawingL();	
+
+	// for hardware testing	only we create an additional bitmap
+#ifndef __WINS__
+	theWin->CreateBackgroundBitmapL(*aMode);
+#endif
+		
+	RWindow* win = (RWindow*) (theWin->DrawableWin());
+	win->SetShadowHeight(0);
+	win->SetShadowDisabled(ETrue);
+	switch (aTransparencyType)
+		{
+	case ETransparencyFactor:
+		{
+		win->SetTransparencyFactor(aCol);
+		theWin->SetBackgroundColor(aCol);
+		}
+		break;
+	case ETransparencyAlpha:
+		win->SetTransparencyAlphaChannel();
+		// fall through into next case
+	case ENonTransparentAlpha:
+	default:
+		theWin->SetBackgroundColor(aCol);
+		break;
+		}
+	
+	theWin->Activate();
+
+	return theWin;
+	}
+
+CTWinAlphaForeground::~CTWinAlphaForeground()
+	{
+	if(iPolygon)
+		{
+		iPolygon->Reset();
+		delete iPolygon;
+		}
+	delete iBitmapBackground;
+	delete iBitmapDeviceBackground;
+	delete iBitmapContextBackground;
+	}
+	
+CTWinAlphaForeground::CTWinAlphaForeground(CTAlphaChannel& aTest)
+	: iTest(aTest)
+	{	
+	}
+
+
+void CTWinAlphaForeground::SetDisplayMode(TDisplayMode aDisplayMode)
+	{
+	BaseWin()->SetRequiredDisplayMode(aDisplayMode);
+	switch (aDisplayMode)
+		{
+	case EColor256:
+		iTitle1 = _L("256");
+		break;
+	case EColor64K:
+		iTitle1 = _L("64K");
+		break;
+	case EColor16MU:
+		iTitle1 = _L("16MU");
+		break;
+	case EColor16MA:
+		iTitle1 = _L("16MA");
+		break;
+	case EColor16MAP:
+		iTitle1 = _L("16MAP");
+		break;
+	default:
+		iTitle1 = _L("");
+		break;
+		}
+	}
+
+void CTWinAlphaForeground::SetBackgroundColor(TRgb aRgb)
+	{
+	switch (aRgb.Alpha())
+		{
+		case 0:
+		iTitle2 = _L(" trans ");		
+		break;
+		case 255:
+		iTitle2 = _L(" opaque ");		
+		break;
+		case 128:
+		default:
+		iTitle2 = _L(" s-trans ");		
+		break;
+		}
+	if (aRgb.Red())
+		iTitle2 += _L("R");
+	if (aRgb.Green())
+		iTitle2 += _L("G");
+	if (aRgb.Blue())
+		iTitle2 += _L("B");
+
+	iBackgroundColor = aRgb;
+	((RWindow*) DrawableWin())->SetBackgroundColor(aRgb);
+	}
+
+void CTWinAlphaForeground::Draw()
+	{
+	CBitmapContext* theGc = TheClient->iGc;
+	((CWindowGc*)theGc)->SetOpaque(iDrawOpaque);
+	
+	if(iBitmapContextBackground)
+		{
+		//CGraphicsContext
+		theGc = iBitmapContextBackground;
+		CleanBackgroundBitmap();
+		}
+	if(iTest.iFont1)
+		theGc->UseFont(iTest.iFont1);
+	
+	
+	theGc->SetFaded(EFalse);
+	DrawTable(*theGc);
+
+	TInt numRows = sizeof(iRows) / sizeof(iRows[0]) ;
+
+	theGc->SetBrushStyle(iTest.iBrushStyle);
+	if(iTest.iFont && iTest.iDrawText)
+		{
+		theGc->DiscardFont();
+		theGc->UseFont(iTest.iFont);
+		}
+	
+	theGc->SetFaded(iTest.iIsFading);
+	
+	// the factor and offset are calculated as follows: 
+	// iFadeMapFactor = iWhiteFading - iBlackFading;
+	// iFadeMapOffset = iBlackFading;
+
+	theGc->SetFadingParameters(iTest.iBlackFading, iTest.iWhiteFading); //black and white
+		
+	for(TInt ii = 0; ii < numRows - 1; ii++)
+		{
+		theGc -> SetBrushStyle(iTest.iBrushStyle);
+
+		TRect theRect = TRect(iCol, iRows[ii], Size().iWidth, iRows[ii + 1]);
+				
+   		TRgb theBrush = iTest.GetBrush(ii);
+   		TRgb thePen = iTest.GetPen(ii);
+
+   		CGraphicsContext::TDrawMode theDrawMode = iTest.GetDrawMode(ii);
+    		
+   		theGc->SetBrushColor(theBrush);
+		theGc->SetPenColor(thePen);
+   		theGc->SetDrawMode(theDrawMode);
+		
+		CGraphicsContext* theBitmapContext64K;
+		CGraphicsContext* theBitmapContext16MA;
+		CFbsBitmap* theBitmap64K;
+		CFbsBitmap* theBitmap16MA;
+
+		switch(ii)
+			{
+			case 0:
+				{
+				theBitmapContext64K = iTest.iBitmapContext64K_1;
+				theBitmapContext16MA = iTest.iBitmapContext16MA_1;
+				theBitmap64K = iTest.iBitmap64K_1;
+				theBitmap16MA = iTest.iBitmap16MA_1;
+				break;
+				}
+			case 1:
+				{
+				theBitmapContext64K = iTest.iBitmapContext64K_2;
+				theBitmapContext16MA = iTest.iBitmapContext16MA_2;
+				theBitmap64K = iTest.iBitmap64K_2;
+				theBitmap16MA = iTest.iBitmap16MA_2;
+				break;
+				}
+			default:
+				{
+				theBitmapContext64K = iTest.iBitmapContext64K_3;
+				theBitmapContext16MA = iTest.iBitmapContext16MA_3;
+				theBitmap64K = iTest.iBitmap64K_3;
+				theBitmap16MA = iTest.iBitmap16MA_3;
+				break;
+				}
+			}
+			if(iTest.iDrawText)
+				{
+				DrawTextInCell(*theGc, theRect);
+				}
+			else
+				{
+				TRAP_IGNORE(iTest.DrawOffscreenBitmapsL(thePen, theBrush, theBitmapContext64K, 
+					theBitmapContext16MA, theBitmap64K, theBitmap16MA));
+				DrawPrimitivesInCell(*theGc, theRect, theBitmap64K, theBitmap16MA);
+				}
+		TheClient->iWs.Flush();	
+		}
+
+	theGc->DiscardFont();
+
+	if(iBitmapContextBackground)
+		{
+		theGc = TheClient->iGc;
+		theGc->BitBlt(TPoint(0, 0), iBitmapBackground);
+		}
+	}
+
+void CTWinAlphaForeground::SetPoligonLocation(const TPoint &ptOffset)
+	{
+	TRect rect = TRect(iTest.iTriangleSize);
+	(*iPolygon)[0] = rect.iTl + ptOffset;
+	(*iPolygon)[1] = TPoint(rect.iTl.iX, rect.iBr.iY) + ptOffset;
+	(*iPolygon)[2] = rect.iBr + ptOffset;
+	}
+	
+/** Define boundary of the table*/
+void CTWinAlphaForeground::CalculateTableMargin()
+	{
+	TInt numRows = sizeof(iRows) / sizeof(iRows[0]) ;
+	iRows[0] = iTest.iFirstCellHeight;
+	TInt theRowHeight = (Size().iHeight - iTest.iFirstCellHeight) / 3;
+	for(TInt ii = 1; ii < numRows; ii++)
+		{
+		iRows[ii] = iRows[ii-1] + theRowHeight;
+		}
+	}
+	
+/** Draw a table which comprises 3 rows: for transparent, semi-transparent 
+	and opaque output
+
+*/	
+void CTWinAlphaForeground::DrawTable(CBitmapContext& aGc) const
+	{
+	TInt numRows = sizeof(iRows) / sizeof(iRows[0]) ;
+	
+	aGc.SetPenColor(iTest.iPenTable);
+	
+	for (TInt ii = 0; ii < numRows - 1; ii++)
+		{
+		TBuf<4> iBuf;
+		TPoint pt1 = TPoint(0, iRows[ii]);
+		TPoint pt2 = TPoint(Size().iWidth, iRows[ii]);
+
+		aGc.DrawLine(pt1, pt2);
+		
+		if(iCol)
+			{
+			TPoint pt3 = TPoint(0, iRows[ii]) + TPoint(2,(iRows[1] - iRows[0]) / 2); 
+			switch(ii)
+				{
+					case 0: iBuf = _L("o"); break;
+					case 1: iBuf = _L("s"); break;
+					case 2: iBuf = _L("t"); break;
+					default : iBuf = _L(""); break;
+				}
+			aGc.DrawText(iBuf, pt3); 
+			}
+		}
+	if(iCol)
+		{
+		TPoint pt3 = TPoint(iCol, iRows[0]) + TPoint(1,-2); 
+		TBuf<32> text = iTitle1;
+		text += iTitle2;
+		aGc.DrawText(text, pt3); 
+	
+		TPoint pt1 = TPoint(iCol, 0);
+		TPoint pt2 = TPoint(iCol, Size().iHeight);
+		aGc.DrawLine(pt1, pt2);
+		}
+		
+	}
+
+/** Draw truetype font to check anti-aliasing*/
+void CTWinAlphaForeground::DrawTextInCell(CBitmapContext& aGc, const TRect& aRect)
+	{
+    TPoint pt(aRect.iTl.iX, aRect.iBr.iY);
+    pt += TPoint(2, -10);
+    
+    aGc.DrawText(_L("ABCD"), pt);
+	}
+
+/** Draw graphics primitive in a cell:
+	rectangle, ellipse, triangle, a few lines, bitmaps
+
+ */	
+void CTWinAlphaForeground::DrawPrimitivesInCell(CBitmapContext& aGc, const TRect& aRect, 
+								CFbsBitmap* aBitmap64K, CFbsBitmap* aBitmap16MA)
+	{
+	TRect theCellRect = aRect;
+	theCellRect.Shrink(1, 1);
+	
+	//rectangle
+	TRect rect = TRect(iTest.iRectangleSize);
+	rect.Move(theCellRect.iTl);
+    aGc.DrawRect(rect);
+    
+    //ellipse
+    rect = TRect(iTest.iEllipseSize);
+	rect.Move(theCellRect.iTl + TPoint(iTest.iRectangleSize.iWidth + 5, 0));
+    aGc.DrawEllipse(rect);
+
+	//triangle
+	TPoint pt = TPoint(rect.iBr.iX, rect.iTl.iY) + TPoint(5, 0);
+	SetPoligonLocation(pt);
+   	aGc.DrawPolygon(iPolygon);
+    
+    //DrawLine
+    pt = pt + TPoint (((*iPolygon)[2]).iX - ((*iPolygon)[0]).iX, 0) + TPoint(5, 2);
+    rect = TRect(iTest.iTriangleSize);
+    rect.Move(pt);
+    aGc.DrawLine(rect.iTl, TPoint(rect.iTl.iX, rect.iBr.iY));
+    aGc.DrawLine(TPoint(rect.iTl.iX, rect.iBr.iY), rect.iBr);
+    aGc.DrawLine(rect.iBr, TPoint(rect.iBr.iX, rect.iTl.iY));
+    aGc.DrawLine(TPoint(rect.iBr.iX, rect.iTl.iY), rect.iTl);
+    aGc.DrawLine(rect.iTl, rect.iBr);
+    aGc.DrawLine(TPoint(rect.iBr.iX, rect.iTl.iY), TPoint(rect.iTl.iX, rect.iBr.iY));
+
+    //64K bitmap
+    aGc.SetBrushStyle(CGraphicsContext::ENullBrush);
+    pt = TPoint(theCellRect.iTl.iX, rect.iBr.iY) + TPoint(0, 5);
+    if(aBitmap64K)
+    	{
+    	aGc.BitBlt(pt, aBitmap64K);
+    	pt = pt + TPoint( aBitmap64K->SizeInPixels().iWidth, 0) + TPoint(2, 0);
+
+    	aGc.BitBltMasked(pt, 
+    		aBitmap64K, TRect(aBitmap64K->SizeInPixels()),
+	    	iTest.iBitmapGray256Mask, EFalse);
+    	pt = pt + TPoint( aBitmap64K->SizeInPixels().iWidth, 0) + TPoint(2, 0);
+
+    	aGc.BitBltMasked(pt, 
+	    	aBitmap64K, TRect(aBitmap64K->SizeInPixels()),
+    		iTest.iBitmapMask, EFalse);
+
+    	pt = pt + TPoint( aBitmap64K->SizeInPixels().iWidth, 0) + TPoint(2, 0);
+	   	}
+    
+    if(aBitmap16MA)
+    	{
+    	aGc.BitBlt(pt, aBitmap16MA);
+
+    	pt = pt + TPoint( aBitmap16MA->SizeInPixels().iWidth, 0) + TPoint(2, 0);
+
+    	aGc.BitBltMasked(pt, 
+	    	aBitmap16MA, TRect(aBitmap16MA->SizeInPixels()),
+    		iTest.iBitmapGray256Mask, EFalse);
+
+    	pt = pt + TPoint( aBitmap16MA->SizeInPixels().iWidth, 0) + TPoint(2,0);
+
+    	pt = pt + TPoint( 0, aBitmap16MA->SizeInPixels().iHeight);
+    	}
+    
+	pt.iX = aRect.iTl.iX + 2;
+	pt.iY = pt.iY + 18;
+	
+    if(aBitmap64K)
+    	{
+		TSize size = aBitmap64K->SizeInPixels();
+		TRect srcRect(TPoint(0,0),size);
+		size += TSize(5,5);
+		TRect destRect(pt - TPoint(0, 8), size);
+    	aGc.DrawBitmap(destRect, aBitmap64K, srcRect);
+    	pt = pt + TPoint( size.iWidth, 0) + TPoint(2, 0);
+
+#ifdef __WINS__
+    	destRect.Move(TPoint(aBitmap64K->SizeInPixels().iWidth + 8, 0));
+    	((CWindowGc&) aGc).DrawBitmapMasked(destRect, 
+    		aBitmap64K, srcRect,
+	    	iTest.iBitmapGray256Mask, EFalse);
+    	pt = pt + TPoint( aBitmap64K->SizeInPixels().iWidth, 0) + TPoint(2, 0);
+#endif
+	   	}
+    
+    aGc.DrawText(iTest.iText, pt);
+    
+#ifdef __WINS__
+    ((CWindowGc&) aGc).DrawTextVertical(iTest.iText, pt, ETrue);
+#endif
+	}
+	
+/** calculate table's size and size of graphics primitieves */
+void CTWinAlphaForeground::PrepareForDrawingL()
+	{
+	iCol = iTest.iFirstCellWidth;
+
+	CalculateTableMargin();
+
+	//create triangle
+	iPolygon = new (ELeave) CArrayFixFlat<TPoint> (3);
+	TRect rect = TRect(iTest.iTriangleSize);
+	iPolygon->AppendL(rect.iTl);
+	iPolygon->AppendL(TPoint(rect.iTl.iX, rect.iBr.iY));
+	iPolygon->AppendL(rect.iBr);
+	}
+
+/** Bitmap is intended to use on target only*/	
+void CTWinAlphaForeground::CreateBackgroundBitmapL(const TDisplayMode& aDispMode)
+	{
+	ASSERT(!iBitmapBackground);
+	
+	TSize size = Size(); 
+		
+	iBitmapBackground = new (ELeave) CFbsBitmap ;
+	iBitmapBackground->Create(size,aDispMode);
+	
+	iBitmapDeviceBackground = CFbsBitmapDevice::NewL(iBitmapBackground);
+	CGraphicsContext *&theGc = (CGraphicsContext*&)iBitmapContextBackground;
+	iBitmapDeviceBackground->CreateContext(theGc);
+	}
+	
+void CTWinAlphaForeground::CleanBackgroundBitmap()
+	{
+	ASSERT(iBitmapBackground);
+	
+	TRect rect = TRect(iBitmapBackground->SizeInPixels());
+	iBitmapContextBackground->SetBrushColor(iBackgroundColor);
+   	iBitmapContextBackground->SetPenColor(iBackgroundColor);
+   	iBitmapContextBackground->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	iBitmapContextBackground->DrawRect(rect);
+	}
+
+void CTWinAlphaForeground::StartAnimationL()
+	{
+	__UHEAP_MARK;
+	RWsSprite theSprite;
+	
+	RDrawableWindow *theWin = DrawableWin();
+
+	theSprite=RWsSprite(TheClient->iWs);
+	TPoint theSpritePos = TPoint(10, 10); 
+	TInt theFlags = 0;
+	theSprite.Construct(*theWin, theSpritePos, theFlags);
+	TDisplayMode dispMode = EColor256;
+	//create a ball bitmap for animation
+	CFbsBitmap* theBitmapBall= new (ELeave) CFbsBitmap;
+	theBitmapBall->Create(TSize(32, 32), dispMode);
+	CFbsBitmapDevice* theBitmapDeviceBall = CFbsBitmapDevice::NewL(theBitmapBall);
+	CGraphicsContext* theBitmapContextBall = NULL;
+	theBitmapDeviceBall->CreateContext(theBitmapContextBall);
+	//draw a background
+	theBitmapContextBall->SetBrushColor(TRgb(128, 0, 255));
+   	theBitmapContextBall->SetPenColor(TRgb(128, 0, 255));
+   	theBitmapContextBall->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	theBitmapContextBall->DrawRect(theBitmapBall->SizeInPixels());
+	
+	//create a ball's mask
+	CFbsBitmap* theBitmapMask= new (ELeave) CFbsBitmap;
+	theBitmapMask->Create(TSize(32, 32), dispMode);
+	CFbsBitmapDevice* theBitmapDeviceMask = CFbsBitmapDevice::NewL(theBitmapMask);
+	CGraphicsContext* theBitmapContextMask = NULL;
+	theBitmapDeviceMask->CreateContext(theBitmapContextMask);
+	//draw a mask
+	theBitmapContextMask->SetBrushColor(TRgb(0, 0, 0));
+   	theBitmapContextMask->SetPenColor(TRgb(0, 0, 0));
+   	theBitmapContextMask->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	theBitmapContextMask->DrawRect(theBitmapMask->SizeInPixels());
+
+	theBitmapContextMask->SetBrushColor(TRgb(255, 255, 255));
+   	theBitmapContextMask->SetPenColor(TRgb(255, 255, 255));
+   	TRect rect = TRect(theBitmapMask->SizeInPixels());
+	theBitmapContextMask->SetPenSize(TSize(6,6));
+	theBitmapContextMask->DrawLine(rect.iTl, rect.iBr);
+	theBitmapContextMask->DrawLine(TPoint(0, rect.iBr.iY), TPoint(rect.iBr.iX, 0));
+
+	//create a second ball's mask
+	CFbsBitmap* theBitmapMask1= new (ELeave) CFbsBitmap;
+	theBitmapMask1->Create(TSize(32, 32), dispMode);
+	CFbsBitmapDevice* theBitmapDeviceMask1 = CFbsBitmapDevice::NewL(theBitmapMask1);
+	CGraphicsContext* theBitmapContextMask1 = NULL;
+	theBitmapDeviceMask1->CreateContext(theBitmapContextMask1);
+	//draw a mask
+	theBitmapContextMask1->SetBrushColor(TRgb(0, 0, 0));
+   	theBitmapContextMask1->SetPenColor(TRgb(0, 0, 0));
+   	theBitmapContextMask1->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	theBitmapContextMask1->DrawRect(theBitmapMask1->SizeInPixels());
+
+	theBitmapContextMask1->SetBrushColor(TRgb(255, 255, 255));
+   	theBitmapContextMask1->SetPenColor(TRgb(255, 255, 255));
+   	rect = TRect(theBitmapMask1->SizeInPixels());
+	theBitmapContextMask1->SetPenSize(TSize(6,6));
+	theBitmapContextMask1->DrawLine(TPoint(rect.iBr.iX/2, 0), TPoint(rect.iBr.iX/2, rect.iBr.iY));
+	theBitmapContextMask1->DrawLine(TPoint(0, rect.iBr.iY/2), TPoint(rect.iBr.iX, rect.iBr.iY/2));
+
+
+	TSpriteMember theSpriteList;
+	theSpriteList.iBitmap = theBitmapBall;
+	theSpriteList.iMaskBitmap = theBitmapMask;
+	theSpriteList.iInvertMask = EFalse;
+	theSpriteList.iDrawMode = CGraphicsContext::EDrawModePEN;
+	theSpriteList.iOffset = TPoint(0, 0);
+	theSpriteList.iInterval = TTimeIntervalMicroSeconds32(100000);
+	theSprite.AppendMember(theSpriteList);
+
+	TSpriteMember theSpriteList1;
+	theSpriteList1.iBitmap = theBitmapBall;
+	theSpriteList1.iMaskBitmap = theBitmapMask1;
+	theSpriteList1.iInvertMask = EFalse;
+	theSpriteList1.iDrawMode = CGraphicsContext::EDrawModePEN;
+	theSpriteList1.iOffset = TPoint(0, 0);
+	theSpriteList1.iInterval = TTimeIntervalMicroSeconds32(100000);
+	
+	theSprite.AppendMember(theSpriteList1);
+	
+	theSprite.Activate();
+	
+	for(TInt ii = 0; ii < 20; ii++)
+		{
+		theSpritePos += TPoint(3, 8);
+		theSprite.SetPosition(theSpritePos);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(50000));		
+		}
+
+	for(TInt jj = 0; jj < 20; jj++)
+		{
+		theSpritePos -= TPoint(0, 8);
+		theSprite.SetPosition(theSpritePos);
+		TheClient->iWs.Flush();	
+		User::After(TTimeIntervalMicroSeconds32(50000));
+		}
+	
+	theSprite.Close();
+	
+	delete theBitmapContextBall;
+	delete theBitmapDeviceBall;
+	
+	delete theBitmapBall;
+	
+	delete theBitmapMask;
+	delete theBitmapContextMask;
+	delete theBitmapDeviceMask;
+	
+	delete theBitmapMask1;
+	delete theBitmapContextMask1;
+	delete theBitmapDeviceMask1;
+
+	__UHEAP_MARKEND;
+	}
+
+void CTWinAlphaForeground::CreateBackedWindowL()
+	{
+	RBackedUpWindow theBackedWindow(TheClient->iWs); 
+	CleanupClosePushL(theBackedWindow);
+	
+	TDisplayMode theDisplayMode = EColor16MA;
+	
+	RWindow* theWin = (RWindow*) DrawableWin();
+
+	theBackedWindow.Construct(*theWin,theDisplayMode, ENullWsHandle);
+	
+	TPoint pos =TPoint(10, 10);
+	TSize size = theWin->Size();
+	size.SetSize(size.iWidth / 5, size.iHeight/10);
+	
+	theBackedWindow.SetExtentErr(pos, size);
+	theBackedWindow.SetOrdinalPosition(0);
+
+	
+	//draw to backed window	
+	TRgb color = TRgb(255, 0, 128);
+	TInt bitmapHandle = theBackedWindow.BitmapHandle();
+	CFbsBitmap bitmapWin;
+	bitmapWin.Duplicate(bitmapHandle);
+	//Leave poss here - theBackedWindow could leak
+	CFbsBitmapDevice* theBitmapDevice = CFbsBitmapDevice::NewL(&bitmapWin);
+	CGraphicsContext* theBitmapContext = NULL;
+	theBitmapDevice->CreateContext(theBitmapContext);
+	theBitmapContext->SetBrushColor(color);
+   	theBitmapContext->SetPenColor(color);
+   	theBitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	theBitmapContext->DrawRect(TRect(bitmapWin.SizeInPixels()));
+
+	color = TRgb(0, 0, 0);
+   	theBitmapContext->SetPenColor(color);
+	for(TInt kk = 0; kk < bitmapWin.SizeInPixels().iWidth; kk += 8)
+		{
+		theBitmapContext->DrawLine(TPoint(kk, 0), TPoint(kk, bitmapWin.SizeInPixels().iHeight));
+		}
+	
+	
+	theBackedWindow.Activate();
+	TheClient->iWs.Flush();
+	User::After(TTimeIntervalMicroSeconds32(500000));
+	
+	//hide the window
+	theBackedWindow.SetVisible(EFalse);
+	TheClient->iWs.Flush();
+	User::After(TTimeIntervalMicroSeconds32(500000));
+	theBackedWindow.SetVisible(ETrue);
+	TheClient->iWs.Flush();
+	
+	for(TInt ii = 0; ii < 7; ii++)
+		{
+		User::After(TTimeIntervalMicroSeconds32(100000));
+		pos.iX += 5;
+		pos.iY += 15;
+		 
+		theBackedWindow.SetExtentErr(pos, size);
+		TheClient->iWs.Flush();
+		}
+
+	User::After(TTimeIntervalMicroSeconds32(500000));
+	
+	//transparent color. don't expect it to work
+	pos.iX -= 5;
+	pos.iY -= 15;
+
+	theBackedWindow.SetExtentErr(pos, size);
+	color = TRgb(255, 255, 128, 128);
+	theBitmapContext->SetBrushColor(color);
+   	theBitmapContext->SetPenColor(color);
+	theBitmapContext->DrawRect(TRect(bitmapWin.SizeInPixels()));
+	TheClient->iWs.Flush();
+	User::After(TTimeIntervalMicroSeconds32(500000));
+
+	//semi-transparent color
+	pos.iX -= 5;
+	pos.iY -= 15;
+	theBackedWindow.SetExtentErr(pos, size);
+	color = TRgb(255, 255, 128, 255);
+	theBitmapContext->SetBrushColor(color);
+   	theBitmapContext->SetPenColor(color);
+	TheClient->iWs.Flush();
+	User::After(TTimeIntervalMicroSeconds32(500000));
+
+	
+	CleanupStack::PopAndDestroy();	 //bitmapWin
+	delete theBitmapContext;
+	delete theBitmapDevice;
+	
+	}
+
+	
+//-------------------
+void CTWinAlpha::Draw()
+	{
+	CBitmapContext* theGc = TheClient->iGc;
+	TSize size = Size();
+	
+	for(TInt ii = 0; ii < size.iHeight; ii += (20+iState))
+		{
+		theGc->DrawLine(TPoint(0, ii), TPoint(size.iWidth, ii));
+		}
+	}
+	
+__WS_CONSTRUCT_STEP__(AlphaChannel)