2 Simple DirectMedia Layer
3 Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
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.
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:
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.
21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_COCOA
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"
32 /* Initialization/Query functions */
33 static int Cocoa_VideoInit(_THIS);
34 static void Cocoa_VideoQuit(_THIS);
36 /* Cocoa driver bootstrap functions */
45 Cocoa_DeleteDevice(SDL_VideoDevice * device)
47 SDL_free(device->driverdata);
51 static SDL_VideoDevice *
52 Cocoa_CreateDevice(int devindex)
54 SDL_VideoDevice *device;
59 /* Initialize all variables that we clean on shutdown */
60 device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
62 data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
71 device->driverdata = data;
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;
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;
109 device->shape_driver.CreateShaper = Cocoa_CreateShaper;
110 device->shape_driver.SetWindowShape = Cocoa_SetWindowShape;
111 device->shape_driver.ResizeWindowShape = Cocoa_ResizeWindowShape;
113 #if SDL_VIDEO_OPENGL_CGL
114 device->GL_LoadLibrary = Cocoa_GL_LoadLibrary;
115 device->GL_GetProcAddress = Cocoa_GL_GetProcAddress;
116 device->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary;
117 device->GL_CreateContext = Cocoa_GL_CreateContext;
118 device->GL_MakeCurrent = Cocoa_GL_MakeCurrent;
119 device->GL_GetDrawableSize = Cocoa_GL_GetDrawableSize;
120 device->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval;
121 device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
122 device->GL_SwapWindow = Cocoa_GL_SwapWindow;
123 device->GL_DeleteContext = Cocoa_GL_DeleteContext;
124 #elif SDL_VIDEO_OPENGL_EGL
125 device->GL_LoadLibrary = Cocoa_GLES_LoadLibrary;
126 device->GL_GetProcAddress = Cocoa_GLES_GetProcAddress;
127 device->GL_UnloadLibrary = Cocoa_GLES_UnloadLibrary;
128 device->GL_CreateContext = Cocoa_GLES_CreateContext;
129 device->GL_MakeCurrent = Cocoa_GLES_MakeCurrent;
130 device->GL_SetSwapInterval = Cocoa_GLES_SetSwapInterval;
131 device->GL_GetSwapInterval = Cocoa_GLES_GetSwapInterval;
132 device->GL_SwapWindow = Cocoa_GLES_SwapWindow;
133 device->GL_DeleteContext = Cocoa_GLES_DeleteContext;
137 device->Vulkan_LoadLibrary = Cocoa_Vulkan_LoadLibrary;
138 device->Vulkan_UnloadLibrary = Cocoa_Vulkan_UnloadLibrary;
139 device->Vulkan_GetInstanceExtensions = Cocoa_Vulkan_GetInstanceExtensions;
140 device->Vulkan_CreateSurface = Cocoa_Vulkan_CreateSurface;
141 device->Vulkan_GetDrawableSize = Cocoa_Vulkan_GetDrawableSize;
144 device->StartTextInput = Cocoa_StartTextInput;
145 device->StopTextInput = Cocoa_StopTextInput;
146 device->SetTextInputRect = Cocoa_SetTextInputRect;
148 device->SetClipboardText = Cocoa_SetClipboardText;
149 device->GetClipboardText = Cocoa_GetClipboardText;
150 device->HasClipboardText = Cocoa_HasClipboardText;
152 device->free = Cocoa_DeleteDevice;
157 VideoBootStrap COCOA_bootstrap = {
158 "cocoa", "SDL Cocoa video driver",
159 Cocoa_Available, Cocoa_CreateDevice
164 Cocoa_VideoInit(_THIS)
166 SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
168 Cocoa_InitModes(_this);
169 Cocoa_InitKeyboard(_this);
170 Cocoa_InitMouse(_this);
172 data->allow_spaces = ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) && SDL_GetHintBoolean(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, SDL_TRUE));
174 /* The IOPM assertion API can disable the screensaver as of 10.7. */
175 data->screensaver_use_iopm = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6;
181 Cocoa_VideoQuit(_THIS)
183 Cocoa_QuitModes(_this);
184 Cocoa_QuitKeyboard(_this);
185 Cocoa_QuitMouse(_this);
188 /* This function assumes that it's called from within an autorelease pool */
190 Cocoa_CreateImage(SDL_Surface * surface)
192 SDL_Surface *converted;
193 NSBitmapImageRep *imgrep;
198 converted = SDL_ConvertSurfaceFormat(surface, SDL_PIXELFORMAT_RGBA32, 0);
203 imgrep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL
204 pixelsWide: converted->w
205 pixelsHigh: converted->h
210 colorSpaceName: NSDeviceRGBColorSpace
211 bytesPerRow: converted->pitch
212 bitsPerPixel: converted->format->BitsPerPixel] autorelease];
214 SDL_FreeSurface(converted);
218 /* Copy the pixels */
219 pixels = [imgrep bitmapData];
220 SDL_memcpy(pixels, converted->pixels, converted->h * converted->pitch);
221 SDL_FreeSurface(converted);
223 /* Premultiply the alpha channel */
224 for (i = (surface->h * surface->w); i--; ) {
225 Uint8 alpha = pixels[3];
226 pixels[0] = (Uint8)(((Uint16)pixels[0] * alpha) / 255);
227 pixels[1] = (Uint8)(((Uint16)pixels[1] * alpha) / 255);
228 pixels[2] = (Uint8)(((Uint16)pixels[2] * alpha) / 255);
232 img = [[[NSImage alloc] initWithSize: NSMakeSize(surface->w, surface->h)] autorelease];
234 [img addRepresentation: imgrep];
240 * Mac OS X log support.
242 * This doesn't really have aything to do with the interfaces of the SDL video
243 * subsystem, but we need to stuff this into an Objective-C source code file.
246 void SDL_NSLog(const char *text)
251 #endif /* SDL_VIDEO_DRIVER_COCOA */
253 /* vim: set ts=4 sw=4 expandtab: */