diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/nonnga/SERVER/backedupwindow.cpp --- /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 +#include +#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(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(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;kClear(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); + }