--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/HANDANIM.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,413 @@
+// Copyright (c) 1999-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:
+// Anim DLL to deal with handwriting
+//
+//
+
+#include "HANDANIM.H"
+
+#define DEFAUlT_LINE_WIDTH 4
+#define DEFAUlT_MASK_WIDTH_FACTOR 3
+#define DEFAUlT_END_POINT_FACTOR 2
+#define BLACK TRgb::Gray2(0)
+#define WHITE TRgb::Gray2(1)
+
+#define leavescan_needs_to_see_some_brackets_here { }
+EXPORT_C CAnimDll *CreateCAnimDllL()
+ {
+ return(new(ELeave) CHandWritingAnimDll());
+ }
+
+
+/*CHandWritingAnimDll*/
+
+CAnim *CHandWritingAnimDll::CreateInstanceL(TInt /*aType*/)
+ {
+ return new(ELeave) CHandWritingAnim();
+ }
+
+
+/*CHandWritingAnim*/
+
+CHandWritingAnim::~CHandWritingAnim()
+ {
+ iFunctions->GetRawEvents(EFalse);
+ delete iBitmapDevice;
+ delete iMaskBitmapDevice;
+ }
+
+void CHandWritingAnim::Activate()
+ {
+ if (iState==EHwStateDeactive)
+ {
+ iState=EHwStateInactive;
+ iFunctions->GetRawEvents(ETrue);
+ }
+ }
+
+void CHandWritingAnim::Deactivate()
+ {
+ if (iState!=EHwStateDeactive)
+ {
+ iState=EHwStateDeactive;
+ iFunctions->GetRawEvents(EFalse);
+ iSpriteFunctions->Activate(EFalse);
+ ClearSprite();
+ }
+ }
+
+void CHandWritingAnim::SpriteChangeL(TBool aUsingSeparateMask)
+ {
+ if (aUsingSeparateMask)
+ {
+ TSpriteMember *spriteMember=iSpriteFunctions->GetSpriteMember(0);
+ iMaskBitmapDevice=CFbsBitmapDevice::NewL(spriteMember->iMaskBitmap); //If this leaves the error value will be returned to the client side
+ }
+ else
+ {
+ delete iMaskBitmapDevice;
+ iMaskBitmapDevice=NULL;
+ iDrawData.iLineColor=BLACK; //Must use black ink when there is no mask
+ iDrawData.iInitialBitmapColor=WHITE; //Must have white background when there is no mask
+ }
+ iIsMask=aUsingSeparateMask;
+ }
+
+void CHandWritingAnim::SetDrawData(THandwritingDrawData *aDrawData)
+ {
+ iDrawData=*aDrawData;
+ if (!iIsMask)
+ {
+ iDrawData.iLineColor=BLACK; //Must use black ink when there is no mask
+ iDrawData.iInitialBitmapColor=WHITE; //Must have white background when there is no mask
+ }
+ }
+
+TBool CHandWritingAnim::HandlePointerDown(TPoint aPoint)
+ {
+ if (iState==EHwStateWaitingMove)
+ return EFalse;
+ iCurrentDrawPoint=aPoint;
+ if (iState==EHwStateInactive)
+ {
+ iState=EHwStateWaitingMove;
+ StartTimer();
+ return ETrue;
+ }
+ iState=EHwStateDrawing;
+ DrawPoint();
+ UpdateSprite();
+ return ETrue;
+ }
+
+TBool CHandWritingAnim::HandlePointerMove(TPoint aPoint)
+ {
+ switch (iState)
+ {
+ case EHwStateWaitingMove:
+ {
+ TPoint moved=aPoint-iCurrentDrawPoint;
+ if (Abs(moved.iX)<5 && Abs(moved.iY)<5) //Need to do something with these constants
+ return ETrue;
+ iSpriteFunctions->Activate(ETrue);
+ DrawPoint();
+ iState=EHwStateDrawing;
+ }
+ case EHwStateDrawing:
+ break;
+ default:
+ return EFalse;
+ }
+ DrawLine(aPoint);
+ UpdateSprite();
+ return ETrue;
+ }
+
+TBool CHandWritingAnim::HandlePointerUp(TPoint aPoint)
+ {
+ if (iState==EHwStateInactive)
+ return EFalse;
+ else if (iState==EHwStateWaitingMove)
+ {
+ TPoint moved=aPoint-iCurrentDrawPoint;
+ if (Abs(moved.iX)<5 && Abs(moved.iY)<5) //Need to do something with these constants
+ {
+ SendEatenDownEvent();
+ return EFalse;
+ }
+ iSpriteFunctions->Activate(ETrue);
+ DrawPoint();
+ }
+ DrawLine(aPoint);
+ DrawPoint();
+ UpdateSprite();
+ iState=EHwStateWaitingStroke;
+ StartTimer();
+ return ETrue;
+ }
+
+void CHandWritingAnim::DrawPoint()
+ {
+ iSpriteGc->Activate(iBitmapDevice);
+ iSpriteGc->SetPenSize(TSize(iDrawData.iEndPontWidth,iDrawData.iEndPontWidth));
+ iSpriteGc->SetPenColor(iDrawData.iLineColor);
+ iSpriteGc->Plot(iCurrentDrawPoint);
+ if (iMaskBitmapDevice)
+ {
+ iSpriteGc->Activate(iMaskBitmapDevice);
+ iSpriteGc->SetPenSize(TSize(iDrawData.iMaskLineWidth,iDrawData.iMaskLineWidth));
+ iSpriteGc->SetPenColor(BLACK); //Mask must be drawn in black
+ iSpriteGc->Plot(iCurrentDrawPoint);
+ }
+ iPointStore->AddPoint(iCurrentDrawPoint);
+ }
+
+void CHandWritingAnim::DrawLine(TPoint aEndPoint)
+ {
+ iSpriteGc->Activate(iBitmapDevice);
+ iSpriteGc->SetPenSize(TSize(iDrawData.iLineWidth,iDrawData.iLineWidth));
+ iSpriteGc->SetPenColor(iDrawData.iLineColor);
+ iSpriteGc->MoveTo(iCurrentDrawPoint);
+ iSpriteGc->DrawLineTo(aEndPoint);
+ if (iMaskBitmapDevice)
+ {
+ iSpriteGc->Activate(iMaskBitmapDevice);
+ iSpriteGc->SetPenSize(TSize(iDrawData.iMaskLineWidth,iDrawData.iMaskLineWidth));
+ iSpriteGc->SetPenColor(BLACK); //Mask must be drawn in black
+ iSpriteGc->MoveTo(iCurrentDrawPoint);
+ iSpriteGc->DrawLineTo(aEndPoint);
+ }
+ iCurrentDrawPoint=aEndPoint;
+ iPointStore->AddPoint(aEndPoint);
+ }
+
+void CHandWritingAnim::UpdateSprite()
+ {
+ TRect drawTo;
+ iSpriteGc->RectDrawnTo(drawTo);
+ iSpriteFunctions->UpdateMember(0,drawTo,EFalse);
+ }
+
+void CHandWritingAnim::StartTimer()
+ {
+ iFunctions->SetNextInterval(2);
+ }
+
+void CHandWritingAnim::SendEatenDownEvent()
+ {
+ TRawEvent rawEvent;
+ rawEvent.Set(TRawEvent::EButton1Down,iCurrentDrawPoint.iX,iCurrentDrawPoint.iY);
+ iFunctions->PostRawEvent(rawEvent);
+ iState=EHwStateInactive;
+ }
+
+void CHandWritingAnim::CharacterFinished()
+ {
+ iState=EHwStateInactive;
+ iLastGeneratedCharacter=iPointStore->GetChar();
+ /*TRawEvent rawEvent;
+ rawEvent.Set(TRawEvent::EKeyDown,iLastGeneratedCharacter);
+ iFunctions->PostKeyEvent(rawEvent);*/
+ TKeyEvent keyEvent;
+ keyEvent.iCode=keyEvent.iScanCode=iLastGeneratedCharacter;
+ keyEvent.iModifiers=keyEvent.iRepeats=0;
+ iFunctions->PostKeyEvent(keyEvent);
+ iPointStore->ClearPoints();
+ iSpriteFunctions->Activate(EFalse);
+ ClearSprite();
+ }
+
+void CHandWritingAnim::ClearSprite()
+ {
+ iSpriteGc->Activate(iBitmapDevice);
+ iSpriteGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+ iSpriteGc->SetBrushColor(iDrawData.iInitialBitmapColor);
+ iSpriteGc->Clear();
+ if (iMaskBitmapDevice)
+ {
+ iSpriteGc->Activate(iMaskBitmapDevice);
+ iSpriteGc->SetBrushColor(WHITE); //Mask must be cleared in white
+ iSpriteGc->Clear();
+ }
+ TRect drawnTo;
+ iSpriteGc->RectDrawnTo(drawnTo); //Clear the drawnTo rect.
+ }
+
+TBool CHandWritingAnim::OfferRawEvent(const TRawEvent &aRawEvent)
+ {
+ if (iState==EHwStateDeactive)
+ return EFalse;
+ switch (aRawEvent.Type())
+ {
+ case TRawEvent::EButton1Down:
+ {
+ iDownTime.HomeTime();
+ return HandlePointerDown(aRawEvent.Pos());
+ }
+ case TRawEvent::EPointerMove:
+ return HandlePointerMove(aRawEvent.Pos());
+ case TRawEvent::EButton1Up:
+ return HandlePointerUp(aRawEvent.Pos());
+ default:
+ return EFalse;
+ }
+ }
+
+void CHandWritingAnim::ConstructL(TAny *)
+ {
+ TSpriteMember *spriteMember=iSpriteFunctions->GetSpriteMember(0);
+ iIsMask=(spriteMember->iBitmap->Handle() != spriteMember->iMaskBitmap->Handle());
+ iBitmapDevice=CFbsBitmapDevice::NewL(spriteMember->iBitmap);
+ if (iIsMask)
+ iMaskBitmapDevice=CFbsBitmapDevice::NewL(spriteMember->iMaskBitmap);
+ iState=EHwStateDeactive;
+ iSpriteGc=CFbsBitGc::NewL();
+ iSpriteGc->Reset();
+ iDrawData.iLineColor=BLACK;
+ iDrawData.iInitialBitmapColor=WHITE;
+ iDrawData.iLineWidth=DEFAUlT_LINE_WIDTH;
+ iDrawData.iMaskLineWidth=DEFAUlT_MASK_WIDTH_FACTOR*DEFAUlT_LINE_WIDTH;
+ iDrawData.iEndPontWidth=DEFAUlT_END_POINT_FACTOR*DEFAUlT_LINE_WIDTH;
+ iSpriteFunctions->SizeChangedL();
+ iPointStore=new(ELeave) CPointStore();
+ iPointStore->ConstructL();
+ }
+
+void CHandWritingAnim::Animate(TDateTime* /*aDateTime*/)
+ {
+ iFunctions->SetInterval(0);
+ if (iState==EHwStateWaitingMove)
+ SendEatenDownEvent();
+ else if (iState==EHwStateWaitingStroke)
+ CharacterFinished();
+ }
+
+void CHandWritingAnim::Redraw()
+ {
+ }
+
+void CHandWritingAnim::Command(TInt aOpcode,TAny *aParams)
+ {
+ switch (aOpcode)
+ {
+ case EHwOpActivate:
+ Activate();
+ break;
+ case EHwOpDeactivate:
+ Deactivate();
+ break;
+ case EHwOpSetDrawData:;
+ SetDrawData(STATIC_CAST(THandwritingDrawData*,aParams));
+ break;
+ default:
+ iFunctions->Panic();
+ }
+ }
+
+void CHandWritingAnim::FocusChanged(TBool )
+ {
+ }
+
+TInt CHandWritingAnim::CommandReplyL(TInt aOpcode,TAny *aParams)
+ {
+ switch (aOpcode)
+ {
+ case EHwOpSpriteMask:
+ SpriteChangeL(*STATIC_CAST(TBool*,aParams));
+ break;
+ case EHwOpGetLastChar:
+ return iLastGeneratedCharacter;
+ default:
+ iFunctions->Panic();
+ }
+ return KErrNone;
+ }
+
+
+/*CPointStore*/
+
+CPointStore::CPointStore()
+ {}
+
+void CPointStore::ConstructL()
+ {
+ iPoints=new(ELeave) CArrayFixFlat<TPoint>(16);
+ iPoints->ResizeL(256);
+ }
+
+void CPointStore::AddPoint(TPoint aPoint)
+ {
+ if (iNumPoints<256)
+ (*iPoints)[iNumPoints++]=aPoint;
+ }
+
+TInt CPointStore::GetChar()
+ {
+ TPoint oldPoint=(*iPoints)[0];
+ TPoint newPoint;
+ TPoint totalPoint=oldPoint;
+ TInt xInc=0,xDec=0,yInc=0,yDec=0;
+ TInt yState=0,xState=0;
+ TInt ii;
+ for (ii=1;ii<iNumPoints;++ii)
+ {
+ newPoint=(*iPoints)[ii];
+ totalPoint+=newPoint;
+ if (newPoint.iX>oldPoint.iX)
+ ++xInc;
+ if (newPoint.iX<oldPoint.iX)
+ ++xDec;
+ if (newPoint.iY>oldPoint.iY)
+ ++yInc;
+ if (newPoint.iY<oldPoint.iY)
+ ++yDec;
+ oldPoint=newPoint;
+ }
+ newPoint-=(*iPoints)[0];
+ if (10*yInc<yDec)
+ yState=-1;
+ else if (yInc>10*yDec)
+ yState=1;
+ if (10*xInc<xDec)
+ xState=-1;
+ else if (xInc>10*xDec)
+ xState=1;
+ if (xState!=0 && yState!=0)
+ {
+ if (Abs(newPoint.iY)<Abs(newPoint.iX))
+ yState=0;
+ else
+ xState=0;
+ }
+ if (xState!=0)
+ return xState>0 ? EKeyRightArrow:EKeyLeftArrow;
+ if (yState!=0)
+ return yState>0 ? EKeyDownArrow:EKeyUpArrow;
+ TInt firstChar='a';
+ TInt numChars=26;
+ TInt type=(totalPoint.iY/10)%10;
+ if (type>5)
+ firstChar='A';
+ else if (type==0)
+ {
+ firstChar='0';
+ numChars=10;
+ }
+ return firstChar+((totalPoint.iX/10)%numChars);
+ }
+
+void CPointStore::ClearPoints()
+ {
+ iNumPoints=0;
+ }