00001 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 00002 // All rights reserved. 00003 // This component and the accompanying materials are made available 00004 // under the terms of "Eclipse Public License v1.0" 00005 // which accompanies this distribution, and is available 00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". 00007 // 00008 // Initial Contributors: 00009 // Nokia Corporation - initial contribution. 00010 // 00011 // Contributors: 00012 // 00013 // Description: 00014 // 00015 00016 #include <coemain.h> 00017 00018 #include "CDirectDisplayLife.h" 00019 00020 // Dimension of each cell 00021 const TInt CDirectDisplayLife::KBlockSize = 20; 00022 // Delay between generations (microseconds) 00023 // Actual minimum is 1/10s on WINS 00024 const TInt CDirectDisplayLife::KGenerationInterval = 70000; 00025 // X & Y origins of upper left of cell display 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 // Create the DSA object 00049 iDirectScreenAccess = CDirectScreenAccess::NewL( 00050 iClient, // WS session 00051 *(CCoeEnv::Static()->ScreenDevice()), // CWsScreenDevice 00052 iWindow, // RWindowBase 00053 *this // MDirectScreenAccess 00054 ); 00055 00056 CActiveScheduler::Add(this); 00057 } 00058 00059 // Start game display 00060 void CDirectDisplayLife::StartL() 00061 { 00062 // Initialise DSA 00063 iDirectScreenAccess -> StartL(); 00064 // Get graphics context for it 00065 iGc = iDirectScreenAccess -> Gc(); 00066 iGc -> SetBrushStyle(CGraphicsContext::ESolidBrush); 00067 // Get region that DSA can draw in 00068 iRegion = iDirectScreenAccess -> DrawingRegion(); 00069 // Set the display to clip to this region 00070 iGc -> SetClippingRegion(iRegion); 00071 00072 After(TTimeIntervalMicroSeconds32(KGenerationInterval)); 00073 } 00074 00075 // Implement MDirectScreenAccess 00076 void CDirectDisplayLife::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/) 00077 { 00078 // Restart display 00079 // Note that this will result in the clipping region being updated 00080 // so that menus, overlaying dialogs, etc. will not be drawn over 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 /*aReason*/) 00089 { 00090 // Cancel timer and display 00091 Cancel(); 00092 } 00093 00094 // Draw cells using DSA 00095 void CDirectDisplayLife::RunL() 00096 { 00097 // Update engine 00098 iLifeEngine.AddGeneration(); 00099 const TCellArray& iCells = iLifeEngine.GetCellArray(); 00100 00101 // Loop through cells drawing each 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 // Redraw the changed areas 00115 TPoint modified; 00116 modified.iX = iXOrigin+KBlockSize; 00117 modified.iY = iYOrigin+KBlockSize; 00118 00119 // Update the screen for the areas that have been redrawn 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 // Renew request 00128 After(TTimeIntervalMicroSeconds32(KGenerationInterval)); 00129 } 00130 00131 void CDirectDisplayLife::DoCancel() 00132 { 00133 // Cancel timer 00134 CTimer::DoCancel(); 00135 // Cancel DSA 00136 iDirectScreenAccess -> Cancel(); 00137 } 00138
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.