SDL_macgl.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_macgl.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /* AGL implementation of SDL OpenGL support */
  23. #include "SDL_error.h"
  24. #include "SDL_lowvideo.h"
  25. #include "SDL_macgl_c.h"
  26. /* krat: adding OpenGL support */
  27. int Mac_GL_Init(_THIS)
  28. {
  29. #ifdef HAVE_OPENGL
  30. AGLPixelFormat format;
  31.     int i = 0;
  32. GLint attributes [ 24 ]; /* 24 is max possible in this setup */
  33. GLboolean noerr;
  34.    
  35. attributes[i++] = AGL_RGBA;
  36. if ( this->gl_config.double_buffer ) {
  37. attributes[i++] = AGL_DOUBLEBUFFER;
  38. }
  39. if ( this->gl_config.depth_size != 0 ) {
  40. attributes[i++] = AGL_DEPTH_SIZE;
  41. attributes[i++] = this->gl_config.depth_size;
  42. }
  43. if ( this->gl_config.red_size   != 0 &&
  44.      this->gl_config.blue_size  != 0 &&
  45.      this->gl_config.green_size != 0 ) {
  46. attributes[i++] = AGL_RED_SIZE;
  47. attributes[i++] = this->gl_config.red_size;
  48. attributes[i++] = AGL_GREEN_SIZE;
  49. attributes[i++] = this->gl_config.green_size;
  50. attributes[i++] = AGL_BLUE_SIZE;
  51. attributes[i++] = this->gl_config.blue_size;
  52. attributes[i++] = AGL_ALPHA_SIZE;
  53. attributes[i++] = this->gl_config.alpha_size;
  54. }
  55. if ( this->gl_config.stencil_size != 0 ) {
  56. attributes[i++] = AGL_STENCIL_SIZE;
  57. attributes[i++] = this->gl_config.stencil_size;
  58. }
  59. if ( this->gl_config.accum_red_size   != 0 &&
  60.      this->gl_config.accum_blue_size  != 0 &&
  61.      this->gl_config.accum_green_size != 0 ) {
  62. attributes[i++] = AGL_ACCUM_RED_SIZE;
  63. attributes[i++] = this->gl_config.accum_red_size;
  64. attributes[i++] = AGL_ACCUM_GREEN_SIZE;
  65. attributes[i++] = this->gl_config.accum_green_size;
  66. attributes[i++] = AGL_ACCUM_BLUE_SIZE;
  67. attributes[i++] = this->gl_config.accum_blue_size;
  68. attributes[i++] = AGL_ACCUM_ALPHA_SIZE;
  69. attributes[i++] = this->gl_config.accum_alpha_size;
  70. }
  71. attributes[i++] = AGL_ALL_RENDERERS;
  72. attributes[i] = AGL_NONE;
  73. format = aglChoosePixelFormat(NULL, 0, attributes);
  74. if ( format == NULL ) {
  75. SDL_SetError("Couldn't match OpenGL desired format");
  76. return(-1);
  77. }
  78. glContext = aglCreateContext(format, NULL);
  79. if ( glContext == NULL ) {
  80. SDL_SetError("Couldn't create OpenGL context");
  81. return(-1);
  82. }
  83. aglDestroyPixelFormat(format);
  84.     #if  TARGET_API_MAC_CARBON
  85.     noerr = aglSetDrawable(glContext, GetWindowPort(SDL_Window));
  86.     #else
  87. noerr = aglSetDrawable(glContext, (AGLDrawable)SDL_Window);
  88.     #endif
  89.     
  90. if(!noerr) {
  91. SDL_SetError("Unable to bind GL context to window");
  92. return(-1);
  93. }
  94. return(0);
  95. #else
  96. SDL_SetError("OpenGL support not configured");
  97. return(-1);
  98. #endif
  99. }
  100. void Mac_GL_Quit(_THIS)
  101. {
  102. #ifdef HAVE_OPENGL
  103. if ( glContext != NULL ) {
  104. aglSetCurrentContext(NULL);
  105. aglSetDrawable(glContext, NULL);
  106. aglDestroyContext(glContext);
  107. glContext = NULL;
  108. }
  109. #endif
  110. }
  111. #ifdef HAVE_OPENGL
  112. /* Make the current context active */
  113. int Mac_GL_MakeCurrent(_THIS)
  114. {
  115. int retval;
  116. retval = 0;
  117. if( ! aglSetCurrentContext(glContext) ) {
  118. SDL_SetError("Unable to make GL context current");
  119. retval = -1;
  120. }
  121. return(retval);
  122. }
  123. void Mac_GL_SwapBuffers(_THIS)
  124. {
  125. aglSwapBuffers(glContext);
  126. }
  127. #endif /* HAVE_OPENGL */