2 * fg_window_blackberry.c
4 * Window management methods for BlackBerry
6 * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
7 * Written by Pawel W. Olszta, <olszta@sourceforge.net>
8 * Copied for Platform code by Evan Felix <karcaw at gmail.com>
9 * Copyright (C) 2012 Sylvain Beucler
10 * Copyright (C) 2013 Vincent Simonetti
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the "Software"),
14 * to deal in the Software without restriction, including without limitation
15 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 * and/or sell copies of the Software, and to permit persons to whom the
17 * Software is furnished to do so, subject to the following conditions:
19 * The above copyright notice and this permission notice shall be included
20 * in all copies or substantial portions of the Software.
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
26 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 #define FREEGLUT_BUILDING_LIB
31 #include <GL/freeglut.h>
32 #include "fg_internal.h"
33 #include "egl/fg_window_egl.h"
34 #include <screen/screen.h>
37 * Opens a window. Requires a SFG_Window object created and attached
38 * to the freeglut structure. OpenGL context is created here.
40 void fgPlatformOpenWindow( SFG_Window* window, const char* title,
41 GLboolean positionUse, int x, int y,
42 GLboolean sizeUse, int w, int h,
43 GLboolean gameMode, GLboolean isSubWindow )
45 /* TODO: only one full-screen window possible? */
46 if (fgDisplay.pDisplay.single_native_window != NULL) {
47 fgWarning("You can't have more than one window on BlackBerry");
52 screen_window_t sWindow;
53 if (screen_create_window(&sWindow, fgDisplay.pDisplay.screenContext)) {
54 fgError("Could not create window");
57 fgDisplay.pDisplay.single_native_window = sWindow;
59 /* Choose config and screen format */
60 fghChooseConfig(&window->Window.pContext.egl.Config);
61 int screenFormat = SCREEN_FORMAT_RGBA8888; //Only SCREEN_FORMAT_RGBA8888 and SCREEN_FORMAT_RGB565 are supported. See fg_window_egl for more info
63 #define EGL_QUERY_COMP(att, comp) (eglGetConfigAttrib(fgDisplay.pDisplay.egl.Display, window->Window.pContext.egl.Config, att, &configAttri) == GL_TRUE && (configAttri comp))
64 if(EGL_QUERY_COMP(EGL_ALPHA_SIZE, <= 0) && EGL_QUERY_COMP(EGL_RED_SIZE, <= 5) &&
65 EGL_QUERY_COMP(EGL_GREEN_SIZE, <= 6) && EGL_QUERY_COMP(EGL_BLUE_SIZE, <= 5)) {
66 screenFormat = SCREEN_FORMAT_RGB565;
70 /* Set window properties */
71 int orientation = atoi(getenv("ORIENTATION"));
72 #ifdef GL_ES_VERSION_2_0
73 int screenUsage = SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_ROTATION;
74 #elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1
75 int screenUsage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION;
77 #if !defined(__X86__) && !defined(__PLAYBOOK__)
78 screenUsage |= SCREEN_USAGE_DISPLAY; // Physical device copy directly into physical display
80 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_FORMAT, &screenFormat)) {
81 screen_destroy_window(sWindow);
82 fgError("Could not set window format");
85 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_USAGE, &screenUsage)) {
86 screen_destroy_window(sWindow);
87 fgError("Could not set window usage");
92 /* Uncomment when multiple windows are supported
96 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_POSITION, value)) {
97 screen_destroy_window(sWindow);
98 fgError("Could not set window position");
104 /* Uncomment when multiple windows are supported
108 //TEMP until ^^ is uncommented
109 if (screen_get_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
110 screen_destroy_window(sWindow);
111 fgError("Could not get window mode");
115 /* From PlatformBlackBerry in GamePlay3d */
116 screen_display_t display;
117 if (screen_get_window_property_pv(sWindow, SCREEN_PROPERTY_DISPLAY, (void**)&display)) {
118 screen_destroy_window(sWindow);
119 fgError("Could not get window display");
123 screen_display_mode_t displayMode;
124 if (screen_get_display_property_pv(display, SCREEN_PROPERTY_MODE, (void**)&displayMode)) {
125 screen_destroy_window(sWindow);
126 fgError("Could not get display mode");
130 if (screen_get_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
131 screen_destroy_window(sWindow);
132 fgError("Could not get window mode");
136 /* Adjust buffer sizes based on rotation */
137 if ((orientation == 0) || (orientation == 180))
139 if (((displayMode.width > displayMode.height) && (value[0] < value[1])) ||
140 ((displayMode.width < displayMode.height) && (value[0] > value[1])))
147 else if ((orientation == 90) || (orientation == 270))
149 if (((displayMode.width > displayMode.height) && (value[0] > value[1])) ||
150 ((displayMode.width < displayMode.height) && (value[0] < value[1])))
159 screen_destroy_window(sWindow);
160 fgError("Unexpected rotation angle");
165 /* Set rotation if usage allows it */
166 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_ROTATION, &orientation)) {
167 screen_destroy_window(sWindow);
168 fgError("Could not set window rotation");
171 window->State.pWState.originalRotation = orientation;
173 /* Set buffer sizes */
174 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
175 screen_destroy_window(sWindow);
176 fgError("Could not set window buffer size");
180 /* Create window buffers */
181 if (screen_create_window_buffers(sWindow, (fgState.DisplayMode & GLUT_DOUBLE) ? 2 : 1)) {
182 screen_destroy_window(sWindow);
183 fgError("Could not create window buffers");
187 /* Save window and set state */
188 window->Window.Handle = sWindow;
189 window->State.WorkMask |= GLUT_INIT_WORK;
190 window->State.IsFullscreen = GL_TRUE; //XXX Always fullscreen for now
193 window->Window.Context = EGL_NO_CONTEXT;
194 if( fgState.UseCurrentContext == GL_TRUE )
195 window->Window.Context = eglGetCurrentContext();
196 if( window->Window.Context == EGL_NO_CONTEXT )
197 window->Window.Context = fghCreateNewContextEGL(window);
199 /* Create EGL window */
200 fghPlatformOpenWindowEGL(window);
202 window->State.Visible = GL_TRUE;
205 void fgPlatformFlushCommands()
207 if(screen_flush_context(fgDisplay.pDisplay.screenContext, 0)) {
208 fgWarning("Could not flush screen context");
212 void fgPlatformRotateWindow(SFG_Window* window, int rotation)
214 if(screen_set_window_property_iv(window->Window.Handle, SCREEN_PROPERTY_ROTATION, &rotation)) {
215 fgWarning("Could not set window rotation");
220 * Request a window resize
222 void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
224 fprintf(stderr, "fgPlatformReshapeWindow: STUB\n");
228 * Closes a window, destroying the frame and OpenGL context
230 void fgPlatformCloseWindow( SFG_Window* window )
232 fghPlatformCloseWindowEGL(window);
234 screen_destroy_window((screen_window_t)window->Window.Handle);
238 * This function makes the specified window visible
240 void fgPlatformShowWindow( void )
242 fprintf(stderr, "fgPlatformShowWindow: STUB\n");
246 * This function hides the specified window
248 void fgPlatformHideWindow( SFG_Window *window )
250 fprintf(stderr, "fgPlatformHideWindow: STUB\n");
254 * Iconify the specified window (top-level windows only)
256 void fgPlatformIconifyWindow( SFG_Window *window )
258 //XXX This is possible via Cascades, but can't seem to find a C-level API
259 //XXX bb::Application::instance()->minimize();
260 fprintf(stderr, "fgPlatformGlutIconifyWindow: STUB\n");
264 * Set the current window's title
266 void fgPlatformGlutSetWindowTitle( const char* title )
268 fprintf(stderr, "fgPlatformGlutSetWindowTitle: STUB\n");
272 * Set the current window's iconified title
274 void fgPlatformGlutSetIconTitle( const char* title )
276 fprintf(stderr, "fgPlatformGlutSetIconTitle: STUB\n");
280 * Change the specified window's position
282 void fgPlatformPositionWindow( SFG_Window *window, int x, int y )
284 fprintf(stderr, "fgPlatformPositionWindow: STUB\n");
288 * Lowers the specified window (by Z order change)
290 void fgPlatformPushWindow( SFG_Window *window )
292 fprintf(stderr, "fgPlatformPushWindow: STUB\n");
296 * Raises the specified window (by Z order change)
298 void fgPlatformPopWindow( SFG_Window *window )
300 fprintf(stderr, "fgPlatformPopWindow: STUB\n");
304 * Toggle the window's full screen state.
306 void fgPlatformFullScreenToggle( SFG_Window *win )
308 fprintf(stderr, "fgPlatformFullScreenToggle: STUB\n");