void OSystem_Wii::switchVideoMode(int mode) { static const struct { gfx_video_mode_t mode; bool filter; } map[] = { { GFX_MODE_DEFAULT, false }, { GFX_MODE_DEFAULT, true }, { GFX_MODE_DS, false }, { GFX_MODE_DS, true } }; if (_gameHeight > 240) { if (mode == gmDoubleStrike) mode = gmStandard; else if (mode == gmDoubleStrikeFiltered) mode = gmStandardFiltered; } printf("switchVideoMode %d\n", mode); if (map[_actualGraphicsMode].mode != map[mode].mode) { GXRModeObj obj; gfx_video_deinit(); gfx_video_get_modeobj(&obj, GFX_STANDARD_AUTO, map[mode].mode); gfx_video_init(&obj); gfx_init(); gfx_con_init(NULL); } _actualGraphicsMode = mode; _bilinearFilter = map[mode].filter; gfx_tex_set_bilinear_filter(&_texGame, _bilinearFilter); gfx_tex_set_bilinear_filter(&_texMouse, _bilinearFilter); u16 usx, usy; if (map[mode].mode == GFX_MODE_DS) { usx = ConfMan.getInt("wii_video_ds_underscan_x", Common::ConfigManager::kApplicationDomain); usy = ConfMan.getInt("wii_video_ds_underscan_y", Common::ConfigManager::kApplicationDomain); } else { usx = ConfMan.getInt("wii_video_default_underscan_x", Common::ConfigManager::kApplicationDomain); usy = ConfMan.getInt("wii_video_default_underscan_y", Common::ConfigManager::kApplicationDomain); } gfx_set_underscan(usx, usy); gfx_coords(&_coordsOverlay, &_texOverlay, GFX_COORD_FULLSCREEN); gfx_coords(&_coordsGame, &_texGame, GFX_COORD_FULLSCREEN); updateScreenResolution(); }
void OSystem_Wii::initGfx() { gfx_set_underscan(ConfMan.getInt("wii_video_default_underscan_x"), ConfMan.getInt("wii_video_default_underscan_y")); _overlayWidth = gfx_video_get_width(); _overlayHeight = gfx_video_get_height(); #ifndef GAMECUBE if (CONF_GetAspectRatio() && _fullscreen) _overlayHeight = 400; #endif _overlaySize = _overlayWidth * _overlayHeight * 2; _overlayPixels = (OverlayColor *) memalign(32, _overlaySize); memset(&_texMouse, 0, sizeof(gfx_tex_t)); memset(&_texOverlay, 0, sizeof(gfx_tex_t)); memset(&_texGame, 0, sizeof(gfx_tex_t)); _cursorPalette = (u16 *) malloc(256 * 2); if (!_cursorPalette) { printf("could not alloc palette buffer\n"); ::abort(); } memset(_cursorPalette, 0, 256 * 2); if (!gfx_tex_init(&_texOverlay, GFX_TF_RGB5A3, 0, _overlayWidth, _overlayHeight)) { printf("could not init the overlay texture\n"); ::abort(); } gfx_coords(&_coordsOverlay, &_texOverlay, GFX_COORD_FULLSCREEN); }
// TODO this is just my console test app, clean up this mess! int main(int argc, char *argv[]) { (void) argc; (void) argv; VIDEO_Init(); PAD_Init(); SYS_SetResetCallback(stmcb); SYS_SetPowerCallback(stmcb); gfx_video_init(NULL); gfx_init(); gfx_con_init(NULL); printf("startup\n"); gfx_tex_t tex; memset(&tex, 0, sizeof(gfx_tex_t)); if (!gfx_tex_init(&tex, GFX_TF_RGB565, 0, 16, 16)) { printf("failed to init tex!\n"); return 1; } memset(tex.pixels, 0xe070, 16 * 16 * 2); gfx_tex_flush_texture(&tex); gfx_screen_coords_t coords_bg; gfx_coords(&coords_bg, &tex, GFX_COORD_FULLSCREEN); srand(gettime()); u64 frame = 0; u16 b; bool pf = false; u32 retries; u8 fg = 7, bg = 0; u32 i; char buf[32]; while (!quit) { b = 0; if (PAD_ScanPads() & 1) { b = PAD_ButtonsDown(0); gfx_con_set_alpha(0xff - PAD_TriggerR(0), 0xff - PAD_TriggerL(0)); } if (b & PAD_BUTTON_A) quit = true; if (b & PAD_BUTTON_B) pf = !pf; if (b & PAD_BUTTON_X) printf(S_RED("Hello") " " S_BLUE("world") "!\n"); if (pf) { for (i = 0; i < gfx_con_get_columns() * gfx_con_get_rows(); ++i) { printf(CON_ESC "%u;1m" CON_ESC "%um%c", 30 + IRAND(8), 40 + IRAND(8), 0x20 + IRAND(16 * 9)); } } if (b & PAD_TRIGGER_Z) { gfx_con_reset(); fg = 7; bg = 0; } if (b & 15) { if (b & PAD_BUTTON_LEFT) { fg = (fg + 8 - 1) % 8; gfx_con_set_foreground_color(fg, true); } if (b & PAD_BUTTON_RIGHT) { fg = (fg + 1) % 8; gfx_con_set_foreground_color(fg, true); } if (b & PAD_BUTTON_UP) { bg = (bg + 8 - 1) % 8; gfx_con_set_background_color(bg, false); } if (b & PAD_BUTTON_DOWN) { bg = (bg + 1) % 8; gfx_con_set_background_color(bg, false); } printf("new color selected: %u %u\n", fg, bg); } sprintf(buf, "frame: %llu", frame); gfx_con_save_attr(); gfx_con_set_pos(1, gfx_con_get_columns() - strlen(buf) + 1); printf(CON_COLRESET "%s", buf); gfx_con_restore_attr(); retries = 0; while (!gfx_frame_start()) { retries++; if (retries > 1000) { printf("gx hates you\n"); gfx_frame_abort(); return -1; } usleep(50); } gfx_draw_tex(&tex, &coords_bg); gfx_con_draw(); gfx_frame_end(); frame++; } printf("shutdown\n"); gfx_tex_deinit(&tex); gfx_con_deinit(); gfx_deinit(); gfx_video_deinit(); return 0; }
void OSystem_Wii::setShakePos(int shakeOffset) { gfx_coords(&_coordsGame, &_texGame, GFX_COORD_FULLSCREEN); _coordsGame.y -= f32(shakeOffset) * _currentYScale; }
void OSystem_Wii::initSize(uint width, uint height, const Graphics::PixelFormat *format) { bool update = false; gfx_tex_format_t tex_format; #ifdef USE_RGB_COLOR Graphics::PixelFormat newFormat; if (format) newFormat = *format; else newFormat = Graphics::PixelFormat::createFormatCLUT8(); if (newFormat.bytesPerPixel > 2) newFormat = Graphics::PixelFormat::createFormatCLUT8(); if (_pfGame != newFormat) { _pfGame = newFormat; update = true; } #endif uint newWidth, newHeight; if (_pfGame.bytesPerPixel > 1) { newWidth = ROUNDUP(width, 4); newHeight = ROUNDUP(height, 4); } else { newWidth = ROUNDUP(width, 8); newHeight = ROUNDUP(height, 4); } if (_gameWidth != newWidth || _gameHeight != newHeight) { assert((newWidth <= 640) && (newHeight <= 480)); if (width != newWidth || height != newHeight) printf("extending texture for compability: %ux%u -> %ux%u\n", width, height, newWidth, newHeight); _gameWidth = newWidth; _gameHeight = newHeight; update = true; } if (_gameRunning) { switchVideoMode(_configGraphicsMode); if (_arCorrection && (_gameWidth == 320) && (_gameHeight == 200)) gfx_set_ar(320.0 / 240.0); else gfx_set_ar(f32(_gameWidth) / f32(_gameHeight)); } if (update) { free(_gamePixels); tex_format = GFX_TF_PALETTE_RGB565; #ifdef USE_RGB_COLOR if (_pfGame.bytesPerPixel > 1) { tex_format = GFX_TF_RGB565; _pfGameTexture = _pfRGB565; } printf("initSize %u*%u*%u (%u%u%u -> %u%u%u match: %d)\n", _gameWidth, _gameHeight, _pfGame.bytesPerPixel * 8, 8 - _pfGame.rLoss, 8 - _pfGame.gLoss, 8 - _pfGame.bLoss, 8 - _pfGameTexture.rLoss, 8 - _pfGameTexture.gLoss, 8 - _pfGameTexture.bLoss, _pfGame == _pfGameTexture); _gamePixels = (u8 *) memalign(32, _gameWidth * _gameHeight * _pfGame.bytesPerPixel); memset(_gamePixels, 0, _gameWidth * _gameHeight * _pfGame.bytesPerPixel); #else printf("initSize %u*%u\n", _gameWidth, _gameHeight); _gamePixels = (u8 *) memalign(32, _gameWidth * _gameHeight); memset(_gamePixels, 0, _gameWidth * _gameHeight); #endif if (!gfx_tex_init(&_texGame, tex_format, TLUT_GAME, _gameWidth, _gameHeight)) { printf("could not init the game texture\n"); ::abort(); } gfx_tex_set_bilinear_filter(&_texGame, _bilinearFilter); gfx_coords(&_coordsGame, &_texGame, GFX_COORD_FULLSCREEN); updateScreenResolution(); } }