00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <coemain.h>
00017
00018 #include "CDirectDisplayLife.h"
00019
00020
00021 const TInt CDirectDisplayLife::KBlockSize = 20;
00022
00023
00024 const TInt CDirectDisplayLife::KGenerationInterval = 70000;
00025
00026 const TInt CDirectDisplayLife::iXOrigin = 50;
00027 const TInt CDirectDisplayLife::iYOrigin = 30;
00028
00029 CDirectDisplayLife::CDirectDisplayLife(RWsSession& aClient,
00030 RWindow& aWindow,
00031 CLifeEngine& aLifeEngine)
00032 : CTimer(CActive::EPriorityStandard),
00033 iClient(aClient),
00034 iWindow(aWindow),
00035 iLifeEngine(aLifeEngine)
00036 {
00037 }
00038
00039 CDirectDisplayLife::~CDirectDisplayLife()
00040 {
00041 Cancel();
00042 delete iDirectScreenAccess;
00043 }
00044
00045 void CDirectDisplayLife::ConstructL()
00046 {
00047 CTimer::ConstructL();
00048
00049 iDirectScreenAccess = CDirectScreenAccess::NewL(
00050 iClient,
00051 *(CCoeEnv::Static()->ScreenDevice()),
00052 iWindow,
00053 *this
00054 );
00055
00056 CActiveScheduler::Add(this);
00057 }
00058
00059
00060 void CDirectDisplayLife::StartL()
00061 {
00062
00063 iDirectScreenAccess -> StartL();
00064
00065 iGc = iDirectScreenAccess -> Gc();
00066 iGc -> SetBrushStyle(CGraphicsContext::ESolidBrush);
00067
00068 iRegion = iDirectScreenAccess -> DrawingRegion();
00069
00070 iGc -> SetClippingRegion(iRegion);
00071
00072 After(TTimeIntervalMicroSeconds32(KGenerationInterval));
00073 }
00074
00075
00076 void CDirectDisplayLife::Restart(RDirectScreenAccess::TTerminationReasons )
00077 {
00078
00079
00080
00081 TRAPD(err,StartL());
00082 if(err != KErrNone)
00083 {
00084 User::Panic(_L("Failed to Restart display"),err);
00085 }
00086 }
00087
00088 void CDirectDisplayLife::AbortNow(RDirectScreenAccess::TTerminationReasons )
00089 {
00090
00091 Cancel();
00092 }
00093
00094
00095 void CDirectDisplayLife::RunL()
00096 {
00097
00098 iLifeEngine.AddGeneration();
00099 const TCellArray& iCells = iLifeEngine.GetCellArray();
00100
00101
00102 TRect drawBlock(iXOrigin, iYOrigin, iXOrigin+KBlockSize,iYOrigin+KBlockSize);
00103 for (int y=0; y<DIM_Y_ARRAY; y++)
00104 {
00105 for (int x=0; x<DIM_X_ARRAY; x++)
00106 {
00107 if (iCells[x][y])
00108 iGc -> SetBrushColor(KRgbBlue);
00109 else
00110 iGc -> SetBrushColor(KRgbYellow);
00111 iGc -> DrawRect(drawBlock);
00112 drawBlock.Move(KBlockSize,0);
00113
00114
00115 TPoint modified;
00116 modified.iX = iXOrigin+KBlockSize;
00117 modified.iY = iYOrigin+KBlockSize;
00118
00119
00120 iDirectScreenAccess->ScreenDevice()->Update();
00121 }
00122 drawBlock.iTl.iX = iXOrigin;
00123 drawBlock.iBr.iX = iXOrigin+KBlockSize;
00124 drawBlock.Move(0,KBlockSize);
00125 }
00126 iClient.Flush();
00127
00128 After(TTimeIntervalMicroSeconds32(KGenerationInterval));
00129 }
00130
00131 void CDirectDisplayLife::DoCancel()
00132 {
00133
00134 CTimer::DoCancel();
00135
00136 iDirectScreenAccess -> Cancel();
00137 }
00138