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

流媒体/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_ph_video.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <unistd.h>
  25. #include <string.h>
  26. #include <sys/ioctl.h>
  27. #include "SDL.h"
  28. #include "SDL_error.h"
  29. #include "SDL_timer.h"
  30. #include "SDL_thread.h"
  31. #include "SDL_video.h"
  32. #include "SDL_mouse.h"
  33. #include "SDL_endian.h"
  34. #include "SDL_sysvideo.h"
  35. #include "SDL_pixels_c.h"
  36. #include "SDL_events_c.h"
  37. #include "SDL_ph_video.h"
  38. #include "SDL_ph_modes_c.h"
  39. #include "SDL_ph_image_c.h"
  40. #include "SDL_ph_events_c.h"
  41. #include "SDL_ph_mouse_c.h"
  42. #include "SDL_ph_wm_c.h"
  43. #include "SDL_phyuv_c.h"
  44. #include "blank_cursor.h"
  45. static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat);
  46. static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
  47.                 int width, int height, int bpp, Uint32 flags);
  48. static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
  49. static void ph_VideoQuit(_THIS);
  50. static void ph_DeleteDevice(SDL_VideoDevice *device);
  51. #ifdef HAVE_OPENGL
  52. int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags);
  53. static void ph_GL_SwapBuffers(_THIS);
  54. static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value);
  55. #endif /* HAVE_OPENGL */
  56. static int ph_Available(void)
  57. {
  58.     int phstat=-1;
  59.     phstat=PtInit(0);
  60.     if (phstat==0)
  61.     {
  62.        return 1;
  63.     }
  64.     else
  65.     {
  66.        return 0;
  67.     }
  68. }
  69. static SDL_VideoDevice *ph_CreateDevice(int devindex)
  70. {
  71.     SDL_VideoDevice *device;
  72.     /* Initialize all variables that we clean on shutdown */
  73.     device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
  74.     if (device) {
  75.         memset(device, 0, (sizeof *device));
  76.         device->hidden = (struct SDL_PrivateVideoData *)
  77.                 malloc((sizeof *device->hidden));
  78.         device->gl_data = NULL;
  79.     }
  80.     if ( (device == NULL) || (device->hidden == NULL) ) {
  81.         SDL_OutOfMemory();
  82.         ph_DeleteDevice(device);
  83.         return(0);
  84.     }
  85.     memset(device->hidden, 0, (sizeof *device->hidden));
  86.     /* Set the driver flags */
  87.     device->handles_any_size = 1; /* JB not true for fullscreen */
  88.     /* Set the function pointers */
  89.     device->CreateYUVOverlay = ph_CreateYUVOverlay;
  90.     device->VideoInit = ph_VideoInit;
  91.     device->ListModes = ph_ListModes;
  92.     device->SetVideoMode = ph_SetVideoMode;
  93.     device->ToggleFullScreen = ph_ToggleFullScreen;
  94.     device->UpdateMouse = NULL;
  95.     device->SetColors = ph_SetColors;
  96.     device->UpdateRects = NULL;         /* ph_ResizeImage */
  97.     device->VideoQuit = ph_VideoQuit;
  98.     device->AllocHWSurface = ph_AllocHWSurface;
  99.     device->CheckHWBlit = NULL;
  100.     device->FillHWRect = NULL;
  101.     device->SetHWColorKey = NULL;
  102.     device->SetHWAlpha = NULL;
  103.     device->LockHWSurface = ph_LockHWSurface;
  104.     device->UnlockHWSurface = ph_UnlockHWSurface;
  105.     device->FlipHWSurface = ph_FlipHWSurface;
  106.     device->FreeHWSurface = ph_FreeHWSurface;
  107.     device->SetCaption = ph_SetCaption;
  108.     device->SetIcon = NULL;
  109.     device->IconifyWindow = ph_IconifyWindow;
  110.     device->GrabInput = ph_GrabInput;
  111.     device->GetWMInfo = ph_GetWMInfo;
  112.     device->FreeWMCursor = ph_FreeWMCursor;
  113.     device->CreateWMCursor = ph_CreateWMCursor;
  114.     device->ShowWMCursor = ph_ShowWMCursor;
  115.     device->WarpWMCursor = ph_WarpWMCursor;
  116.     device->CheckMouseMode = ph_CheckMouseMode;
  117.     device->InitOSKeymap = ph_InitOSKeymap;
  118.     device->PumpEvents = ph_PumpEvents;
  119.     /* OpenGL support. */
  120.     device->GL_LoadLibrary = NULL;
  121.     device->GL_GetProcAddress = NULL;
  122.     device->GL_MakeCurrent = NULL;
  123. #ifdef HAVE_OPENGL
  124.     device->GL_SwapBuffers = ph_GL_SwapBuffers;
  125.     device->GL_GetAttribute = ph_GL_GetAttribute;
  126. #else
  127.     device->GL_SwapBuffers = NULL;
  128.     device->GL_GetAttribute = NULL;
  129. #endif /* HAVE_OPENGL */
  130.     device->free = ph_DeleteDevice;
  131.     return device;
  132. }
  133. VideoBootStrap ph_bootstrap = {
  134.     "photon", "QNX Photon video output",
  135.     ph_Available, ph_CreateDevice
  136. };
  137. static void ph_DeleteDevice(SDL_VideoDevice *device)
  138. {
  139.     if (device)
  140.     {
  141.         if (device->hidden)
  142.         {
  143.             free(device->hidden);
  144.             device->hidden = NULL;
  145.         }
  146.         if (device->gl_data)
  147.         {
  148.             free(device->gl_data);
  149.             device->gl_data = NULL;
  150.         }
  151.         free(device);
  152.         device = NULL;
  153.     }
  154. }
  155. static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat)
  156. {
  157.     PgVideoModeInfo_t my_mode_info;
  158.     PgHWCaps_t my_hwcaps;
  159.     window=NULL;
  160.     desktoppal=SDLPH_PAL_NONE;
  161. #ifdef HAVE_OPENGL
  162.     oglctx=NULL;
  163. #endif /* HAVE_OPENGL */
  164.     
  165.     captionflag=0;
  166.     old_video_mode=-1;
  167.     old_refresh_rate=-1;
  168.     if (NULL == (event = malloc(EVENT_SIZE)))
  169.     {
  170.         exit(EXIT_FAILURE);
  171.     }
  172.     /* Create the blank cursor */
  173.     SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
  174.                                           (int)BLANK_CWIDTH, (int)BLANK_CHEIGHT,
  175.                                           (int)BLANK_CHOTX, (int)BLANK_CHOTY);
  176.     if (SDL_BlankCursor == NULL)
  177.     {
  178.         printf("ph_VideoInit: could not create blank cursorn");
  179.     }
  180.     if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
  181.     {
  182.         fprintf(stderr,"ph_VideoInit: GetGraphicsHWCaps failed!! n");
  183.     }
  184.     if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0)
  185.     {
  186.         fprintf(stderr,"ph_VideoInit:  PgGetVideoModeInfo failedn");
  187.     }
  188.     /* We need to return BytesPerPixel as it in used by CreateRGBsurface */
  189.     vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
  190.     vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width;
  191.     desktopbpp = my_mode_info.bits_per_pixel;
  192.     
  193.     /* save current palette */
  194.     if (desktopbpp==8)
  195.     {
  196.         PgGetPalette(ph_palette);
  197.     }
  198.          
  199.     currently_fullscreen = 0;
  200.     
  201.     this->info.wm_available = 1;
  202.     
  203.     return 0;
  204. }
  205. static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,
  206.                 int width, int height, int bpp, Uint32 flags)
  207. {
  208.     PgDisplaySettings_t settings;
  209.     int mode;
  210.     PtArg_t arg[32];
  211.     PhDim_t dim;
  212.     int rtnval;
  213.     int i;
  214.     unsigned long *tempptr;
  215.     int pargc;
  216.     dim.w=width;
  217.     dim.h=height;
  218.     /* Lock the event thread, in multi-threading environments */
  219.     SDL_Lock_EventThread();
  220.     current->flags = flags;
  221.     /* create window if no OpenGL support selected */
  222.     if ((flags & SDL_OPENGL)!=SDL_OPENGL)
  223.     {
  224.         pargc=0;
  225.         PtSetArg(&arg[pargc++], Pt_ARG_DIM, &dim, 0);
  226.         PtSetArg(&arg[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
  227.         /* enable window minimizing */
  228.         PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE);
  229.         /* remove border and caption if no frame flag selected */
  230.         if ((flags & SDL_NOFRAME) == SDL_NOFRAME)
  231.         {
  232.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_TITLE | Ph_WM_RENDER_BORDER);
  233.         }
  234.         else
  235.         {
  236.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_TITLE | Ph_WM_RENDER_BORDER);
  237.         }
  238.         /* if window is not resizable then remove resize handles and maximize button */
  239.         if ((flags & SDL_RESIZABLE) != SDL_RESIZABLE)
  240.         {
  241.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX);
  242.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
  243.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
  244.         }
  245.         else
  246.         {
  247.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX);
  248.             /* it is need to be Pt_FALSE to allow the application to process the resize callback */
  249.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);
  250.             PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_RESIZE | Ph_WM_MAX);
  251.         }
  252.         if (window!=NULL)
  253.         {
  254.             PtUnrealizeWidget(window);
  255.             PtDestroyWidget(window);
  256.             window=NULL;
  257.         }
  258.         window=PtCreateWidget(PtWindow, NULL, pargc, arg);
  259.         PtRealizeWidget(window);
  260.         
  261.         PtFlush();
  262.     }
  263. #ifdef HAVE_OPENGL
  264.     if (flags & SDL_OPENGL)
  265.     {
  266.         /* ph_SetupOpenGLContext creates also window as need */
  267.         if (ph_SetupOpenGLContext(this, width, height, bpp, flags)==0)
  268.         {
  269.             /* setup OGL update function ... ugly method */
  270.             ph_ResizeImage(this, current, flags); 
  271.         }
  272.         else
  273.         {
  274.             /* if context creation fail, report no OpenGL to high level */
  275.             current->flags=(flags & (~SDL_OPENGL));
  276.         }
  277. #else
  278.     if (flags & SDL_OPENGL) /* if no built-in OpenGL support */
  279.     {
  280.         fprintf(stderr, "error: no OpenGL support, try to recompile library.n");
  281.         current->flags=(flags & (~SDL_OPENGL));
  282.         return NULL;
  283. #endif /* HAVE_OPENGL */
  284.     }
  285.     else
  286.     {
  287.         /* Initialize the window */
  288.         if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */
  289.         {
  290.             /* Get the video mode and set it */
  291.             if (flags & SDL_ANYFORMAT)
  292.             {
  293.                 if ((mode = get_mode_any_format(width, height, bpp)) == 0)
  294.                 {
  295.                     fprintf(stderr,"error: get_mode_any_format failedn");
  296.                     exit(1);
  297.                 }
  298.             }
  299.             else
  300.             {
  301.                 if ((mode = get_mode(width, height, bpp)) == 0)
  302.                 {
  303.                     fprintf(stderr,"error: get_mode failedn");
  304.                     exit(1);
  305.                 }
  306.             }
  307.             
  308.             if (bpp==8)
  309.             {
  310.                desktoppal=SDLPH_PAL_SYSTEM;
  311.             }
  312.             
  313.             /* save old video mode caps */
  314.             PgGetVideoMode(&settings);
  315.             old_video_mode=settings.mode;
  316.             old_refresh_rate=settings.refresh;
  317.             /* setup new video mode */
  318.             settings.mode = mode;
  319.             settings.refresh = 0;
  320.             settings.flags = 0;
  321.             if (PgSetVideoMode(&settings) < 0)
  322.             {
  323.                 fprintf(stderr,"error: PgSetVideoMode failedn");
  324.             }
  325.             current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */
  326.             /* Begin direct mode */
  327.             ph_EnterFullScreen(this);
  328.         } /* end fullscreen flag */
  329.         else
  330.         {
  331.             /* Use offscreen memory iff SDL_HWSURFACE flag is set */
  332.             if (flags & SDL_HWSURFACE)
  333.             {
  334.                 /* no stretch blit in offscreen context */
  335.                 current->flags = (flags & (~SDL_RESIZABLE));
  336.             }
  337.             /* using palette emulation code in window mode */
  338.             if (bpp==8)
  339.             {
  340.                 if (desktopbpp>=15)
  341.                 {
  342.                     desktoppal=SDLPH_PAL_EMULATE;
  343.                 }
  344.                 else
  345.                 {
  346.                     desktoppal=SDLPH_PAL_SYSTEM;
  347.                 }
  348.             }
  349.             else
  350.             {
  351.                desktoppal=SDLPH_PAL_NONE;
  352.             }
  353.         }
  354. /* If we are setting video to use the palette make sure we have allocated memory for it */
  355. if (bpp==8)
  356. {
  357.             current->format->palette = malloc(sizeof(SDL_Palette));
  358.             memset(current->format->palette, 0, sizeof(SDL_Palette));
  359.             current->format->palette->ncolors = 256;
  360.             current->format->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color));
  361.             /* fill the palette */
  362.             rtnval = PgGetPalette(ph_palette);
  363.             tempptr = (unsigned long *)current->format->palette->colors;
  364.             for(i=0; i<256; i++)
  365.             {
  366.                 *tempptr = (((unsigned long)ph_palette[i]) << 8);
  367.                 tempptr++;
  368.             }
  369.         }
  370.     }
  371.     current->w = width;
  372.     current->h = height;
  373.     current->format->BitsPerPixel = bpp;
  374.     current->format->BytesPerPixel = (bpp+7)/8;
  375.     current->pitch = SDL_CalculatePitch(current);
  376.     /* Must call at least once it setup image planes */
  377.     ph_ResizeImage(this, current, flags);
  378.     /* delayed set caption call */
  379.     if (captionflag)
  380.     {
  381.         ph_SetCaption(this, this->wm_title, NULL);
  382.     }
  383.     /* finish window drawing */
  384.     PtFlush();
  385.     SDL_Unlock_EventThread();
  386.     /* We're done! */
  387.     return (current);
  388. }
  389. static void ph_VideoQuit(_THIS)
  390. {
  391. #ifdef HAVE_OPENGL
  392.     PhRegion_t region_info;
  393. #endif /* HAVE_OPENGL */
  394.     ph_DestroyImage(this, SDL_VideoSurface); 
  395.     if (currently_fullscreen)
  396.     {
  397.         ph_LeaveFullScreen(this);
  398.     }
  399. #ifdef HAVE_OPENGL
  400.     /* prevent double SEGFAULT during parachute mode */
  401.     if (this->screen)
  402.     {
  403.         if (((this->screen->flags & SDL_FULLSCREEN)==SDL_FULLSCREEN) &&
  404.             ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL))
  405.         {
  406.             region_info.cursor_type=Ph_CURSOR_POINTER;
  407.             region_info.rid=PtWidgetRid(window);
  408.             PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
  409.         }
  410.     }
  411.     PtFlush();
  412. #endif /* HAVE_OPENGL */
  413.     
  414.     if (window)
  415.     {
  416.         PtUnrealizeWidget(window);
  417.         PtDestroyWidget(window);
  418.         window=NULL;
  419.     }
  420.     
  421.     /* restore palette */
  422.     if (desktoppal!=SDLPH_PAL_NONE)
  423.     {
  424.         PgSetPalette(ph_palette, 0, 0, _Pg_MAX_PALETTE, Pg_PALSET_GLOBAL | Pg_PALSET_FORCE_EXPOSE, 0);
  425.     }
  426. #ifdef HAVE_OPENGL
  427.     if (oglctx)
  428.     {
  429.         PhDCSetCurrent(NULL);
  430.         PhDCRelease(oglctx);
  431.         oglctx=NULL;
  432.     }
  433. #endif /* HAVE_OPENGL */
  434. }
  435. static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
  436. {
  437.     int i;
  438.     PhPoint_t point={0, 0};
  439.     PgColor_t syspalph[_Pg_MAX_PALETTE];
  440.     /* palette emulation code, using palette of the PhImage_t struct */
  441.     if (desktoppal==SDLPH_PAL_EMULATE)
  442.     {
  443.         if ((SDL_Image) && (SDL_Image->palette))
  444.         {
  445.             for (i=firstcolor; i<firstcolor+ncolors; i++)
  446.             {
  447.                 SDL_Image->palette[i]  = 0x00000000UL;
  448.                 SDL_Image->palette[i] |= colors[i-firstcolor].r<<16;
  449.                 SDL_Image->palette[i] |= colors[i-firstcolor].g<<8;
  450.                 SDL_Image->palette[i] |= colors[i-firstcolor].b;
  451.             }
  452.         }
  453.         /* image needs to be redrawed, very slow method */
  454.         PgDrawPhImage(&point, SDL_Image, 0);
  455.     }
  456.     else
  457.     {
  458.         if (desktoppal==SDLPH_PAL_SYSTEM)
  459.         {
  460.             for (i=firstcolor; i<firstcolor+ncolors; i++)
  461.             {
  462.                 syspalph[i]  = 0x00000000UL;
  463.                 syspalph[i] |= colors[i-firstcolor].r<<16;
  464.                 syspalph[i] |= colors[i-firstcolor].g<<8;
  465.                 syspalph[i] |= colors[i-firstcolor].b;
  466.             }
  467.             if ((this->screen->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN)
  468.             {
  469.                 /* window mode must use soft palette */
  470.                 PgSetPalette((PgColor_t*)&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_SOFT, 0);
  471.                 /* image needs to be redrawed, very slow method */
  472.                 PgDrawPhImage(&point, SDL_Image, 0);
  473.             }
  474.             else
  475.             {
  476.                 /* fullscreen mode must use hardware palette */
  477.                 PgSetPalette((PgColor_t*)&syspalph[firstcolor], 0, firstcolor, ncolors, Pg_PALSET_GLOBAL, 0);
  478.             }
  479.         }
  480.         else
  481.         {
  482.             /* SDLPH_PAL_NONE do nothing */
  483.         }
  484.     }
  485.     
  486.     return 1;
  487. }
  488. #ifdef HAVE_OPENGL
  489. int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
  490. {
  491.     PtArg_t args[8];
  492.     PhDim_t dim;
  493.     uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
  494.     int OGLargc;
  495.     int pargc;
  496.     dim.w=width;
  497.     dim.h=height;
  498.     
  499.     if (oglctx!=NULL)
  500.     {
  501.        PhDCSetCurrent(NULL);
  502.        PhDCRelease(oglctx);
  503.        oglctx=NULL;
  504.     }
  505.     OGLargc=0;
  506.     if (this->gl_config.depth_size)
  507.     {
  508.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS;
  509.         OGLAttrib[OGLargc++]=this->gl_config.depth_size;
  510.     }
  511.     if (this->gl_config.stencil_size)
  512.     {
  513.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS;
  514.         OGLAttrib[OGLargc++]=this->gl_config.stencil_size;
  515.     }
  516.     OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
  517.     if (flags & SDL_FULLSCREEN)
  518.     {
  519.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN;
  520.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT;
  521.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST;
  522.         OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER;
  523.     }
  524.     OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE;
  525.     if (this->gl_config.double_buffer)
  526.     {
  527.         oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
  528.     }
  529.     else
  530.     {
  531.         oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
  532.     }
  533.     if (oglctx==NULL)
  534.     {
  535.         fprintf(stderr,"ph_SetupOpenGLContext: cannot create OpenGL context.n");
  536.         return (-1);
  537.     }
  538.     PhDCSetCurrent(oglctx);
  539.     pargc=0;
  540.     PtSetArg(&args[pargc++], Pt_ARG_DIM, &dim, 0);
  541.     PtSetArg(&args[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);
  542.     PtSetArg(&args[pargc++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
  543.     if (flags & SDL_FULLSCREEN)
  544.     {
  545.         PhPoint_t pos;
  546.         pos.x=0;
  547.         pos.y=0;
  548.         PtSetArg(&args[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, ~0);
  549.         PtSetArg(&args[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_FFRONT | Ph_WM_CLOSE | Ph_WM_TOFRONT | Ph_WM_CONSWITCH);
  550.         PtSetArg(&args[pargc++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS);
  551.         PtSetArg(&args[pargc++], Pt_ARG_POS, &pos, 0);
  552.     }
  553.     else
  554.     {
  555.         /* remove border and caption if no frame flag selected */
  556.         if ((flags & SDL_NOFRAME) == SDL_NOFRAME)
  557.         {
  558.             PtSetArg(&args[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, 0, Ph_WM_RENDER_TITLE | Ph_WM_RENDER_BORDER);
  559.         }
  560.         else
  561.         {
  562.            /* if window is not resizable then remove resize handles */
  563.            if ((flags & SDL_RESIZABLE) != SDL_RESIZABLE)
  564.            {
  565.                PtSetArg(&args[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, 0, Ph_WM_RENDER_RESIZE);
  566.            }
  567.         }
  568.     }
  569.     if (window!=NULL)
  570.     {
  571.         PtUnrealizeWidget(window);
  572.         PtDestroyWidget(window);
  573.         window=NULL;
  574.     }
  575.     window=PtCreateWidget(PtWindow, NULL, pargc, args);
  576.     PtRealizeWidget(window);
  577.     /* disable mouse for fullscreen */
  578.     if (flags & SDL_FULLSCREEN)
  579.     {
  580.         PhRegion_t region_info;
  581.         region_info.cursor_type=Ph_CURSOR_NONE;
  582.         region_info.rid=PtWidgetRid(window);
  583.         PhRegionChange(Ph_REGION_CURSOR, 0, &region_info, NULL, NULL);
  584.     }
  585.     PtFlush();
  586.     return 0;
  587. }
  588. void ph_GL_SwapBuffers(_THIS)
  589. {
  590.     PgSetRegion(PtWidgetRid(window));
  591.     PdOpenGLContextSwapBuffers(oglctx);
  592. }
  593. int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
  594. {
  595.     switch (attrib)
  596.     {
  597.         case SDL_GL_DOUBLEBUFFER:
  598.              *value=this->gl_config.double_buffer;
  599.              break;
  600.         case SDL_GL_STENCIL_SIZE:
  601.              *value=this->gl_config.stencil_size;
  602.              break;
  603.         case SDL_GL_DEPTH_SIZE:
  604.              *value=this->gl_config.depth_size;
  605.              break;
  606.         default:
  607.              *value=0;
  608.              return(-1);
  609.     }
  610.     return 0;
  611. }
  612. #endif /* HAVE_OPENGL */