src/video/uikit/SDL_uikitopengles.m
author Sam Lantinga <slouken@libsdl.org>
Tue, 01 Feb 2011 09:00:47 -0800
changeset 5132 5f09cb749d75
parent 5131 7b7da52e8775
child 5209 115fff0641ee
permissions -rw-r--r--
Added vim spacing hints
     1 /*
     2  SDL - Simple DirectMedia Layer
     3  Copyright (C) 1997-2009 Sam Lantinga
     4  
     5  This library is free software; you can redistribute it and/or
     6  modify it under the terms of the GNU Lesser General Public
     7  License as published by the Free Software Foundation; either
     8  version 2.1 of the License, or (at your option) any later version.
     9  
    10  This library is distributed in the hope that it will be useful,
    11  but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13  Lesser General Public License for more details.
    14  
    15  You should have received a copy of the GNU Lesser General Public
    16  License along with this library; if not, write to the Free Software
    17  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18  
    19  Sam Lantinga
    20  slouken@libsdl.org
    21  */
    22 
    23 #include "SDL_uikitopengles.h"
    24 #include "SDL_uikitopenglview.h"
    25 #include "SDL_uikitappdelegate.h"
    26 #include "SDL_uikitwindow.h"
    27 #include "jumphack.h"
    28 #include "SDL_sysvideo.h"
    29 #include "../../events/SDL_keyboard_c.h"
    30 #include "../../events/SDL_mouse_c.h"
    31 #include "SDL_loadso.h"
    32 #include <dlfcn.h>
    33 
    34 static int UIKit_GL_Initialize(_THIS);
    35 
    36 void *
    37 UIKit_GL_GetProcAddress(_THIS, const char *proc)
    38 {    
    39     /* Look through all SO's for the proc symbol.  Here's why:
    40        -Looking for the path to the OpenGL Library seems not to work in the iPhone Simulator.
    41        -We don't know that the path won't change in the future.
    42     */
    43     return SDL_LoadFunction(RTLD_DEFAULT, proc);
    44 }
    45 
    46 /*
    47     note that SDL_GL_Delete context makes it current without passing the window
    48 */
    49 int UIKit_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
    50 {
    51     
    52     if (context) {
    53         SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
    54         [data->view setCurrentContext];
    55     }
    56     else {
    57         [EAGLContext setCurrentContext: nil];
    58     }
    59         
    60     return 0;
    61 }
    62 
    63 int
    64 UIKit_GL_LoadLibrary(_THIS, const char *path)
    65 {
    66     /* 
    67         shouldn't be passing a path into this function 
    68         why?  Because we've already loaded the library
    69         and because the SDK forbids loading an external SO
    70     */
    71     if (path != NULL) {
    72         SDL_SetError("iPhone GL Load Library just here for compatibility");
    73         return -1;
    74     }
    75     return 0;
    76 }
    77 
    78 extern void SDL_UIKit_UpdateBatteryMonitoring(void);
    79 
    80 void UIKit_GL_SwapWindow(_THIS, SDL_Window * window)
    81 {
    82     #ifdef SDL_POWER_UIKIT
    83     // Check once a frame to see if we should turn off the battery monitor.
    84     SDL_UIKit_UpdateBatteryMonitoring();
    85     #endif
    86 
    87     SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
    88     
    89     if (nil == data->view) {
    90         return;
    91     }
    92     [data->view swapBuffers];
    93     /* since now we've got something to draw
    94        make the window visible */
    95     [data->uiwindow makeKeyAndVisible];
    96 
    97     /* we need to let the event cycle run, or the OS won't update the OpenGL view! */
    98     SDL_PumpEvents();
    99     
   100 }
   101 
   102 SDL_GLContext UIKit_GL_CreateContext(_THIS, SDL_Window * window)
   103 {
   104     SDL_uikitopenglview *view;
   105     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
   106     UIScreen *uiscreen = (UIScreen *) window->display->driverdata;
   107     UIWindow *uiwindow = data->uiwindow;
   108 
   109     /* construct our view, passing in SDL's OpenGL configuration data */
   110     view = [[SDL_uikitopenglview alloc] initWithFrame: [uiwindow bounds] \
   111                                     retainBacking: _this->gl_config.retained_backing \
   112                                     rBits: _this->gl_config.red_size \
   113                                     gBits: _this->gl_config.green_size \
   114                                     bBits: _this->gl_config.blue_size \
   115                                     aBits: _this->gl_config.alpha_size \
   116                                     depthBits: _this->gl_config.depth_size];
   117     
   118     data->view = view;
   119     
   120     /* add the view to our window */
   121     [uiwindow addSubview: view ];
   122     
   123     /* Don't worry, the window retained the view */
   124     [view release];
   125     
   126     if ( UIKit_GL_MakeCurrent(_this, window, view) < 0 ) {
   127         UIKit_GL_DeleteContext(_this, view);
   128         return NULL;
   129     }
   130 
   131     /* Make this window the current mouse focus for touch input */
   132     SDL_SetMouseFocus(window);
   133     SDL_SetKeyboardFocus(window);
   134 
   135     return view;
   136 }
   137 
   138 void UIKit_GL_DeleteContext(_THIS, SDL_GLContext context)
   139 {
   140     /* the delegate has retained the view, this will release him */
   141     SDL_uikitopenglview *view = (SDL_uikitopenglview *)context;
   142     /* this will also delete it */
   143     [view removeFromSuperview];
   144 }
   145 
   146 /* vi: set ts=4 sw=4 expandtab: */