windowing/windowserver/nga/SERVER/renderstagemanager.cpp
changeset 0 5d03bc08d59c
child 18 5e30ef2e26cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/renderstagemanager.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,213 @@
+// Copyright (c) 2008-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:
+//
+
+#include <e32base.h>
+#include <e32std.h>
+#include "inifile.h"
+#include "wstop.h"
+
+#include "renderstagemanager.h"
+#include "wspluginmanager.h"
+
+#include "Graphics/WsRenderStageFactory.h"
+
+//  Constants
+
+_LIT(KWhiteSpace,									" ");
+_LIT(KDefaultRenderStages, 							"flickerbuffer display");
+_LIT(KRenderStages,									"RENDERSTAGES");
+
+// Globals
+
+GLREF_D CDebugLogBase *wsDebugLog;
+
+/**
+@internalComponent
+@prototype
+*/
+LOCAL_C HBufC* ReverseListLC(const TDesC* aRenderStageList)
+	{
+	HBufC* writeableCopy = HBufC::NewLC(aRenderStageList->Length());
+
+	TPtr reversedList(writeableCopy->Des());
+	TLex lex(*aRenderStageList);
+	TBool firstTime = true;
+	
+	while (true)
+		{
+		TPtrC currentPluginString = lex.NextToken();
+		if (!currentPluginString.Length())
+			{
+			break;
+			}
+		if (firstTime)
+			{
+			reversedList.Insert(0, currentPluginString);
+			firstTime = false;
+			}
+		else
+			{
+			reversedList.Insert(0, KWhiteSpace());
+			reversedList.Insert(0, currentPluginString);
+			}
+		}
+	return writeableCopy;
+	}
+
+/**
+@internalComponent
+@prototype
+*/
+LOCAL_C	CWsRenderStage *ConstructRenderStageChain(HBufC* reversedRenderStageList, TInt aScreenNumber, MWsScreen *aScreen, MWsScreenRedraw *aScreenRedraw)
+	{
+	TInt err = KErrNone;
+
+	CWsPluginManager * pluginMgr = CWsTop::PluginManager();
+
+	if (!pluginMgr)
+		{
+		RDebug::Printf("ConstructRenderStageChain: Failed to obtain Plugin Manager at File: %s, Line: %d\n", __FILE__, __LINE__);
+		return NULL;
+		}
+
+	CWsRenderStage* stage;
+	CWsRenderStage* savedStage = NULL;
+	TBool isLastRenderStage = ETrue;
+
+	TLex lex(*reversedRenderStageList);
+
+	while (true)
+		{
+		TPtrC ptr = lex.NextToken();
+		if (ptr.Length() > 0)
+			{
+			MWsRenderStageFactory * factory = pluginMgr->FindNamedImplementation<MWsRenderStageFactory>(ptr);
+			if (factory)
+				{
+				if (isLastRenderStage)
+					{
+					isLastRenderStage = EFalse;
+					stage = NULL;
+					TRAP(err, stage = factory->CreateFinalRenderStageL(aScreen, aScreenRedraw, aScreenNumber));
+					if (err)
+						{
+						RDebug::Printf("ConstructRenderStageChain: Create final renderstage error at File: %s, Line: %d Error Code: %d\n", __FILE__, __LINE__, err);
+						}
+					}
+				else
+					{
+					stage = NULL;
+					TRAP(err, stage = factory->CreateRenderStageL(aScreen, aScreenRedraw, savedStage));
+					if (err)
+						{
+						RDebug::Printf("ConstructRenderStageChain: Create renderstage error at File: %s, Line: %d Error Code: %d\n", __FILE__, __LINE__, err);
+						}
+					}
+				
+				if (!stage)
+					{
+					err = KErrNotFound;
+					}
+				else
+					{
+					savedStage = stage;
+					}
+				}
+			else
+				{
+				err = KErrNotFound;
+				TBuf<256> buf;
+				_LIT(KTxt1, "ConstructRenderStageChain: Factory ");
+				buf.Append(KTxt1);
+				buf.Append(ptr);
+				_LIT(KTxt2, " not found at File: ");
+				buf.Append(KTxt2);
+#define FILENAME(f)	_LIT(KFileName, f);
+				FILENAME(__FILE__);
+				buf.Append(KFileName);
+				TBuf<32> buf1;
+				_LIT(KTxt3," Line: %d Error Code: %d, \n");
+				buf1.Format(KTxt3, __LINE__, err);
+				buf.Append(buf1);
+				RDebug::RawPrint(buf);
+				}
+
+			if (err)
+				{
+				if (wsDebugLog)
+					{
+					TBuf<64> buf;
+					_LIT(KMissingRenderStage,"Failed to add render stage (%d): ");
+					buf.Append(KMissingRenderStage);
+					buf.Append(ptr);
+					wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf,err);
+					}
+				// This method must fail if *ANY* of the render stages fails during construction
+				break;
+				}
+			else if (wsDebugLog)
+				{
+				TBuf<64> buf;
+				_LIT(KAddedRenderStage,"Added render stage: ");
+				buf.Append(KAddedRenderStage);
+				buf.Append(ptr);
+				wsDebugLog->MiscMessage(CDebugLogBase::ELogImportant,buf);
+				}
+			}
+		else
+			{
+			break;
+			}
+		}
+
+	if (err)
+		{
+		delete savedStage;
+		savedStage = NULL;
+		}
+
+	return savedStage;
+	}
+
+CWsRenderStage *CRenderStageManager::ConnectL(TInt aScreenNumber, MWsScreen *aScreen, MWsScreenRedraw *aScreenRedraw)
+	{
+	TPtrC stagesString;
+	const TDesC *renderStageList;
+	const TBool customStages = WsIniFile->FindVar(aScreenNumber, KRenderStages, stagesString);
+
+	if (customStages)
+		{
+		renderStageList = &stagesString;
+		}
+	else
+		{
+		renderStageList = &KDefaultRenderStages();
+		}
+	
+	LEAVE_LOG_INSTALL_C;
+	HBufC* reversedRenderStageList = ReverseListLC(renderStageList);
+	CWsRenderStage *firstRenderStage;
+	firstRenderStage = ConstructRenderStageChain(reversedRenderStageList, aScreenNumber, aScreen, aScreenRedraw);
+	
+	CleanupStack::PopAndDestroy(reversedRenderStageList);
+	LEAVE_LOG_UNINSTALL_C;
+	
+	return firstRenderStage;
+	}
+
+void CRenderStageManager::Release(CWsRenderStage *aRenderStage)
+	{
+		delete aRenderStage; // this deletes the render stage and its children
+	}