windowing/windowserver/nga/SERVER/WSANIMGC.CPP
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// 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);
	}