gl1ctrace and gl2ctrace support
[spandex:spandex.git] / sct / symbian / common / src / symbian_siwindow.cpp
1 /*
2  * Spandex benchmark and test framework.
3  *
4  * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  *
6  * Contact: Kari J. Kangas <kari.j.kangas@nokia.com>
7  *
8  *   This framework is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU Lesser General Public License as published by the
10  * Free Software Foundation, version 2.1 of the License.
11  *
12  *   This framework is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
15  * for more details.
16  *
17  *   You should have received a copy of the GNU Lesser General Public License
18  * along with this framework; if not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21
22 /* Symbian includes */
23 #include <e32base.h>
24 #include <e32cons.h>
25 #include <e32std.h>
26 #include <w32std.h>
27
28 /* */
29 #if defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION )
30 # include <aknappui.h>
31 # include <aknviewappui.h>
32 #endif  /* defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION ) */
33
34 #if defined( SCT_S60_SUPPORT_WINDOW_OPACITY )
35 # include <platform/mw/alf/alfcompositionutility.h>
36 #endif  /* defined( SCT_S60_SUPPORT_WINDOW_OPACITY ) */
37
38 /* Stdlib includes*/
39 #include <stdio.h>
40 #include <math.h>
41 #include <string.h>
42 #include <stdlib.h>
43 #include <hal.h>
44
45 /* Includes from Spandex core */
46 #include "sct_sicommon.h"
47 #include "sct_siwindow.h"
48
49 #include "CPlatform.h"
50
51 #define SCT_FLUSH_BITMAP_TO_WINDOW
52 #define SCT_SYMBIAN_SIWINDOW_CONTEXT    0x1234
53
54 /*!
55  *
56  */
57 static void         sctiSetScreenOrientationL( SCTScreenOrientation orientation );
58 static TDisplayMode sctiConvertColorFormat( SCTColorFormat format );
59
60 /*!
61  *
62  *
63  */
64 void* siWindowGetContext()
65 {
66     //RDebug::Printf( "SPANDEX: siWindowGetContext" );
67     return ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT );
68 }
69
70 /*!
71  *
72  *
73  */
74 void siWindowReleaseContext( void* context )
75 {
76     //RDebug::Printf( "SPANDEX: siWindowReleaseContext" );
77     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );    
78 }
79
80 /* ---------------------------------------------------------------------- */
81 /*!
82  *
83  *
84  */
85 void* siWindowGetDisplay( void* context )
86 {
87     //RDebug::Printf( "SPANDEX: siWindowGetDisplay" );
88     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );        
89     return NULL;
90 }
91
92 /*!
93  *
94  *
95  */
96 void siWindowQueryScreenSize( void* context, int* width, int* height )
97 {
98     //RDebug::Printf( "SPANDEX: siWindowQueryScreenSize" );    
99     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
100     SCT_ASSERT_ALWAYS( width != NULL );
101     SCT_ASSERT_ALWAYS( height != NULL );
102     
103     CPlatform::ScreenSize( *width, *height );
104 }
105
106 /*!
107  *
108  *
109  */
110 static void sctiSetScreenOrientationL( SCTScreenOrientation orientation )
111 {
112 #if defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION )    
113     CAknAppUi* appUi = ( ( CAknAppUi* )( CEikonEnv::Static()->EikAppUi() ) );
114
115     if( orientation == SCT_SCREEN_ORIENTATION_PORTRAIT )
116     {
117         //RDebug::Printf( "SPANDEX: siWindowSetScreenOrientation TO-PORTRAIT" );
118         appUi->SetOrientationL( CAknViewAppUi::EAppUiOrientationPortrait );
119     }
120     else if( orientation == SCT_SCREEN_ORIENTATION_LANDSCAPE )
121     {
122         //RDebug::Printf( "SPANDEX: siWindowSetScreenOrientation TO-LANDSCAPE" );        
123         appUi->SetOrientationL( CAknViewAppUi::EAppUiOrientationLandscape );
124     }
125
126     RWsSession* wsSession = CPlatform::WindowServerSession();
127     wsSession->Flush();
128 #else  /* defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION ) */
129     SCT_USE_VARIABLE( orientation );
130 #endif  /* defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION ) */    
131 }
132
133 /*!
134  *
135  *
136  */
137 SCTBoolean siWindowSetScreenOrientation( void* context, SCTScreenOrientation orientation )
138 {
139     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
140     
141 #if defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION )
142     SCTScreenOrientation    o;   
143     CAknAppUi*              appUi = ( ( CAknAppUi* )( CEikonEnv::Static()->EikAppUi() ) );
144
145     if( orientation == SCT_SCREEN_ORIENTATION_DEFAULT )
146     {
147         int w, h;
148         CPlatform::ScreenSize( w, h );
149         if( w > h )
150         {
151             o = SCT_SCREEN_ORIENTATION_LANDSCAPE;
152         }
153         else
154         {
155             o = SCT_SCREEN_ORIENTATION_PORTRAIT;
156         }
157     }
158     else
159     {
160         o = orientation;
161     }
162     
163     if( o != SCT_SCREEN_ORIENTATION_PORTRAIT &&
164         o != SCT_SCREEN_ORIENTATION_LANDSCAPE )
165     {
166         return SCT_FALSE;
167     }
168
169         TRAPD( error, sctiSetScreenOrientationL( o ) );
170     if( error != KErrNone )
171     {
172         RDebug::Printf( "SPANDEX: sctiSetScreenOrientationL failed" );
173         return SCT_FALSE;
174     }
175     
176     return SCT_TRUE;
177 #else   /* defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION ) */
178     SCT_USE_VARIABLE( orientation );
179     return SCT_FALSE;   
180 #endif  /* defined( SCT_S60_SUPPORT_SCREEN_ORIENTATION ) */
181 }
182
183 /*!
184  *
185  *
186  */
187 void* siWindowGetPixmap( void* context, int width, int height, SCTColorFormat format )
188 {
189     TDisplayMode                displayMode;
190     CFbsBitmap*                 bitmap;
191
192     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );    
193
194     //RDebug::Printf( "SPANDEX: siWindowGetPixmap start" );
195     
196     displayMode = sctiConvertColorFormat( format );
197
198     TSize size( width, height );
199     bitmap = new CFbsBitmap;
200     if( bitmap == NULL || bitmap->Create( size, displayMode ) != KErrNone )
201     {
202         RDebug::Printf( "SPANDEX: siWindowGetPixmap bitmap create failed" );
203         delete bitmap;
204         return NULL;
205     }
206
207     //RDebug::Printf( "SPANDEX: siWindowGetPixmap end" );
208     
209     return bitmap;
210 }
211
212 /*!
213  *
214  *
215  */
216 SCTBoolean siWindowBlitPixmap( void* context, void* pixmap, int x, int y )
217 {
218     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );            
219     SCT_ASSERT_ALWAYS( pixmap != NULL );
220
221     CWindowGc*          gc          = CPlatform::Gc();
222
223     SCT_ASSERT_ALWAYS( gc != NULL );
224
225     //RDebug::Printf( "SPANDEX: siWindowBlitPixmap start" );
226     
227     gc->BitBlt( TPoint( x, y ),  ( CFbsBitmap* )( pixmap ) );
228     
229 #if defined( SCT_FLUSH_BITMAP_TO_WINDOW )
230     RWsSession*         wsSession   = CPlatform::WindowServerSession();
231     wsSession->Flush();
232 #endif  /* defined( SCT_FLUSH_BITMAP_TO_WINDOW ) */
233
234     //RDebug::Printf( "SPANDEX: siWindowBlitPixmap end" );
235     
236     return SCT_FALSE;
237 }
238
239 /*!
240  *
241  *
242  */
243 void siWindowReleasePixmap( void* context, void* pixmap )
244 {
245     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
246     SCT_ASSERT_ALWAYS( pixmap != NULL );
247
248     //RDebug::Printf( "SPANDEX: siWindowReleasePixmap" );
249     
250     delete ( CFbsBitmap* )( pixmap );
251 }
252
253 /*!
254  *
255  *
256  */
257 void* siWindowGetWindow( void* context, int x, int y, int width, int height, SCTColorFormat format, void* parent )
258 {
259     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
260     SCT_ASSERT_ALWAYS( width > 0 );
261     SCT_ASSERT_ALWAYS( height > 0 );
262
263     //RDebug::Printf( "SPANDEX: siWindowGetWindow start" );
264     
265     TInt            error;
266     RWsSession*     wsSession       = CPlatform::WindowServerSession();
267     RWindow*        parentWindow;
268     TDisplayMode    mode            = sctiConvertColorFormat( format );
269     TDisplayMode    actualMode;
270        
271     SCT_ASSERT_ALWAYS( wsSession != NULL );
272
273     if( parent != NULL )
274     {
275         parentWindow = ( RWindow* )( parent );
276     }
277     else
278     {
279         parentWindow = CPlatform::MainWindow();
280     }
281     
282     SCT_ASSERT_ALWAYS( parentWindow != NULL );
283
284     if( mode == ENone )
285     {
286         RDebug::Printf( "SPANDEX: siWindowGetWindow unsupported format" );
287         return NULL;       
288     }
289     
290     RWindow* win = new RWindow( *wsSession );
291     if( win == NULL )
292     {
293         RDebug::Printf( "SPANDEX: siWindowGetWindow RWindow allocation failed" );        
294         return NULL;
295     }
296
297         error = win->Construct( *parentWindow, ( TUint32 )( win ) );
298     if( error != KErrNone )
299     {
300         RDebug::Printf( "SPANDEX: siWindowGetWindow RWindow construct failed" );                
301         delete win;
302         return NULL;
303     }
304
305     actualMode = ( TDisplayMode )( win->SetRequiredDisplayMode( mode ) );
306
307     if( ( format != SCT_COLOR_FORMAT_DEFAULT ) && ( actualMode != mode ) )
308     {
309         RDebug::Printf( "SPANDEX: siWindowGetWindow RWindow display mode setting failed, requested=%d actual=%d", mode, actualMode );
310         win->Close();
311         delete win;
312         wsSession->Flush();        
313
314         return NULL;
315     }
316
317         win->SetExtent( TPoint( x, y ), TSize( width, height ) );
318         win->SetBackgroundColor();
319         win->Activate();
320
321     wsSession->Flush();
322    
323     //RDebug::Printf( "SPANDEX: siWindowGetWindow end" );    
324     return win;
325 }
326
327 /*!
328  *
329  *
330  */
331 SCTBoolean siWindowToFront( void* context, void* window )
332 {
333     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );    
334
335     //RDebug::Printf( "SPANDEX: siWindowToFront start" );    
336
337     RWindow*        win         = ( RWindow* )( window );
338     RWsSession*     wsSession   = CPlatform::WindowServerSession();
339
340     SCT_ASSERT_ALWAYS( win != NULL );   
341     SCT_ASSERT_ALWAYS( wsSession != NULL );
342     
343     win->SetOrdinalPosition( 0 );
344     wsSession->Flush();
345
346     //RDebug::Printf( "SPANDEX: siWindowToFront end" );    
347
348     return SCT_TRUE;
349 }
350
351 /*!
352  *
353  *
354  */
355 SCTBoolean siWindowResize( void* context, void* window, int x, int y, int width, int height )
356 {
357     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
358
359     //RDebug::Printf( "SPANDEX: siWindowResize start" );    
360     
361     RWindow*        win         = ( RWindow* )( window );
362     RWsSession*     wsSession   = CPlatform::WindowServerSession();    
363
364     SCT_ASSERT_ALWAYS( win != NULL );   
365     SCT_ASSERT_ALWAYS( wsSession != NULL );
366     
367     win->SetExtent( TPoint( x, y ), TSize( width, height ) );
368     wsSession->Flush();    
369
370     //RDebug::Printf( "SPANDEX: siWindowResize end" );    
371     
372     return SCT_TRUE;
373 }
374
375 /*!
376  *
377  *
378  */
379 SCTBoolean siWindowSetOpacity( void* context, void* window, float opacity )
380 {
381     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
382
383 #if defined( SCT_S60_SUPPORT_WINDOW_OPACITY )   
384     RWindow*                win   = ( RWindow* )( window );
385     CAlfCompositionSource*  alfCS = CAlfCompositionSource::NewL( *win );
386
387     if( alfCS == NULL )
388     {
389         return SCT_FALSE;
390     }
391     
392     if( opacity < 1.0 )
393     {
394         alfCS->EnableAlpha( ETrue );
395     }
396     else
397     {
398         alfCS->EnableAlpha( EFalse );
399     }
400
401     alfCS->SetOpacity( opacity );
402     delete alfCS;
403
404     return SCT_TRUE;
405 #else   /* defined( SCT_S60_SUPPORT_WINDOW_OPACITY ) */
406     SCT_USE_VARIABLE( window );
407     SCT_USE_VARIABLE( opacity );
408     return SCT_FALSE;
409 #endif  /* defined( SCT_S60_SUPPORT_WINDOW_OPACITY ) */    
410 }
411
412 /*!
413  *
414  *
415  */
416 SCTBoolean siWindowRefresh( void* context, void* window )
417 {
418     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
419
420     //RDebug::Printf( "SPANDEX: siWindowRefresh start" );    
421     
422     RWindow*        win         = ( RWindow* )( window );
423     RWsSession*     wsSession   = CPlatform::WindowServerSession();    
424
425     SCT_ASSERT_ALWAYS( win != NULL );   
426     SCT_ASSERT_ALWAYS( wsSession != NULL );
427
428     win->Invalidate();
429     wsSession->Flush();    
430     
431     //RDebug::Printf( "SPANDEX: siWindowRefresh end" );    
432     
433     return SCT_TRUE;
434 }
435
436 /*!
437  *
438  *
439  */
440 void siWindowReleaseWindow( void* context, void* window )
441 {
442     SCT_ASSERT_ALWAYS( context == ( void* )( SCT_SYMBIAN_SIWINDOW_CONTEXT ) );
443
444     //RDebug::Printf( "SPANDEX: siWindowReleaseWindow start" );    
445     
446     RWindow*        win         = ( RWindow* )( window );
447     RWsSession*     wsSession   = CPlatform::WindowServerSession();    
448
449     SCT_ASSERT_ALWAYS( win != NULL );   
450     SCT_ASSERT_ALWAYS( wsSession != NULL );
451
452     win->Close();
453     wsSession->Flush();    
454     
455     delete win;
456
457     //RDebug::Printf( "SPANDEX: siWindowReleaseWindow end" );    
458 }
459
460 /*!
461  *
462  *
463  */
464 static TDisplayMode sctiConvertColorFormat( SCTColorFormat format )
465 {
466     switch( format )
467     {
468     case SCT_COLOR_FORMAT_RGBA4444:
469         return EColor4K;
470     case SCT_COLOR_FORMAT_RGB565:
471         return EColor64K;
472     case SCT_COLOR_FORMAT_RGB888:
473         return EColor16M;
474     case SCT_COLOR_FORMAT_RGBX8888:
475         return EColor16MU;
476     case SCT_COLOR_FORMAT_RGBA8888:
477         return EColor16MA;
478     case SCT_COLOR_FORMAT_DEFAULT:
479         return CPlatform::ScreenMode();
480     default:
481         return ENone;
482     }
483 }