void CWsDirectScreenAccess::GetRegion(TInt aNumRects) { #if defined(_DEBUG) if (iStatus!=EDirectStatusInitialising) iWsOwner->PPanic(EWservPanicDirectMisuse); #endif STACK_REGION region; iWin->GenerateTopRegion(region); const TInt regionCount=region.Count(); if (region.Count()==aNumRects) { iVisible.Copy(region); if (iVisible.CheckError()) { iStatus=EDirectStatusNone; SetReply(KErrNotReady); } else { TPtrC8 rectList(REINTERPRET_CAST(const TUint8*,region.RectangleList()),region.Count()*sizeof(TRect)); CWsClient::ReplyBuf(rectList); iStatus=EDirectStatusRunning; Initiate(); iMsgQueue->Started(); SetReply(KMaxTInt); } }
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()); UpdateScreen(fixRegion); regionToClear.Close(); } }
void CWsDirectScreenAccess::Request(TInt handle) { if (iStatus!=EDirectStatusNone) { if (iStatus==EDirectStatusCompleted) { iMsgQueue->Cancel(); } else { iWsOwner->PPanic(EWservPanicDirectMisuse); } } iWsOwner->HandleToClientWindow(handle,&iWin); iScreen=iWin->Screen(); STACK_REGION region; iWin->GenerateTopRegion(region); const TInt regionCount=region.Count(); region.Close(); SetReply(regionCount); iStatus=EDirectStatusInitialising; }