--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/directgdigcwrapper.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,521 @@
+// Copyright (c) 2008-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 "directgdigcwrapper.h"
+#include "mwsgraphicscontexttodirectgdimappings.h"
+#include <s32mem.h>
+#include "stdpanic.h"
+#include <graphics/lookuptable.h>
+#include <graphics/directgdidriver.h>
+#include <graphics/directgdidrawablesource.h>
+
+void Panic(TStdPluginPanic aPanic)
+ {
+ _LIT(KStdPanicCategory, "WSERV-TEST-PLUGIN");
+ User::Panic(KStdPanicCategory, aPanic);
+ }
+
+CDirectGdiGcWrapper* CDirectGdiGcWrapper::NewL(RDirectGdiImageTarget& aTarget)
+ {
+ CDirectGdiGcWrapper* self = new(ELeave) CDirectGdiGcWrapper;
+ CleanupStack::PushL(self);
+ CDirectGdiDriver* driver = CDirectGdiDriver::Static();
+ User::LeaveIfNull(driver);
+ self->iContext = CDirectGdiContext::NewL(*driver);
+ TInt err = self->iContext->Activate(aTarget);
+ User::LeaveIfError(err);
+ self->iErrorCode = KErrNone;
+ self->iGcBuf = CBufSeg::NewL(512);
+ //MWsFader
+ //Default in BitGdi was 128 for the blackMap and 255 for the whiteMap
+ //SetFadingParameters shows how the fade color is computed
+ self->iFadeColor.SetInternal(0x80FFFFFF);
+
+ self->iLut = PtrTo16BitNormalisationTable();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CDirectGdiGcWrapper::~CDirectGdiGcWrapper()
+ {
+ delete iContext;
+ delete iGcBuf;
+ iClippingRegion.Close();
+ }
+
+void CDirectGdiGcWrapper::BitBlt(const TPoint& aDestPos, const CFbsBitmap& aSourceBitmap)
+ {
+ iContext->BitBlt(aDestPos, aSourceBitmap);
+ }
+
+void CDirectGdiGcWrapper::BitBlt(const TPoint& aDestPos, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect)
+ {
+ iContext->BitBlt(aDestPos, aSourceBitmap, aSourceRect);
+ }
+
+void CDirectGdiGcWrapper::BitBltMasked(const TPoint& aDestPos, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect, const CFbsBitmap& aMaskBitmap, TBool aInvertMask)
+ {
+ iContext->BitBltMasked(aDestPos, aSourceBitmap, aSourceRect, aMaskBitmap, aInvertMask);
+ }
+
+void CDirectGdiGcWrapper::BitBltMasked(const TPoint& aDestPos, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect, const CFbsBitmap& aMaskBitmap, const TPoint& aMaskPos)
+ {
+ iContext->BitBltMasked(aDestPos, aSourceBitmap, aSourceRect, aMaskBitmap, aMaskPos);
+ }
+
+void CDirectGdiGcWrapper::ResetClippingRegion()
+ {
+ iContext->ResetClippingRegion();
+ }
+
+void CDirectGdiGcWrapper::Clear()
+ {
+ iContext->Clear();
+ }
+
+void CDirectGdiGcWrapper::Clear(const TRect& aRect)
+ {
+ iContext->Clear(aRect);
+ }
+
+void CDirectGdiGcWrapper::ResetBrushPattern()
+ {
+ iContext->ResetBrushPattern();
+ }
+
+void CDirectGdiGcWrapper::ResetFont()
+ {
+ iContext->ResetFont();
+ }
+
+void CDirectGdiGcWrapper::DrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd)
+ {
+ iContext->DrawArc(aRect, aStart, aEnd);
+ }
+
+void CDirectGdiGcWrapper::DrawPie(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd)
+ {
+ iContext->DrawPie(aRect, aStart, aEnd);
+ }
+
+void CDirectGdiGcWrapper::DrawBitmap(const TRect& aDestRect, const CFbsBitmap& aSourceBitmap)
+ {
+ iContext->DrawBitmap(aDestRect, aSourceBitmap);
+ }
+
+void CDirectGdiGcWrapper::DrawBitmap(const TRect& aDestRect, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect)
+ {
+ iContext->DrawBitmap(aDestRect, aSourceBitmap, aSourceRect);
+ }
+
+void CDirectGdiGcWrapper::DrawBitmapMasked(const TRect& aDestRect, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect, const CFbsBitmap& aMaskBitmap, TBool aInvertMask)
+ {
+ iContext->DrawBitmapMasked(aDestRect, aSourceBitmap, aSourceRect, aMaskBitmap, aInvertMask);
+ }
+
+void CDirectGdiGcWrapper::DrawRoundRect(const TRect& aRect, const TSize& aEllipse)
+ {
+ iContext->DrawRoundRect(aRect, aEllipse);
+ }
+
+void CDirectGdiGcWrapper::DrawPolyLine(const TArray<TPoint>& aPointList)
+ {
+ iContext->DrawPolyLine(aPointList);
+ }
+
+void CDirectGdiGcWrapper::DrawPolyLineNoEndPoint(const TArray<TPoint>& aPointList)
+ {
+ iContext->DrawPolyLineNoEndPoint(aPointList);
+ }
+
+void CDirectGdiGcWrapper::DrawPolygon(const TArray<TPoint>& aPointList, TFillRule aFillRule)
+ {
+ iContext->DrawPolygon(aPointList, MWsGraphicsContextToDirectGdiMappings::Convert(aFillRule));
+ }
+
+void CDirectGdiGcWrapper::DrawEllipse(const TRect& aRect)
+ {
+ iContext->DrawEllipse(aRect);
+ }
+
+void CDirectGdiGcWrapper::DrawLine(const TPoint& aStart, const TPoint& aEnd)
+ {
+ iContext->DrawLine(aStart, aEnd);
+ }
+
+void CDirectGdiGcWrapper::DrawLineTo(const TPoint& aPoint)
+ {
+ iContext->DrawLineTo(aPoint);
+ }
+
+void CDirectGdiGcWrapper::DrawLineBy(const TPoint& aVector)
+ {
+ iContext->DrawLineBy(aVector);
+ }
+
+void CDirectGdiGcWrapper::DrawRect(const TRect& aRect)
+ {
+ iContext->DrawRect(aRect);
+ }
+
+void CDirectGdiGcWrapper::DrawText(const TDesC& aText,const TTextParameters* aParam)
+ {
+ iContext->DrawText(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam));
+ }
+
+void CDirectGdiGcWrapper::DrawText(const TDesC& aText,const TTextParameters* aParam,const TPoint& aPosition)
+ {
+ iContext->DrawText(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aPosition);
+ }
+
+void CDirectGdiGcWrapper::DrawText(const TDesC& aText,const TTextParameters* aParam,const TRect& aClipRect)
+ {
+ iContext->DrawText(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aClipRect);
+ }
+
+void CDirectGdiGcWrapper::DrawText(const TDesC& aText,const TTextParameters* aParam,const TRect& aClipFillRect,TInt aBaselineOffset, TTextAlign aHrz,TInt aMargin)
+ {
+ iContext->DrawText(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aClipFillRect, aBaselineOffset, MWsGraphicsContextToDirectGdiMappings::Convert(aHrz), aMargin);
+ }
+
+void CDirectGdiGcWrapper::DrawTextVertical(const TDesC& aText,const TTextParameters* aParam,TBool aUp)
+ {
+ iContext->DrawTextVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aUp);
+ }
+
+void CDirectGdiGcWrapper::DrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TPoint& aPosition,TBool aUp)
+ {
+ iContext->DrawTextVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aPosition, aUp);
+ }
+
+void CDirectGdiGcWrapper::DrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TRect& aClipRect,TBool aUp)
+ {
+ iContext->DrawTextVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aClipRect, aUp);
+ }
+
+void CDirectGdiGcWrapper::DrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TRect& aClipRect,TInt aBaselineOffset,TBool aUp,TTextAlign aVert,TInt aMargin)
+ {
+ iContext->DrawTextVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aClipRect, aBaselineOffset, aUp, MWsGraphicsContextToDirectGdiMappings::Convert(aVert), aMargin);
+ }
+
+void CDirectGdiGcWrapper::DrawTextVertical(const TDesC& aText,const TTextParameters* aParam,const TRect& aClipRect,TInt aBaselineOffset,TInt aTextWidth,TBool aUp,TTextAlign aVert,TInt aMargin)
+ {
+ iContext->DrawTextVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aClipRect, aBaselineOffset, aTextWidth, aUp, MWsGraphicsContextToDirectGdiMappings::Convert(aVert), aMargin);
+ }
+
+void CDirectGdiGcWrapper::MoveTo(const TPoint& aPoint)
+ {
+ iContext->MoveTo(aPoint);
+ }
+
+void CDirectGdiGcWrapper::MoveBy(const TPoint& aVector)
+ {
+ iContext->MoveBy(aVector);
+ }
+
+void CDirectGdiGcWrapper::Plot(const TPoint& aPoint)
+ {
+ iContext->Plot(aPoint);
+ }
+
+void CDirectGdiGcWrapper::Reset()
+ {
+ iContext->Reset();
+ }
+
+void CDirectGdiGcWrapper::SetBrushColor(const TRgb& aColor)
+ {
+ iContext->SetBrushColor(aColor);
+ }
+
+void CDirectGdiGcWrapper::SetBrushOrigin(const TPoint& aOrigin)
+ {
+ iContext->SetBrushOrigin(aOrigin);
+ }
+
+void CDirectGdiGcWrapper::SetBrushStyle(TBrushStyle aBrushStyle)
+ {
+ iContext->SetBrushStyle(MWsGraphicsContextToDirectGdiMappings::Convert(aBrushStyle));
+ }
+
+void CDirectGdiGcWrapper::SetClippingRegion(const TRegion& aRegion)
+ {
+ CDirectGdiDriver* driver = CDirectGdiDriver::Static();
+ driver->GetError(); //make sure that an error has been received
+ iContext->SetClippingRegion(aRegion);
+ TInt err = driver->GetError();
+ SetError(err);
+ if(err == KErrNone)
+ {
+ iClippingRegion.Copy(aRegion);
+ }
+ }
+
+void CDirectGdiGcWrapper::SetDrawMode(TDrawMode aDrawMode)
+ {
+ iContext->SetDrawMode(MWsGraphicsContextToDirectGdiMappings::LossyConvert(aDrawMode));
+ }
+
+void CDirectGdiGcWrapper::SetOrigin(const TPoint& aPoint)
+ {
+ iContext->SetOrigin(aPoint);
+ iOrigin = aPoint;
+ }
+
+void CDirectGdiGcWrapper::SetPenColor(const TRgb& aColor)
+ {
+ iContext->SetPenColor(aColor);
+ }
+
+void CDirectGdiGcWrapper::SetPenStyle(TPenStyle aPenStyle)
+ {
+ iContext->SetPenStyle(MWsGraphicsContextToDirectGdiMappings::Convert(aPenStyle));
+ }
+
+void CDirectGdiGcWrapper::SetPenSize(const TSize& aSize)
+ {
+ iContext->SetPenSize(aSize);
+ }
+
+void CDirectGdiGcWrapper::SetTextShadowColor(const TRgb& aColor)
+ {
+ iContext->SetTextShadowColor(aColor);
+ }
+
+void CDirectGdiGcWrapper::SetCharJustification(TInt aExcessWidth, TInt aNumChars)
+ {
+ iContext->SetCharJustification(aExcessWidth, aNumChars);
+ }
+
+void CDirectGdiGcWrapper::SetWordJustification(TInt aExcessWidth, TInt aNumGaps)
+ {
+ iContext->SetWordJustification(aExcessWidth, aNumGaps);
+ }
+
+void CDirectGdiGcWrapper::SetUnderlineStyle(TFontUnderline aUnderlineStyle)
+ {
+ iContext->SetUnderlineStyle(MWsGraphicsContextToDirectGdiMappings::Convert(aUnderlineStyle));
+ }
+
+void CDirectGdiGcWrapper::SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle)
+ {
+ iContext->SetStrikethroughStyle(MWsGraphicsContextToDirectGdiMappings::Convert(aStrikethroughStyle));
+ }
+
+void CDirectGdiGcWrapper::SetBrushPattern(const CFbsBitmap& aBitmap)
+ {
+ iContext->SetBrushPattern(aBitmap);
+ }
+
+void CDirectGdiGcWrapper::SetBrushPattern(TInt aFbsBitmapHandle)
+ {
+ iContext->SetBrushPattern(aFbsBitmapHandle);
+ }
+
+void CDirectGdiGcWrapper::SetFont(const CFont* aFont)
+ {
+ iContext->SetFont(aFont);
+ }
+
+void CDirectGdiGcWrapper::CopyRect(const TPoint& aOffset, const TRect& aRect)
+ {
+ iContext->CopyRect(aOffset, aRect);
+ }
+
+void CDirectGdiGcWrapper::UpdateJustification(const TDesC& aText,const TTextParameters* aParam)
+ {
+ iContext->UpdateJustification(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam));
+ }
+
+void CDirectGdiGcWrapper::UpdateJustificationVertical(const TDesC& aText,const TTextParameters* aParam,TBool aUp)
+ {
+ iContext->UpdateJustificationVertical(aText, MWsGraphicsContextToDirectGdiMappings::Convert(aParam), aUp);
+ }
+
+void CDirectGdiGcWrapper::SetFontNoDuplicate(const CFont* aFont)
+ {
+ iContext->SetFontNoDuplicate(static_cast<const CDirectGdiFont*>(aFont));
+ }
+
+TBool CDirectGdiGcWrapper::HasBrushPattern() const
+ {
+ return iContext->HasBrushPattern();
+ }
+
+TBool CDirectGdiGcWrapper::HasFont() const
+ {
+ return iContext->HasFont();
+ }
+
+TRgb CDirectGdiGcWrapper::BrushColor() const
+ {
+ return iContext->BrushColor();
+ }
+
+TRgb CDirectGdiGcWrapper::PenColor() const
+ {
+ return iContext->PenColor();
+ }
+
+TRgb CDirectGdiGcWrapper::TextShadowColor() const
+ {
+ return iContext->TextShadowColor();
+ }
+
+TAny* CDirectGdiGcWrapper::ResolveObjectInterface(TUint /*aTypeId*/)
+ {
+ return NULL;
+ }
+
+/**
+Sets the error code. If the error code is already set to a value other
+than KErrNone, the error code will not be modified.
+
+@param aErr The error code to set.
+
+@post The error code has been set.
+*/
+void CDirectGdiGcWrapper::SetError(TInt aError)
+ {
+ if (aError != KErrNone && iErrorCode == KErrNone)
+ {
+ iErrorCode = aError;
+ }
+ }
+
+/**
+Returns the first error code (set as the result of calling some CDirectGdiGcWrapper API), if any,
+since the last call to this function or, if it has not previously been called, since
+the CDirectGdiGcWrapper was constructed. Calling this function clears the error code.
+
+@post The error code has been reset after being read.
+
+@return The first error code, if any, since the last call to this function or,
+ if it has not previously been called, since the CDirectGdiGcWrapper was constructed.
+ KErrNone will indicate that no such error has occurred.
+*/
+TInt CDirectGdiGcWrapper::GetError()
+ {
+ TInt err = iErrorCode;
+ iErrorCode = KErrNone;
+ return err;
+ }
+
+TPoint CDirectGdiGcWrapper::Origin() const
+ {
+ return iOrigin;
+ }
+
+const TRegion& CDirectGdiGcWrapper::ClippingRegion()
+ {
+ return iClippingRegion;
+ }
+
+TInt CDirectGdiGcWrapper::Push()
+ {
+ // the buf format is len+data where data is written by the GC's ExternalizeL()
+ iGcBuf->Reset();
+ CBufBase& buf = *iGcBuf;
+ const TInt start = buf.Size();
+ RBufWriteStream out(buf,start);
+ TRAPD(err,out.WriteInt32L(0));
+ if(!err)
+ {
+ TRAP(err,iContext->ExternalizeL(out));
+ }
+ if(err) //rollback addition
+ {
+ buf.Delete(start,buf.Size()-start);
+ }
+ else //fixup len
+ {
+ TRAP_IGNORE(out.CommitL();) // can't see this failing
+ TPckgBuf<TInt32> pckg(buf.Size()-sizeof(TInt32)-start);
+ buf.Write(start,pckg);
+ }
+ return err;
+ }
+
+void CDirectGdiGcWrapper::Pop()
+ {
+ CBufBase& buf = *iGcBuf;
+ TInt ofs = 0;
+ FOREVER
+ {
+ TInt chunk = 0;
+ RBufReadStream in(buf,ofs);
+ TRAPD(err,chunk = in.ReadInt32L());
+ if(err)
+ {
+ STD_ASSERT_DEBUG(err != 0, EStdPanicPopGcSettings);
+ return;
+ }
+ if(ofs+sizeof(TInt32)+chunk >= buf.Size()) // the last chunk?
+ {
+ TRAP_IGNORE(iContext->InternalizeL(in));
+ buf.Delete(ofs,buf.Size()-ofs);
+ return;
+ }
+ ofs += chunk + sizeof(TInt32);
+ }
+ }
+
+//Default method of fading simply uses bitgdi to perform fading
+void CDirectGdiGcWrapper::FadeArea(const TRegion& aRegion)
+ {
+ if (!&aRegion || aRegion.CheckError())
+ return;
+
+ iContext->Reset();
+ iContext->SetClippingRegion(aRegion);
+ iContext->SetPenStyle(DirectGdi::ENullPen);
+ iContext->SetBrushStyle(DirectGdi::ESolidBrush);
+ iContext->SetBrushColor(iFadeColor);
+ iContext->DrawRect(aRegion.BoundingRect());
+ }
+
+//Default method of fading expects two TUint8's describing the black/white map
+//as possible fading parameters
+void CDirectGdiGcWrapper::SetFadingParameters(const TDesC8& aData)
+ {
+ TPckgBuf<TFadingParams> buf;
+ buf.Copy(aData);
+ TFadingParams parameters = buf();
+
+ //Situations where blackMap > whiteMap are NOT supported
+ if (parameters.blackMap > parameters.whiteMap)
+ {
+ TUint8 oldMap = parameters.blackMap;
+ parameters.blackMap = parameters.whiteMap;
+ parameters.whiteMap = oldMap;
+ }
+
+ //CFbsBitGc::FadeArea() does the following per color component:
+ // dst = dst * (whiteMap - blackMap) + blackMap;
+
+ //To achieve the same effect using MWsGraphicsContext we draw a rectangle
+ //with specific intensity and alpha values:
+ // dst = dst * (1 - alpha) + intensity * alpha;
+ //Thus:
+ // alpha = 1 - whiteMap + blackMap;
+ // intensity = blackMap / alpha;
+
+ // alpha = 1 - whiteMap + blackMap;
+ TInt alpha = 255 - parameters.whiteMap + parameters.blackMap;
+ // intensity = blackMap / alpha;
+ TInt i = (parameters.blackMap * iLut[alpha]) >> 8;
+
+ iFadeColor.SetInternal(i << 16 | i << 8 | i | alpha << 24);
+ }