⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_ph_video.c

📁 Simple DirectMedia Layer - Simple DirectMedia Layer 是一个跨平台的多媒体库设计用来提供快速图形framebuffer和音频驱动。应用MPEG为软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Library General Public License for more details.    You should have received a copy of the GNU Library General Public    License along with this library; if not, write to the Free    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    Sam Lantinga    slouken@libsdl.org*/#ifdef SAVE_RCSIDstatic char rcsid = "@(#) $Id: SDL_ph_video.c,v 1.15 2002/05/28 19:31:32 slouken Exp $";#endif#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/ioctl.h>#include "SDL.h"#include "SDL_error.h"#include "SDL_timer.h"#include "SDL_thread.h"#include "SDL_video.h"#include "SDL_mouse.h"#include "SDL_endian.h"#include "SDL_sysvideo.h"#include "SDL_pixels_c.h"#include "SDL_events_c.h"#include "SDL_ph_video.h"#include "SDL_ph_modes_c.h"#include "SDL_ph_image_c.h"#include "SDL_ph_events_c.h"#include "SDL_ph_mouse_c.h"#include "SDL_ph_wm_c.h"#include "SDL_phyuv_c.h"#include "blank_cursor.h"static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat);static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,                int width, int height, int bpp, Uint32 flags);static int ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);static void ph_VideoQuit(_THIS);static void ph_DeleteDevice(SDL_VideoDevice *device);#ifdef HAVE_OPENGLint 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 */static int ph_Available(void){    int phstat=-1;    phstat=PtInit(0);    if (phstat==0)    {       return 1;    }    else    {       return 0;    }}static SDL_VideoDevice *ph_CreateDevice(int devindex){    SDL_VideoDevice *device;    /* Initialize all variables that we clean on shutdown */    device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));    if (device) {        memset(device, 0, (sizeof *device));        device->hidden = (struct SDL_PrivateVideoData *)                malloc((sizeof *device->hidden));        device->gl_data = NULL;    }    if ( (device == NULL) || (device->hidden == NULL) ) {        SDL_OutOfMemory();        ph_DeleteDevice(device);        return(0);    }    memset(device->hidden, 0, (sizeof *device->hidden));    /* Set the driver flags */    device->handles_any_size = 1; /* JB not true for fullscreen */    /* Set the function pointers */    device->CreateYUVOverlay = ph_CreateYUVOverlay;    device->VideoInit = ph_VideoInit;    device->ListModes = ph_ListModes;    device->SetVideoMode = ph_SetVideoMode;    device->ToggleFullScreen = ph_ToggleFullScreen;    device->UpdateMouse = NULL;	    device->SetColors = ph_SetColors;    device->UpdateRects = NULL;         /* ph_ResizeImage */    device->VideoQuit = ph_VideoQuit;    device->AllocHWSurface = ph_AllocHWSurface;    device->CheckHWBlit = NULL;    device->FillHWRect = NULL;    device->SetHWColorKey = NULL;    device->SetHWAlpha = NULL;    device->LockHWSurface = ph_LockHWSurface;    device->UnlockHWSurface = ph_UnlockHWSurface;    device->FlipHWSurface = ph_FlipHWSurface;    device->FreeHWSurface = ph_FreeHWSurface;    device->SetCaption = ph_SetCaption;    device->SetIcon = NULL;    device->IconifyWindow = ph_IconifyWindow;    device->GrabInput = ph_GrabInput;    device->GetWMInfo = ph_GetWMInfo;    device->FreeWMCursor = ph_FreeWMCursor;    device->CreateWMCursor = ph_CreateWMCursor;    device->ShowWMCursor = ph_ShowWMCursor;    device->WarpWMCursor = ph_WarpWMCursor;    device->CheckMouseMode = ph_CheckMouseMode;    device->InitOSKeymap = ph_InitOSKeymap;    device->PumpEvents = ph_PumpEvents;    /* OpenGL support. */    device->GL_LoadLibrary = NULL;    device->GL_GetProcAddress = NULL;    device->GL_MakeCurrent = NULL;#ifdef HAVE_OPENGL    device->GL_SwapBuffers = ph_GL_SwapBuffers;    device->GL_GetAttribute = ph_GL_GetAttribute;#else    device->GL_SwapBuffers = NULL;    device->GL_GetAttribute = NULL;#endif /* HAVE_OPENGL */    device->free = ph_DeleteDevice;    return device;}VideoBootStrap ph_bootstrap = {    "photon", "QNX Photon video output",    ph_Available, ph_CreateDevice};static void ph_DeleteDevice(SDL_VideoDevice *device){    if (device)    {        if (device->hidden)        {            free(device->hidden);            device->hidden = NULL;        }        if (device->gl_data)        {            free(device->gl_data);            device->gl_data = NULL;        }        free(device);        device = NULL;    }}static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat){    PgVideoModeInfo_t my_mode_info;    PgHWCaps_t my_hwcaps;    window=NULL;    desktoppal=SDLPH_PAL_NONE;#ifdef HAVE_OPENGL    oglctx=NULL;#endif /* HAVE_OPENGL */        captionflag=0;    old_video_mode=-1;    old_refresh_rate=-1;	    if (NULL == (event = malloc(EVENT_SIZE)))    {        exit(EXIT_FAILURE);    }    memset(event, 0x00, EVENT_SIZE);    /* 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("ph_VideoInit(): could not create blank cursor !\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;    desktopbpp = my_mode_info.bits_per_pixel;        /* save current palette */    if (desktopbpp==8)    {        PgGetPalette(ph_palette);    }             currently_fullscreen = 0;        this->info.wm_available = 1;        return 0;}static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface *current,                int width, int height, int bpp, Uint32 flags){    PgDisplaySettings_t settings;    int mode;    PtArg_t arg[32];    PhDim_t dim;    int rtnval;    int i;    unsigned long *tempptr;    int pargc;    dim.w=width;    dim.h=height;    /* Lock the event thread, in multi-threading environments */    SDL_Lock_EventThread();    current->flags = flags;    /* create window if no OpenGL support selected */    if ((flags & SDL_OPENGL)!=SDL_OPENGL)    {        pargc=0;                // prevent using HWSURFACE in window mode if desktop bpp != chosen bpp        if ((flags & SDL_HWSURFACE) && (!(flags & SDL_FULLSCREEN)))        {           if (desktopbpp!=bpp)           {              fprintf(stderr, "ph_SetVideoMode(): SDL_HWSURFACE available only with chosen bpp equal desktop bpp !\n");              return NULL;           }        }        PtSetArg(&arg[pargc++], Pt_ARG_DIM, &dim, 0);        PtSetArg(&arg[pargc++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE, Pt_RESIZE_XY_AS_REQUIRED);        /* enable window minimizing */        PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE);        /* remove border and caption if no frame flag selected */        if ((flags & SDL_NOFRAME) == SDL_NOFRAME)        {            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_TITLE | Ph_WM_RENDER_BORDER);        }        else        {            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_TITLE | Ph_WM_RENDER_BORDER);        }        /* if window is not resizable then remove resize handles and maximize button */        if ((flags & SDL_RESIZABLE) != SDL_RESIZABLE)        {            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX);            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);        }        else        {            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE, Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX);            /* it is need to be Pt_FALSE to allow the application to process the resize callback */            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_RESIZE | Ph_WM_MAX);            PtSetArg(&arg[pargc++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_RESIZE | Ph_WM_MAX);        }        if (window!=NULL)        {            PtUnrealizeWidget(window);            PtDestroyWidget(window);            window=NULL;        }        window=PtCreateWidget(PtWindow, NULL, pargc, 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)        {            /* setup OGL update function ... ugly method */            ph_ResizeImage(this, current, flags);         }        else        {            /* if context creation fail, report no OpenGL to high level */            current->flags=(flags & (~SDL_OPENGL));        }#else    if (flags & SDL_OPENGL) /* if no built-in OpenGL support */    {        fprintf(stderr, "ph_SetVideoMode(): no OpenGL support, try to recompile library.\n");        current->flags=(flags & (~SDL_OPENGL));        return NULL;#endif /* HAVE_OPENGL */    }    else    {        /* 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,"ph_SetVideoMode(): get_mode_any_format failed !\n");                    exit(1);                }            }            else            {                if ((mode = get_mode(width, height, bpp)) == 0)                {                    fprintf(stderr,"ph_SetVideoMode(): get_mode failed !\n");                    exit(1);                }            }                        if (bpp==8)            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -