windowing/windowserver/nonnga/SERVER/backedupwindow.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/backedupwindow.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,218 @@
+// Copyright (c) 1995-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:
+// Window redraw code, three sorts of redrawing are supported
+// This class deals with drawing from backup bitmap
+// 
+//
+
+#include "backedupwindow.h"
+#include "server.h"
+#include "gc.h"
+#include "wstop.h"
+#include "ANIM.H"
+#include "EVQUEUE.H"
+#include <s32mem.h>
+#include <gdi.h>
+#include "panics.h"
+#include "inifile.h"
+#include "rootwin.h"
+#include "EVENT.H"
+#include "playbackgc.h"
+
+CFbsBitGc *CWsBackedUpWindow::iBitGc=NULL;
+
+CWsBackedUpWindow::CWsBackedUpWindow(CWsWindow *aWin, TDisplayMode aDisplayMode) : CWsWindowRedraw(aWin), iDisplayMode(aDisplayMode)
+	{}
+
+void CWsBackedUpWindow::StaticInitL()
+	{
+	iBitGc=CFbsBitGc::NewL();
+	}
+
+void CWsBackedUpWindow::StaticDestroy()
+	{
+	delete iBitGc;
+	iBitGc = 0;
+	}
+
+void CWsBackedUpWindow::ActivateGc()
+	{
+	iBitGc->Activate(iBitmapDevice);
+	iBitGc->Reset();
+	iBitGc->SetBrushColor(BackColor());
+	}
+
+TBool CWsBackedUpWindow::DrawCommand(CWsGc*,const TAny*)
+	{
+	Screen()->AddRedrawRegion(iWsWin->VisibleRegion());
+	return ETrue;
+	}
+
+void CWsBackedUpWindow::ConstructL()
+	{
+	iDisplayMode=iWsWin->DisplayMode();
+	TSize size=iWsWin->Size();
+	iBitmap=new(ELeave) CFbsBitmap();
+	User::LeaveIfError(iBitmap->Create(size, iDisplayMode));
+	iBitmapDevice=CFbsBitmapDevice::NewL(iBitmap);
+	SetSizeInTwips();
+//
+	ActivateGc();
+	iBitGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+	iBitGc->Clear(TRect(size));
+	iBitGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	WS_ASSERT_DEBUG(iWsWin->WinType()==EWinTypeClient,EWsPanicWindowType);
+	}
+
+void CWsBackedUpWindow::PrepareForResizeL(const TSize &aSize, TSize &aOldSize)
+	{
+	aOldSize=iBitmapDevice->SizeInPixels();
+	if (aOldSize!=aSize)
+		{
+		User::LeaveIfError(iBitmapDevice->Resize(aSize));
+		SetSizeInTwips();
+		}
+	}
+
+void CWsBackedUpWindow::Resize(const TSize &aSize, const TSize &aOldSize)
+	{
+	ActivateGc();
+	iBitGc->SetClippingRegion(NULL);
+	iBitGc->Clear(TRect(aOldSize.iWidth, 0, aSize.iWidth, aOldSize.iHeight));
+	iBitGc->Clear(TRect(0, aOldSize.iHeight,aSize.iWidth, aSize.iHeight));
+	
+	static_cast<CWsClientWindow *>(iWsWin)->ReactivateGcs();
+	}
+
+CWsBackedUpWindow::~CWsBackedUpWindow()
+	{
+	delete iBitmapDevice;
+	delete iBitmap;
+	}
+
+TBool CWsBackedUpWindow::CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd)
+	{
+	switch(aOpcode)
+		{
+		case EWsWinOpUpdateBackupBitmap:
+			break;
+		case EWsWinOpMaintainBackup:
+			break;
+		case EWsWinOpBitmapHandle:
+			SetReply(iBitmap->Handle());
+			break;
+		case EWsWinOpUpdateScreen:
+			{
+			// Andy - shouldn't this use the base area?  Or don't we allow funny shaped
+			// backup windows?
+			TRegionFix<1> fixRegion(iWsWin->AbsRect());
+			Screen()->AddRedrawRegion(fixRegion);
+			}
+			break;
+		case EWsWinOpUpdateScreenRegion:
+			{
+			TRegionFix<1> fixRegion(iWsWin->AbsRect());
+			RWsRegion *clientRegion=NULL;
+			TRAPD(err,clientRegion=GetRegionFromClientL(iWsWin->WsOwner(), *aCmd.Int));
+			if (err==KErrNone)
+				{
+				clientRegion->Offset(iWsWin->Origin());
+				clientRegion->ClipRect(iWsWin->AbsRect());
+				Screen()->AddRedrawRegion(*static_cast<TRegion*>(clientRegion));
+				clientRegion->Destroy();
+				}
+			else
+				{
+				Screen()->AddRedrawRegion(fixRegion);
+				}
+			}
+			break;
+		default:
+			return(EFalse);
+		}
+	return(ETrue);
+	}
+
+CWsBackedUpWindow *CWsBackedUpWindow::Backup() const
+	{
+	return((CWsBackedUpWindow *)this);
+	}
+
+CFbsDevice* CWsBackedUpWindow::OutputDevice() const
+	{
+	return iBitmapDevice;
+	}
+
+TRgb CWsBackedUpWindow::BackColor() const
+	{
+	return(iWsWin->RootWindow()->DefaultBackgroundColor());
+	}
+
+void CWsBackedUpWindow::Scroll(const TRect &aClipRect, const TPoint &aOffset,const TRect &aRect)
+	{
+	TRect winBorder=TRect(iWsWin->Size());
+	TRect clipRect=aClipRect;
+	TRect srcRect = aRect;		
+	clipRect.Intersection(winBorder);	
+	if (!clipRect.IsEmpty())
+		{	// If we have to do something (a visible part will change)
+		srcRect.Intersection(clipRect);
+
+		STACK_REGION regionToClear;
+		regionToClear.AddRect(aRect);
+		regionToClear.SubRect(srcRect);
+		regionToClear.Offset(aOffset);
+		
+		ActivateGc();
+		iBitGc->SetClippingRect(clipRect);
+		iBitGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+		iBitGc->CopyRect(aOffset,srcRect);				
+		for (TInt k=0;k<regionToClear.Count();k++)
+			{
+			iBitGc->Clear(regionToClear[k]);
+			}
+		iBitGc->SetClippingRect(winBorder);
+		iBitGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+		TRegionFix<1> fixRegion(iWsWin->AbsRect());
+		Screen()->AddRedrawRegion(fixRegion);		
+		regionToClear.Close();
+		}
+	}
+
+TBool CWsBackedUpWindow::NeedsRedraw() const
+	{
+	return(EFalse);
+	}
+
+TBool CWsBackedUpWindow::GetRedrawRect(TRect &) const
+	{
+	return(EFalse);
+	}
+
+void CWsBackedUpWindow::SetSizeInTwips()
+	{
+	TSize size=iBitmap->SizeInPixels();
+	size.iWidth=Screen()->ScreenDevice()->HorizontalPixelsToTwips(size.iWidth);
+	size.iHeight=Screen()->ScreenDevice()->VerticalPixelsToTwips(size.iHeight);
+	iBitmap->SetSizeInTwips(size);
+	}
+
+void CWsBackedUpWindow::DrawWindow()
+	{
+	CFbsBitGc& gc = CPlaybackGc::Instance()->BitGc();
+	gc.SetUserDisplayMode(iWsWin->DisplayMode());
+	gc.SetOrigin(iWsWin->Origin());
+	gc.SetClippingRegion(iGlobalRedrawRegion);
+	gc.BitBlt(TPoint(0,0), iBitmap);
+	}