diff -r 000000000000 -r bde4ae8d615e os/graphics/windowing/windowserverplugins/openwfc/src/directgdigcwrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/graphics/windowing/windowserverplugins/openwfc/src/directgdigcwrapper.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,705 @@ +// 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 +#include +#include +#include +#include +#include "mwsgraphicscontexttodirectgdimappings.h" +#include "panic.h" + +CDirectGdiGcWrapper* CDirectGdiGcWrapper::NewL() + { + CDirectGdiGcWrapper* self = new(ELeave) CDirectGdiGcWrapper; + CleanupStack::PushL(self); + CDirectGdiDriver* driver = CDirectGdiDriver::Static(); + User::LeaveIfNull(driver); + self->iContext = CDirectGdiContext::NewL(*driver); + 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; + for (TInt i = 0; i < iDrawableSources.Count(); ++i) + { + iDrawableSources[i]->Close(); + } + iDrawableSources.ResetAndDestroy(); + iClippingRegion.Close(); + } + +TAny* CDirectGdiGcWrapper::ResolveObjectInterface(TUint aTypeId) + { + switch(aTypeId) + { + case MWsGraphicsContext::EWsObjectInterfaceId: + return static_cast(this); + case MWsFader::EWsObjectInterfaceId: + return static_cast(this); + case MWsDrawableSourceProvider::EWsObjectInterfaceId: + return static_cast(this); + case MWsTextCursor::EWsObjectInterfaceId: + return static_cast(this); + } + return NULL; + } + +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& aPointList) + { + iContext->DrawPolyLine(aPointList); + } + +void CDirectGdiGcWrapper::DrawPolyLineNoEndPoint(const TArray& aPointList) + { + iContext->DrawPolyLineNoEndPoint(aPointList); + } + +void CDirectGdiGcWrapper::DrawPolygon(const TArray& 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(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(); + } + +TInt CDirectGdiGcWrapper::CreateDrawableSource(const TSgDrawableId& aDrawableId, TAny*& aSource) + { + CDirectGdiDriver* driver = CDirectGdiDriver::Static(); + if (!driver) + { + return KErrNotReady; + } + RDirectGdiDrawableSource* drawableSource = new RDirectGdiDrawableSource(*driver); + if (!drawableSource) + { + return KErrNoMemory; + } + + //check usage flags if the drawable is an RSgImage + RSgImage image; + TInt res = image.Open(aDrawableId); + if (res == KErrNone) + { + TSgImageInfo info; + res = image.GetInfo(info); + image.Close(); + if (res == KErrNone && !(info.iUsage & ESgUsageWindowGcSource)) + { + res = KErrNotSupported; + } + + if (res != KErrNone) + { + delete drawableSource; + return res; + } + } + + RSgDrawable drawable; + res = drawable.Open(aDrawableId, ESgDoNotRestrictUsage); + if (res != KErrNone) + { + delete drawableSource; + return res; + } + res = drawableSource->Create(drawable); + drawable.Close(); + if (res != KErrNone) + { + delete drawableSource; + return res; + } + res = iDrawableSources.InsertInAddressOrder(drawableSource); + if (res != KErrNone) + { + drawableSource->Close(); + delete drawableSource; + return res; + } + aSource = drawableSource; + return KErrNone; + } + +void CDirectGdiGcWrapper::CloseDrawableSource(TAny* aSource) + { + RDirectGdiDrawableSource* drawableSource = static_cast(aSource); + TInt index = iDrawableSources.FindInAddressOrder(drawableSource); + if (index != KErrNotFound) + { + drawableSource->Close(); + delete drawableSource; + iDrawableSources.Remove(index); + } + } + +void CDirectGdiGcWrapper::DrawResource(const TAny* aSource, const TPoint& aPos, CWindowGc::TGraphicsRotation aRotation) + { + const RDirectGdiDrawableSource* drawableSource = static_cast(aSource); + TInt index = iDrawableSources.FindInAddressOrder(drawableSource); + if (index == KErrNotFound) + { + STD_ASSERT_DEBUG(0, EPluginPanicInvalidDrawableSource); + return; + } + iContext->DrawResource(aPos, *drawableSource, (DirectGdi::TGraphicsRotation)aRotation); + } + +void CDirectGdiGcWrapper::DrawResource(const TAny* aSource, const TRect& aRect, CWindowGc::TGraphicsRotation aRotation) + { + const RDirectGdiDrawableSource* drawableSource = static_cast(aSource); + TInt index = iDrawableSources.FindInAddressOrder(drawableSource); + if (index == KErrNotFound) + { + STD_ASSERT_DEBUG(0, EPluginPanicInvalidDrawableSource); + return; + } + iContext->DrawResource(aRect, *drawableSource, (DirectGdi::TGraphicsRotation)aRotation); + } + +void CDirectGdiGcWrapper::DrawResource(const TAny* aSource, const TRect& aRectDest, const TRect& aRectSrc, CWindowGc::TGraphicsRotation aRotation) + { + const RDirectGdiDrawableSource* drawableSource = static_cast(aSource); + TInt index = iDrawableSources.FindInAddressOrder(drawableSource); + if (index == KErrNotFound) + { + STD_ASSERT_DEBUG(0, EPluginPanicInvalidDrawableSource); + return; + } + iContext->DrawResource(aRectDest, *drawableSource, aRectSrc, (DirectGdi::TGraphicsRotation)aRotation); + } + +void CDirectGdiGcWrapper::DrawResource(const TAny* aSource, const TRect& aRect, const TDesC8& aDes) + { + const RDirectGdiDrawableSource* drawableSource = static_cast(aSource); + TInt index = iDrawableSources.FindInAddressOrder(drawableSource); + if (index == KErrNotFound) + { + STD_ASSERT_DEBUG(0, EPluginPanicInvalidDrawableSource); + return; + } + iContext->DrawResource(aRect, *drawableSource, aDes); + } + +/** +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 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, EPluginPanicPopGcSettings); + 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 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); + } + +void CDirectGdiGcWrapper::DrawTextCursor(const TTextCursorInfo& aTextCursorInfo) + { + /* + * This function is written with the following assumption: + * The UI Toolkit uses text entry windows with a white background + * and black text, but always requests a white text cursor. + * + * We therefore ignore the KRgbWhite text cursor cursor supplied + * and use a Black overprinting strategy instead. + */ + STD_ASSERT_ALWAYS( + aTextCursorInfo.iTextCursorType == TTextCursor::ETypeRectangle || + aTextCursorInfo.iTextCursorType == TTextCursor::ETypeHollowRectangle, + EPluginPanicInvalidCursorType + ); + + TRegionFix<1> fullWindowRegion; + const TRegion* clippingRegion = &aTextCursorInfo.iRegion; + if (aTextCursorInfo.iRegion.CheckError()) + { + fullWindowRegion.AddRect(aTextCursorInfo.iWindow->AbsRect()); + clippingRegion = &fullWindowRegion; + } + + if (clippingRegion->IsEmpty()) + { + return; + } + + iContext->SetDrawMode(DirectGdi::EDrawModePEN); + switch (aTextCursorInfo.iTextCursorType) + { + case TTextCursor::ETypeRectangle: + { + iContext->SetBrushStyle(DirectGdi::ESolidBrush); + iContext->SetPenStyle(DirectGdi::ENullPen); + iContext->SetBrushColor(KRgbBlack); + } + break; + case TTextCursor::ETypeHollowRectangle: + { + iContext->SetBrushStyle(DirectGdi::ENullBrush); + iContext->SetPenStyle(DirectGdi::ESolidPen); + iContext->SetPenColor(KRgbBlack); + } + break; + } + iContext->SetClippingRegion(*clippingRegion); + /* + * During Sprite drawing, the GC gets reset. Possibly other code could + * have done this also. So make sure we setup the origin so that window-relative + * co-ordinates work as expected; iCursorRect is in window co-ordinates. + */ + iContext->SetOrigin(aTextCursorInfo.iWindow->Origin()); + iContext->DrawRect(aTextCursorInfo.iCursorRect); + }