void OSystem_Wii::setCursorPalette(const byte *colors, uint start, uint num) { if (!_texMouse.palette) { printf("switching to palette based cursor\n"); if (!gfx_tex_init(&_texMouse, GFX_TF_PALETTE_RGB5A3, TLUT_MOUSE, 16, 16)) { printf("could not init the mouse texture\n"); ::abort(); } gfx_tex_set_bilinear_filter(&_texMouse, _bilinearFilter); } if (_cursorPaletteDisabled) { memcpy(_cursorPalette, _texMouse.palette, 256 * 2); _cursorPaletteDisabled = false; } const byte *s = colors; u16 *d = _texMouse.palette; for (uint i = 0; i < num; ++i, s += 3) d[start + i] = Graphics::ARGBToColor<Graphics::ColorMasks<3444> >(0xff, s[0], s[1], s[2]); _cursorPaletteDirty = true; }
void OSystem_Wii::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { gfx_tex_format_t tex_format = GFX_TF_PALETTE_RGB5A3; uint tw, th; bool tmpBuf = false; uint32 oldKeycolor = _mouseKeyColor; #ifdef USE_RGB_COLOR if (!format) _pfCursor = Graphics::PixelFormat::createFormatCLUT8(); else _pfCursor = *format; if (_pfCursor.bytesPerPixel > 1) { tex_format = GFX_TF_RGB5A3; _mouseKeyColor = keycolor & 0xffff; tw = ROUNDUP(w, 4); th = ROUNDUP(h, 4); if (_pfCursor != _pfRGB3444) tmpBuf = true; } else { #endif _mouseKeyColor = keycolor & 0xff; tw = ROUNDUP(w, 8); th = ROUNDUP(h, 4); #ifdef USE_RGB_COLOR } #endif if (!gfx_tex_init(&_texMouse, tex_format, TLUT_MOUSE, tw, th)) { printf("could not init the mouse texture\n"); ::abort(); } gfx_tex_set_bilinear_filter(&_texMouse, _bilinearFilter); if ((tw != w) || (th != h)) tmpBuf = true; if (!tmpBuf) { gfx_tex_convert(&_texMouse, buf); } else { u8 bpp = _texMouse.bpp >> 3; byte *tmp = (byte *) malloc(tw * th * bpp); if (!tmp) { printf("could not alloc temp cursor buffer\n"); ::abort(); } if (bpp > 1) memset(tmp, 0, tw * th * bpp); else memset(tmp, _mouseKeyColor, tw * th); #ifdef USE_RGB_COLOR if (bpp > 1) { if (!Graphics::crossBlit(tmp, buf, tw * _pfRGB3444.bytesPerPixel, w * _pfCursor.bytesPerPixel, tw, th, _pfRGB3444, _pfCursor)) { printf("crossBlit failed (cursor)\n"); ::abort(); } // nasty, shouldn't the frontend set the alpha channel? u16 *s = (u16 *) buf; u16 *d = (u16 *) tmp; for (u16 y = 0; y < h; ++y) { for (u16 x = 0; x < w; ++x) { if (*s++ != _mouseKeyColor) *d++ |= 7 << 12; else d++; } d += tw - w; } } else { #endif byte *dst = tmp; do { memcpy(dst, buf, w * bpp); buf += w * bpp; dst += tw * bpp; } while (--h); #ifdef USE_RGB_COLOR } #endif gfx_tex_convert(&_texMouse, tmp); free(tmp); } _mouseHotspotX = hotspotX; _mouseHotspotY = hotspotY; _cursorScale = cursorTargetScale; if ((_texMouse.palette) && (oldKeycolor != _mouseKeyColor)) _cursorPaletteDirty = true; }
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(); } }