diff --git a/src/ags.c b/src/ags.c index 5f7ffbd..c19b373 100644 --- a/src/ags.c +++ b/src/ags.c @@ -99,7 +99,7 @@ boolean ags_check_param_xy(int *x, int *y) { return TRUE; } -void ags_init() { +void ags_init(const char *videodev) { nact->ags.mouse_movesw = 2; /* 0:IZを無視, 1: 直接指定場所へ, 2: スムーズに指定場所に */ nact->ags.pal = &pal_256; nact->ags.world_size.width = SYS35_DEFAULT_WIDTH; @@ -110,7 +110,7 @@ void ags_init() { nact->ags.view_area.w = SYS35_DEFAULT_WIDTH; nact->ags.view_area.h = SYS35_DEFAULT_HEIGHT; - sdl_Initilize(); + sdl_Initialize(videodev); font_init(); initPal(&pal_256); diff --git a/src/ags.h b/src/ags.h index 62480c5..750f2c7 100644 --- a/src/ags.h +++ b/src/ags.h @@ -126,7 +126,7 @@ typedef struct _ags ags_t; /* 初期化関係 */ -extern void ags_init(); +extern void ags_init(const char *videodev); extern void ags_remove(); /* ウィンド関係 */ diff --git a/src/sdl_core.h b/src/sdl_core.h index 100a521..9546adf 100644 --- a/src/sdl_core.h +++ b/src/sdl_core.h @@ -34,7 +34,7 @@ struct inputstring_param; /* 初期化関係 */ -extern int sdl_Initilize(void); +extern int sdl_Initialize(const char *videodev); extern void sdl_Remove(void); /* ウィンド関係 */ diff --git a/src/sdl_video.c b/src/sdl_video.c index 73b530c..e2796d7 100644 --- a/src/sdl_video.c +++ b/src/sdl_video.c @@ -36,7 +36,7 @@ #include "xsystem35.h" #include "image.h" -static void window_init(void); +static void window_init(const char *driver_name); static void makeDIB(int width, int height, int depth); struct sdl_private_data *sdl_videodev; @@ -73,11 +73,10 @@ static boolean joy_open(void) { } /* SDL の初期化 */ -int sdl_Initilize(void) { +int sdl_Initialize(const char *videodev) { sdl_videodev = calloc(1, sizeof(struct sdl_private_data)); - /* make topleve window */ - window_init(); + window_init(videodev); /* offscreen Pixmap */ makeDIB(SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT, SYS35_DEFAULT_DEPTH); @@ -127,8 +126,26 @@ void sdl_setWindowTitle(char *name) { } #endif -/* Visual に応じて Window を生成する */ -static void window_init(void) { +static int rendering_driver_index(const char *driver_name) { + if (!driver_name) + return -1; + + SDL_RendererInfo info; + int nr_devs = SDL_GetNumRenderDrivers(); + for (int i = 0; i < nr_devs; i++) { + if (!SDL_GetRenderDriverInfo(i, &info) && !strcmp(info.name, driver_name)) + return i; + } + + fprintf(stderr, "Unknown video driver \"%s\". Valid names are:\n", driver_name); + for (int i = 0; i < nr_devs; i++) { + if (SDL_GetRenderDriverInfo(i, &info) == 0) + fprintf(stderr, " %s\n", info.name); + } + exit(1); +} + +static void window_init(const char *driver_name) { SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0"); SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK); @@ -151,7 +168,7 @@ static void window_init(void) { SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SYS35_DEFAULT_WIDTH, SYS35_DEFAULT_HEIGHT, flags); - sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); + sdl_renderer = SDL_CreateRenderer(sdl_window, rendering_driver_index(driver_name), 0); SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); SDL_RenderSetIntegerScale(sdl_renderer, integer_scaling); } diff --git a/src/xsystem35.c b/src/xsystem35.c index 23690f6..d21b311 100644 --- a/src/xsystem35.c +++ b/src/xsystem35.c @@ -80,6 +80,8 @@ static void sys35_remove(); static void sys35_ParseOption(int *argc, char **argv); static void check_profile(); +static char *videodev = NULL; + /* for debugging */ static int debuglv = DEBUGLEVEL; enum { @@ -112,6 +114,7 @@ static void sys35_usage(boolean verbose) { puts("Usage: xsystem35 [OPTIONS]\n"); puts("OPTIONS"); puts(" -gamefile file : set game resource file to 'file'"); + puts(" -devvideo device : set video device name to 'device'"); puts(" -devcd device : set cdrom device name to 'device'"); puts(" -devmidi device: set midi device name to 'device'"); @@ -209,7 +212,7 @@ static void sys35_init() { v_initVars(); - ags_init(); + ags_init(videodev); for (i = 0; i < FONTTYPEMAX; i++) font_set_name_and_index(i, fontname_tt[i], fontface[i]); @@ -275,6 +278,8 @@ static void sys35_ParseOption(int *argc, char **argv) { debugger_mode = DEBUGGER_CUI; } else if (0 == strcmp(argv[i], "-debug_dap")) { debugger_mode = DEBUGGER_DAP; + } else if (0 == strcmp(argv[i], "-devvideo")) { + videodev = argv[i + 1]; } else if (0 == strcmp(argv[i], "-devcd")) { if (argv[i + 1] != NULL) { cd_set_devicename(argv[i + 1]); @@ -356,6 +361,12 @@ static void check_profile() { audio_buffer_size = atoi(param); } + /* Video device */ + param = get_profile("video_device"); + if (param) { + videodev = param; + } + /* CD-ROM device name の設定 */ param = get_profile("cdrom_device"); if (param) {