diff -r 000000000000 -r 2f259fa3e83a lafagnosticuifoundation/clockanim/src/DISPLAY.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lafagnosticuifoundation/clockanim/src/DISPLAY.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,550 @@ +// Copyright (c) 1997-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 "CL_STD.H" + +_LIT(KFormatText,"%*A"); + +// DDisplay + +DDisplay::DDisplay(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow) + :iShadow(aShadow), + iPosition(aPosition), + iSize(aSize), + iVisible(EFalse), + iMargins(aMargins) + { + __DECLARE_NAME(_S("DDisplay")); + } + +void DDisplay::DrawP(MAnimWindowFunctions& aFunctions, CAnimGc& aGc) const + { + DrawClippedToDisplayRegionP(aFunctions, aGc); + } + +void DDisplay::UpdateLP(DAnimWithUtils::TFunctions& aFunctions, CAnimGc& aGc, const TTime& aTime) + { + aFunctions.iWindowFunctions.ActivateGc(); +#if defined(__SHOW_UPDATE_REGION__) + DrawClippedToDisplayRegionP(aFunctions, aGc); +#endif + RRegionBuf10 region; + TRAPD(error, UpdateDisplayDataAndDrawClippedToDisplayRegionP(aFunctions, aGc, aTime, IsVisibleAndNotHidden(aFunctions.iWindowFunctions)? ®ion: NULL)); + region.Close(); + if (error!=KErrNone) + { + __ASSERT_DEBUG(error==KPanicClientFromServer, Panic(EClockServerPanicUnexpectedError)); + User::Leave(error); + } + } + +TRect DDisplay::RectDrawnTo() const + { + return TRect(iPosition, iSize); + } + +TRect DDisplay::RectToInvalidate() const + { + TRect rect=RectDrawnTo(); + rect.iTl.iX-=iMargins.iLeft; + rect.iTl.iY-=iMargins.iTop; + rect.iBr.iX+=iMargins.iRight; + rect.iBr.iY+=iMargins.iBottom; + return rect; + } + +void DDisplay::HandleCommandLP(DAnimWithUtils::TFunctions& aFunctions, CAnimGc& aGc, const TTime& aTime, TInt aOpcode, TAny* aArgs) + { + TPoint position=iPosition; + TSize size=iSize; + switch (aOpcode) + { + case EDisplayCommandSetVisible: + { + SDisplayCommandSetVisibleArgs* displayArgs=(SDisplayCommandSetVisibleArgs*)aArgs; + if (iVisible!=displayArgs->iVisible) + { + iVisible=displayArgs->iVisible; + aFunctions.iWindowFunctions.Invalidate(RectToInvalidate()); + } + } + break; + case EDisplayCommandSetPositionAndSize: + { + SDisplayCommandSetPositionAndSizeArgs* displayArgs=(SDisplayCommandSetPositionAndSizeArgs*)aArgs; + position=displayArgs->iPosition; + size=displayArgs->iSize; + } + goto setPositionAndOrSize; + case EDisplayCommandSetPosition: + { + SDisplayCommandSetPositionArgs* displayArgs=(SDisplayCommandSetPositionArgs*)aArgs; + position=displayArgs->iPosition; + } + goto setPositionAndOrSize; + case EDisplayCommandSetSize: + { + SDisplayCommandSetSizeArgs* displayArgs=(SDisplayCommandSetSizeArgs*)aArgs; + size=displayArgs->iSize; + } + goto setPositionAndOrSize; + setPositionAndOrSize: + if ((iPosition!=position) || (iSize!=size)) + { + TRect oldRectToInvalidate=RectToInvalidate(); + iPosition=position; + iSize=size; + PositionOrSizeHasChanged(); + TRect newRectToInvalidate=RectToInvalidate(); + if (newRectToInvalidate.Intersects(oldRectToInvalidate)) + newRectToInvalidate.BoundingRect(oldRectToInvalidate); + else + if (iVisible) + aFunctions.iWindowFunctions.Invalidate(oldRectToInvalidate); + aFunctions.iWindowFunctions.SetRect(newRectToInvalidate); + if (iVisible) + aFunctions.iWindowFunctions.Invalidate(newRectToInvalidate); + } + break; + case EDisplayCommandUpdateDisplay: + UpdateLP(aFunctions, aGc, aTime); + break; + case EDisplayCommandDraw: + aFunctions.iWindowFunctions.ActivateGc(); + DrawP(aFunctions.iWindowFunctions, aGc); + break; + default: + PanicClientFromServer(); + break; + } + } + +void DDisplay::PositionOrSizeHasChanged() + { + } + +void DDisplay::SetPosition(const TPoint& aPosition) + { + iPosition=aPosition; + } + +void DDisplay::DrawClippedToDisplayRegionP(MAnimWindowFunctions& aFunctions, CAnimGc& aGc, TRegion* aRegion) const + { + if (IsVisibleAndNotHidden(aFunctions)) + { + TRect rectDrawnTo=RectDrawnTo(); + const TRegionFix<1> regionDrawnTo=rectDrawnTo; + const TRegion* clippingRegion=NULL; + TBool fullDrawRequired=ETrue; + if (aRegion!=NULL) + { + aRegion->Intersect(regionDrawnTo); + aRegion->Tidy(); + if (aRegion->CheckError()==KErrNone) + { + clippingRegion=aRegion; + fullDrawRequired=EFalse; + } + } + if (clippingRegion==NULL) + clippingRegion=®ionDrawnTo; + if (!clippingRegion->IsEmpty()) + { +#if defined(__SHOW_UPDATE_REGION__) + aGc.SetDrawMode(CGraphicsContext::EDrawModeNOTSCREEN); + aGc.SetPenStyle(CGraphicsContext::ESolidPen); + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc.DrawRect(rectDrawnTo); +#endif + TRect clippingRegionBoundingRect=clippingRegion->BoundingRect(); + aGc.SetClippingRect(clippingRegionBoundingRect); + aGc.SetClippingRegion(*clippingRegion); // N.B. cannot fail + DoDrawP(aGc, fullDrawRequired, clippingRegionBoundingRect); + aGc.CancelClippingRegion(); + aGc.CancelClippingRect(); + } + } + } + +void DDisplay::UpdateDisplayDataAndDrawClippedToDisplayRegionP(DAnimWithUtils::TFunctions& aFunctions, CAnimGc& aGc, const TTime& aTime, TRegion* aRegion) + { + UpdateDisplayDataP(aFunctions.iFunctions, aTime, aRegion); + DrawClippedToDisplayRegionP(aFunctions.iWindowFunctions, aGc, aRegion); + } + +TBool DDisplay::IsVisibleAndNotHidden(MAnimWindowFunctions& aFunctions) const + { + return iVisible && !aFunctions.IsHidden(); + } + +// DDigitalDisplay + +DDigitalDisplay::DDigitalDisplay(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow, TRgb aBackgroundColor, TInt aNumTextSections) + :DDisplay(aPosition, aSize, aMargins, aShadow), + iBackgroundColor(aBackgroundColor), + iFlashStateOn(ETrue) +#pragma warning (disable: 4705) + { +#pragma warning (default: 4705) + __DECLARE_NAME(_S("DDigitalDisplay")); + + __ASSERT_ALWAYS((aNumTextSections>0) && (aNumTextSections<=KMaxTInt16), PanicClientFromServer()); + iTextSections.iNumTextSections=(TInt16)aNumTextSections; + __ASSERT_DEBUG(iTextSections.iNumTextSectionsAdded==0, Panic(EClockServerPanicNotInitializedToNULL1)); + __ASSERT_DEBUG(iTextSections.iTextSections==NULL, Panic(EClockServerPanicNotInitializedToZero1)); + } + +void DDigitalDisplay::AddTextSectionLP(DDigitalDisplayTextSection* aTextSection) + { + __ASSERT_ALWAYS(iTextSections.iNumTextSectionsAddedSetInitialTimeP(aTime,iTimeResolutionLimitedToMinutes); + } + +DDigitalDisplay::~DDigitalDisplay() + { + if (iTextSections.iTextSections!=NULL) + { + for (TInt i=0; iiBackgroundColor) || (iShadow.iColor!=digitalDisplayArgs->iShadowColor)) + { + iBackgroundColor=digitalDisplayArgs->iBackgroundColor; + iShadow.iColor=digitalDisplayArgs->iShadowColor; + aFunctions.iWindowFunctions.ActivateGc(); + DrawP(aFunctions.iWindowFunctions, aGc); + } + } + break; + case EDigitalDisplayCommandSetTextColor: + { + SDigitalDisplayCommandSetTextColorArgs* digitalDisplayArgs=(SDigitalDisplayCommandSetTextColorArgs*)aArgs; + for (TInt i=0; iSetTextColor(digitalDisplayArgs->iTextColor); +// aFunctions.ActivateGc(); +// DrawP(aFunctions, aGc); + } + break; + default: + DDisplay::HandleCommandLP(aFunctions, aGc, aTime, aOpcode, aArgs); + break; + } + } + +void DDigitalDisplay::DoDrawP(CAnimGc& aGc, TBool, const TRect&) const + { + __ASSERT_ALWAYS(iTextSections.iNumTextSectionsAdded==iTextSections.iNumTextSections, PanicClientFromServer()); + TRect rectDrawnTo=RectDrawnTo(); + aGc.SetDrawMode(CGraphicsContext::EDrawModePEN); + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc.SetBrushColor(iBackgroundColor); + aGc.SetPenStyle(CGraphicsContext::ESolidPen); + aGc.SetPenColor(iBackgroundColor); + aGc.DrawRect(rectDrawnTo); + if (iShadow.iIsOn) + { + TRect shadowRect=rectDrawnTo; + shadowRect.Move(iShadow.iOffset); + for (TInt i=0; iDrawP(aGc, shadowRect, iFlashStateOn, &iShadow.iColor); + } + for (TInt i=0; iDrawP(aGc, rectDrawnTo, iFlashStateOn); + } + +void DDigitalDisplay::UpdateDisplayDataP(MAnimGeneralFunctions& aFunctions, const TTime& aTime, TRegion* aRegion) + { + __ASSERT_ALWAYS(iTextSections.iNumTextSectionsAdded==iTextSections.iNumTextSections, PanicClientFromServer()); + TBool flashStateIsChanging=EFalse; + TBool flashStateOn=aFunctions.FlashStateOn(); + if ((!iFlashStateOn)!=(!flashStateOn)) // "logical-not" both sides before comparing for inequality + { + iFlashStateOn=flashStateOn; + flashStateIsChanging=ETrue; + } + TRect rectDrawnTo=RectDrawnTo(); + for (TInt i=0; iUpdateDisplayDataP(rectDrawnTo, iShadow, aTime, flashStateIsChanging, aRegion,iTimeResolutionLimitedToMinutes); + } + +// DAnalogDisplay + +DAnalogDisplay::DAnalogDisplay(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow, TInt aNumHands) + :DDisplay(aPosition, aSize, aMargins, aShadow) +#pragma warning (disable: 4705) + { +#pragma warning (default: 4705) + __DECLARE_NAME(_S("DAnalogDisplay")); + + __ASSERT_DEBUG(iFace==NULL, Panic(EClockServerPanicNotInitializedToNULL2)); + __ASSERT_DEBUG(iFaceMask==NULL, Panic(EClockServerPanicNotInitializedToNULL3)); + __ASSERT_ALWAYS((aNumHands>0) && (aNumHands<=KMaxTInt16), PanicClientFromServer()); + iHands.iNumHands=(TInt16)aNumHands; + __ASSERT_DEBUG(iHands.iNumHandsAdded==0, Panic(EClockServerPanicNotInitializedToNULL4)); + __ASSERT_DEBUG(iHands.iHands==NULL, Panic(EClockServerPanicNotInitializedToZero2)); + __ASSERT_DEBUG(iAmPm==NULL, Panic(EClockServerPanicNotInitializedToNULL5)); + } + +void DAnalogDisplay::ConstructL(MAnimGeneralFunctions& aFunctions, TInt aFaceHandle, TInt aFaceMaskHandle) + { + iFace=aFunctions.DuplicateBitmapL(aFaceHandle); + if (aFaceMaskHandle!=0) + iFaceMask=aFunctions.DuplicateBitmapL(aFaceMaskHandle); + } + +void DAnalogDisplay::AddHandLP(DAnalogDisplayHand* aHand) + { + __ASSERT_ALWAYS(iHands.iNumHandsAddedConstructLP(aFunctions, aTextColor, aFontHandle); + } + +void DAnalogDisplay::SetInitialTimeP(const TTime& aTime) + { + __ASSERT_ALWAYS(iHands.iNumHandsAdded==iHands.iNumHands, PanicClientFromServer()); + if (iAmPm!=NULL) + iAmPm->SetInitialTimeP(aTime); + for (TInt i=0; iSetInitialTimeP(aTime); + } + +DAnalogDisplay::~DAnalogDisplay() + { + delete iFace; + delete iFaceMask; + delete iAmPm; + if (iHands.iHands!=NULL) + { + for (TInt i=0; iSetPosition(AmPmPosition()); + } + +TRect DAnalogDisplay::FaceRect() const + { + TRect rectDrawnTo=RectDrawnTo(); + TSize sizeDrawnTo=rectDrawnTo.Size(); + TSize faceSize=iFace->SizeInPixels(); + TPoint facePosition=rectDrawnTo.iTl+TPoint((sizeDrawnTo.iWidth-faceSize.iWidth)/2, (sizeDrawnTo.iHeight-faceSize.iHeight)/2); + return TRect(facePosition, faceSize); + } + +// Function to stop a the specified hand types from being displayed +void DAnalogDisplay::DisableHands(TBool aHourHand, TBool aMinuteHand, TBool aSecondHand) + { + if(aHourHand) + iHands.iHandsDisabled|=EHourHand; + if(aMinuteHand) + iHands.iHandsDisabled|=EMinuteHand; + if(aSecondHand) + iHands.iHandsDisabled|=ESecondHand; + + } + +// Function to re-enable the displaying of the specified hand types after a call to DisableHands() +void DAnalogDisplay::EnableHands(TBool aHourHand, TBool aMinuteHand, TBool aSecondHand) + { + if(aHourHand) + iHands.iHandsDisabled&= ~EHourHand; + if(aMinuteHand) + iHands.iHandsDisabled&= ~EMinuteHand; + if(aSecondHand) + iHands.iHandsDisabled&= ~ESecondHand; + } + +void DAnalogDisplay::DoDrawP(CAnimGc& aGc, TBool aFullDrawRequired, const TRect& aClippingRect) const + { + __ASSERT_ALWAYS(iHands.iNumHandsAdded==iHands.iNumHands, PanicClientFromServer()); + aGc.SetDrawMode(CGraphicsContext::EDrawModePEN); + TRect rectDrawnTo=RectDrawnTo(); + TRect rectDrawnToRelativeToFace=rectDrawnTo; + rectDrawnToRelativeToFace.Move(-FaceRect().iTl); + if ((iFaceMask!=NULL) && aFullDrawRequired) + aGc.BitBltMasked(rectDrawnTo.iTl, iFace, rectDrawnToRelativeToFace, iFaceMask, EFalse); + else + aGc.BitBlt(rectDrawnTo.iTl, iFace, rectDrawnToRelativeToFace); + if (iAmPm!=NULL) + { + TRect temp=iAmPm->RectDrawnTo(); + if (temp.Intersects(aClippingRect)) + { + temp.Intersection(aClippingRect); + aGc.SetClippingRect(temp); + iAmPm->DoDrawP(aGc, aFullDrawRequired, temp); + aGc.SetClippingRect(aClippingRect); + } + } + TPoint handCenter=HandCenter(); + if (iShadow.iIsOn) + { + TPoint shadowHandCenter=handCenter+iShadow.iOffset; + DrawHands(aGc, shadowHandCenter, &iShadow.iColor); + } + DrawHands(aGc, handCenter); + } + +void DAnalogDisplay::DrawHands(CAnimGc& aGc, const TPoint& aCenter, const TRgb* aShadowColour) const + { + for (TInt i=0; iType() == EAnalogDisplayHandOneRevPer12Hours)&&(!(iHands.iHandsDisabled&EHourHand))) + ||((iHands.iHands[i]->Type() == EAnalogDisplayHandOneRevPerHour)&&(!(iHands.iHandsDisabled&EMinuteHand))) + ||((iHands.iHands[i]->Type() == EAnalogDisplayHandOneRevPerMinute)&&(!(iHands.iHandsDisabled&ESecondHand))) ) + { + iHands.iHands[i]->DrawP(aGc, aCenter, aShadowColour); + } + } + } + +void DAnalogDisplay::UpdateDisplayDataP(MAnimGeneralFunctions& aFunctions, const TTime& aTime, TRegion* aRegion) + { + __ASSERT_ALWAYS(iHands.iNumHandsAdded==iHands.iNumHands, PanicClientFromServer()); + if (iAmPm) + iAmPm->UpdateDisplayDataP(aFunctions, aTime, aRegion); + for (TInt i=0; iType() == EAnalogDisplayHandOneRevPer12Hours)&&(!(iHands.iHandsDisabled&EHourHand))) + ||((iHands.iHands[i]->Type() == EAnalogDisplayHandOneRevPerHour)&&(!(iHands.iHandsDisabled&EMinuteHand))) + ||((iHands.iHands[i]->Type() == EAnalogDisplayHandOneRevPerMinute)&&(!(iHands.iHandsDisabled&ESecondHand))) ) + { + iHands.iHands[i]->UpdateDisplayDataP(aTime, HandCenter(), iShadow, aRegion); + } + else + { + // When a hand is Disabled in needs to be cleared immediately, in some circumstances + // the time will be the same as the last time the hand was drawn and this results + // in the region not being updated (because no change has occured) + // We need to force the update by tricking the updtae code into thinking the hand has moved + // This is done by adding 1 to the time. + TTime tempTime = aTime+TTimeIntervalSeconds(1); + iHands.iHands[i]->UpdateDisplayDataP(tempTime, HandCenter(), iShadow, aRegion); + } + } + } + +TPoint DAnalogDisplay::HandCenter() const + { + return FaceRect().Center(); + } + +TPoint DAnalogDisplay::AmPmPosition() const + { + return FaceRect().iTl+iAmPmPositionRelativeToFace; + } + +// DAnalogDisplay::DAmPmDisplay + +DAnalogDisplay::DAmPmDisplay::DAmPmDisplay(const TPoint& aPosition, const TSize& aSize, const TMargins& aMargins, const STimeDeviceShadow& aShadow, TRgb aBackgroundColor) + :DDigitalDisplay(aPosition, aSize, aMargins, aShadow, aBackgroundColor, 1) + { + } + +void DAnalogDisplay::DAmPmDisplay::ConstructLP(MAnimGeneralFunctions& aFunctions, TRgb aTextColor, TInt aFontHandle) + { + DDigitalDisplayTextSection* textSection=new(ELeave) DDigitalDisplayTextSection(aFunctions, aTextColor, + EDigitalDisplayHorizontalTextAlignmentCenter, + EDigitalDisplayVerticalTextAlignmentCenterExclDescent, 0, 0); + CleanupStack::PushL(textSection); + textSection->ConstructL(KFormatText, aFontHandle); + AddTextSectionLP(textSection); + CleanupStack::Pop(); // pop off textSection + } + +void DAnalogDisplay::DAmPmDisplay::DoDrawP(CAnimGc& aGc, TBool aFullDrawRequired, const TRect& aClippingRect) const + { + DDigitalDisplay::DoDrawP(aGc, aFullDrawRequired, aClippingRect); + } + +void DAnalogDisplay::DAmPmDisplay::UpdateDisplayDataP(MAnimGeneralFunctions& aFunctions, const TTime& aTime, TRegion* aRegion) + { + DDigitalDisplay::UpdateDisplayDataP(aFunctions, aTime, aRegion); + } + + +void DAnalogDisplay::HandleCommandLP(DAnimWithUtils::TFunctions& aFunctions, CAnimGc& aGc, const TTime& aTime, TInt aOpcode, TAny* aArgs) + { + switch (aOpcode) + { + case EDigitalDisplayCommandSetBackgroundColor: + case EDigitalDisplayCommandSetTextColor: + if (iAmPm) + iAmPm->HandleCommandLP(aFunctions,aGc,aTime,aOpcode,aArgs); + break; + case EAnalogDisplayCommandSetPenColor: + { + SAnalogDisplayHandFeaturesPenColorArgs* analogDisplayArgs=(SAnalogDisplayHandFeaturesPenColorArgs*)aArgs; + for (TInt i=0; iSetPenColor(analogDisplayArgs->iPenColor); + } + break; + case EAnalogDisplayCommandSetBrushColor: + { + SAnalogDisplayHandFeaturesBrushColorArgs* analogDisplayArgs=(SAnalogDisplayHandFeaturesBrushColorArgs*)aArgs; + for (TInt i=0; iSetBrushColor(analogDisplayArgs->iBrushColor); +// iBrushColor=analogDisplayArgs->iBrushColor; +// aFunctions.ActivateGc(); +// DrawP(aFunctions, aGc); + } + break; + default: + DDisplay::HandleCommandLP(aFunctions, aGc, aTime, aOpcode, aArgs); + break; + } + } +//!>