diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/nga/SERVER/WSANIMGC.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/nga/SERVER/WSANIMGC.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,647 @@ +// Copyright (c) 1996-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: +// Interface code for animated DLL's GC +// +// + +#include +#include "server.h" +#include "playbackgc.h" +#include "ANIM.H" +#include "wsfont.h" +#include "bitgditomwsgraphicscontextmappings.h" +#include "devicemap.h" + +CWsAnimGc::CWsAnimGc(CWsAnim& aWsAnim) : iOwningWsAnim(aWsAnim), iUserActive(EFalse), iUseDrawingRegion(EFalse) + { + __DECLARE_NAME(_S("CWsAnimGc")); + } + +CWsAnimGc::~CWsAnimGc() + { + iDrawingRegion.Close(); + } + +void CWsAnimGc::Activate(const TRegion* aRegion, MWsGraphicsContext* aGc) + { + iBaseRegion = aRegion ? aRegion : iOwningWsAnim.ClientWindow()->DrawingRegion(); + iGc = aGc; + iUserActive = ETrue; + Reset(); + } + +void CWsAnimGc::Deactivate() + { + CloseCurrentFont(); + iGc = NULL; + iUserActive = EFalse; + iUseDrawingRegion = EFalse; + iDrawingRegion.Close(); + } + +TBool CWsAnimGc::IsActive() const + { + return (iUserActive || (iGc != NULL)); + } + +void CWsAnimGc::UserActivate() + { + if (iUserActive) + { + // Already active + UserDeactivate(); + iOwningWsAnim.SessionPanic(); + } + iUserActive = ETrue; + } + +void CWsAnimGc::UserDeactivate() + { + CloseCurrentFont(); + + if (iUserActive) + { + iUserActive = EFalse; + } + } + +CGraphicsDevice* CWsAnimGc::Device() const + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + + return NULL; //deprecated + } + +void CWsAnimGc::SetClippingRect(const TRect& aRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + + if (iGc) + { + iClippingRect = aRect; + iClippingRect.Move(iOwningWsAnim.ClientWindow()->Origin()); + iClippingRect.Intersection(iOwningWsAnim.ClientWindow()->AbsRect()); + + STACK_REGION region; + region.Copy(*iBaseRegion); + if (iUseDrawingRegion) + region.Intersect(iDrawingRegion); + region.ClipRect(iClippingRect); + region.Tidy(); + + iGc->SetClippingRegion(region); + region.Close(); + + if (iGc->GetError()) + iClippingRect = iOwningWsAnim.ClientWindow()->AbsRect(); // On error revert to the default clipping rect + } + } + +TInt CWsAnimGc::SetClippingRegion(const TRegion &aRegion) + { + if (!iUserActive) + return KErrGeneral; + + TInt error = KErrNone; + if (iGc) + { + STACK_REGION region; + region.Copy(aRegion); + region.Offset(iOwningWsAnim.ClientWindow()->Origin()); + region.Intersect(*iBaseRegion); + region.ClipRect(iClippingRect); + region.Tidy(); + + iGc->SetClippingRegion(region); + region.Close(); + + error = iGc->GetError(); + if (!error) + { // Need to keep a copy of the region in screen coordinates + iDrawingRegion.Copy(aRegion); + iDrawingRegion.Offset(iOwningWsAnim.ClientWindow()->Origin()); + iUseDrawingRegion = ETrue; + } + } + return error; + } + +void CWsAnimGc::CancelClippingRegion() + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + + if (iGc) + { + iDrawingRegion.Close(); + iUseDrawingRegion = EFalse; + + STACK_REGION region; + region.Copy(*iBaseRegion); + region.ClipRect(iClippingRect); + region.Tidy(); + iGc->SetClippingRegion(region); + region.Close(); + } + } + +void CWsAnimGc::CancelClippingRect() + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + + if (iGc) + { + iClippingRect = iOwningWsAnim.ClientWindow()->AbsRect(); // Revert to the default clipping rect + + STACK_REGION region; + region.Copy(*iBaseRegion); + if (iUseDrawingRegion) + region.Intersect(iDrawingRegion); + region.ClipRect(iClippingRect); + region.Tidy(); + iGc->SetClippingRegion(region); + region.Close(); + } + } + +void CWsAnimGc::SetDrawMode(TDrawMode aDrawingMode) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + + if (iGc) + iGc->SetDrawMode(BitGdiToMWsGraphicsContextMappings::LossyConvert(aDrawingMode)); + } + +void CWsAnimGc::UseFont(const CFont *aFont) + { + CloseCurrentFont(); + iFont=(CAnimFbsFont *)aFont; + iFont->Open(); + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetFontNoDuplicate(iFont); + } + +void CWsAnimGc::DiscardFont() + { + CloseCurrentFont(); + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->ResetFont(); + } + +void CWsAnimGc::SetUnderlineStyle(TFontUnderline aUnderlineStyle) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetUnderlineStyle(BitGdiToMWsGraphicsContextMappings::Convert(aUnderlineStyle)); + } + +void CWsAnimGc::SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetStrikethroughStyle(BitGdiToMWsGraphicsContextMappings::Convert(aStrikethroughStyle)); + } + +void CWsAnimGc::SetWordJustification(TInt aExcessWidth,TInt aNumGaps) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetWordJustification(aExcessWidth,aNumGaps); + } + +void CWsAnimGc::SetCharJustification(TInt aExcessWidth,TInt aNumChars) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetCharJustification(aExcessWidth,aNumChars); + } + +void CWsAnimGc::SetPenColor(const TRgb &aColor) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetPenColor(aColor); + } + +void CWsAnimGc::SetPenStyle(TPenStyle aPenStyle) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetPenStyle(BitGdiToMWsGraphicsContextMappings::Convert(aPenStyle)); + } + +void CWsAnimGc::SetPenSize(const TSize& aSize) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetPenSize(aSize); + } + +void CWsAnimGc::SetBrushColor(const TRgb &aColor) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetBrushColor(aColor); + } + +void CWsAnimGc::SetBrushStyle(TBrushStyle aBrushStyle) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetBrushStyle(BitGdiToMWsGraphicsContextMappings::Convert(aBrushStyle)); + } + +void CWsAnimGc::SetBrushOrigin(const TPoint &aOrigin) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetBrushOrigin(aOrigin); + } + +void CWsAnimGc::UseBrushPattern(const CFbsBitmap *aBitmap) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetBrushPattern(*aBitmap); + } + +void CWsAnimGc::DiscardBrushPattern() + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->ResetBrushPattern(); + } + +void CWsAnimGc::SetFaded(TBool /*aFaded*/) // Deprecated + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + // Do nothing + } + +void CWsAnimGc::SetFadingParameters(TUint8 /*aBlackMap*/,TUint8 /*aWhiteMap*/) // Deprecated + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + // Do nothing + } + +// +// Drawing commands // +// + +void CWsAnimGc::DrawArc(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawArc(aRect,aStart,aEnd); + } + +void CWsAnimGc::DrawPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawPie(aRect,aStart,aEnd); + } + +void CWsAnimGc::DrawLine(const TPoint &aPoint1,const TPoint &aPoint2) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawLine(aPoint1, aPoint2); + } + +void CWsAnimGc::DrawLineTo(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawLineTo(aPoint); + } + +void CWsAnimGc::DrawLineBy(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawLineBy(aPoint); + } + +void CWsAnimGc::DrawEllipse(const TRect &aRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawEllipse(aRect); + } + +void CWsAnimGc::DrawRect(const TRect &aRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawRect(aRect); + } + +void CWsAnimGc::DrawRoundRect(const TRect &aRect,const TSize &aCornerSize) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawRoundRect(aRect, aCornerSize); + } + +void CWsAnimGc::Clear(const TRect &aRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->Clear(aRect); + } + +void CWsAnimGc::Clear() + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->Clear(); + } + +void CWsAnimGc::BitBlt(const TPoint &aPoint,const CFbsBitmap *aBitmap) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->BitBlt(aPoint, *aBitmap); + } + +void CWsAnimGc::BitBlt(const TPoint &aDestination,const CFbsBitmap *aBitmap,const TRect &aSource) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->BitBlt(aDestination, *aBitmap, aSource); + } + +void CWsAnimGc::BitBltMasked(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aSourceRect,const CFbsBitmap* aMaskBitmap,TBool aInvertMask) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->BitBltMasked(aPoint, *aBitmap, aSourceRect, *aMaskBitmap, aInvertMask); + } + +void CWsAnimGc::DrawBitmap(const TPoint &aTopLeft, const CFbsBitmap *aSource) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + { + // DrawBitmap(TPoint&, ) uses the size of the bitmap in twips, but + // MWsGraphicsContext::DrawBitmap() takes a TRect in pixels, so we need to convert + TRect destRect(iOwningWsAnim.ClientWindow()->Screen()->DeviceMap().TwipsToPixels(aSource->SizeInTwips())); + destRect.Move(aTopLeft); //aTopLeft is defined in pixels, that's why we're not converting it + iGc->DrawBitmap(destRect, *aSource); + } + } + +void CWsAnimGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aSource) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawBitmap(aDestRect, *aSource); + } + +void CWsAnimGc::DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aSource, const TRect &aSrcRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawBitmap(aDestRect, *aSource, aSrcRect); + } + +void CWsAnimGc::DrawBitmapMasked(const TRect &aDestRect, const CFbsBitmap *aBitmap, const TRect &aSrcRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawBitmapMasked(aDestRect, *aBitmap, aSrcRect, *aMaskBitmap, aInvertMask); + } + +void CWsAnimGc::DrawBitmapMasked(const TRect& aDestRect,const CWsBitmap* aBitmap,const TRect& aSrcRect,const CWsBitmap* aMaskBitmap, TBool aInvertMask) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawBitmapMasked(aDestRect, *aBitmap, aSrcRect, *aMaskBitmap, aInvertMask); + } + +void CWsAnimGc::DrawPolyLine(const TPoint* aPointList,TInt aNumPoints) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + { + TArrayWrapper points(aPointList, aNumPoints); + iGc->DrawPolyLine(points); + } + } + +void CWsAnimGc::DrawPolyLine(const CArrayFix *aPointList) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->DrawPolyLine(aPointList->Array()); + } + +TInt CWsAnimGc::DrawPolygon(const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule) + { + TInt result = KErrGeneral; + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + { + TArrayWrapper pointsArray(aPointList, aNumPoints); + iGc->DrawPolygon(pointsArray, BitGdiToMWsGraphicsContextMappings::Convert(aFillRule)); + result = iGc->GetError(); + } + return result; + } + +TInt CWsAnimGc::DrawPolygon(const CArrayFix *aPointList,TFillRule aFillRule) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if(!aPointList) + return KErrArgument; + TInt result = KErrGeneral; + if (iGc) + { + iGc->DrawPolygon(aPointList->Array(), BitGdiToMWsGraphicsContextMappings::Convert(aFillRule)); + result = iGc->GetError(); + } + return result; + } + +void CWsAnimGc::DrawText(const TDesC &aString,const TPoint &aPosition) + { + if (!iFont) + iOwningWsAnim.Panic(EWservPanicNoFont); + if (iGc) + iGc->DrawText(aString, NULL, aPosition); + } + +void CWsAnimGc::DrawText(const TDesC &aString,const TRect &aBox,TInt aBaselineOffset,TTextAlign aHoriz,TInt aLeftMrg) + { + if (!iFont) + iOwningWsAnim.Panic(EWservPanicNoFont); + if (iGc) + iGc->DrawText(aString, NULL, aBox, aBaselineOffset, BitGdiToMWsGraphicsContextMappings::Convert(aHoriz), aLeftMrg); + } + +void CWsAnimGc::MoveTo(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->MoveTo(aPoint); + } + +void CWsAnimGc::MoveBy(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->MoveBy(aPoint); + } + +void CWsAnimGc::Plot(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->Plot(aPoint); + } + +void CWsAnimGc::SetOrigin(const TPoint &aPoint) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->SetOrigin(iOwningWsAnim.ClientWindow()->Origin() + aPoint); + } + +void CWsAnimGc::CopyRect(const TPoint& aOffset,const TRect& aRect) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->CopyRect(aOffset, aRect); + } + +void CWsAnimGc::Reset() + { + CloseCurrentFont(); + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + iGc->Reset(); + SetOrigin(TPoint(0,0)); + CancelClippingRect(); + CancelClippingRegion(); + } + +void CWsAnimGc::CloseCurrentFont() + { + if (iFont) + { + iFont->Close(); + iFont=NULL; + } + } + +/** +@see CBitmapContext::AlphaBlendBitmaps()*/ +TInt CWsAnimGc::AlphaBlendBitmaps(const TPoint& aDestPt, const CFbsBitmap* aSrcBmp, const TRect& aSrcRect, const CFbsBitmap* aAlphaBmp, const TPoint& aAlphaPt) + { + TInt result = KErrGeneral; + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + if (iGc) + { + iGc->BitBltMasked(aDestPt, *aSrcBmp, aSrcRect, *aAlphaBmp, aAlphaPt); + result = iGc->GetError(); + } + return result; + } + +/*Body stub implementation. The alternate AlphaBlendBitmap function using CFbsBitmaps should instead be used*/ +TInt CWsAnimGc::AlphaBlendBitmaps(const TPoint& /*aDestPt*/, const CWsBitmap* /*aSrcBmp*/, const TRect& /*aSrcRect*/, const CWsBitmap* /*aAlphaBmp*/, const TPoint& /*aAlphaPt*/) + { + return KErrNone; + }; + +/** +@see CGraphicsContext::MapColors()*/ +void CWsAnimGc::MapColors(const TRect& /*aRect*/,const TRgb* /*aColors*/,TInt /*aNumPairs*/,TBool /*aMapForwards*/) + { + if (!iUserActive) + iOwningWsAnim.Panic(EWservPanicAnimLeave); + } + +/** +@see CGraphicsContext::DrawTextVertical()*/ +void CWsAnimGc::DrawTextVertical(const TDesC& aText,const TPoint& aPos,TBool aUp) + { + if (!iFont) + iOwningWsAnim.Panic(EWservPanicNoFont); + if (iGc) + iGc->DrawTextVertical(aText, NULL, aPos, aUp); + } + +/** +@see CGraphicsContext::DrawTextVertical()*/ +void CWsAnimGc::DrawTextVertical(const TDesC& aText,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin) + { + if (!iFont) + iOwningWsAnim.Panic(EWservPanicNoFont); + if (iGc) + iGc->DrawTextVertical(aText, NULL, aBox, aBaselineOffset, aUp, BitGdiToMWsGraphicsContextMappings::Convert(aVert), aMargin); + } +