|
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // Defines the screen class (was in scrdev.h) |
|
15 // |
|
16 // |
|
17 |
|
18 #ifndef __SCREEN_H__ |
|
19 #define __SCREEN_H__ |
|
20 |
|
21 #include <e32std.h> |
|
22 #include <e32base.h> |
|
23 #include <graphics/surface.h> |
|
24 #include <hal_data.h> |
|
25 #include <graphics/wsscene.h> |
|
26 #include <graphics/wsdisplaypolicy.h> |
|
27 |
|
28 #include "W32STD.H" |
|
29 #include "w32cmd.h" |
|
30 #include "wstypes.h" |
|
31 #include <Graphics/WSGRAPHICDRAWERINTERFACE.H> |
|
32 #include "panics.h" |
|
33 |
|
34 #include "wsdisplaychangeao.h" |
|
35 |
|
36 |
|
37 class CWsDirectScreenAccess; |
|
38 |
|
39 class CWsWindowGroup; |
|
40 class CWsWindow; |
|
41 class CWsRootWindow; |
|
42 class CWsClientWindow; |
|
43 class CDebugBar; |
|
44 class CScreenRedraw; |
|
45 class CWsSpriteManager; |
|
46 class CWindowElementSet; |
|
47 class CActiveComposer; |
|
48 class CRegisteredSurfaceMap; |
|
49 class MWsScene; |
|
50 class MWsElement; |
|
51 class MWsScreenDevice; |
|
52 class MWsDisplayMapping; |
|
53 class MWsDisplayControl; |
|
54 class MWsTextCursor; |
|
55 class CGraphicsDeviceMap; |
|
56 class TDisplayConfiguration; |
|
57 #if defined(__WINS__) && defined(_DEBUG) |
|
58 class CDebugOsbWin; |
|
59 #endif |
|
60 |
|
61 enum TAnimType |
|
62 { |
|
63 EWindowAnim = 0x01, |
|
64 ESpriteAnim = 0x02, |
|
65 ETextCursor = 0x04, |
|
66 EWindowSprite = 0x08, |
|
67 EFloatingSprite = 0x10, |
|
68 EFloatingSpriteAnim = 0x20, |
|
69 ECrpAnim = 0x40, |
|
70 }; |
|
71 |
|
72 _LIT(KWSERVIniFileVarChangeTracking, "CHANGETRACKING"); |
|
73 |
|
74 class CScreen : public CBase, public MWsScreen, public MWsScreenConfigList, public MWsScreenConfig, public MWsWindowTree |
|
75 { |
|
76 public: |
|
77 enum {EGetScanLineBufLen=0x100}; // Buffer of for returning result of GetScanLine |
|
78 enum TDisplayScreen |
|
79 { |
|
80 EBlankScreenOnRotation = 0x1, |
|
81 EAutoClear = 0x2, |
|
82 EHasDynamicSizeModes = 0x04, |
|
83 EChangeTracking = 0x8, |
|
84 }; |
|
85 |
|
86 /** |
|
87 The fallback map is an array of 32 bit integers sufficiently large to store a single bit for any |
|
88 possible orientation and size of the screen, with the pixel rows padded to the end of the int. |
|
89 */ |
|
90 class CFallbackMap : public CBase |
|
91 { |
|
92 public: |
|
93 static CFallbackMap * NewL(CScreen* aScreen); |
|
94 ~CFallbackMap(); |
|
95 |
|
96 void Prepare(); |
|
97 TBool FillRegion(const TRegion& aRegion); |
|
98 TBool FillRect(const TRect& aRect); |
|
99 TInt Count() const; |
|
100 const TRect * Rect() const; |
|
101 const RRegion * Region() const; |
|
102 TInt Resize(const TSize& aSize); |
|
103 |
|
104 private: |
|
105 CFallbackMap(CScreen* aScreen); |
|
106 void ConstructL(); |
|
107 |
|
108 public: |
|
109 CScreen* iScreen; |
|
110 RRegionBuf<1> iRegion; |
|
111 TInt iCount; |
|
112 TInt iMapSize; // size in padded TInts |
|
113 TInt * iMap; |
|
114 }; |
|
115 public: |
|
116 CScreen(); |
|
117 ~CScreen(); |
|
118 void ConstructL( const TRect& aDigitiserArea, TInt aScreenNumber); |
|
119 void AbortAllDirectDrawing(RDirectScreenAccess::TTerminationReasons aReason); |
|
120 void AddDirect(CWsDirectScreenAccess& aDirect); |
|
121 void RemoveDirect(CWsDirectScreenAccess& aDirect); |
|
122 void AbortDSAs(RDirectScreenAccess::TTerminationReasons aReason,TSglQue<CWsDirectScreenAccess>& aDirects); |
|
123 void ReleaseDsaScreenDevice(); |
|
124 void AcquireDsaScreenDeviceL(); |
|
125 void CreateDsaScreenDeviceIfSupportedL(TDisplayMode aScreenMode); |
|
126 TBool DoCreateDsaScreenDevice(TDisplayMode aScreenMode); |
|
127 #if defined(_DEBUG) |
|
128 TBool IsDirectOnQueue(const CWsDirectScreenAccess* aDirect); |
|
129 #endif |
|
130 |
|
131 inline CWsWindowGroup* FocusWindowGroup(); |
|
132 void KillForegroundSession(); |
|
133 void ResetFocus(CWsWindowGroup *aClosingWindow); |
|
134 inline TBool BlankScreenOnRotation(); |
|
135 inline TBool AutoClear(); |
|
136 void RemoveFromDefaultOwningList(CWsWindowGroup *aDestroyedGroup); |
|
137 void SetDefaultOwningWindow(CWsWindowGroup *aGroup); |
|
138 inline CWsWindowGroup *DefaultOwningWindowGroup(); |
|
139 const MWsScreenDevice& ScreenDevice() const; |
|
140 const CGraphicsDeviceMap& DeviceMap() const; |
|
141 inline const TSurfaceId& DsaSurface() const; |
|
142 inline CWsRootWindow* RootWindow() const; |
|
143 inline TInt ScreenNumber() const; |
|
144 void UpdateDsa(); |
|
145 inline TDisplayMode DefaultDisplayMode(const TInt aMode) const; |
|
146 TDisplayMode FirstDefaultDisplayMode() const; |
|
147 void MaxNumColors(TInt& aColors,TInt& aGrays); |
|
148 TInt ColorModesFlag(); |
|
149 inline void GetFadingParams(TUint8& aBlackMap,TUint8& aWhiteMap) const; |
|
150 inline void SetFadingParams(TUint8 aBlackMap,TUint8 aWhiteMap); |
|
151 void GetScanLine(const TWsSdCmdGetScanLine *aGetScanLine); |
|
152 |
|
153 TBool SetScreenModeEnforcement(TInt aMode); |
|
154 inline TInt ScreenSizeMode() const; |
|
155 void SetPointerCursorArea(TInt aMode,const TRect& aRect); |
|
156 inline TRect GetPointerCursorArea(TInt aMode) const; |
|
157 CFbsBitGc::TGraphicsOrientation Orientation() const; |
|
158 void CycleDisplaySize(); |
|
159 TBool UpdateOrientation(MWsScene::TSceneRotation* aOldRotation = NULL); |
|
160 void doSetScreenMode(TInt aMode,TBool aInsideStartup=EFalse); |
|
161 inline TSize CurrentScreenSize() const; |
|
162 TRect DrawableArea() const; |
|
163 void CycleOrientation(); |
|
164 TClientPanic SetModeRotation(TInt aMode,CFbsBitGc::TGraphicsOrientation aRotation); |
|
165 void LoadScreenSizesL(TSize aScreenSize); |
|
166 void LoadScreenSizeProperties(TDisplayMode aDefaultDisplayMode); |
|
167 void SetDigitiserAreas(const TSize& aUiSize); |
|
168 inline TInt NumScreenSizeModes() const; |
|
169 inline const TSizeMode& ScreenSizeModeData() const; |
|
170 inline const TSizeMode& ScreenSizeModeData(TInt aMode) const; |
|
171 inline TScreenModeEnforcement SizeEnforcementMode() const; |
|
172 void GetScreenSizeAndRotation(TPixelsTwipsAndRotation &aSar, TInt aScreenMode); |
|
173 void GetScreenSizeAndRotation(TPixelsAndRotation &aSar, TInt aScreenMode); |
|
174 void SetCurrentScreenModeAttributes(const TSizeMode &aModeData); |
|
175 TPoint PhysicalToLogical(TPoint aPhysicalPt); |
|
176 void IncContrast(); |
|
177 void DecContrast(); |
|
178 void IncBrightness(); |
|
179 void DecBrightness(); |
|
180 inline TBool IsValidScreenSizeMode(TInt aMode) const; |
|
181 TInt GetScreenSizeModeListL(); |
|
182 // called by CWsGc when it is implementing MWsGc |
|
183 const TTime& Now() const; |
|
184 void ScheduleAnimation(TAnimType aType, const TRect& aRect,const TTimeIntervalMicroSeconds& aFromNow,const TTimeIntervalMicroSeconds& aFreq,const TTimeIntervalMicroSeconds& aStop, CWsWindow* aWindow); |
|
185 TBool IsScheduled(TAnimType aType, const TRect& aRect, CWsWindow* aWindow) const; |
|
186 // redraw scheduling code |
|
187 void AddRedrawRegion(const TRegion& aRegion, TBool aSchedule = ETrue, TRedrawDepth aDepth = ERedrawAll); |
|
188 void ScheduleRender(const TTimeIntervalMicroSeconds& aFromNow); |
|
189 void DoRedrawNow(); |
|
190 void RedrawNowIfPending(); |
|
191 void ScheduleRegionUpdate(const TRegion* aDefinitelyDirty); |
|
192 // implementing MWsScreen |
|
193 void OnAnimation(TRequestStatus* aFinished); |
|
194 void Redraw(); |
|
195 TBool RedrawInvalid(const TArray<TGraphicDrawerId>& aInvalid); |
|
196 inline TBool BackLightFlag(); |
|
197 // implementing interface extension |
|
198 TAny* ResolveObjectInterface(TUint aTypeId); |
|
199 |
|
200 // implementing MWsScreenConfig... this might be better as RS interface, but half methods are in here! |
|
201 TSize ScreenModeSizeInPixels() const; |
|
202 TInt Stride() const; |
|
203 TInt SizeMode() const; |
|
204 TSize ScalingFactor() const; |
|
205 TPoint Origin() const; |
|
206 TPoint ScaledOrigin() const; |
|
207 |
|
208 // implementing MWsScreenConfigList |
|
209 TInt GetScreenSizeModeList(RArray<TInt>&aList) const; |
|
210 TDisplayMode DisplayModeL(TInt aIndex) const; |
|
211 TSize ScreenModeSizeInPixelsL(TInt aIndex) const; |
|
212 /** Get screen size in twips for current screen size mode as defined in wsini */ |
|
213 TSize ScreenModeSizeInTwipsL(TInt aIndex) const; |
|
214 CFbsBitGc::TGraphicsOrientation OrientationL(TInt aIndex) const; |
|
215 TInt AvailableOrientationsL(TInt aIndex) const; |
|
216 TSize ScalingFactorL(TInt aIndex) const; |
|
217 TPoint OriginL(TInt aIndex) const; |
|
218 TPoint ScaledOriginL(TInt aIndex) const; |
|
219 TInt ModeFlagsL(TInt aIndex) const; |
|
220 |
|
221 //implementing MWsWindowTree |
|
222 void SendTree() const; |
|
223 |
|
224 // other public methods |
|
225 |
|
226 TDisplayMode DisplayMode() const; |
|
227 TSize SizeInPixels() const; |
|
228 TSize SizeInTwips() const; |
|
229 TSize DSASizeInPixels() const; |
|
230 inline CWindowElementSet& WindowElements() const; |
|
231 inline MWsElement& UiElement() const; |
|
232 void ElementAdded(); |
|
233 void ElementRemoved(); |
|
234 //check if the current display mode has alpha |
|
235 inline TBool HasAlpha() const; |
|
236 //list of session and surface id |
|
237 CRegisteredSurfaceMap* SurfaceMap(); |
|
238 |
|
239 void DiscardAllSchedules(); |
|
240 inline CDebugBar * DebugBar(); |
|
241 inline CFallbackMap * FallbackMap(); |
|
242 inline CWsSpriteManager* SpriteManager() const; |
|
243 TBool IsQuickFadeScheduled( CWsWindow* aWin ) const; |
|
244 void RemoveFromQuickFadeList( CWsWindow* aWin ); |
|
245 void AcceptFadeRequest( CWsWindow* aWin, TBool aFadeOn ); |
|
246 TBool HasVisibleDirectOnQueue(); |
|
247 TBool IsDSAClientWindow( const CWsClientWindow* aWin ) const; |
|
248 MWsTextCursor* RenderStageTextCursor() const; |
|
249 void ClearDsaSurface(const TRect& area, const TRgb& color); |
|
250 void PositionUiElements(const TRect& aExtent, const TRect& aViewport); |
|
251 TInt SetConfiguration(const TDisplayConfiguration& aConfig); |
|
252 void UpdateDynamicScreenModes(); |
|
253 void RecalculateModeTwips(const TDisplayConfiguration* aConfig = NULL); |
|
254 inline void IncreaseDisplaySpinner(); |
|
255 inline void IncreaseConfigSpinner(); |
|
256 inline TInt DisplaySpinner(); |
|
257 inline TInt ConfigSpinner(); |
|
258 TInt AddNotificationClient(CWsClient *aClient); |
|
259 void RemoveNotificationClient(CWsClient *aClient); |
|
260 TInt FindNotificationClient (CWsClient *aClient); |
|
261 TInt GetNotificationClients(RPointerArray<CWsClient>& aClientsArray); |
|
262 inline MWsDisplayPolicy* DisplayPolicy(); |
|
263 inline MWsDisplayMapping* DisplayMapping(); |
|
264 |
|
265 //CR1577 |
|
266 inline TBool ChangeTracking() const; |
|
267 inline MWsWindowTreeObserver* WindowTreeObserver() const; |
|
268 inline MWsDrawAnnotationObserver* DrawAnnotationObserver() const; |
|
269 inline MWsWindowVisibilityNotifier* WindowVisibilityNotifier() const; |
|
270 void ScheduleWindow(CWsWindow* aWindow); |
|
271 void RemoveFromScheduledList(CWsWindow* aWindow); |
|
272 void RemoveFromTimedDrawList(CWsWindow* aWindow); |
|
273 void SetupVisibleRegionTracking(CWsWindow& aWindow, TBool aRegister) const; |
|
274 |
|
275 TBool IsAnimating() const; |
|
276 |
|
277 private: |
|
278 class TInternalSizeMode: public TSizeMode |
|
279 { |
|
280 public: |
|
281 inline TInternalSizeMode(){} |
|
282 inline TInternalSizeMode(TSize& aSize) |
|
283 : TSizeMode(aSize), iFlags(0) |
|
284 { } |
|
285 TInt iFlags; |
|
286 }; |
|
287 enum TSyncConsts |
|
288 { |
|
289 KDSAAbortingImmediateRespAwaitFrameMicrosec = 80000 // 0.08 sec |
|
290 }; |
|
291 void SetInitialScreenSizeModeAndRotation(); |
|
292 CWsWindowGroup* FindNewFocus(CWsRootWindow* aRootWindow); |
|
293 void UpdateCompositionMode(); |
|
294 void InitializeSceneL(); |
|
295 void InitializeUiElementsL(); |
|
296 TInt InitializeDsaSurface(); |
|
297 void LoadScreenRotationProperties(TInternalSizeMode& aMode, const TInt aModeIndex); |
|
298 void LoadScreenTwipsProperties(TInternalSizeMode& aMode, const TInt aModeIndex); |
|
299 void CreateFallbackMapL(); |
|
300 MWsElement* CreateUiElementL(const TRect& aExtent); |
|
301 const TInternalSizeMode* ModePtrL(TInt aIndex) const; |
|
302 void ApplyRemainingWsiniSettingsL(); |
|
303 private: |
|
304 enum |
|
305 { |
|
306 eTimerCreated=0x1, |
|
307 }; |
|
308 enum TDsaDrawState |
|
309 { |
|
310 EDsaDrawStateIdle, |
|
311 EDsaDrawStateDrawing |
|
312 }; |
|
313 private: |
|
314 TSglQue<CWsDirectScreenAccess> iDirects; |
|
315 RTimer iTimer; |
|
316 TRequestStatus iTimerStatus; |
|
317 TUint iFlags; |
|
318 |
|
319 CScreenRedraw* iRedraw; |
|
320 |
|
321 CWsRootWindow* iRootWindow; |
|
322 CWsWindowGroup *iCurrentFocus; |
|
323 CWsWindowGroup *iDefaultOwningWindow; |
|
324 |
|
325 MWsScreenDevice* iScreenDevice; |
|
326 CFbsScreenDevice* iDsaDevice; |
|
327 CFbsBitGc* iDsaGc; |
|
328 CGraphicsDeviceMap* iDeviceMap; |
|
329 // Size and rotation members |
|
330 RPointerArray<TInternalSizeMode> *iModes; |
|
331 TInt iScreenSizeMode; |
|
332 TScreenModeEnforcement iSizeEnforcementMode; |
|
333 TInt iScreenNumber; |
|
334 TInt iMaxContrast; |
|
335 TInt iMaxBrightness; |
|
336 TInt iNumScreenSizeModes; |
|
337 TInt iNumSupportedScreenSizeModes; |
|
338 TInt iNumberDrawingDsa; |
|
339 TBool iBackLightFlag; |
|
340 |
|
341 TDsaDrawState iDsaDrawState; |
|
342 |
|
343 MWsDisplayMapping* iDisplayMapping; |
|
344 MWsDisplayControl* iDisplayControl; |
|
345 MWsDisplayPolicy* iDisplayPolicy; |
|
346 MWsScene* iScene; |
|
347 CWindowElementSet* iWindowElementSet; |
|
348 MWsElement* iUiElement; |
|
349 TSurfaceId iDsaSurface; |
|
350 CRegisteredSurfaceMap* iSurfaceMap; |
|
351 |
|
352 CDebugBar* iDebugBar; |
|
353 CFallbackMap* iFallbackMap; |
|
354 TUint8 iBlackMap; |
|
355 TUint8 iWhiteMap; |
|
356 CWsSpriteManager* iSpriteManager; |
|
357 //The next three interfaces should be provided by renderstages if the screen is to be used in CHANGETRACKING mode |
|
358 MWsWindowTreeObserver* iWindowTreeObserver; |
|
359 MWsDrawAnnotationObserver* iDrawAnnotationObserver; |
|
360 MWsWindowVisibilityNotifier* iWindowVisibilityNotifier; |
|
361 |
|
362 #if defined(__WINS__) && defined(_DEBUG) |
|
363 CDebugOsbWin* iDebugWin; |
|
364 #endif |
|
365 CWsDisplayChangeNotifier* iDisplayChangeNotifier; |
|
366 CWsConfigChangeNotifier* iConfigChangeNotifier; |
|
367 TInt iDisplayChangeSpinner; |
|
368 TInt iConfigChangeSpinner; |
|
369 RPointerArray<CWsClient> iWsClientList; |
|
370 TRect iDigitiserArea; |
|
371 }; |
|
372 |
|
373 |
|
374 |
|
375 // |
|
376 // inlines // |
|
377 // |
|
378 |
|
379 // |
|
380 // CScreen |
|
381 // |
|
382 |
|
383 inline CWsWindowGroup* CScreen::FocusWindowGroup() |
|
384 {return(iCurrentFocus);} |
|
385 inline TBool CScreen::BlankScreenOnRotation() |
|
386 {return(iFlags&EBlankScreenOnRotation);} |
|
387 inline TBool CScreen::AutoClear() |
|
388 {return(iFlags&EAutoClear);} |
|
389 inline CWsWindowGroup* CScreen::DefaultOwningWindowGroup() |
|
390 {return(iDefaultOwningWindow);} |
|
391 inline const TSurfaceId& CScreen::DsaSurface() const |
|
392 {return iDsaSurface;} |
|
393 |
|
394 inline CWsRootWindow* CScreen::RootWindow() const |
|
395 {return iRootWindow;} |
|
396 inline TInt CScreen::ScreenNumber() const |
|
397 {return iScreenNumber;} |
|
398 // |
|
399 inline TInt CScreen::ScreenSizeMode() const |
|
400 {return(iScreenSizeMode);} |
|
401 inline TRect CScreen::GetPointerCursorArea(TInt aMode) const |
|
402 {return (*iModes)[aMode]->iPointerCursorArea;} |
|
403 inline TSize CScreen::CurrentScreenSize() const |
|
404 {return (*iModes)[iScreenSizeMode]->iScreenSize;} |
|
405 inline TInt CScreen::NumScreenSizeModes() const |
|
406 {return iNumScreenSizeModes;} |
|
407 inline const TSizeMode& CScreen::ScreenSizeModeData() const |
|
408 {return *(*iModes)[iScreenSizeMode];} |
|
409 inline const TSizeMode& CScreen::ScreenSizeModeData(TInt aMode) const |
|
410 {return *(*iModes)[aMode];} |
|
411 inline TDisplayMode CScreen::DefaultDisplayMode(const TInt aMode) const |
|
412 {return (*iModes)[aMode]->iDefaultDisplayMode;} |
|
413 inline TScreenModeEnforcement CScreen::SizeEnforcementMode() const |
|
414 {return iSizeEnforcementMode;} |
|
415 inline TBool CScreen::IsValidScreenSizeMode(TInt aMode) const |
|
416 {return (aMode>=0 && aMode<iModes->Count() && (*iModes)[aMode]!=NULL);} |
|
417 inline TBool CScreen::BackLightFlag() |
|
418 {return iBackLightFlag;} |
|
419 |
|
420 inline TBool CScreen::HasAlpha() const |
|
421 {return (0x3 & (0x1 << (EColor16MAP - DisplayMode())));} //currently it is just EColor16MA Or EColor16MAP |
|
422 |
|
423 inline CWindowElementSet& CScreen::WindowElements() const |
|
424 { |
|
425 return *iWindowElementSet; |
|
426 } |
|
427 |
|
428 inline MWsElement& CScreen::UiElement() const |
|
429 { |
|
430 return *iUiElement; |
|
431 } |
|
432 |
|
433 inline CDebugBar * CScreen::DebugBar() |
|
434 {return iDebugBar;} |
|
435 inline CScreen::CFallbackMap * CScreen::FallbackMap() |
|
436 {return iFallbackMap;} |
|
437 |
|
438 inline void CScreen::GetFadingParams(TUint8& aBlackMap,TUint8& aWhiteMap) const |
|
439 {aBlackMap=iBlackMap;aWhiteMap=iWhiteMap;} |
|
440 inline void CScreen::SetFadingParams(TUint8 aBlackMap,TUint8 aWhiteMap) |
|
441 {iBlackMap=aBlackMap;iWhiteMap=aWhiteMap;} |
|
442 inline CWsSpriteManager* CScreen::SpriteManager() const |
|
443 {return iSpriteManager;} |
|
444 inline MWsWindowTreeObserver* CScreen::WindowTreeObserver() const |
|
445 {return iWindowTreeObserver;} |
|
446 inline MWsDrawAnnotationObserver* CScreen::DrawAnnotationObserver() const |
|
447 {return iDrawAnnotationObserver;} |
|
448 inline MWsWindowVisibilityNotifier* CScreen::WindowVisibilityNotifier() const |
|
449 {return iWindowVisibilityNotifier;} |
|
450 inline TBool CScreen::ChangeTracking() const |
|
451 {return iFlags&EChangeTracking;} |
|
452 inline void CScreen::IncreaseDisplaySpinner() |
|
453 {iDisplayChangeSpinner++;} |
|
454 inline void CScreen::IncreaseConfigSpinner() |
|
455 {iConfigChangeSpinner++;} |
|
456 inline TInt CScreen::DisplaySpinner() |
|
457 {return iDisplayChangeSpinner;} |
|
458 inline TInt CScreen::ConfigSpinner() |
|
459 {return iConfigChangeSpinner;} |
|
460 inline MWsDisplayPolicy* CScreen::DisplayPolicy() |
|
461 {return iDisplayPolicy;} |
|
462 inline MWsDisplayMapping* CScreen::DisplayMapping() |
|
463 {return iDisplayMapping;} |
|
464 #endif |
|
465 |