Atlas - SDL_cocoavideo.m
Home / ext / SDL2 / src / video / cocoa Lines: 1 | Size: 8627 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20*/ 21#include "../../SDL_internal.h" 22 23#if SDL_VIDEO_DRIVER_COCOA 24 25#include "SDL.h" 26#include "SDL_endian.h" 27#include "SDL_cocoavideo.h" 28#include "SDL_cocoashape.h" 29#include "SDL_cocoavulkan.h" 30#include "SDL_assert.h" 31 32/* Initialization/Query functions */ 33static int Cocoa_VideoInit(_THIS); 34static void Cocoa_VideoQuit(_THIS); 35 36/* Cocoa driver bootstrap functions */ 37 38static int 39Cocoa_Available(void) 40{ 41 return (1); 42} 43 44static void 45Cocoa_DeleteDevice(SDL_VideoDevice * device) 46{ 47 SDL_free(device->driverdata); 48 SDL_free(device); 49} 50 51static SDL_VideoDevice * 52Cocoa_CreateDevice(int devindex) 53{ 54 SDL_VideoDevice *device; 55 SDL_VideoData *data; 56 57 Cocoa_RegisterApp(); 58 59 /* Initialize all variables that we clean on shutdown */ 60 device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); 61 if (device) { 62 data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); 63 } else { 64 data = NULL; 65 } 66 if (!data) { 67 SDL_OutOfMemory(); 68 SDL_free(device); 69 return NULL; 70 } 71 device->driverdata = data; 72 73 /* Set the function pointers */ 74 device->VideoInit = Cocoa_VideoInit; 75 device->VideoQuit = Cocoa_VideoQuit; 76 device->GetDisplayBounds = Cocoa_GetDisplayBounds; 77 device->GetDisplayUsableBounds = Cocoa_GetDisplayUsableBounds; 78 device->GetDisplayDPI = Cocoa_GetDisplayDPI; 79 device->GetDisplayModes = Cocoa_GetDisplayModes; 80 device->SetDisplayMode = Cocoa_SetDisplayMode; 81 device->PumpEvents = Cocoa_PumpEvents; 82 device->SuspendScreenSaver = Cocoa_SuspendScreenSaver; 83 84 device->CreateSDLWindow = Cocoa_CreateWindow; 85 device->CreateSDLWindowFrom = Cocoa_CreateWindowFrom; 86 device->SetWindowTitle = Cocoa_SetWindowTitle; 87 device->SetWindowIcon = Cocoa_SetWindowIcon; 88 device->SetWindowPosition = Cocoa_SetWindowPosition; 89 device->SetWindowSize = Cocoa_SetWindowSize; 90 device->SetWindowMinimumSize = Cocoa_SetWindowMinimumSize; 91 device->SetWindowMaximumSize = Cocoa_SetWindowMaximumSize; 92 device->SetWindowOpacity = Cocoa_SetWindowOpacity; 93 device->ShowWindow = Cocoa_ShowWindow; 94 device->HideWindow = Cocoa_HideWindow; 95 device->RaiseWindow = Cocoa_RaiseWindow; 96 device->MaximizeWindow = Cocoa_MaximizeWindow; 97 device->MinimizeWindow = Cocoa_MinimizeWindow; 98 device->RestoreWindow = Cocoa_RestoreWindow; 99 device->SetWindowBordered = Cocoa_SetWindowBordered; 100 device->SetWindowResizable = Cocoa_SetWindowResizable; 101 device->SetWindowFullscreen = Cocoa_SetWindowFullscreen; 102 device->SetWindowGammaRamp = Cocoa_SetWindowGammaRamp; 103 device->GetWindowGammaRamp = Cocoa_GetWindowGammaRamp; 104 device->SetWindowGrab = Cocoa_SetWindowGrab; 105 device->DestroyWindow = Cocoa_DestroyWindow; 106 device->GetWindowWMInfo = Cocoa_GetWindowWMInfo; 107 device->SetWindowHitTest = Cocoa_SetWindowHitTest; 108 device->AcceptDragAndDrop = Cocoa_AcceptDragAndDrop; 109 110 device->shape_driver.CreateShaper = Cocoa_CreateShaper; 111 device->shape_driver.SetWindowShape = Cocoa_SetWindowShape; 112 device->shape_driver.ResizeWindowShape = Cocoa_ResizeWindowShape; 113 114#if SDL_VIDEO_OPENGL_CGL 115 device->GL_LoadLibrary = Cocoa_GL_LoadLibrary; 116 device->GL_GetProcAddress = Cocoa_GL_GetProcAddress; 117 device->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary; 118 device->GL_CreateContext = Cocoa_GL_CreateContext; 119 device->GL_MakeCurrent = Cocoa_GL_MakeCurrent; 120 device->GL_GetDrawableSize = Cocoa_GL_GetDrawableSize; 121 device->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval; 122 device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval; 123 device->GL_SwapWindow = Cocoa_GL_SwapWindow; 124 device->GL_DeleteContext = Cocoa_GL_DeleteContext; 125#elif SDL_VIDEO_OPENGL_EGL 126 device->GL_LoadLibrary = Cocoa_GLES_LoadLibrary; 127 device->GL_GetProcAddress = Cocoa_GLES_GetProcAddress; 128 device->GL_UnloadLibrary = Cocoa_GLES_UnloadLibrary; 129 device->GL_CreateContext = Cocoa_GLES_CreateContext; 130 device->GL_MakeCurrent = Cocoa_GLES_MakeCurrent; 131 device->GL_SetSwapInterval = Cocoa_GLES_SetSwapInterval; 132 device->GL_GetSwapInterval = Cocoa_GLES_GetSwapInterval; 133 device->GL_SwapWindow = Cocoa_GLES_SwapWindow; 134 device->GL_DeleteContext = Cocoa_GLES_DeleteContext; 135#endif 136 137#if SDL_VIDEO_VULKAN 138 device->Vulkan_LoadLibrary = Cocoa_Vulkan_LoadLibrary; 139 device->Vulkan_UnloadLibrary = Cocoa_Vulkan_UnloadLibrary; 140 device->Vulkan_GetInstanceExtensions = Cocoa_Vulkan_GetInstanceExtensions; 141 device->Vulkan_CreateSurface = Cocoa_Vulkan_CreateSurface; 142 device->Vulkan_GetDrawableSize = Cocoa_Vulkan_GetDrawableSize; 143#endif 144 145 device->StartTextInput = Cocoa_StartTextInput; 146 device->StopTextInput = Cocoa_StopTextInput; 147 device->SetTextInputRect = Cocoa_SetTextInputRect; 148 149 device->SetClipboardText = Cocoa_SetClipboardText; 150 device->GetClipboardText = Cocoa_GetClipboardText; 151 device->HasClipboardText = Cocoa_HasClipboardText; 152 153 device->free = Cocoa_DeleteDevice; 154 155 return device; 156} 157 158VideoBootStrap COCOA_bootstrap = { 159 "cocoa", "SDL Cocoa video driver", 160 Cocoa_Available, Cocoa_CreateDevice 161}; 162 163 164int 165Cocoa_VideoInit(_THIS) 166{ 167 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; 168 169 Cocoa_InitModes(_this); 170 Cocoa_InitKeyboard(_this); 171 Cocoa_InitMouse(_this); 172 173 data->allow_spaces = ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) && SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, SDL_TRUE)); 174 175 /* The IOPM assertion API can disable the screensaver as of 10.7. */ 176 data->screensaver_use_iopm = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6; 177 178 return 0; 179} 180 181void 182Cocoa_VideoQuit(_THIS) 183{ 184 Cocoa_QuitModes(_this); 185 Cocoa_QuitKeyboard(_this); 186 Cocoa_QuitMouse(_this); 187} 188 189/* This function assumes that it's called from within an autorelease pool */ 190NSImage * 191Cocoa_CreateImage(SDL_Surface * surface) 192{ 193 SDL_Surface *converted; 194 NSBitmapImageRep *imgrep; 195 Uint8 *pixels; 196 int i; 197 NSImage *img; 198 199 converted = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_RGBA32, 0); 200 if (!converted) { 201 return nil; 202 } 203 204 imgrep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL 205 pixelsWide: converted->w 206 pixelsHigh: converted->h 207 bitsPerSample: 8 208 samplesPerPixel: 4 209 hasAlpha: YES 210 isPlanar: NO 211 colorSpaceName: NSDeviceRGBColorSpace 212 bytesPerRow: converted->pitch 213 bitsPerPixel: converted->format->BitsPerPixel] autorelease]; 214 if (imgrep == nil) { 215 SDL_FreeSurface(converted); 216 return nil; 217 } 218 219 /* Copy the pixels */ 220 pixels = [imgrep bitmapData]; 221 SDL_memcpy(pixels, converted->pixels, converted->h * converted->pitch); 222 SDL_FreeSurface(converted); 223 224 /* Premultiply the alpha channel */ 225 for (i = (surface->h * surface->w); i--; ) { 226 Uint8 alpha = pixels[3]; 227 pixels[0] = (Uint8)(((Uint16)pixels[0] * alpha) / 255); 228 pixels[1] = (Uint8)(((Uint16)pixels[1] * alpha) / 255); 229 pixels[2] = (Uint8)(((Uint16)pixels[2] * alpha) / 255); 230 pixels += 4; 231 } 232 233 img = [[[NSImage alloc] initWithSize: NSMakeSize(surface->w, surface->h)] autorelease]; 234 if (img != nil) { 235 [img addRepresentation: imgrep]; 236 } 237 return img; 238} 239 240/* 241 * Mac OS X log support. 242 * 243 * This doesn't really have aything to do with the interfaces of the SDL video 244 * subsystem, but we need to stuff this into an Objective-C source code file. 245 */ 246 247void SDL_NSLog(const char *text) 248{ 249 NSLog(@"%s", text); 250} 251 252#endif /* SDL_VIDEO_DRIVER_COCOA */ 253 254/* vim: set ts=4 sw=4 expandtab: */ 255[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.