void sdl_initialize() { if (graphic_manager.isLoaded) { return; } // Start SDL SDL_Init(SDL_INIT_EVERYTHING); // enable unicode SDL_EnableUNICODE(1); const SDL_VideoInfo *videoinfo = SDL_GetVideoInfo(); graphic_manager.flags = SDL_OPENGL | SDL_OPENGLBLIT | SDL_GL_DOUBLEBUFFER | SDL_HWPALETTE; if (videoinfo->hw_available) { graphic_manager.flags |= SDL_HWSURFACE; } else { graphic_manager.flags |= SDL_SWSURFACE; } if (videoinfo->blit_hw) { graphic_manager.flags |= SDL_HWACCEL; } if (graphic_manager.fullscreen) { graphic_manager.flags |= SDL_FULLSCREEN; } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); graphic_manager.res_mode_list = NULL; graphic_manager.res_mode_count = 0; sdl_get_resolution(); graphic_manager.surface = SDL_SetVideoMode( graphic_manager.res_mode_default->width, graphic_manager.res_mode_default->height, graphic_manager.res_mode_default->bpp, graphic_manager.flags ); if (graphic_manager.surface == 0) { LOG(SDL_GetError()); exit(EXIT_FAILURE); } SDL_ShowCursor(1); SDL_WM_SetCaption("Incubation", "Incubation"); sdl_init_gl(); graphic_manager.isLoaded = 1; }
BYTE gfx_init(void) { const SDL_VideoInfo *video_info; /* casi particolari provenienti dal settings_file_parse() e cmd_line_parse() */ if ((cfg->scale == X1) && (cfg->filter != NO_FILTER)) { cfg->scale = X2; } if (gui_create() == EXIT_ERROR) { fprintf(stderr, "gui initialization failed\n"); return (EXIT_ERROR); } #if defined (__WIN64__) sprintf(SDL_windowhack, "SDL_WINDOWID=%I64u", (uint64_t) gui_screen_id()); #else sprintf(SDL_windowhack, "SDL_WINDOWID=%i", (int) gui_screen_id()); #endif sdl_wid(); /* inizializzazione SDL */ if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "SDL initialization failed: %s\n", SDL_GetError()); return (EXIT_ERROR); } gui_after_set_video_mode(); video_info = SDL_GetVideoInfo(); /* * modalita' video con profondita' di colore * inferiori a 15 bits non sono supportate. */ if (video_info->vfmt->BitsPerPixel < 15) { fprintf(stderr, "Sorry but video mode at 256 color are not supported\n"); return (EXIT_ERROR); } /* il filtro hqx supporta solo i 32 bit di profondita' di colore */ if (((cfg->filter >= HQ2X) || (cfg->filter <= HQ4X)) && (video_info->vfmt->BitsPerPixel < 32)) { cfg->filter = NO_FILTER; } /* controllo se e' disponibile l'accelerazione hardware */ if (video_info->hw_available) { software_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ASYNCBLIT; } else { software_flags = SDL_SWSURFACE | SDL_ASYNCBLIT; } /* per poter inizializzare il glew devo creare un contesto opengl prima */ if (!(surface_sdl = SDL_SetVideoMode(0, 0, 0, SDL_OPENGL))) { opengl.supported = FALSE; cfg->render = RENDER_SOFTWARE; gfx_set_render(cfg->render); if ((cfg->filter >= PHOSPHOR) && (cfg->filter <= CRT_NO_CURVE)) { cfg->filter = NO_FILTER; } fprintf(stderr, "INFO: OpenGL not supported.\n"); } else { opengl.supported = TRUE; } /* casi particolari provenienti dal settings_file_parse() e cmd_line_parse()*/ if (cfg->fullscreen == FULLSCR) { if (!gfx.opengl) { cfg->fullscreen = NO_FULLSCR; } else { gfx.scale_before_fscreen = cfg->scale; } } sdl_init_gl(); /* * inizializzo l'ntsc che utilizzero' non solo * come filtro ma anche nel gfx_set_screen() per * generare la paletta dei colori. */ if (ntsc_init(0, 0, 0, 0, 0) == EXIT_ERROR) { return (EXIT_ERROR); } /* * mi alloco una zona di memoria dove conservare la * paletta nel formato di visualizzazione. */ if (!(palette_win = (uint32_t *) malloc(NUM_COLORS * sizeof(uint32_t)))) { fprintf(stderr, "Unable to allocate the palette\n"); return (EXIT_ERROR); } if (cfg->fullscreen) { gfx_set_screen(cfg->scale, cfg->filter, NO_FULLSCR, cfg->palette, FALSE, FALSE); cfg->fullscreen = NO_FULLSCR; cfg->scale = gfx.scale_before_fscreen; gui_fullscreen(); } else { gfx_set_screen(cfg->scale, cfg->filter, NO_FULLSCR, cfg->palette, FALSE, FALSE); /* * nella versione windows (non so in quella linux), sembra che * il VSync (con alcune schede video) non venga settato correttamente * al primo gfx_set_screen. E' necessario fare un gfx_reset_video * e poi nuovamente un gfx_set_screen. Nella versione linux il gui_reset_video() * non fa assolutamente nulla. */ gui_reset_video(); } if (!surface_sdl) { fprintf(stderr, "SDL initialization failed: %s\n", SDL_GetError()); return (EXIT_ERROR); } return (EXIT_OK); }