windowing/windowserver/nga/SERVER/WSANIMGC.CPP
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// 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 <e32std.h>
#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<TPoint> points(aPointList, aNumPoints);
		iGc->DrawPolyLine(points);
		}
	}

void CWsAnimGc::DrawPolyLine(const CArrayFix<TPoint> *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<TPoint> pointsArray(aPointList, aNumPoints);
		iGc->DrawPolygon(pointsArray, BitGdiToMWsGraphicsContextMappings::Convert(aFillRule));
		result = iGc->GetError();
		}
	return result;
	}

TInt CWsAnimGc::DrawPolygon(const CArrayFix<TPoint> *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);
	}