void S9xInitDisplay (int argc, char **argv) { #if 0 // AWH - Already initialized in GUI if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("Unable to initialize SDL: %s\n", SDL_GetError()); } #endif // AWH atexit(SDL_Quit); /* * domaemon * * we just go along with RGB565 for now, nothing else.. */ S9xSetRenderPixelFormat(RGB565); S9xBlitFilterInit(); #if 0 // AWH S9xBlit2xSaIFilterInit(); S9xBlitHQ2xFilterInit(); #endif // AWH /* * domaemon * * FIXME: The secreen size should be flexible * FIXME: Check if the SDL screen is really in RGB565 mode. screen->fmt */ if (GUI.fullscreen == TRUE) { GUI.sdl_screen = SDL_SetVideoMode(0, 0, 16, SDL_FULLSCREEN); } else { /* AWH - Modified */ // NTSC GUI.sdl_screen = SDL_SetVideoMode(512 + 104, 478, 16, 0); #if defined(CAPE_LCD3) GUI.sdl_screen = SDL_SetVideoMode(320, 240, 16, 0); #else GUI.sdl_screen = SDL_SetVideoMode(640, 480, 16, 0); #endif //GUI.sdl_screen = SDL_SetVideoMode(SNES_WIDTH, SNES_HEIGHT, 16, 0); } if (GUI.sdl_screen == NULL) { printf("Unable to set video mode: %s\n", SDL_GetError()); exit(1); } fprintf(stderr, "screen %dx%d, pitch: %d\n", GUI.sdl_screen->w, GUI.sdl_screen->h, GUI.sdl_screen->pitch); /* * domaemon * * buffer allocation, quite important */ SetupImage(); }
void S9xInitDisplay (int argc, char **argv) { if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("Unable to initialize SDL: %s\n", SDL_GetError()); } atexit(SDL_Quit); /* * domaemon * * we just go along with RGB565 for now, nothing else.. */ S9xSetRenderPixelFormat(RGB565); S9xBlitFilterInit(); S9xBlit2xSaIFilterInit(); S9xBlitHQ2xFilterInit(); /* * domaemon * * FIXME: The secreen size should be flexible * FIXME: Check if the SDL screen is really in RGB565 mode. screen->fmt */ if (GUI.fullscreen == TRUE) { GUI.sdl_screen = SDL_SetVideoMode(0, 0, 16, SDL_FULLSCREEN); } else { GUI.sdl_screen = SDL_SetVideoMode(SNES_WIDTH * 2, SNES_HEIGHT_EXTENDED * 2, 16, 0); } if (GUI.sdl_screen == NULL) { printf("Unable to set video mode: %s\n", SDL_GetError()); exit(1); } /* * domaemon * * buffer allocation, quite important */ SetupImage(); }
void S9xInitDisplay (int argc, char **argv) { GUI.display = XOpenDisplay(NULL); if (GUI.display == NULL) FatalError("Failed to connect to X server."); GUI.screen = DefaultScreenOfDisplay(GUI.display); GUI.screen_num = XScreenNumberOfScreen(GUI.screen); GUI.visual = DefaultVisualOfScreen(GUI.screen); XVisualInfo plate, *matches; int count; plate.visualid = XVisualIDFromVisual(GUI.visual); matches = XGetVisualInfo(GUI.display, VisualIDMask, &plate, &count); if (!count) FatalError("Your X Window System server is unwell!"); GUI.depth = matches[0].depth; if ((GUI.depth != 15 && GUI.depth != 16 && GUI.depth != 24) || (matches[0].c_class != TrueColor)) FatalError("Requiers 15, 16, 24 or 32-bit color depth supporting TrueColor."); GUI.red_shift = ffs(matches[0].red_mask) - 1; GUI.green_shift = ffs(matches[0].green_mask) - 1; GUI.blue_shift = ffs(matches[0].blue_mask) - 1; GUI.red_size = matches[0].red_mask >> GUI.red_shift; GUI.green_size = matches[0].green_mask >> GUI.green_shift; GUI.blue_size = matches[0].blue_mask >> GUI.blue_shift; if (GUI.depth == 16 && GUI.green_size == 63) GUI.green_shift++; XFree(matches); switch (GUI.depth) { default: case 32: case 24: S9xSetRenderPixelFormat(RGB555); GUI.pixel_format = 555; break; case 16: if (GUI.red_size != GUI.green_size || GUI.blue_size != GUI.green_size) { // 565 format if (GUI.green_shift > GUI.blue_shift && GUI.green_shift > GUI.red_shift) S9xSetRenderPixelFormat(GBR565); else if (GUI.red_shift > GUI.blue_shift) S9xSetRenderPixelFormat(RGB565); else S9xSetRenderPixelFormat(BGR565); GUI.pixel_format = 565; break; } // FALL ... case 15: if (GUI.green_shift > GUI.blue_shift && GUI.green_shift > GUI.red_shift) S9xSetRenderPixelFormat(GBR555); else if (GUI.red_shift > GUI.blue_shift) S9xSetRenderPixelFormat(RGB555); else S9xSetRenderPixelFormat(BGR555); GUI.pixel_format = 555; break; } S9xBlitFilterInit(); S9xBlit2xSaIFilterInit(); S9xBlitHQ2xFilterInit(); XSetWindowAttributes attrib; memset(&attrib, 0, sizeof(attrib)); attrib.background_pixel = BlackPixelOfScreen(GUI.screen); attrib.colormap = XCreateColormap(GUI.display, RootWindowOfScreen(GUI.screen), GUI.visual, AllocNone); GUI.window = XCreateWindow(GUI.display, RootWindowOfScreen(GUI.screen), (WidthOfScreen(GUI.screen) - SNES_WIDTH * 2) / 2, (HeightOfScreen(GUI.screen) - SNES_HEIGHT_EXTENDED * 2) / 2, SNES_WIDTH * 2, SNES_HEIGHT_EXTENDED * 2, 0, GUI.depth, InputOutput, GUI.visual, CWBackPixel | CWColormap, &attrib); static XColor bg, fg; static char data[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; Pixmap bitmap; bitmap = XCreateBitmapFromData(GUI.display, GUI.window, data, 8, 8); GUI.point_cursor = XCreatePixmapCursor(GUI.display, bitmap, bitmap, &fg, &bg, 0, 0); XDefineCursor(GUI.display, GUI.window, GUI.point_cursor); GUI.cross_hair_cursor = XCreateFontCursor(GUI.display, XC_crosshair); GUI.gc = DefaultGCOfScreen(GUI.screen); XSizeHints Hints; XWMHints WMHints; memset((void *) &Hints, 0, sizeof(XSizeHints)); memset((void *) &WMHints, 0, sizeof(XWMHints)); Hints.flags = PSize | PMinSize | PMaxSize; Hints.min_width = Hints.max_width = Hints.base_width = SNES_WIDTH * 2; Hints.min_height = Hints.max_height = Hints.base_height = SNES_HEIGHT_EXTENDED * 2; WMHints.input = True; WMHints.flags = InputHint; XSetWMHints(GUI.display, GUI.window, &WMHints); XSetWMNormalHints(GUI.display, GUI.window, &Hints); XSelectInput(GUI.display, GUI.window, FocusChangeMask | ExposureMask | KeyPressMask | KeyReleaseMask | StructureNotifyMask | ButtonPressMask | ButtonReleaseMask); XMapRaised(GUI.display, GUI.window); XClearWindow(GUI.display, GUI.window); SetupImage(); switch (GUI.depth) { default: case 32: GUI.bytes_per_pixel = 4; break; case 24: if (GUI.image->bits_per_pixel == 24) GUI.bytes_per_pixel = 3; else GUI.bytes_per_pixel = 4; break; case 15: case 16: GUI.bytes_per_pixel = 2; break; } }