42#define STB_IMAGE_WRITE_IMPLEMENTATION
45#define kOOLogUnconvertedNSLog @"unclassified.MyOpenGLView"
47extern int SaveEXRSnapshot(
const char* outfilename,
int width,
int height,
const float* rgb);
49static NSString *
kOOLogKeyUp =
@"input.keyMapping.keyPress.keyUp";
55#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
56#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
58HRESULT WINAPI DwmSetWindowAttribute (HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
60#define USE_UNDOCUMENTED_DARKMODE_API 1
62#if USE_UNDOCUMENTED_DARKMODE_API
63#ifndef LOAD_LIBRARY_SEARCH_SYSTEM32
64#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
66typedef DWORD(WINAPI* pfnSetPreferredAppMode)(DWORD appMode);
78@interface MyOpenGLView (OOPrivate)
81- (void) setWindowBorderless:(BOOL)borderless;
82- (void) handleStringInput: (SDL_KeyboardEvent *) kbd_event keyID:(Uint16)key_id;
90 int nativeDisplayWidth = 1024;
91 int nativeDisplayHeight = 768;
94 SDL_SysWMinfo dpyInfo;
95 SDL_VERSION(&dpyInfo.version);
96 if(SDL_GetWMInfo(&dpyInfo))
98 nativeDisplayWidth = DisplayWidth(dpyInfo.info.x11.display, 0);
99 nativeDisplayHeight = DisplayHeight(dpyInfo.info.x11.display, 0);
100 OOLog(
@"display.mode.list.native",
@"X11 native resolution detected: %d x %d", nativeDisplayWidth, nativeDisplayHeight);
104 OOLog(
@"display.mode.list.native.failed",
@"%@",
@"SDL_GetWMInfo failed, defaulting to 1024x768 for native size");
107 nativeDisplayWidth = GetSystemMetrics(SM_CXSCREEN);
108 nativeDisplayHeight = GetSystemMetrics(SM_CYSCREEN);
109 OOLog(
@"display.mode.list.native",
@"Windows native resolution detected: %d x %d", nativeDisplayWidth, nativeDisplayHeight);
111 OOLog(
@"display.mode.list.native.unknown",
@"Unknown architecture, defaulting to 1024x768");
113 [mode setValue: [
NSNumber numberWithInt: nativeDisplayWidth] forKey:kOODisplayWidth];
114 [mode setValue: [
NSNumber numberWithInt: nativeDisplayHeight] forKey: kOODisplayHeight];
115 [mode setValue: [
NSNumber numberWithInt: 0] forKey: kOODisplayRefreshRate];
117 return [mode autorelease];
124 const int videoModeFlags = SDL_HWSURFACE | SDL_OPENGL | SDL_RESIZABLE;
131 ShowWindow(SDL_Window,SW_SHOWMINIMIZED);
141 surface = SDL_SetVideoMode(8, 8, 32, videoModeFlags);
163 char * errStr = SDL_GetError();
164 OOLogWARN(
@"gamma.set.failed",
@"Could not set gamma: %s", errStr);
169 SDL_EnableUNICODE(1);
178 SDL_Surface *icon=NULL;
180 NSString *cmdLineArgsStr =
@"Startup command: ";
186 BOOL vSyncPreference = [
prefs oo_boolForKey:@"v-sync" defaultValue:YES];
187 int bitsPerColorComponent = [
prefs oo_boolForKey:@"hdr" defaultValue:NO] ? 16 : 8;
190 NSArray *arguments =
nil;
191 NSEnumerator *argEnum =
nil;
193 BOOL noSplashArgFound = NO;
204 for (argEnum = [arguments objectEnumerator]; (arg = [
argEnum nextObject]); )
206 if ([arg isEqual:
@"-nosplash"] || [arg isEqual:
@"--nosplash"])
209 noSplashArgFound = YES;
211 else if (([arg isEqual:
@"-splash"] || [arg isEqual:
@"--splash"]) && !noSplashArgFound)
217 if ([arg isEqual:
@"-novsync"] || [arg isEqual:
@"--novsync"]) vSyncPreference = NO;
219 if ([arg isEqual:
@"-hdr"]) bitsPerColorComponent = 16;
222 cmdLineArgsStr = [
cmdLineArgsStr stringByAppendingFormat:@"%@ ", arg];
225 OOLog(
@"process.args",
@"%@", cmdLineArgsStr);
231 OOLog(
@"sdl.init",
@"%@",
@"initialising SDL");
232 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
234 OOLog(
@"sdl.init.failed",
@"Unable to init SDL: %s\n", SDL_GetError());
239 SDL_putenv (
"SDL_VIDEO_WINDOW_POS=center");
245 if (![
OOSound isSoundOK])
OOLog(
@"sound.init",
@"%@",
@"Sound system disabled.");
248 static char windowCaption[128];
249 NSString *versionString = [
NSString stringWithFormat:@"Oolite v%@", [[[
NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]];
251 strcpy (windowCaption, [versionString UTF8String]);
252 strcat (windowCaption,
" - "__DATE__);
253 SDL_WM_SetCaption (windowCaption,
"Oolite");
257 SDL_EventState (SDL_SYSWMEVENT, SDL_ENABLE);
260 static SDL_SysWMinfo wInfo;
261 SDL_VERSION(&wInfo.version);
262 SDL_GetWMInfo(&wInfo);
263 SDL_Window = wInfo.window;
266 if (![
self getCurrentMonitorInfo:&monitorInfo])
268 OOLogWARN(
@"display.initGL.monitorInfoWarning",
@"Could not get current monitor information.");
271 atDesktopResolution = YES;
273#if USE_UNDOCUMENTED_DARKMODE_API
275 HMODULE hUxTheme = LoadLibraryExW(L
"uxtheme.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
279 pfnSetPreferredAppMode SetPreferredAppMode = (pfnSetPreferredAppMode)GetProcAddress(hUxTheme, MAKEINTRESOURCEA(135));
280 if (SetPreferredAppMode) SetPreferredAppMode(AllowDark);
281 FreeLibrary(hUxTheme);
288 imagesDir = [[[
NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Images"];
289 icon = SDL_LoadBMP([[imagesDir stringByAppendingPathComponent:
@"WMicon.bmp"] UTF8String]);
293 colorkey = SDL_MapRGB(icon->format, 128, 0, 128);
294 SDL_SetColorKey(icon, SDL_SRCCOLORKEY, colorkey);
295 SDL_WM_SetIcon(icon, NULL);
297 SDL_FreeSurface(icon);
299 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, bitsPerColorComponent);
300 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, bitsPerColorComponent);
301 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, bitsPerColorComponent);
302 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, bitsPerColorComponent);
303 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
304 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
310 _hdrMaxBrightness = [
prefs oo_floatForKey:@"hdr-max-brightness" defaultValue:1000.0f];
311 _hdrPaperWhiteBrightness = [
prefs oo_floatForKey:@"hdr-paperwhite-brightness" defaultValue:200.0f];
312 if (bitsPerColorComponent == 16)
315 SDL_GL_SetAttribute(SDL_GL_PIXEL_TYPE_FLOAT, 1);
321 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vSyncPreference);
322 OOLog(
@"display.initGL",
@"V-Sync %@requested.", vSyncPreference ?
@"" :
@"not ");
331 if ([prefs oo_boolForKey:
@"anti-aliasing" defaultValue:NO])
333 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
334 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
337 OOLog(
@"display.mode.list",
@"%@",
@"CREATING MODE LIST");
350 OOLog(
@"display.initGL",
@"Trying %d-bpcc, 24-bit depth buffer", bitsPerColorComponent);
356 OOLog(
@"display.initGL",
@"%@",
@"Trying 8-bpcc, 32-bit depth buffer");
357 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
358 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
359 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
360 SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
361 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
368 OOLog(
@"display.initGL",
@"%@",
@"Trying 5-bpcc, 16-bit depth buffer");
369 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
370 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
371 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
372 SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
374 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0);
375 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0);
381 char * errStr = SDL_GetError();
382 OOLogERR(
@"display.mode.error",
@"Could not create display surface: %s", errStr);
386 [[
NSUserDefaults standardUserDefaults] setBool:NO forKey:@"splash-screen"];
388 OOLogWARN(
@"display.mode.conflict",
@"Possible incompatibility between the splash screen and video drivers detected.");
389 OOLogWARN(
@"display.mode.conflict",
@"Oolite will start without showing the splash screen from now on. Override with 'oolite.exe -splash'");
398 OOLog(
@"display.initGL",
@"%@",
@"Achieved color / depth buffer sizes (bits):");
399 SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &testAttrib);
400 OOLog(
@"display.initGL",
@"Red: %d", testAttrib);
401 SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &testAttrib);
402 OOLog(
@"display.initGL",
@"Green: %d", testAttrib);
403 SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &testAttrib);
404 OOLog(
@"display.initGL",
@"Blue: %d", testAttrib);
405 SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &testAttrib);
406 OOLog(
@"display.initGL",
@"Alpha: %d", testAttrib);
407 SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &testAttrib);
408 OOLog(
@"display.initGL",
@"Depth Buffer: %d", testAttrib);
410 SDL_GL_GetAttribute(SDL_GL_PIXEL_TYPE_FLOAT, &testAttrib);
411 OOLog(
@"display.initGL",
@"Pixel type is float : %d", testAttrib);
413 OOLog(
@"display.initGL",
@"Pixel format index: %d", GetPixelFormat(GetDC(SDL_Window)));
417 if (vSyncPreference && SDL_GL_GetAttribute(SDL_GL_SWAP_CONTROL, &vSyncValue) == -1)
419 OOLogWARN(
@"display.initGL",
@"Could not enable V-Sync. Please check that your graphics driver supports the %@_swap_control extension.",
453 if (MessageBox(NULL,
"No primary display in HDR mode was detected.\n\n"
454 "If you continue, graphics will not be rendered as intended.\n"
455 "Click OK to launch anyway, or Cancel to exit.",
"oolite.exe - HDR requested",
456 MB_OKCANCEL | MB_ICONWARNING) == IDCANCEL)
469 ShowWindow(SDL_Window,SW_RESTORE);
474 int videoModeFlags = SDL_HWSURFACE | SDL_OPENGL;
476 videoModeFlags |= (
fullScreen) ? SDL_FULLSCREEN : SDL_RESIZABLE;
482 videoModeFlags &= ~SDL_FULLSCREEN;
483 videoModeFlags |= SDL_RESIZABLE;
487 SDL_putenv (
"SDL_VIDEO_WINDOW_POS=none");
496 SDL_Event dummyEvent;
497 while (SDL_PollEvent(&dummyEvent))
523 NSString *kbd = [
prefs oo_stringForKey:@"keyboard-code" defaultValue:@"default"];
524 NSDictionary *subset = [
kmap objectForKey:kbd];
526 [keyMappings_normal release];
528 [keyMappings_shifted release];
536 [typedString release];
539 [screenSizes release];
543 SDL_FreeSurface(surface);
547 if (keyMappings_normal)
548 [keyMappings_normal release];
550 if (keyMappings_shifted)
551 [keyMappings_shifted release];
557 [matrixManager release];
568 if (SDL_ShowCursor(SDL_QUERY) == SDL_ENABLE)
569 SDL_ShowCursor(SDL_DISABLE);
573 if (SDL_ShowCursor(SDL_QUERY) == SDL_DISABLE)
574 SDL_ShowCursor(SDL_ENABLE);
584- (void) allowStringInput: (BOOL) value
584- (void) allowStringInput: (BOOL) value {
…}
606 [typedString setString:@""];
610- (void) setTypedString:(NSString*) value
612 [typedString setString:value];
610- (void) setTypedString:(NSString*) value {
…}
677- (void) setFullScreenMode:(BOOL)fsm
682 [[NSUserDefaults standardUserDefaults]
683 setBool: fullScreen forKey:@"fullscreen"];
684 [[NSUserDefaults standardUserDefaults] synchronize];
688- (void) toggleScreenMode
690 [
self setFullScreenMode: !fullScreen];
692 [
self getCurrentMonitorInfo:&monitorInfo];
697 if(![
self isRunningOnPrimaryDisplayDevice])
699 [
self initialiseGLWithSize:NSMakeSize(monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left,
700 monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top)];
702 else [
self initialiseGLWithSize:[
self modeAsSize: currentSize]];
704 [
self initialiseGLWithSize:[
self modeAsSize: currentSize]];
708 [
self initialiseGLWithSize: currentWindowSize];
712 if ([PlayerEntity sharedPlayer])
719- (void) setDisplayMode:(
int)mode fullScreen:(BOOL)fsm
721 [
self setFullScreenMode: fsm];
724 [
self initialiseGLWithSize: [
self modeAsSize: mode]];
728- (
int) indexOfCurrentSize
734- (void) setScreenSize: (
int)sizeIndex
736 currentSize=sizeIndex;
738 [
self initialiseGLWithSize: [
self modeAsSize: currentSize]];
742- (NSMutableArray *)getScreenSizeArray
748- (NSSize) modeAsSize:(
int)sizeIndex
750 NSDictionary *
mode=[screenSizes objectAtIndex: sizeIndex];
764 [
self drawRect: NSMakeRect(0, 0, viewSize.width, viewSize.height)];
767- (void) drawRect:(NSRect)rect
767- (void) drawRect:(NSRect)rect {
…}
772- (void) updateScreenWithVideoMode:(BOOL) v_mode
793 if (
UNIVERSE) [UNIVERSE drawUniverse];
797 glClearColor( 0.0, 0.0, 0.0, 0.0);
798 glClear( GL_COLOR_BUFFER_BIT);
801 SDL_GL_SwapBuffers();
772- (void) updateScreenWithVideoMode:(BOOL) v_mode {
…}
809 SDL_Surface *image=NULL;
812 NSString *imagesDir = [[[
NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Images"];
814 image = SDL_LoadBMP([[imagesDir stringByAppendingPathComponent:
@"splash.bmp"] UTF8String]);
818 SDL_FreeSurface(image);
819 OOLogWARN(
@"sdl.gameStart",
@"%@",
@"image 'splash.bmp' not found!");
831 dest.x = (GetSystemMetrics(SM_CXSCREEN)- dest.w)/2;
832 dest.y = (GetSystemMetrics(SM_CYSCREEN)-dest.h)/2;
833 SetWindowLong(SDL_Window,GWL_STYLE,GetWindowLong(SDL_Window,GWL_STYLE) & ~WS_CAPTION & ~WS_THICKFRAME);
834 ShowWindow(SDL_Window,SW_RESTORE);
835 MoveWindow(SDL_Window,dest.x,dest.y,dest.w,dest.h,TRUE);
847 surface = SDL_SetVideoMode(dest.w, dest.h, 32, SDL_HWSURFACE | SDL_OPENGL);
853 glViewport( 0, 0, dest.w, dest.h);
855 glEnable( GL_TEXTURE_2D );
856 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
857 glClear( GL_COLOR_BUFFER_BIT );
867 GLenum texture_format;
871 nOfColors = image->format->BytesPerPixel;
874 if (image->format->Rmask == 0x000000ff)
875 texture_format = GL_RGBA;
877 texture_format = GL_BGRA;
879 else if (nOfColors == 3)
881 if (image->format->Rmask == 0x000000ff)
882 texture_format = GL_RGB;
884 texture_format = GL_BGR;
886 SDL_FreeSurface(image);
887 OOLog(
@"Sdl.GameStart",
@"%@",
@"----- Encoding error within image 'splash.bmp'");
892 glGenTextures( 1, &texture );
893 glBindTexture( GL_TEXTURE_2D, texture );
896 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
897 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
900 glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, image->w, image->h, 0,
901 texture_format, GL_UNSIGNED_BYTE, image->pixels );
903 glBindTexture( GL_TEXTURE_2D, texture );
906 glTexCoord2i( 0, 0 );
908 glTexCoord2i( 1, 0 );
909 glVertex2i( dest.w, 0 );
910 glTexCoord2i( 1, 1 );
911 glVertex2i( dest.w, dest.h );
912 glTexCoord2i( 0, 1 );
913 glVertex2i( 0, dest.h );
917 SDL_GL_SwapBuffers();
922 SDL_FreeSurface( image );
924 glDeleteTextures(1, &texture);
926 glDisable( GL_TEXTURE_2D );
932- (MONITORINFOEX) currentMonitorInfo
938- (BOOL) getCurrentMonitorInfo:(MONITORINFOEX *)mInfo
940 HMONITOR hMon = MonitorFromWindow(SDL_Window, MONITOR_DEFAULTTOPRIMARY);
941 ZeroMemory(mInfo,
sizeof(MONITORINFOEX));
942 mInfo->cbSize =
sizeof(MONITORINFOEX);
943 if (GetMonitorInfo (hMon, (LPMONITORINFO)mInfo))
951- (BOOL) isRunningOnPrimaryDisplayDevice
954 [
self getCurrentMonitorInfo:&monitorInfo];
955 if (!(monitorInfo.dwFlags & MONITORINFOF_PRIMARY))
963- (void) grabMouseInsideGameWindow:(BOOL) value
968 GetWindowRect(SDL_Window, &gameWindowRect);
969 ClipCursor(&gameWindowRect);
975 grabMouseStatus = !!value;
979- (void) stringToClipboard:(NSString *)stringToCopy
983 const char *clipboardText = [stringToCopy cStringUsingEncoding:NSUTF8StringEncoding];
984 const size_t clipboardTextLength = strlen(clipboardText) + 1;
985 HGLOBAL clipboardMem = GlobalAlloc(GMEM_MOVEABLE, clipboardTextLength);
988 memcpy(GlobalLock(clipboardMem), clipboardText, clipboardTextLength);
989 GlobalUnlock(clipboardMem);
992 if (!SetClipboardData(CF_TEXT, clipboardMem))
994 OOLog(
@"stringToClipboard.failed",
@"Failed to copy string %@ to clipboard", stringToCopy);
999 GlobalFree(clipboardMem);
1011 SDLMod modState = SDL_GetModState();
1012 Uint8 *keyState = SDL_GetKeyState(NULL);
1013 BYTE keyboardStatus[256];
1014 #define OO_RESET_SDLKEY_MODIFIER(vkCode, kModCode, sdlkCode) do {\
1015 if (keyboardStatus[vkCode] & 0x0080) \
1017 modState |= kModCode; \
1018 keyState[sdlkCode] = SDL_PRESSED; \
1022 modState &= ~kModCode; \
1023 keyState[sdlkCode] = SDL_RELEASED; \
1026 if (GetKeyboardState(keyboardStatus))
1039 OO_RESET_SDLKEY_MODIFIER(VK_LCONTROL, KMOD_LCTRL, SDLK_LCTRL);
1040 OO_RESET_SDLKEY_MODIFIER(VK_RCONTROL, KMOD_RCTRL, SDLK_RCTRL);
1041 ctrl = (modState & KMOD_LCTRL || modState & KMOD_RCTRL);
1044 OO_RESET_SDLKEY_MODIFIER(VK_LSHIFT, KMOD_LSHIFT, SDLK_LSHIFT);
1045 OO_RESET_SDLKEY_MODIFIER(VK_RSHIFT, KMOD_RSHIFT, SDLK_RSHIFT);
1046 shift = (modState & KMOD_LSHIFT || modState & KMOD_RSHIFT);
1049 if (GetKeyState(VK_CAPITAL) & 0x0001)
1051 modState |= KMOD_CAPS;
1052 keyState[SDLK_CAPSLOCK] = SDL_PRESSED;
1056 modState &= ~KMOD_CAPS;
1057 keyState[SDLK_CAPSLOCK] = SDL_RELEASED;
1061 SDL_SetModState(modState);
1065- (void) setWindowBorderless:(BOOL)borderless
1067 LONG currentWindowStyle = GetWindowLong(SDL_Window, GWL_STYLE);
1070 if ((!borderless && (currentWindowStyle & WS_CAPTION)) ||
1071 (borderless && !(currentWindowStyle & WS_CAPTION)))
return;
1075 SetWindowLong(SDL_Window, GWL_STYLE, currentWindowStyle & ~WS_CAPTION & ~WS_THICKFRAME);
1079 SetWindowLong(SDL_Window, GWL_STYLE, currentWindowStyle |
1080 WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );
1081 [
self refreshDarKOrLightMode];
1083 SetWindowPos(SDL_Window, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
1087- (void) refreshDarKOrLightMode
1089 int shouldSetDarkMode = [
self isDarkModeOn];
1090 DwmSetWindowAttribute (SDL_Window, DWMWA_USE_IMMERSIVE_DARK_MODE, &shouldSetDarkMode,
sizeof(shouldSetDarkMode));
1094- (BOOL) isDarkModeOn
1097 DWORD bufferSize =
sizeof(buffer);
1100 HRESULT resultRegGetValue = RegGetValueW(HKEY_CURRENT_USER, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize",
1101 L
"AppsUseLightTheme", RRF_RT_REG_DWORD, NULL, buffer, &bufferSize);
1102 if (resultRegGetValue != ERROR_SUCCESS)
1108 int i = (
int)(buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0]);
1115- (BOOL) atDesktopResolution
1117 return atDesktopResolution;
1127- (BOOL) isOutputDisplayHDREnabled
1129 UINT32 pathCount, modeCount;
1130 DISPLAYCONFIG_PATH_INFO *pPathInfoArray;
1131 DISPLAYCONFIG_MODE_INFO *pModeInfoArray;
1132 UINT32 flags = QDC_ONLY_ACTIVE_PATHS | QDC_VIRTUAL_MODE_AWARE;
1133 LONG tempResult = ERROR_SUCCESS;
1134 BOOL isAdvColorInfo2DetectionSuccess = NO;
1140 tempResult = GetDisplayConfigBufferSizes(flags, &pathCount, &modeCount);
1142 if (tempResult != ERROR_SUCCESS)
1144 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: %d", HRESULT_FROM_WIN32(tempResult));
1149 pPathInfoArray = (DISPLAYCONFIG_PATH_INFO *)malloc(pathCount *
sizeof(DISPLAYCONFIG_PATH_INFO));
1150 if (!pPathInfoArray)
1152 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: -1");
1156 pModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)malloc(modeCount *
sizeof(DISPLAYCONFIG_MODE_INFO));
1157 if (!pModeInfoArray)
1160 free(pPathInfoArray);
1161 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: -1");
1166 tempResult = QueryDisplayConfig(flags, &pathCount, pPathInfoArray, &modeCount, pModeInfoArray, NULL);
1168 if (tempResult != ERROR_SUCCESS)
1170 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: %d", HRESULT_FROM_WIN32(tempResult));
1175 pPathInfoArray = realloc(pPathInfoArray, pathCount *
sizeof(DISPLAYCONFIG_PATH_INFO));
1176 if (!pPathInfoArray)
1178 OOLogERR(
@"gameView.isOutputDisplayHDREnabled",
@"Failed ro reallocate pPathInfoArray");
1181 pModeInfoArray = realloc(pModeInfoArray, modeCount *
sizeof(DISPLAYCONFIG_MODE_INFO));
1182 if (!pModeInfoArray)
1184 OOLogERR(
@"gameView.isOutputDisplayHDREnabled",
@"Failed to reallocate pModeInfoArray");
1190 }
while (tempResult == ERROR_INSUFFICIENT_BUFFER);
1192 if (tempResult != ERROR_SUCCESS)
1194 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: %d", HRESULT_FROM_WIN32(tempResult));
1200 for (i = 0; i < pathCount; i++)
1202 DISPLAYCONFIG_PATH_INFO *path = &pPathInfoArray[i];
1204 DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = {};
1205 targetName.header.adapterId = path->targetInfo.adapterId;
1206 targetName.header.id = path->targetInfo.id;
1207 targetName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
1208 targetName.header.size =
sizeof(targetName);
1209 tempResult = DisplayConfigGetDeviceInfo(&targetName.header);
1211 if (tempResult != ERROR_SUCCESS)
1213 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: %d", HRESULT_FROM_WIN32(tempResult));
1218 DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO_2 advColorInfo2 = {};
1219 advColorInfo2.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO_2;
1220 advColorInfo2.header.adapterId = path->targetInfo.adapterId;
1221 advColorInfo2.header.id = path->targetInfo.id;
1222 advColorInfo2.header.size =
sizeof(advColorInfo2);
1224 tempResult = DisplayConfigGetDeviceInfo(&advColorInfo2.header);
1226 if (tempResult == ERROR_SUCCESS) isAdvColorInfo2DetectionSuccess = YES;
1229 OOLogWARN(
@"gameView.isOutputDisplayHDREnabled",
@"Received 0x%08X while attempting to detect HDR mode using Advanced Color Info 2 API. Retrying detection using legacy API.", HRESULT_FROM_WIN32(tempResult));
1234 DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO advColorInfo = {};
1235 advColorInfo.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO;
1236 advColorInfo.header.adapterId = path->targetInfo.adapterId;
1237 advColorInfo.header.id = path->targetInfo.id;
1238 advColorInfo.header.size =
sizeof(advColorInfo);
1240 tempResult = DisplayConfigGetDeviceInfo(&advColorInfo.header);
1242 if (tempResult != ERROR_SUCCESS)
1244 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"Error! Code: %d", HRESULT_FROM_WIN32(tempResult));
1248 char saveDeviceName[64];
1249 wchar_t wcsDeviceID[256];
1251 ZeroMemory(&dd,
sizeof(dd));
1253 EnumDisplayDevices(NULL, i, &dd, 0);
1254 BOOL isPrimaryDisplayDevice = dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE;
1256 strncpy(saveDeviceName, dd.DeviceName, 33);
1257 EnumDisplayDevices(saveDeviceName, 0, &dd, 0x00000001);
1258 mbstowcs(wcsDeviceID, dd.DeviceID, 129);
1263 if (isPrimaryDisplayDevice && !wcscmp(targetName.monitorDevicePath, wcsDeviceID) &&
1264 ((isAdvColorInfo2DetectionSuccess && advColorInfo2.highDynamicRangeSupported && advColorInfo2.activeColorMode == DISPLAYCONFIG_ADVANCED_COLOR_MODE_HDR) ||
1265 (!isAdvColorInfo2DetectionSuccess && advColorInfo.advancedColorSupported && advColorInfo.advancedColorEnabled && !advColorInfo.wideColorEnforced)))
1272 OOLog(
@"gameView.isOutputDisplayHDREnabled",
@"HDR display output requested - checking availability: %@", result ?
@"YES" :
@"NO");
1274 free (pModeInfoArray);
1275 free (pPathInfoArray);
1281- (float) hdrMaxBrightness
1283 return _hdrMaxBrightness;
1287- (void) setHDRMaxBrightness: (
float)newMaxBrightness
1291 _hdrMaxBrightness = newMaxBrightness;
1293 [[NSUserDefaults standardUserDefaults] setFloat:_hdrMaxBrightness forKey:@"hdr-max-brightness"];
1297- (float) hdrPaperWhiteBrightness
1299 return _hdrPaperWhiteBrightness;
1303- (void) setHDRPaperWhiteBrightness: (
float)newPaperWhiteBrightness
1307 _hdrPaperWhiteBrightness = newPaperWhiteBrightness;
1309 [[NSUserDefaults standardUserDefaults] setFloat:_hdrPaperWhiteBrightness forKey:@"hdr-paperwhite-brightness"];
1322- (void) grabMouseInsideGameWindow:(BOOL) value
1322- (void) grabMouseInsideGameWindow:(BOOL) value {
…}
1328- (void) stringToClipboard:(NSString *)stringToCopy
1328- (void) stringToClipboard:(NSString *)stringToCopy {
…}
1340- (void) setWindowBorderless:(BOOL)borderless
1340- (void) setWindowBorderless:(BOOL)borderless {
…}
1360- (void) initialiseGLWithSize:(NSSize) v_size
1360- (void) initialiseGLWithSize:(NSSize) v_size {
…}
1366- (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode
1372 OOLog(
@"display.initGL",
@"Requested a new surface of %d x %d, %@.", (
int)
viewSize.width, (
int)
viewSize.height,(
fullScreen ?
@"fullscreen" :
@"windowed"));
1373 SDL_GL_SwapBuffers();
1376 if (!updateContext)
return;
1379 settings.dmSize =
sizeof(DEVMODE);
1380 settings.dmDriverExtra = 0;
1381 EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &settings);
1383 WINDOWPLACEMENT windowPlacement;
1384 windowPlacement.length =
sizeof(WINDOWPLACEMENT);
1385 GetWindowPlacement(SDL_Window, &windowPlacement);
1387 static BOOL lastWindowPlacementMaximized = NO;
1388 if (
fullScreen && (windowPlacement.showCmd == SW_SHOWMAXIMIZED))
1392 lastWindowPlacementMaximized = YES;
1396 if (lastWindowPlacementMaximized)
1398 windowPlacement.showCmd = SW_SHOWMAXIMIZED;
1405 (wasFullScreen && (settings.dmPelsWidth != [[[screenSizes objectAtIndex:0] objectForKey: kOODisplayWidth] intValue]
1406 || settings.dmPelsHeight != [[[screenSizes objectAtIndex:0] objectForKey: kOODisplayHeight] intValue])));
1418 [
self getCurrentMonitorInfo: &monitorInfo];
1420 settings.dmPelsWidth =
viewSize.width;
1421 settings.dmPelsHeight =
viewSize.height;
1422 settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
1427 if(lastWindowPlacementMaximized)
1429 CopyRect(&lastGoodRect, &windowPlacement.rcNormalPosition);
1431 windowPlacement.showCmd = SW_SHOWNORMAL;
1432 SetWindowPlacement(SDL_Window, &windowPlacement);
1434 else GetWindowRect(SDL_Window, &lastGoodRect);
1437 SetForegroundWindow(SDL_Window);
1438 if (changingResolution)
1440 if (ChangeDisplaySettingsEx(monitorInfo.szDevice, &settings, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)
1443 OOLogERR(
@"displayMode.change.error",
@"Could not switch to requested display mode.");
1446 atDesktopResolution = settings.dmPelsWidth == [[[screenSizes objectAtIndex:0] objectForKey: kOODisplayWidth] intValue]
1447 && settings.dmPelsHeight == [[[screenSizes objectAtIndex:0] objectForKey: kOODisplayHeight] intValue];
1450 MoveWindow(SDL_Window, monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top, (
int)
viewSize.width, (
int)
viewSize.height, TRUE);
1457 else if ( wasFullScreen )
1459 if (changingResolution)
1462 if (ChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL) == DISP_CHANGE_SUCCESSFUL)
1464 atDesktopResolution = YES;
1476 [
self getCurrentMonitorInfo: &monitorInfo];
1478 if (lastWindowPlacementMaximized) CopyRect(&windowPlacement.rcNormalPosition, &lastGoodRect);
1479 SetWindowPlacement(SDL_Window, &windowPlacement);
1480 if (!lastWindowPlacementMaximized)
1482 MoveWindow(SDL_Window, (monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left - (
int)
viewSize.width)/2 +
1483 monitorInfo.rcMonitor.left,
1484 (monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top - (
int)
viewSize.height)/2 +
1485 monitorInfo.rcMonitor.top,
1491 lastWindowPlacementMaximized = NO;
1492 ShowWindow(SDL_Window,SW_SHOW);
1496 saveSize = !wasFullScreen;
1498 GetClientRect(SDL_Window, &wDC);
1501 ||
bounds.size.height != wDC.bottom - wDC.top))
1510 RECT desiredClientRect;
1511 GetWindowRect(SDL_Window, &desiredClientRect);
1512 AdjustWindowRect(&desiredClientRect, WS_CAPTION | WS_THICKFRAME, FALSE);
1513 SetWindowPos(SDL_Window, NULL, desiredClientRect.left, desiredClientRect.top,
1514 desiredClientRect.right - desiredClientRect.left,
1515 desiredClientRect.bottom - desiredClientRect.top, 0);
1517 GetClientRect(SDL_Window, &wDC);
1518 viewSize.width = wDC.right - wDC.left;
1519 viewSize.height = wDC.bottom - wDC.top;
1528 bounds.origin.x = monitorInfo.rcMonitor.left;
1529 bounds.origin.y = monitorInfo.rcMonitor.top;
1535 int videoModeFlags = SDL_HWSURFACE | SDL_OPENGL;
1538 videoModeFlags |= SDL_NOFRAME;
1541 videoModeFlags |= SDL_FULLSCREEN;
1545 videoModeFlags |= SDL_RESIZABLE;
1553 videoModeFlags &= ~SDL_FULLSCREEN;
1554 videoModeFlags |= SDL_RESIZABLE;
1561 OOLogERR(
@"display.mode.error",
@"Unable to change display mode: %s",SDL_GetError());
1569 OOLog(
@"display.initGL",
@"Created a new surface of %d x %d, %@.", (
int)
viewSize.width, (
int)
viewSize.height,(
fullScreen ?
@"fullscreen" :
@"windowed"));
1586 SDL_GL_SwapBuffers();
1366- (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode {
…}
1599- (void) adjustColorSaturation:(
float)colorSaturationAdjustment;
1599- (void) adjustColorSaturation:(
float)colorSaturationAdjustment; {
…}
1606- (BOOL) snapShot:(NSString *)filename
1608 BOOL snapShotOK = YES;
1609 SDL_Surface* tmpSurface;
1612 NSString* originalDirectory = [[
NSFileManager defaultManager] currentDirectoryPath];
1617 static unsigned imageNo = 0;
1618 unsigned tmpImageNo = 0;
1619 NSString *pathToPic =
nil;
1620 NSString *baseName =
@"oolite";
1622#if SNAPSHOTS_PNG_FORMAT
1623 NSString *extension =
@".png";
1625 NSString *extension =
@".bmp";
1631 pathToPic = [filename stringByAppendingString:extension];
1635 tmpImageNo = imageNo;
1638 if (withFilename && [[NSFileManager defaultManager] fileExistsAtPath:pathToPic])
1640 OOLog(
@"screenshot.filenameExists",
@"Snapshot \"%@%@\
" already exists - adding numerical sequence.", pathToPic, extension);
1644 if (pathToPic ==
nil)
1649 pathToPic = [
NSString stringWithFormat:@"%@-%03d%@", baseName, tmpImageNo, extension];
1650 }
while ([[NSFileManager defaultManager] fileExistsAtPath:pathToPic]);
1655 imageNo = tmpImageNo;
1658 OOLog(
@"screenshot",
@"Saving screen shot \"%@\
" (%u x %u pixels).", pathToPic,
surface->w,
surface->h);
1661 unsigned char *pixls = malloc(pitch *
surface->h);
1665 if (
surface->w % 4) glPixelStorei(GL_PACK_ALIGNMENT,1);
1666 else glPixelStorei(GL_PACK_ALIGNMENT,4);
1667 for (
y=
surface->h-1, off=0;
y>=0;
y--, off+=pitch)
1669 glReadPixels(0,
y,
surface->w, 1, GL_RGB, GL_UNSIGNED_BYTE, pixls + off);
1672 tmpSurface=SDL_CreateRGBSurfaceFrom(pixls,
surface->w,
surface->h,24,
surface->w*3,0xFF,0xFF00,0xFF0000,0x0);
1673#if SNAPSHOTS_PNG_FORMAT
1674 if(![
self pngSaveSurface:pathToPic withSurface:tmpSurface])
1676 OOLog(
@"screenshotPNG",
@"Failed to save %@", pathToPic);
1680 if (SDL_SaveBMP(tmpSurface, [pathToPic UTF8String]) == -1)
1682 OOLog(
@"screenshotBMP",
@"Failed to save %@", pathToPic);
1686 SDL_FreeSurface(tmpSurface);
1692 NSString *fileExtension = [[
NSUserDefaults standardUserDefaults] oo_stringForKey:@"hdr-snapshot-format" defaultValue:SNAPSHOTHDR_EXTENSION_DEFAULT];
1695 if (![[fileExtension substringToIndex:1] isEqual:
@"."]) fileExtension = [@"."
stringByAppendingString:fileExtension];
1703 NSString *pathToPicHDR = [
pathToPic stringByReplacingString:@".png" withString:fileExtension];
1704 OOLog(
@"screenshot",
@"Saving screen shot \"%@\
" (%u x %u pixels).", pathToPicHDR,
surface->w,
surface->h);
1705 GLfloat *pixlsf = (GLfloat *)malloc(pitch *
surface->h *
sizeof(GLfloat));
1706 for (
y=
surface->h-1, off=0;
y>=0;
y--, off+=pitch)
1708 glReadPixels(0,
y,
surface->w, 1, GL_RGB, GL_FLOAT, pixlsf + off);
1714 OOLog(
@"screenshotHDR",
@"Failed to save %@", pathToPicHDR);
1722 [[
NSFileManager defaultManager] changeCurrentDirectoryPath:originalDirectory];
1606- (BOOL) snapShot:(NSString *)filename {
…}
1727#if SNAPSHOTS_PNG_FORMAT
1729- (BOOL) pngSaveSurface:(NSString *)fileName withSurface:(SDL_Surface *)surf
1735 png_bytep *rowPointers;
1737 fp = fopen([fileName UTF8String],
"wb");
1740 OOLog(
@"pngSaveSurface.fileCreate.failed",
@"Failed to create output screenshot file %@", fileName);
1745 pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
1751 infoPtr = png_create_info_struct(pngPtr);
1752 if (infoPtr == NULL) {
1753 png_destroy_write_struct(&pngPtr, (png_infopp)NULL);
1754 OOLog(
@"pngSaveSurface.info_struct.failed",
@"%@",
@"png_create_info_struct error");
1758 if (setjmp(png_jmpbuf(pngPtr)))
1760 png_destroy_write_struct(&pngPtr, &infoPtr);
1765 png_init_io(pngPtr, fp);
1767 colorType = PNG_COLOR_MASK_COLOR;
1768 if (surf->format->palette)
1770 colorType |= PNG_COLOR_MASK_PALETTE;
1772 else if (surf->format->Amask)
1774 colorType |= PNG_COLOR_MASK_ALPHA;
1777 png_set_IHDR(pngPtr, infoPtr, surf->w, surf->h, 8, colorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
1781 if ([
self hdrOutput]) png_set_gAMA(pngPtr, infoPtr, 1.0f);
1784 png_write_info(pngPtr, infoPtr);
1785 png_set_packing(pngPtr);
1787 rowPointers = (png_bytep*) malloc(
sizeof(png_bytep)*surf->h);
1788 for (i = 0; i < surf->h; i++)
1790 rowPointers[
i] = (png_bytep)(Uint8 *)surf->pixels + i*surf->pitch;
1792 png_write_image(pngPtr, rowPointers);
1793 png_write_end(pngPtr, infoPtr);
1796 png_destroy_write_struct(&pngPtr, &infoPtr);
1729- (BOOL) pngSaveSurface:(NSString *)fileName withSurface:(SDL_Surface *)surf {
…}
1805- (
int) translateKeyCode: (
int) input
1810 case NSUpArrowFunctionKey:
1814 case NSDownArrowFunctionKey:
1818 case NSLeftArrowFunctionKey:
1822 case NSRightArrowFunctionKey:
1826 case NSF1FunctionKey:
1830 case NSF2FunctionKey:
1834 case NSF3FunctionKey:
1838 case NSF4FunctionKey:
1842 case NSF5FunctionKey:
1846 case NSF6FunctionKey:
1850 case NSF7FunctionKey:
1854 case NSF8FunctionKey:
1858 case NSF9FunctionKey:
1862 case NSF10FunctionKey:
1866 case NSF11FunctionKey:
1870 case NSHomeFunctionKey:
1881- (void) setVirtualJoystick:(
double) vmx :(
double) vmy
1881- (void) setVirtualJoystick:(
double) vmx :(
double) vmy {
…}
1900 for (i = 0; i < [
self numKeys]; i++)
1907 keys[gvMouseDoubleClick] = NO;
1908 keys[gvMouseLeftButton] = NO;
1913- (void) clearKey: (
int)theKey
1915 if (theKey >= 0 && theKey < [
self numKeys])
1913- (void) clearKey: (
int)theKey {
…}
1924 [
self setVirtualJoystick:0.0 :0.0];
1957- (BOOL) isDown: (
int) key
1957- (BOOL) isDown: (
int) key {
…}
2001 return (SDL_GetModState() & KMOD_CAPS) == KMOD_CAPS;
2033- (void) setMouseWheelDelta: (
float) newWheelDelta
2033- (void) setMouseWheelDelta: (
float) newWheelDelta {
…}
2060 SDL_KeyboardEvent *kbd_event;
2061 SDL_MouseButtonEvent *mbtn_event;
2062 SDL_MouseMotionEvent *mmove_event;
2063 int mxdelta, mydelta;
2066 NSTimeInterval timeNow = [
NSDate timeIntervalSinceReferenceDate];
2070 while (SDL_PollEvent(&event))
2072 switch (event.type) {
2073 case SDL_JOYAXISMOTION:
2074 case SDL_JOYBUTTONUP:
2075 case SDL_JOYBUTTONDOWN:
2076 case SDL_JOYHATMOTION:
2080 case SDL_MOUSEBUTTONDOWN:
2081 mbtn_event = (SDL_MouseButtonEvent*)&event;
2086 short inDelta = mbtn_event->wheelDelta;
2088 switch(mbtn_event->button)
2090 case SDL_BUTTON_LEFT:
2091 keys[gvMouseLeftButton] = YES;
2093 case SDL_BUTTON_RIGHT:
2105 case SDL_BUTTON_WHEELUP:
2108 case SDL_BUTTON_WHEELDOWN:
2111 case SDL_BUTTON_WHEELUP:
2112 case SDL_BUTTON_WHEELDOWN:
2121 else if (inDelta < 0)
2132 case SDL_MOUSEBUTTONUP:
2133 mbtn_event = (SDL_MouseButtonEvent*)&event;
2136 if (mbtn_event->button == SDL_BUTTON_LEFT)
2143 keys[gvMouseLeftButton] = NO;
2151 if (mbtn_event->button == SDL_BUTTON_WHEELUP || mbtn_event->button == SDL_BUTTON_WHEELDOWN)
2158 case SDL_MOUSEMOTION:
2171 SDL_GetRelativeMouseState(&mxdelta, &mydelta);
2172 double mxd=(double)mxdelta / mouseVirtualStickSensitivityX;
2173 double myd=(double)mydelta / mouseVirtualStickSensitivityY;
2202 mmove_event = (SDL_MouseMotionEvent*)&event;
2205 int h=
bounds.size.height;
2209 double mx = mmove_event->x - w/2.0;
2210 double my = mmove_event->y - h/2.0;
2222 [
self setVirtualJoystick:mx :my];
2233 kbd_event = (SDL_KeyboardEvent*)&event;
2234 key_id = (Uint16)kbd_event->keysym.unicode;
2235 scan_code = kbd_event->keysym.scancode;
2239 BOOL modifier_pressed = NO;
2240 BOOL special_key = NO;
2243 switch (kbd_event->keysym.sym)
2248 modifier_pressed = YES;
2254 modifier_pressed = YES;
2260 modifier_pressed = YES;
2280 case SDLK_HOME: key_id =
gvHomeKey; special_key = YES;
break;
2281 case SDLK_END: key_id =
gvEndKey; special_key = YES;
break;
2282 case SDLK_INSERT: key_id =
gvInsertKey; special_key = YES;
break;
2283 case SDLK_PAGEUP: key_id =
gvPageUpKey; special_key = YES;
break;
2284 case SDLK_PAGEDOWN: key_id =
gvPageDownKey; special_key = YES;
break;
2285 case SDLK_SPACE: key_id = 32; special_key = YES;
break;
2286 case SDLK_RETURN: key_id = 13; special_key = YES;
break;
2287 case SDLK_TAB: key_id = 9; special_key = YES;
break;
2288 case SDLK_UP: key_id =
gvArrowKeyUp; special_key = YES;
break;
2289 case SDLK_DOWN: key_id =
gvArrowKeyDown; special_key = YES;
break;
2290 case SDLK_LEFT: key_id =
gvArrowKeyLeft; special_key = YES;
break;
2292 case SDLK_PAUSE: key_id =
gvPauseKey; special_key = YES;
break;
2293 case SDLK_BACKSPACE: key_id =
gvBackspaceKey; special_key = YES;
break;
2294 case SDLK_DELETE: key_id =
gvDeleteKey; special_key = YES;
break;
2333 if (
ctrl && key_id >=1 && key_id <= 26)
2353 NSString *keyNormal = [keyMappings_normal objectForKey:[
NSString stringWithFormat:@"%d", scan_code]];
2354 if (keyNormal) key_id = [
keyNormal integerValue];
2358 NSString *keyShifted = [keyMappings_shifted objectForKey:[
NSString stringWithFormat:@"%d", scan_code]];
2359 if (keyShifted) key_id = [
keyShifted integerValue];
2371 OOLog(
kOOLogKeyDown,
@"Keydown scancode = %d, unicode = %i, sym = %i, character = %c, shift = %d, ctrl = %d, alt = %d", scan_code, key_id, kbd_event->keysym.sym, key_id,
shift,
ctrl,
opt);
2374 if (key_id > 0 && key_id <= [
self numKeys])
2386 kbd_event = (SDL_KeyboardEvent*)&event;
2387 scan_code = kbd_event->keysym.scancode;
2393 switch (kbd_event->keysym.sym)
2412 OOLog(
kOOLogKeyUp,
@"Keyup scancode = %d, unicode = %i, sym = %i, character = %c, shift = %d, ctrl = %d, alt = %d", scan_code, key_id, kbd_event->keysym.sym, key_id,
shift,
ctrl,
opt);
2416 switch (kbd_event->keysym.sym)
2435 case SDLK_HOME: key_id =
gvHomeKey;
break;
2436 case SDLK_END: key_id =
gvEndKey;
break;
2440 case SDLK_SPACE: key_id = 32;
break;
2441 case SDLK_RETURN: key_id = 13;
break;
2442 case SDLK_TAB: key_id = 9;
break;
2443 case SDLK_ESCAPE: key_id = 27;
break;
2460 case SDLK_F12: key_id = 327;
break;
2469 if (key_id > 0 && key_id <= [
self numKeys])
2479 case SDL_VIDEORESIZE:
2481 SDL_ResizeEvent *rsevt=(SDL_ResizeEvent *)&event;
2482 NSSize newSize=NSMakeSize(rsevt->w, rsevt->h);
2518 case SDL_ACTIVEEVENT:
2520 if ((event.active.state & SDL_APPACTIVE) &&
fullScreen)
2531 case SDL_SYSWMEVENT:
2533 DWORD dwLastError = 0;
2534 switch (event.syswm.msg->msg)
2536 case WM_WINDOWPOSCHANGING:
2556 wp.length =
sizeof(WINDOWPLACEMENT);
2557 GetWindowPlacement(SDL_Window, &wp);
2559 GetWindowRect(SDL_Window, &rDC);
2560 if (rDC.left != monitorInfo.rcMonitor.left || rDC.top != monitorInfo.rcMonitor.top)
2562 BOOL fullScreenMaximized = NO;
2563 if (wp.showCmd == SW_SHOWMAXIMIZED && !fullScreenMaximized)
2565 fullScreenMaximized = YES;
2566 wp.showCmd = SW_SHOWNORMAL;
2567 SetWindowPlacement(SDL_Window, &wp);
2570 if (wp.showCmd != SW_SHOWMINIMIZED && wp.showCmd != SW_MINIMIZE)
2572 MoveWindow(SDL_Window, monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top,
2576 if (fullScreenMaximized)
2578 GetWindowPlacement(SDL_Window, &wp);
2579 wp.showCmd = SW_SHOWMAXIMIZED;
2580 CopyRect(&wp.rcNormalPosition, &lastGoodRect);
2581 SetWindowPlacement(SDL_Window, &wp);
2584 else if (wp.showCmd == SW_SHOWMAXIMIZED)
2586 CopyRect(&wp.rcNormalPosition, &lastGoodRect);
2587 SetWindowPlacement(SDL_Window, &wp);
2602 case WM_ACTIVATEAPP:
2606 case WM_SETTINGCHANGE:
2616 [
self refreshDarKOrLightMode];
2628 if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL))
2630 dwLastError = GetLastError();
2631 OOLog(
@"wm_setfocus.message",
@"Setting thread priority to time critical failed! (error code: %d)", dwLastError);
2636 if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL))
2638 dwLastError = GetLastError();
2639 OOLog(
@"wm_killfocus.message",
@"Setting thread priority to normal failed! (error code: %d)", dwLastError);
2670- (void) handleStringInput: (SDL_KeyboardEvent *) kbd_event keyID:(Uint16)key_id;
2672 SDLKey key=kbd_event->keysym.sym;
2675 if((key == SDLK_BACKSPACE || key == SDLK_DELETE) && [typedString length] > 0)
2681 isAlphabetKeyDown=NO;
2684 if([typedString length] < 40)
2686 lastKeyShifted = shift;
2690 if(key >= SDLK_a && key <= SDLK_z)
2692 isAlphabetKeyDown=YES;
2701 if (key_id >= 32 && key_id <= 255)
2705 isAlphabetKeyDown=YES;
2670- (void) handleStringInput: (SDL_KeyboardEvent *) kbd_event keyID:(Uint16)key_id; {
…}
2719 NSMutableDictionary *
mode;
2726 [screenSizes addObject: mode];
2728 modes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE);
2729 if(modes == (SDL_Rect **)NULL)
2731 OOLog(
@"display.mode.list.none",
@"%@",
@"SDL didn't return any screen modes");
2735 if(modes == (SDL_Rect **)-1)
2737 OOLog(
@"display.mode.list.none",
@"%@",
@"SDL claims 'all resolutions available' which is unhelpful in the extreme");
2741 int lastw=[[mode objectForKey: kOODisplayWidth] intValue];
2742 int lasth=[[mode objectForKey: kOODisplayHeight] intValue];
2743 for(i=0; modes[
i]; i++)
2749 if(modes[i]->w != lastw || modes[i]->h != lasth)
2753 [mode setValue: [
NSNumber numberWithInt: (int)modes[
i]->w]
2754 forKey: kOODisplayWidth];
2755 [mode setValue: [
NSNumber numberWithInt: (int)modes[
i]->h]
2756 forKey: kOODisplayHeight];
2757 [mode setValue: [
NSNumber numberWithInt: 0]
2758 forKey: kOODisplayRefreshRate];
2761 [screenSizes addObject: mode];
2762 OOLog(
@"display.mode.list",
@"Added res %d x %d", modes[i]->w, modes[i]->h);
2772- (void) saveWindowSize: (NSSize) windowSize
2775 [
defaults setInteger: (int)windowSize.width forKey: @"window_width"];
2776 [
defaults setInteger: (int)windowSize.height forKey: @"window_height"];
2772- (void) saveWindowSize: (NSSize) windowSize {
…}
2785 if([defaults objectForKey:
@"window_width"] && [defaults objectForKey:
@"window_height"])
2787 windowSize=NSMakeSize([defaults integerForKey:
@"window_width"],
2788 [defaults integerForKey:
@"window_height"]);
2802 int width=0, height=0, refresh=0;
2805 NSArray* cmdline_arguments = [[
NSProcessInfo processInfo] arguments];
2807 NSUserDefaults *userDefaults = [
NSUserDefaults standardUserDefaults];
2808 if ([userDefaults objectForKey:
@"display_width"])
2810 if ([userDefaults objectForKey:
@"display_height"])
2811 height = [
userDefaults integerForKey:@"display_height"];
2812 if ([userDefaults objectForKey:
@"display_refresh"])
2813 refresh = [
userDefaults integerForKey:@"display_refresh"];
2814 if([userDefaults objectForKey:
@"fullscreen"])
2822 if ([[cmdline_arguments objectAtIndex:i] isEqual:
@"-fullscreen"])
fullScreen = YES;
2823 if ([[cmdline_arguments objectAtIndex:i] isEqual:
@"-windowed"])
fullScreen = NO;
2835- (
int) findDisplayModeForWidth:(
unsigned int) d_width Height:(
unsigned int) d_height Refresh:(
unsigned int) d_refresh
2839 unsigned int modeWidth, modeHeight, modeRefresh;
2841 modeCount = [screenSizes count];
2843 for (i = 0; i < modeCount; i++)
2845 mode = [screenSizes objectAtIndex: i];
2846 modeWidth = [[mode objectForKey: kOODisplayWidth] intValue];
2847 modeHeight = [[mode objectForKey: kOODisplayHeight] intValue];
2848 modeRefresh = [[mode objectForKey: kOODisplayRefreshRate] intValue];
2849 if ((modeWidth == d_width)&&(modeHeight == d_height)&&(modeRefresh == d_refresh))
2851 OOLog(
@"display.mode.found",
@"Found mode %@",
mode);
2856 OOLog(
@"display.mode.found.failed",
@"Failed to find mode: width=%d height=%d refresh=%d", d_width, d_height, d_refresh);
2857 OOLog(
@"display.mode.found.failed.list",
@"Contents of list: %@",
screenSizes);
2835- (
int) findDisplayModeForWidth:(
unsigned int) d_width Height:(
unsigned int) d_height Refresh:(
unsigned int) d_refresh {
…}
2864 NSDictionary *
mode=[screenSizes objectAtIndex: currentSize];
2871 OOLog(
@"display.mode.unknown",
@"%@",
@"Screen size unknown!");
2876- (void) setMouseInDeltaMode: (BOOL) inDelta
2876- (void) setMouseInDeltaMode: (BOOL) inDelta {
…}
2882- (void) setGammaValue: (
float) value
2884 if (value < 0.2f) value = 0.2f;
2885 if (value > 4.0f) value = 4.0f;
2890 [[
NSUserDefaults standardUserDefaults] setFloat:_gamma forKey:@"gamma-value"];
2882- (void) setGammaValue: (
float) value {
…}
2900- (void) setFov:(
float)value fromFraction:(BOOL)fromFraction
2902 _fov = fromFraction ? value : tan((value / 2) *
M_PI / 180);
2900- (void) setFov:(
float)value fromFraction:(BOOL)fromFraction {
…}
2906- (float) fov:(BOOL)inFraction
2908 return inFraction ?
_fov : 2 * atan(
_fov) * 180 /
M_PI;
2906- (float) fov:(BOOL)inFraction {
…}
2918- (void) setMsaa:(BOOL)newMsaa
2918- (void) setMsaa:(BOOL)newMsaa {
…}
2932 return 0 != (SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT));
2937- (void) dumpRGBAToFileNamed:(NSString *)name
2938 bytes:(uint8_t *)bytes
2939 width:(NSUInteger)width
2940 height:(NSUInteger)height
2941 rowBytes:(NSUInteger)rowBytes
2943 if (name ==
nil || bytes == NULL || width == 0 || height == 0 || rowBytes < width * 4)
return;
2946 NSString *dumpFile = [[
NSHomeDirectory() stringByAppendingPathComponent:@SAVEDIR] stringByAppendingPathComponent:@SNAPSHOTDIR];
2947 dumpFile = [
dumpFile stringByAppendingPathComponent: [
NSString stringWithFormat:@"%@.bmp", name]];
2950 SDL_Surface* tmpSurface = SDL_CreateRGBSurfaceFrom(bytes, width, height, 32, rowBytes, 0xFF, 0xFF00, 0xFF0000, 0xFF000000);
2951 SDL_SaveBMP(tmpSurface, [dumpFile UTF8String]);
2952 SDL_FreeSurface(tmpSurface);
2937- (void) dumpRGBAToFileNamed:(NSString *)name {
…}
2956- (void) dumpRGBToFileNamed:(NSString *)name
2957 bytes:(uint8_t *)bytes
2958 width:(NSUInteger)width
2959 height:(NSUInteger)height
2960 rowBytes:(NSUInteger)rowBytes
2962 if (name ==
nil || bytes == NULL || width == 0 || height == 0 || rowBytes < width * 3)
return;
2965 NSString *dumpFile = [[
NSHomeDirectory() stringByAppendingPathComponent:@SAVEDIR] stringByAppendingPathComponent:@SNAPSHOTDIR];
2966 dumpFile = [
dumpFile stringByAppendingPathComponent: [
NSString stringWithFormat:@"%@.bmp", name]];
2968 SDL_Surface* tmpSurface = SDL_CreateRGBSurfaceFrom(bytes, width, height, 24, rowBytes, 0xFF, 0xFF00, 0xFF0000, 0x0);
2969 SDL_SaveBMP(tmpSurface, [dumpFile UTF8String]);
2970 SDL_FreeSurface(tmpSurface);
2956- (void) dumpRGBToFileNamed:(NSString *)name {
…}
2974- (void) dumpGrayToFileNamed:(NSString *)name
2975 bytes:(uint8_t *)bytes
2976 width:(NSUInteger)width
2977 height:(NSUInteger)height
2978 rowBytes:(NSUInteger)rowBytes
2980 if (name ==
nil || bytes == NULL || width == 0 || height == 0 || rowBytes < width)
return;
2983 NSString *dumpFile = [[
NSHomeDirectory() stringByAppendingPathComponent:@SAVEDIR] stringByAppendingPathComponent:@SNAPSHOTDIR];
2984 dumpFile = [
dumpFile stringByAppendingPathComponent: [
NSString stringWithFormat:@"%@.bmp", name]];
2986 SDL_Surface* tmpSurface = SDL_CreateRGBSurfaceFrom(bytes, width, height, 8, rowBytes, 0xFF, 0xFF, 0xFF, 0x0);
2987 SDL_SaveBMP(tmpSurface, [dumpFile UTF8String]);
2988 SDL_FreeSurface(tmpSurface);
2974- (void) dumpGrayToFileNamed:(NSString *)name {
…}
2992- (void) dumpGrayAlphaToFileNamed:(NSString *)name
2993 bytes:(uint8_t *)bytes
2994 width:(NSUInteger)width
2995 height:(NSUInteger)height
2996 rowBytes:(NSUInteger)rowBytes
2998 if (name ==
nil || bytes == NULL || width == 0 || height == 0 || rowBytes < width * 2)
return;
3001 NSString *dumpFile = [[
NSHomeDirectory() stringByAppendingPathComponent:@SAVEDIR] stringByAppendingPathComponent:@SNAPSHOTDIR];
3002 dumpFile = [
dumpFile stringByAppendingPathComponent: [
NSString stringWithFormat:@"%@.bmp", name]];
3004 SDL_Surface* tmpSurface = SDL_CreateRGBSurfaceFrom(bytes, width, height, 16, rowBytes, 0xFF, 0xFF, 0xFF, 0xFF);
3005 SDL_SaveBMP(tmpSurface, [dumpFile UTF8String]);
3006 SDL_FreeSurface(tmpSurface);
2992- (void) dumpGrayAlphaToFileNamed:(NSString *)name {
…}
3010- (void) dumpRGBAToRGBFileNamed:(NSString *)rgbName
3011 andGrayFileNamed:(NSString *)grayName
3012 bytes:(uint8_t *)bytes
3013 width:(NSUInteger)width
3014 height:(NSUInteger)height
3015 rowBytes:(NSUInteger)rowBytes
3017 if ((rgbName ==
nil && grayName ==
nil) || bytes == NULL || width == 0 || height == 0 || rowBytes < width * 4)
return;
3019 uint8_t *rgbBytes, *rgbPx, *grayBytes, *grayPx, *srcPx;
3021 BOOL trivalAlpha = YES;
3023 rgbPx = rgbBytes = malloc(width * height * 3);
3024 if (rgbBytes == NULL)
return;
3026 grayPx = grayBytes = malloc(width * height);
3027 if (grayBytes == NULL)
3033 for (
y = 0;
y < height;
y++)
3035 srcPx = bytes + rowBytes *
y;
3037 for (
x = 0;
x < width;
x++)
3039 *rgbPx++ = *srcPx++;
3040 *rgbPx++ = *srcPx++;
3041 *rgbPx++ = *srcPx++;
3042 trivalAlpha = trivalAlpha && ((*srcPx == 0xFF) || (*srcPx == 0x00));
3043 *grayPx++ = *srcPx++;
3010- (void) dumpRGBAToRGBFileNamed:(NSString *)rgbName {
…}
static NSString * kOOLogKeyDown
static NSString * kOOLogKeyUp
#define MAIN_GUI_PIXEL_WIDTH
#define MAIN_GUI_PIXEL_HEIGHT
#define OOLogWARN(class, format,...)
#define OOLogERR(class, format,...)
#define OOLog(class, format,...)
#define OOVerifyOpenGLState()
#define OOSetOpenGLState(STATE)
int SaveEXRSnapshot(const char *outfilename, int width, int height, const float *rgb)
#define MOUSE_DOUBLE_CLICK_INTERVAL
#define SNAPSHOTHDR_EXTENSION_HDR
#define MAX_COLOR_SATURATION
#define SNAPSHOTHDR_EXTENSION_DEFAULT
#define OOMOUSEWHEEL_EVENTS_DELAY_INTERVAL
#define WINDOW_SIZE_DEFAULT_HEIGHT
#define MIN_HDR_MAXBRIGHTNESS
#define MIN_HDR_PAPERWHITE
#define WINDOW_SIZE_DEFAULT_WIDTH
#define OOMOUSEWHEEL_DELTA
#define SNAPSHOTHDR_EXTENSION_EXR
#define MAX_HDR_MAXBRIGHTNESS
#define MAX_HDR_PAPERWHITE
int SaveEXRSnapshot(const char *outfilename, int width, int height, const float *rgb)
void resetSDLKeyModifiers()
void setUpBasicOpenGLStateWithSize:(NSSize viewSize)
void exitAppWithContext:(NSString *context)
BOOL m_glContextInitialized
void saveWindowSize:(NSSize windowSize)
void initialiseGLWithSize:(NSSize v_size)
void grabMouseInsideGameWindow:(BOOL value)
void handleStringInput:keyID:(SDL_KeyboardEvent *kbd_event, [keyID] Uint16 key_id)
void setFullScreenMode:(BOOL fsm)
void suppressKeysUntilKeyUp()
BOOL isOutputDisplayHDREnabled()
void drawRect:(NSRect rect)
void initKeyMappingData()
int loadFullscreenSettings()
NSMutableDictionary * getNativeSize()
NSDictionary * keyMappings_shifted
float _mouseVirtualStickSensitivityFactor
void populateFullScreenModelist()
int findDisplayModeForWidth:Height:Refresh:(unsigned int d_width,[Height] unsigned int d_height,[Refresh] unsigned int d_refresh)
NSMutableString * typedString
NSMutableArray * screenSizes
int scancode2Unicode[NUM_KEYS]
void setMouseInDeltaMode:(BOOL inDelta)
void initialiseGLWithSize:useVideoMode:(NSSize v_size,[useVideoMode] BOOL v_mode)
NSPoint virtualJoystickPosition
BOOL isRunningOnPrimaryDisplayDevice()
void setWindowBorderless:(BOOL borderless)
OOOpenGLMatrixManager * getOpenGLMatrixManager()
NSTimeInterval timeSinceLastMouseWheel
OOOpenGLMatrixManager * matrixManager
NSTimeInterval timeIntervalAtLastClick
NSSize currentScreenSize()
void updateScreenWithVideoMode:(BOOL v_mode)
void resetSDLKeyModifiers()
void dumpGrayToFileNamed:bytes:width:height:rowBytes:(NSString *name,[bytes] uint8_t *bytes,[width] NSUInteger width,[height] NSUInteger height,[rowBytes] NSUInteger rowBytes)
void dumpRGBToFileNamed:bytes:width:height:rowBytes:(NSString *name,[bytes] uint8_t *bytes,[width] NSUInteger width,[height] NSUInteger height,[rowBytes] NSUInteger rowBytes)
NSDictionary * keyMappings_normal
GameController * gameController
BOOL setStickHandlerClass:(Class aClass)
void orthoLeft:right:bottom:top:near:far:(double l,[right] double r,[bottom] double b,[top] double t,[near] double n,[far] double f)
BOOL handleSDLEvent:(SDL_Event *evt)
void doGuiScreenResizeUpdates()
PlayerEntity * sharedPlayer()
NSDictionary * dictionaryFromFilesNamed:inFolder:mergeMode:cache:(NSString *fileName,[inFolder] NSString *folderName,[mergeMode] OOResourceMergeMode mergeMode,[cache] BOOL useCache)
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data)