Mercurial > sdl-ios-xcode
diff src/video/photon/SDL_ph_video.c @ 309:2de77f7b7a28
*** empty log message ***
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 11 Mar 2002 17:38:56 +0000 |
parents | f6ffac90895c |
children | 3333b6e68289 |
line wrap: on
line diff
--- a/src/video/photon/SDL_ph_video.c Sun Mar 10 03:55:45 2002 +0000 +++ b/src/video/photon/SDL_ph_video.c Mon Mar 11 17:38:56 2002 +0000 @@ -58,17 +58,24 @@ static void ph_DeleteDevice(SDL_VideoDevice *device); #ifdef HAVE_OPENGL +int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags); static void ph_GL_SwapBuffers(_THIS); static int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value); #endif /* HAVE_OPENGL */ -#ifdef HAVE_OPENGL -PdOpenGLContext_t* OGLContext=NULL; -#endif /* HAVE_OPENGL */ - static int ph_Available(void) { - return 1; + int phstat=-1; + + phstat=PtInit(0); + if (phstat==0) + { + return 1; + } + else + { + return 0; + } } static SDL_VideoDevice *ph_CreateDevice(int devindex) @@ -77,7 +84,7 @@ /* Initialize all variables that we clean on shutdown */ device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); - if ( device ) { + if (device) { memset(device, 0, (sizeof *device)); device->hidden = (struct SDL_PrivateVideoData *) malloc((sizeof *device->hidden)); @@ -98,10 +105,10 @@ device->VideoInit = ph_VideoInit; device->ListModes = ph_ListModes; device->SetVideoMode = ph_SetVideoMode; - device->ToggleFullScreen = ph_ToggleFullScreen; + device->ToggleFullScreen = ph_ToggleFullScreen; device->UpdateMouse = NULL; device->SetColors = ph_SetColors; - device->UpdateRects = NULL; /* ph_ResizeImage; */ + device->UpdateRects = NULL; /* ph_ResizeImage */ device->VideoQuit = ph_VideoQuit; device->AllocHWSurface = ph_AllocHWSurface; device->CheckHWBlit = NULL; @@ -149,13 +156,15 @@ static void ph_DeleteDevice(SDL_VideoDevice *device) { - - if ( device ) { - if ( device->hidden ) { + if (device) + { + if (device->hidden) + { free(device->hidden); device->hidden = NULL; } - if ( device->gl_data ) { + if (device->gl_data) + { free(device->gl_data); device->gl_data = NULL; } @@ -166,104 +175,68 @@ static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat) { - PtArg_t arg[1]; - PhDim_t dim; - PgColor_t ph_palette[_Pg_MAX_PALETTE]; - int i; - unsigned long *tempptr; - int rtnval; -// PgDisplaySettings_t mysettings; - PgVideoModeInfo_t my_mode_info; - PgHWCaps_t my_hwcaps; - - if( NULL == ( event = malloc( EVENT_SIZE ) ) ) - exit( EXIT_FAILURE ); + PgColor_t ph_palette[_Pg_MAX_PALETTE]; + int i; + unsigned long *tempptr; + int rtnval; + PgVideoModeInfo_t my_mode_info; + PgHWCaps_t my_hwcaps; - /* Create a widget 'window' to capture events */ - dim.w=0; //JB test320; - dim.h=0; //JB test240; - //We need to return BytesPerPixel as it in used by CreateRGBsurface + window=NULL; + oglctx=NULL; - PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); - -/* - PtSetArg(&arg[1], Pt_ARG_RESIZE_FLAGS, Pt_TRUE, Pt_RESIZE_XY_AS_REQUIRED); - PtSetArg(&arg[2], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | - Ph_WM_STATE_ISMAX | - Ph_WM_STATE_ISFOCUS); + if (NULL == (event = malloc(EVENT_SIZE))) + { + exit(EXIT_FAILURE); + } + + /* Create the blank cursor */ + SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask, + (int)BLANK_CWIDTH, (int)BLANK_CHEIGHT, + (int)BLANK_CHOTX, (int)BLANK_CHOTY); - PtSetArg(&arg[3], Pt_ARG_WINDOW_RENDER_FLAGS,Pt_FALSE,~0); - PtSetArg(&arg[4], Pt_ARG_WINDOW_MANAGED_FLAGS,Pt_TRUE, - Ph_WM_FFRONT | - Ph_WM_CLOSE | - Ph_WM_TOFRONT | - Ph_WM_CONSWITCH); -*/ - - - window=PtAppInit(NULL, NULL, NULL, 1, arg); + if (SDL_BlankCursor == NULL) + { + printf("ph_VideoInit: could not create blank cursor\n"); + } - if(window == NULL) - { - printf("Photon application init failed, probably Photon is not running.\n"); - exit( EXIT_FAILURE ); - } - - //PgSetDrawBufferSize(16 *1024); - PgSetRegion(PtWidgetRid(window)); - PgSetClipping(0,NULL); - PtRealizeWidget(window); - + if (PgGetGraphicsHWCaps(&my_hwcaps) < 0) + { + fprintf(stderr,"ph_VideoInit: GetGraphicsHWCaps failed!! \n"); + } - /* Get the available video modes */ -// if(ph_GetVideoModes(this) < 0) -// return -1; - - /* Create the blank cursor */ - SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask, - (int)BLANK_CWIDTH, (int)BLANK_CHEIGHT, - (int)BLANK_CHOTX, (int)BLANK_CHOTY); - - if(SDL_BlankCursor == NULL) - printf("could not create blank cursor\n"); + if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0) + { + fprintf(stderr,"ph_VideoInit: PgGetVideoModeInfo failed\n"); + } - if (PgGetGraphicsHWCaps(&my_hwcaps) < 0) - { - fprintf(stderr,"ph_VideoInit: GetGraphicsHWCaps failed!! \n"); - } - if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0) - { - fprintf(stderr,"ph_VideoInit: PgGetVideoModeInfo failed\n"); - } - - //We need to return BytesPerPixel as it in used by CreateRGBsurface - vformat->BitsPerPixel = my_mode_info.bits_per_pixel; - vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width; + /* We need to return BytesPerPixel as it in used by CreateRGBsurface */ + vformat->BitsPerPixel = my_mode_info.bits_per_pixel; + vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width; - //return a palette if we are in 256 color mode - if(vformat->BitsPerPixel == 8) - { - vformat->palette = malloc(sizeof(SDL_Palette)); - memset(vformat->palette, 0, sizeof(SDL_Palette)); - vformat->palette->ncolors = 256; - vformat->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color)); - - //fill the palette - rtnval = PgGetPalette(ph_palette); - if(rtnval < 0) - printf("ph_VideoInit: PgGetPalette failed\n"); - - tempptr = (unsigned long *)vformat->palette->colors; + /* return a palette if we are in 256 color mode */ + if (vformat->BitsPerPixel == 8) + { + vformat->palette = malloc(sizeof(SDL_Palette)); + memset(vformat->palette, 0, sizeof(SDL_Palette)); + vformat->palette->ncolors = 256; + vformat->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color)); - for(i=0;i<256; i++) - { - *tempptr = (((unsigned long)ph_palette[i]) << 8); - tempptr++; + /* fill the palette */ + rtnval = PgGetPalette(ph_palette); + if (rtnval < 0) + { + fprintf(stderr, "ph_VideoInit: PgGetPalette failed\n"); + } - } - - } + tempptr = (unsigned long *)vformat->palette->colors; + for(i=0;i<256; i++) + { + *tempptr = (((unsigned long)ph_palette[i]) << 8); + tempptr++; + } + } currently_fullscreen = 0; @@ -276,21 +249,14 @@ int width, int height, int bpp, Uint32 flags) { PgDisplaySettings_t settings; - int mode, actual_width, actual_height; - PtArg_t arg[5]; - PhDim_t dim; + int mode; + PtArg_t arg[32]; + PhDim_t dim; int rtnval; PgColor_t ph_palette[_Pg_MAX_PALETTE]; int i; unsigned long *tempptr; - -#ifdef HAVE_OPENGL - uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS]; - int OGLargc; -#endif /* HAVE_OPENGL */ - - actual_width = width; - actual_height = height; + int pargc; dim.w=width; dim.h=height; @@ -298,136 +264,131 @@ /* Lock the event thread, in multi-threading environments */ SDL_Lock_EventThread(); - /* Initialize the window */ - if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */ + /* create window if no OpenGL support selected */ + if ((flags & SDL_OPENGL)!=SDL_OPENGL) { - /* Get the video mode and set it */ - if (flags & SDL_ANYFORMAT) + pargc=0; + + PtSetArg(&arg[pargc++], Pt_ARG_DIM, &dim, 0); + PtSetArg(&arg[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED); + + if (window!=NULL) { - if ((mode = get_mode_any_format(width, height, bpp)) == 0) - { - fprintf(stderr,"error: get_mode_any_format failed\n"); - exit(1); - } + PtUnrealizeWidget(window); + PtDestroyWidget(window); + window=NULL; + } + + window=PtCreateWidget(PtWindow, NULL, pargc-1, arg); + PtRealizeWidget(window); + + PtFlush(); + } + +#ifdef HAVE_OPENGL + if (flags & SDL_OPENGL) + { + /* ph_SetupOpenGLContext creates also window as need */ + if (ph_SetupOpenGLContext(this, width, height, bpp, flags)==0) + { + current->flags=flags; + /* setup OGL update function ... ugly method */ + ph_ResizeImage(this, current, flags); } else { - if ((mode = get_mode(width, height, bpp)) == 0) - { - fprintf(stderr,"error: get_mode failed\n"); - exit(1); - } + /* if context creation fail, report no OpenGL to high level */ + current->flags=(flags & (~SDL_OPENGL)); } - settings.mode = mode; - settings.refresh = 0; - settings.flags = 0; - - if (PgSetVideoMode( &settings ) < 0) - { - fprintf(stderr,"error: PgSetVideoMode failed\n"); - } - - /* Get the true height and width */ - - current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */ - - /* Begin direct mode */ - - ph_EnterFullScreen(this); - - } /* end fullscreen flag */ +#else + if (flags & SDL_OPENGL) /* if no built-in OpenGL support */ + { + fprintf(stderr, "error: no OpenGL support, try to recompile library.\n"); + current->flags=(flags & (~SDL_OPENGL)); + return NULL; +#endif /* HAVE_OPENGL */ + } else { - if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */ - { - /* Hardware surface is Offsceen Context. ph_ResizeImage handles the switch */ - current->flags = (flags & (~SDL_RESIZABLE)); /* no stretch blit in offscreen context */ - } - else /* must be SDL_SWSURFACE */ - { - current->flags = (flags | SDL_RESIZABLE); /* yes we can resize as this is a software surface */ - } + /* Initialize the window */ + if (flags & SDL_FULLSCREEN) /* Direct Context , assume SDL_HWSURFACE also set */ + { + /* Get the video mode and set it */ + if (flags & SDL_ANYFORMAT) + { + if ((mode = get_mode_any_format(width, height, bpp)) == 0) + { + fprintf(stderr,"error: get_mode_any_format failed\n"); + exit(1); + } + } + else + { + if ((mode = get_mode(width, height, bpp)) == 0) + { + fprintf(stderr,"error: get_mode failed\n"); + exit(1); + } + } + settings.mode = mode; + settings.refresh = 0; + settings.flags = 0; + + if (PgSetVideoMode( &settings ) < 0) + { + fprintf(stderr,"error: PgSetVideoMode failed\n"); + } + + /* Get the true height and width */ + + current->flags = (flags & (~SDL_RESIZABLE)); /* no resize for Direct Context */ + + /* Begin direct mode */ -#ifdef HAVE_OPENGL - if (flags & SDL_OPENGL) /* for now support OpenGL in window mode only */ - { - OGLargc=0; - if (this->gl_config.depth_size) - { - OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS; - OGLAttrib[OGLargc++]=this->gl_config.depth_size; - } - if (this->gl_config.stencil_size) - { - OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS; - OGLAttrib[OGLargc++]=this->gl_config.stencil_size; - } - OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE; - if (this->gl_config.double_buffer) - { - OGLContext=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib); - } - else - { - OGLContext=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib); - } - if (OGLContext==NULL) - { - fprintf(stderr,"error: cannot create OpenGL context.\n"); - exit(1); - } - PhDCSetCurrent(OGLContext); - } -#else - if (flags & SDL_OPENGL) /* if no OpenGL support */ - { - fprintf(stderr, "error: no OpenGL support, try to recompile library.\n"); - exit(1); - } + ph_EnterFullScreen(this); + + } /* end fullscreen flag */ + else + { + if (flags & SDL_HWSURFACE) /* Use offscreen memory iff SDL_HWSURFACE flag is set */ + { + /* Hardware surface is Offsceen Context. ph_ResizeImage handles the switch */ + current->flags = (flags & (~SDL_RESIZABLE)); /* no stretch blit in offscreen context */ + } + else /* must be SDL_SWSURFACE */ + { + current->flags = (flags | SDL_RESIZABLE); /* yes we can resize as this is a software surface */ + } + } -#endif /* HAVE_OPENGL */ - + /* If we are setting video to use the palette make sure we have allocated memory for it */ + if (bpp==8) + { + current->format->palette = malloc(sizeof(SDL_Palette)); + memset(current->format->palette, 0, sizeof(SDL_Palette)); + current->format->palette->ncolors = 256; + current->format->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color)); + /* fill the palette */ + rtnval = PgGetPalette(ph_palette); + + tempptr = (unsigned long *)current->format->palette->colors; + + for(i=0; i<256; i++) + { + *tempptr = (((unsigned long)ph_palette[i]) << 8); + tempptr++; + } + } + } - /* If we are setting video to use the palette make sure we have allocated memory for it */ - if(bpp == 8) - { - current->format->palette = malloc(sizeof(SDL_Palette)); - memset(current->format->palette, 0, sizeof(SDL_Palette)); - current->format->palette->ncolors = 256; - current->format->palette->colors = (SDL_Color *)malloc(256 *sizeof(SDL_Color)); - /* fill the palette */ - rtnval = PgGetPalette(ph_palette); - - tempptr = (unsigned long *)current->format->palette->colors; - - for(i=0;i<256; i++) - { - *tempptr = (((unsigned long)ph_palette[i]) << 8); - tempptr++; - - } - } - - - /* Current window dimensions */ - PtGetResource( window, Pt_ARG_DIM, &dim, 0 ); - - /* If we need to resize the window */ - if((dim.w != width)||(dim.h != height)) - { - dim.w=width; - dim.h=height; - PtSetArg(&arg[0], Pt_ARG_DIM, &dim,0); - PtSetResources( window, 1, arg ); - current->w = width; - current->h = height; - current->format->BitsPerPixel = bpp; - current->format->BytesPerPixel = (bpp+7)/8; - current->pitch = SDL_CalculatePitch(current); - /* Must call at least once it setup image planes */ - ph_ResizeImage(this, current, flags); - } + current->w = width; + current->h = height; + current->format->BitsPerPixel = bpp; + current->format->BytesPerPixel = (bpp+7)/8; + current->pitch = SDL_CalculatePitch(current); + /* Must call at least once it setup image planes */ + ph_ResizeImage(this, current, flags); SDL_Unlock_EventThread(); @@ -437,18 +398,47 @@ static void ph_VideoQuit(_THIS) { + PhRegion_t region_info; + ph_DestroyImage(this, SDL_VideoSurface); if (currently_fullscreen) { - PdDirectStop( directContext ); - PdReleaseDirectContext( directContext ); + PdDirectStop(directContext); + PdReleaseDirectContext(directContext); directContext=0; - currently_fullscreen = 0; + currently_fullscreen=0; + } + +#ifdef HAVE_OPENGL + if (((this->screen->flags & SDL_FULLSCREEN)==SDL_FULLSCREEN) && + ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)) + { + region_info.cursor_type=Ph_CURSOR_POINTER; + region_info.rid=PtWidgetRid(window); + PhRegionChange(Ph_REGION_CURSOR, 0, ®ion_info, NULL, NULL); } + + PtFlush(); +#endif /* HAVE_OPENGL */ + + if (window) + { + PtUnrealizeWidget(window); + PtDestroyWidget(window); + window=NULL; + } + +#ifdef HAVE_OPENGL + if (oglctx) + { + PhDCSetCurrent(NULL); + PhDCRelease(oglctx); + oglctx=NULL; + } +#endif /* HAVE_OPENGL */ } - static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) { PgColor_t *in, *out; @@ -508,10 +498,110 @@ } #ifdef HAVE_OPENGL + +int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags) +{ + PtArg_t args[8]; + PhDim_t dim; + uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS]; + int OGLargc; + int pargc; + + dim.w=width; + dim.h=height; + + if (oglctx!=NULL) + { + PhDCSetCurrent(NULL); + PhDCRelease(oglctx); + oglctx=NULL; + } + + OGLargc=0; + if (this->gl_config.depth_size) + { + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DEPTH_BITS; + OGLAttrib[OGLargc++]=this->gl_config.depth_size; + } + if (this->gl_config.stencil_size) + { + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_STENCIL_BITS; + OGLAttrib[OGLargc++]=this->gl_config.stencil_size; + } + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW; + if (flags & SDL_FULLSCREEN) + { + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN; + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_DIRECT; + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_BEST; + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FULLSCREEN_CENTER; + } + OGLAttrib[OGLargc++]=PHOGL_ATTRIB_NONE; + + if (this->gl_config.double_buffer) + { + oglctx=PdCreateOpenGLContext(2, &dim, 0, OGLAttrib); + } + else + { + oglctx=PdCreateOpenGLContext(1, &dim, 0, OGLAttrib); + } + if (oglctx==NULL) + { + fprintf(stderr,"error: cannot create OpenGL context.\n"); + return (-1); + } + + PhDCSetCurrent(oglctx); + + pargc=0; + + PtSetArg(&args[pargc++], Pt_ARG_DIM, &dim, 0); + PtSetArg(&args[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED); + PtSetArg(&args[pargc++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0); + + if (flags & SDL_FULLSCREEN) + { + PhPoint_t pos; + + pos.x=0; + pos.y=0; + + PtSetArg(&args[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, ~0); + PtSetArg(&args[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS,Pt_TRUE, Ph_WM_FFRONT | Ph_WM_CLOSE | Ph_WM_TOFRONT | Ph_WM_CONSWITCH); + PtSetArg(&args[pargc++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS); + PtSetArg(&args[pargc++], Pt_ARG_POS, &pos, 0); + } + + if (window!=NULL) + { + PtUnrealizeWidget(window); + PtDestroyWidget(window); + window=NULL; + } + + window=PtCreateWidget(PtWindow, NULL, pargc-1, args); + PtRealizeWidget(window); + + /* disable mouse for fullscreen */ + if (flags & SDL_FULLSCREEN) + { + PhRegion_t region_info; + + region_info.cursor_type=Ph_CURSOR_NONE; + region_info.rid=PtWidgetRid(window); + PhRegionChange(Ph_REGION_CURSOR, 0, ®ion_info, NULL, NULL); + } + + PtFlush(); + + return 0; +} + void ph_GL_SwapBuffers(_THIS) { PgSetRegion(PtWidgetRid(window)); - PdOpenGLContextSwapBuffers(OGLContext); + PdOpenGLContextSwapBuffers(oglctx); } int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)