comparison mupdf-source/thirdparty/freeglut/src/blackberry/fg_window_blackberry.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /*
2 * fg_window_blackberry.c
3 *
4 * Window management methods for BlackBerry
5 *
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
11 *
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:
18 *
19 * The above copyright notice and this permission notice shall be included
20 * in all copies or substantial portions of the Software.
21 *
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.
28 */
29
30 #define FREEGLUT_BUILDING_LIB
31 #include <GL/freeglut.h>
32 #include "fg_internal.h"
33 #include "egl/fg_window_egl.h"
34 #include <sys/pps.h>
35
36 /*
37 * Opens a window. Requires a SFG_Window object created and attached
38 * to the freeglut structure. OpenGL context is created here.
39 */
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 )
44 {
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");
48 return;
49 }
50
51 /* Create window */
52 screen_window_t sWindow;
53 if (screen_create_window(&sWindow, fgDisplay.pDisplay.screenContext)) {
54 fgError("Could not create window");
55 return;
56 }
57 fgDisplay.pDisplay.single_native_window = sWindow;
58
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
62 int configAttri;
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;
67 }
68 #undef EGL_QUERY_COMP
69
70 /* Set window properties */
71 int orientation = atoi(getenv("ORIENTATION"));
72 int screenUsage = SCREEN_USAGE_ROTATION;
73 #ifdef SCREEN_USAGE_OPENGL_ES3
74 if (fgState.MajorVersion >= 3) {
75 screenUsage |= SCREEN_USAGE_OPENGL_ES3;
76 } else
77 #endif
78 if (fgState.MajorVersion >= 2) {
79 screenUsage |= SCREEN_USAGE_OPENGL_ES2;
80 } else {
81 screenUsage |= SCREEN_USAGE_OPENGL_ES1;
82 }
83 #if !defined(__X86__) && !defined(__PLAYBOOK__)
84 screenUsage |= SCREEN_USAGE_DISPLAY; // Physical device copy directly into physical display
85 #endif
86 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_FORMAT, &screenFormat)) {
87 screen_destroy_window(sWindow);
88 fgError("Could not set window format");
89 return;
90 }
91 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_USAGE, &screenUsage)) {
92 screen_destroy_window(sWindow);
93 fgError("Could not set window usage");
94 return;
95 }
96
97 int value[2];
98 /* Uncomment when multiple windows are supported
99 if(positionUse) {
100 value[0] = x;
101 value[1] = y;
102 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_POSITION, value)) {
103 screen_destroy_window(sWindow);
104 fgError("Could not set window position");
105 return;
106 }
107 }*/
108
109 if(sizeUse) {
110 /* Uncomment when multiple windows are supported
111 value[0] = w;
112 value[1] = h;
113 */
114 //TEMP until ^^ is uncommented
115 if (screen_get_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
116 screen_destroy_window(sWindow);
117 fgError("Could not get window mode");
118 return;
119 }
120 } else {
121 /* From PlatformBlackBerry in GamePlay3d */
122 screen_display_t display;
123 if (screen_get_window_property_pv(sWindow, SCREEN_PROPERTY_DISPLAY, (void**)&display)) {
124 screen_destroy_window(sWindow);
125 fgError("Could not get window display");
126 return;
127 }
128
129 screen_display_mode_t displayMode;
130 if (screen_get_display_property_pv(display, SCREEN_PROPERTY_MODE, (void**)&displayMode)) {
131 screen_destroy_window(sWindow);
132 fgError("Could not get display mode");
133 return;
134 }
135
136 if (screen_get_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
137 screen_destroy_window(sWindow);
138 fgError("Could not get window mode");
139 return;
140 }
141
142 /* Adjust buffer sizes based on rotation */
143 if ((orientation == 0) || (orientation == 180))
144 {
145 if (((displayMode.width > displayMode.height) && (value[0] < value[1])) ||
146 ((displayMode.width < displayMode.height) && (value[0] > value[1])))
147 {
148 int tmp = value[1];
149 value[1] = value[0];
150 value[0] = tmp;
151 }
152 }
153 else if ((orientation == 90) || (orientation == 270))
154 {
155 if (((displayMode.width > displayMode.height) && (value[0] > value[1])) ||
156 ((displayMode.width < displayMode.height) && (value[0] < value[1])))
157 {
158 int tmp = value[1];
159 value[1] = value[0];
160 value[0] = tmp;
161 }
162 }
163 else
164 {
165 screen_destroy_window(sWindow);
166 fgError("Unexpected rotation angle");
167 return;
168 }
169 }
170
171 /* Set rotation if usage allows it */
172 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_ROTATION, &orientation)) {
173 screen_destroy_window(sWindow);
174 fgError("Could not set window rotation");
175 return;
176 }
177 window->State.pWState.originalRotation = orientation;
178
179 /* Set buffer sizes */
180 if (screen_set_window_property_iv(sWindow, SCREEN_PROPERTY_BUFFER_SIZE, value)) {
181 screen_destroy_window(sWindow);
182 fgError("Could not set window buffer size");
183 return;
184 }
185
186 /* Create window buffers */
187 if (screen_create_window_buffers(sWindow, (fgState.DisplayMode & GLUT_DOUBLE) ? 2 : 1)) {
188 screen_destroy_window(sWindow);
189 fgError("Could not create window buffers");
190 return;
191 }
192
193 /* Save window and set state */
194 window->Window.Handle = sWindow;
195 window->State.WorkMask |= GLUT_INIT_WORK;
196 window->State.IsFullscreen = GL_TRUE; //XXX Always fullscreen for now
197
198 /* Create context */
199 window->Window.Context = EGL_NO_CONTEXT;
200 if( fgState.UseCurrentContext == GL_TRUE )
201 window->Window.Context = eglGetCurrentContext();
202 if( window->Window.Context == EGL_NO_CONTEXT )
203 window->Window.Context = fghCreateNewContextEGL(window);
204
205 /* Create EGL window */
206 fghPlatformOpenWindowEGL(window);
207
208 window->State.Visible = GL_TRUE;
209 }
210
211 void fgPlatformFlushCommands()
212 {
213 if(screen_flush_context(fgDisplay.pDisplay.screenContext, 0)) {
214 fgWarning("Could not flush screen context");
215 }
216 }
217
218 void fgPlatformRotateWindow(SFG_Window* window, int rotation)
219 {
220 if(screen_set_window_property_iv(window->Window.Handle, SCREEN_PROPERTY_ROTATION, &rotation)) {
221 fgWarning("Could not set window rotation");
222 }
223 }
224
225 /*
226 * Request a window resize
227 */
228 void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
229 {
230 fprintf(stderr, "fgPlatformReshapeWindow: STUB\n");
231 }
232
233 /*
234 * Closes a window, destroying the frame and OpenGL context
235 */
236 void fgPlatformCloseWindow( SFG_Window* window )
237 {
238 fghPlatformCloseWindowEGL(window);
239
240 screen_destroy_window((screen_window_t)window->Window.Handle);
241 }
242
243 /*
244 * This function makes the specified window visible
245 */
246 void fgPlatformShowWindow( void )
247 {
248 fprintf(stderr, "fgPlatformShowWindow: STUB\n");
249 }
250
251 /*
252 * This function hides the specified window
253 */
254 void fgPlatformHideWindow( SFG_Window *window )
255 {
256 fprintf(stderr, "fgPlatformHideWindow: STUB\n");
257 }
258
259 /*
260 * Iconify the specified window (top-level windows only)
261 */
262 void fgPlatformIconifyWindow( SFG_Window *window )
263 {
264 #ifndef __PLAYBOOK__
265 pps_encoder_t encoder;
266
267 pps_encoder_initialize(&encoder, false);
268 pps_encoder_add_string(&encoder, "msg", "minimizeWindow");
269
270 if (navigator_raw_write(pps_encoder_buffer(&encoder), pps_encoder_length(&encoder)) != BPS_SUCCESS) {
271 fgWarning("Could not iconify window on BlackBerry");
272 }
273
274 pps_encoder_cleanup(&encoder);
275 #else
276 fprintf(stderr, "fgPlatformGlutIconifyWindow: STUB\n");
277 #endif
278 }
279
280 /*
281 * Set the current window's title
282 */
283 void fgPlatformGlutSetWindowTitle( const char* title )
284 {
285 fprintf(stderr, "fgPlatformGlutSetWindowTitle: STUB\n");
286 }
287
288 /*
289 * Set the current window's iconified title
290 */
291 void fgPlatformGlutSetIconTitle( const char* title )
292 {
293 //XXX Possibly a window cover label?
294 fprintf(stderr, "fgPlatformGlutSetIconTitle: STUB\n");
295 }
296
297 /*
298 * Change the specified window's position
299 */
300 void fgPlatformPositionWindow( SFG_Window *window, int x, int y )
301 {
302 fprintf(stderr, "fgPlatformPositionWindow: STUB\n");
303 }
304
305 /*
306 * Lowers the specified window (by Z order change)
307 */
308 void fgPlatformPushWindow( SFG_Window *window )
309 {
310 fprintf(stderr, "fgPlatformPushWindow: STUB\n");
311 }
312
313 /*
314 * Raises the specified window (by Z order change)
315 */
316 void fgPlatformPopWindow( SFG_Window *window )
317 {
318 fprintf(stderr, "fgPlatformPopWindow: STUB\n");
319 }
320
321 /*
322 * Toggle the window's full screen state.
323 */
324 void fgPlatformFullScreenToggle( SFG_Window *win )
325 {
326 fprintf(stderr, "fgPlatformFullScreenToggle: STUB\n");
327 }