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