Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/thirdparty/freeglut/src/fg_state.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_state.c | |
| 3 * | |
| 4 * Freeglut state query methods. | |
| 5 * | |
| 6 * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. | |
| 7 * Written by Pawel W. Olszta, <olszta@sourceforge.net> | |
| 8 * Creation date: Thu Dec 16 1999 | |
| 9 * | |
| 10 * Permission is hereby granted, free of charge, to any person obtaining a | |
| 11 * copy of this software and associated documentation files (the "Software"), | |
| 12 * to deal in the Software without restriction, including without limitation | |
| 13 * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| 14 * and/or sell copies of the Software, and to permit persons to whom the | |
| 15 * Software is furnished to do so, subject to the following conditions: | |
| 16 * | |
| 17 * The above copyright notice and this permission notice shall be included | |
| 18 * in all copies or substantial portions of the Software. | |
| 19 * | |
| 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
| 21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
| 23 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| 24 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| 25 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| 26 */ | |
| 27 | |
| 28 #include <GL/freeglut.h> | |
| 29 #include "fg_internal.h" | |
| 30 | |
| 31 /* | |
| 32 * TODO BEFORE THE STABLE RELEASE: | |
| 33 * | |
| 34 * glutGet() -- X11 tests passed, but check if all enums | |
| 35 * handled (what about Win32?) | |
| 36 * glutDeviceGet() -- X11 tests passed, but check if all enums | |
| 37 * handled (what about Win32?) | |
| 38 * glutGetModifiers() -- OK, but could also remove the limitation | |
| 39 * glutLayerGet() -- what about GLUT_NORMAL_DAMAGED? | |
| 40 * | |
| 41 * The fail-on-call policy will help adding the most needed things imho. | |
| 42 */ | |
| 43 | |
| 44 extern int fgPlatformGlutGet ( GLenum eWhat ); | |
| 45 extern int fgPlatformGlutDeviceGet ( GLenum eWhat ); | |
| 46 extern int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size); | |
| 47 extern SFG_Font* fghFontByID( void* font ); | |
| 48 | |
| 49 | |
| 50 /* -- LOCAL DEFINITIONS ---------------------------------------------------- */ | |
| 51 | |
| 52 /* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ | |
| 53 | |
| 54 | |
| 55 /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ | |
| 56 | |
| 57 /* | |
| 58 * General settings assignment method | |
| 59 */ | |
| 60 void FGAPIENTRY glutSetOption( GLenum eWhat, int value ) | |
| 61 { | |
| 62 FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" ); | |
| 63 | |
| 64 switch( eWhat ) | |
| 65 { | |
| 66 case GLUT_INIT_WINDOW_X: | |
| 67 fgState.Position.X = (GLint)value; | |
| 68 break; | |
| 69 | |
| 70 case GLUT_INIT_WINDOW_Y: | |
| 71 fgState.Position.Y = (GLint)value; | |
| 72 break; | |
| 73 | |
| 74 case GLUT_INIT_WINDOW_WIDTH: | |
| 75 fgState.Size.X = (GLint)value; | |
| 76 break; | |
| 77 | |
| 78 case GLUT_INIT_WINDOW_HEIGHT: | |
| 79 fgState.Size.Y = (GLint)value; | |
| 80 break; | |
| 81 | |
| 82 case GLUT_INIT_DISPLAY_MODE: | |
| 83 fgState.DisplayMode = (unsigned int)value; | |
| 84 break; | |
| 85 | |
| 86 case GLUT_ACTION_ON_WINDOW_CLOSE: | |
| 87 fgState.ActionOnWindowClose = value; | |
| 88 break; | |
| 89 | |
| 90 case GLUT_RENDERING_CONTEXT: | |
| 91 fgState.UseCurrentContext = | |
| 92 ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE; | |
| 93 break; | |
| 94 | |
| 95 case GLUT_DIRECT_RENDERING: | |
| 96 fgState.DirectContext = value; | |
| 97 break; | |
| 98 | |
| 99 case GLUT_WINDOW_CURSOR: | |
| 100 if( fgStructure.CurrentWindow != NULL ) | |
| 101 fgStructure.CurrentWindow->State.Cursor = value; | |
| 102 break; | |
| 103 | |
| 104 case GLUT_AUX: | |
| 105 fgState.AuxiliaryBufferNumber = value; | |
| 106 break; | |
| 107 | |
| 108 case GLUT_MULTISAMPLE: | |
| 109 fgState.SampleNumber = value; | |
| 110 break; | |
| 111 | |
| 112 case GLUT_SKIP_STALE_MOTION_EVENTS: | |
| 113 fgState.SkipStaleMotion = !!value; | |
| 114 break; | |
| 115 | |
| 116 case GLUT_GEOMETRY_VISUALIZE_NORMALS: | |
| 117 if( fgStructure.CurrentWindow != NULL ) | |
| 118 fgStructure.CurrentWindow->State.VisualizeNormals = !!value; | |
| 119 break; | |
| 120 | |
| 121 case GLUT_STROKE_FONT_DRAW_JOIN_DOTS: | |
| 122 fgState.StrokeFontDrawJoinDots = !!value; | |
| 123 break; | |
| 124 | |
| 125 default: | |
| 126 fgWarning( "glutSetOption(): missing enum handle %d", eWhat ); | |
| 127 break; | |
| 128 } | |
| 129 } | |
| 130 | |
| 131 /* | |
| 132 * General settings query method | |
| 133 */ | |
| 134 int FGAPIENTRY glutGet( GLenum eWhat ) | |
| 135 { | |
| 136 switch (eWhat) | |
| 137 { | |
| 138 case GLUT_INIT_STATE: | |
| 139 return fgState.Initialised; | |
| 140 | |
| 141 /* Although internally the time store is 64bits wide, the return value | |
| 142 * here still wraps every 49.7 days. Integer overflows cancel however | |
| 143 * when subtracting an initial start time, unless the total time exceeds | |
| 144 * 32-bit, so you can still work with this. | |
| 145 * XXX: a glutGet64 to return the time might be an idea... | |
| 146 */ | |
| 147 case GLUT_ELAPSED_TIME: | |
| 148 return (int) fgElapsedTime(); | |
| 149 } | |
| 150 | |
| 151 FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" ); | |
| 152 | |
| 153 switch( eWhat ) | |
| 154 { | |
| 155 /* Following values are stored in fgState and fgDisplay global structures */ | |
| 156 case GLUT_SCREEN_WIDTH: return fgDisplay.ScreenWidth ; | |
| 157 case GLUT_SCREEN_HEIGHT: return fgDisplay.ScreenHeight ; | |
| 158 case GLUT_SCREEN_WIDTH_MM: return fgDisplay.ScreenWidthMM ; | |
| 159 case GLUT_SCREEN_HEIGHT_MM: return fgDisplay.ScreenHeightMM; | |
| 160 case GLUT_INIT_WINDOW_X: return fgState.Position.Use ? | |
| 161 fgState.Position.X : -1 ; | |
| 162 case GLUT_INIT_WINDOW_Y: return fgState.Position.Use ? | |
| 163 fgState.Position.Y : -1 ; | |
| 164 case GLUT_INIT_WINDOW_WIDTH: return fgState.Size.Use ? | |
| 165 fgState.Size.X : -1 ; | |
| 166 case GLUT_INIT_WINDOW_HEIGHT: return fgState.Size.Use ? | |
| 167 fgState.Size.Y : -1 ; | |
| 168 case GLUT_INIT_DISPLAY_MODE: return fgState.DisplayMode ; | |
| 169 case GLUT_INIT_MAJOR_VERSION: return fgState.MajorVersion ; | |
| 170 case GLUT_INIT_MINOR_VERSION: return fgState.MinorVersion ; | |
| 171 case GLUT_INIT_FLAGS: return fgState.ContextFlags ; | |
| 172 case GLUT_INIT_PROFILE: return fgState.ContextProfile ; | |
| 173 | |
| 174 /* The window structure queries */ | |
| 175 case GLUT_WINDOW_PARENT: | |
| 176 if( fgStructure.CurrentWindow == NULL ) return 0; | |
| 177 if( fgStructure.CurrentWindow->Parent == NULL ) return 0; | |
| 178 return fgStructure.CurrentWindow->Parent->ID; | |
| 179 | |
| 180 case GLUT_WINDOW_NUM_CHILDREN: | |
| 181 if( fgStructure.CurrentWindow == NULL ) | |
| 182 return 0; | |
| 183 return fgListLength( &fgStructure.CurrentWindow->Children ); | |
| 184 | |
| 185 case GLUT_WINDOW_CURSOR: | |
| 186 if( fgStructure.CurrentWindow == NULL ) | |
| 187 return 0; | |
| 188 return fgStructure.CurrentWindow->State.Cursor; | |
| 189 | |
| 190 case GLUT_MENU_NUM_ITEMS: | |
| 191 if( fgStructure.CurrentMenu == NULL ) | |
| 192 return 0; | |
| 193 return fgListLength( &fgStructure.CurrentMenu->Entries ); | |
| 194 | |
| 195 case GLUT_ACTION_ON_WINDOW_CLOSE: | |
| 196 return fgState.ActionOnWindowClose; | |
| 197 | |
| 198 case GLUT_VERSION : | |
| 199 return VERSION_MAJOR * 10000 + VERSION_MINOR * 100 + VERSION_PATCH; | |
| 200 | |
| 201 case GLUT_RENDERING_CONTEXT: | |
| 202 return fgState.UseCurrentContext ? GLUT_USE_CURRENT_CONTEXT | |
| 203 : GLUT_CREATE_NEW_CONTEXT; | |
| 204 | |
| 205 case GLUT_DIRECT_RENDERING: | |
| 206 return fgState.DirectContext; | |
| 207 | |
| 208 case GLUT_FULL_SCREEN: | |
| 209 return fgStructure.CurrentWindow->State.IsFullscreen; | |
| 210 | |
| 211 case GLUT_AUX: | |
| 212 return fgState.AuxiliaryBufferNumber; | |
| 213 | |
| 214 case GLUT_MULTISAMPLE: | |
| 215 return fgState.SampleNumber; | |
| 216 | |
| 217 case GLUT_SKIP_STALE_MOTION_EVENTS: | |
| 218 return fgState.SkipStaleMotion; | |
| 219 | |
| 220 case GLUT_GEOMETRY_VISUALIZE_NORMALS: | |
| 221 if( fgStructure.CurrentWindow == NULL ) | |
| 222 return GL_FALSE; | |
| 223 return fgStructure.CurrentWindow->State.VisualizeNormals; | |
| 224 | |
| 225 case GLUT_STROKE_FONT_DRAW_JOIN_DOTS: | |
| 226 return fgState.StrokeFontDrawJoinDots; | |
| 227 | |
| 228 default: | |
| 229 return fgPlatformGlutGet ( eWhat ); | |
| 230 break; | |
| 231 } | |
| 232 } | |
| 233 | |
| 234 /* | |
| 235 * Returns various device information. | |
| 236 */ | |
| 237 int FGAPIENTRY glutDeviceGet( GLenum eWhat ) | |
| 238 { | |
| 239 FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDeviceGet" ); | |
| 240 | |
| 241 /* XXX WARNING: we are mostly lying in this function. */ | |
| 242 switch( eWhat ) | |
| 243 { | |
| 244 case GLUT_HAS_JOYSTICK: | |
| 245 return fgJoystickDetect (); | |
| 246 | |
| 247 case GLUT_OWNS_JOYSTICK: | |
| 248 return fgState.JoysticksInitialised; | |
| 249 | |
| 250 case GLUT_JOYSTICK_POLL_RATE: | |
| 251 return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.JoystickPollRate : 0; | |
| 252 | |
| 253 /* XXX The following two are only for Joystick 0 but this is an improvement */ | |
| 254 case GLUT_JOYSTICK_BUTTONS: | |
| 255 return glutJoystickGetNumButtons ( 0 ); | |
| 256 | |
| 257 case GLUT_JOYSTICK_AXES: | |
| 258 return glutJoystickGetNumAxes ( 0 ); | |
| 259 | |
| 260 case GLUT_HAS_DIAL_AND_BUTTON_BOX: | |
| 261 return fgInputDeviceDetect (); | |
| 262 | |
| 263 case GLUT_NUM_DIALS: | |
| 264 if ( fgState.InputDevsInitialised ) return 8; | |
| 265 return 0; | |
| 266 | |
| 267 case GLUT_NUM_BUTTON_BOX_BUTTONS: | |
| 268 return 0; | |
| 269 | |
| 270 case GLUT_HAS_SPACEBALL: | |
| 271 return fgHasSpaceball(); | |
| 272 | |
| 273 case GLUT_HAS_TABLET: | |
| 274 return 0; | |
| 275 | |
| 276 case GLUT_NUM_SPACEBALL_BUTTONS: | |
| 277 return fgSpaceballNumButtons(); | |
| 278 | |
| 279 case GLUT_NUM_TABLET_BUTTONS: | |
| 280 return 0; | |
| 281 | |
| 282 case GLUT_DEVICE_IGNORE_KEY_REPEAT: | |
| 283 return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.IgnoreKeyRepeat : 0; | |
| 284 | |
| 285 case GLUT_DEVICE_KEY_REPEAT: | |
| 286 return fgState.KeyRepeat; | |
| 287 | |
| 288 default: | |
| 289 return fgPlatformGlutDeviceGet ( eWhat ); | |
| 290 } | |
| 291 } | |
| 292 | |
| 293 /* | |
| 294 * This should return the current state of ALT, SHIFT and CTRL keys. | |
| 295 */ | |
| 296 int FGAPIENTRY glutGetModifiers( void ) | |
| 297 { | |
| 298 FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetModifiers" ); | |
| 299 if( fgState.Modifiers == INVALID_MODIFIERS ) | |
| 300 { | |
| 301 fgWarning( "glutGetModifiers() called outside an input callback" ); | |
| 302 return 0; | |
| 303 } | |
| 304 | |
| 305 return fgState.Modifiers; | |
| 306 } | |
| 307 | |
| 308 /* | |
| 309 * Return the state of the GLUT API overlay subsystem. A misery ;-) | |
| 310 */ | |
| 311 int FGAPIENTRY glutLayerGet( GLenum eWhat ) | |
| 312 { | |
| 313 FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLayerGet" ); | |
| 314 | |
| 315 /* | |
| 316 * This is easy as layers are not implemented and | |
| 317 * overlay support is not planned. E.g. on Windows, | |
| 318 * overlay requests in PFDs are ignored | |
| 319 * (see iLayerType at http://msdn.microsoft.com/en-us/library/dd368826(v=vs.85).aspx) | |
| 320 */ | |
| 321 switch( eWhat ) | |
| 322 { | |
| 323 | |
| 324 case GLUT_OVERLAY_POSSIBLE: | |
| 325 return 0 ; | |
| 326 | |
| 327 case GLUT_LAYER_IN_USE: | |
| 328 return GLUT_NORMAL; | |
| 329 | |
| 330 case GLUT_HAS_OVERLAY: | |
| 331 return 0; | |
| 332 | |
| 333 case GLUT_TRANSPARENT_INDEX: | |
| 334 /* | |
| 335 * Return just anything, which is always defined as zero | |
| 336 * | |
| 337 * XXX HUH? | |
| 338 */ | |
| 339 return 0; | |
| 340 | |
| 341 case GLUT_NORMAL_DAMAGED: | |
| 342 /* XXX Actually I do not know. Maybe. */ | |
| 343 return 0; | |
| 344 | |
| 345 case GLUT_OVERLAY_DAMAGED: | |
| 346 return -1; | |
| 347 | |
| 348 default: | |
| 349 fgWarning( "glutLayerGet(): missing enum handle %d", eWhat ); | |
| 350 break; | |
| 351 } | |
| 352 | |
| 353 /* And fail. That's good. Programs do love failing. */ | |
| 354 return -1; | |
| 355 } | |
| 356 | |
| 357 int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int *size) | |
| 358 { | |
| 359 int *array; | |
| 360 | |
| 361 FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues"); | |
| 362 | |
| 363 *size = 0; | |
| 364 array = fgPlatformGlutGetModeValues ( eWhat, size ); | |
| 365 | |
| 366 return array; | |
| 367 } | |
| 368 | |
| 369 /*** END OF FILE ***/ |
