diff options
Diffstat (limited to 'backends/platform')
| -rw-r--r-- | backends/platform/samsungtv/events.cpp | 190 | ||||
| -rw-r--r-- | backends/platform/samsungtv/graphics.cpp | 991 | ||||
| -rw-r--r-- | backends/platform/samsungtv/main.cpp | 41 | ||||
| -rw-r--r-- | backends/platform/samsungtv/sdl.cpp | 204 | ||||
| -rw-r--r-- | backends/platform/samsungtv/sdl.h | 339 | 
5 files changed, 25 insertions, 1740 deletions
diff --git a/backends/platform/samsungtv/events.cpp b/backends/platform/samsungtv/events.cpp index 9d67272dce..c65e10fb80 100644 --- a/backends/platform/samsungtv/events.cpp +++ b/backends/platform/samsungtv/events.cpp @@ -29,41 +29,7 @@  #if defined(SAMSUNGTV) -static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { -	if (key >= SDLK_F1 && key <= SDLK_F9) { -		return key - SDLK_F1 + Common::ASCII_F1; -	} else if (key >= SDLK_KP0 && key <= SDLK_KP9) { -		return key - SDLK_KP0 + '0'; -	} else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) { -		return key; -	} else if (unicode) { -		return unicode; -	} else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) { -		return key & ~0x20; -	} else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) { -		return 0; -	} -	return key; -} - -void OSystem_SDL_SamsungTV::fillMouseEvent(Common::Event &event, int x, int y) { -	event.mouse.x = x; -	event.mouse.y = y; - -	// Update the "keyboard mouse" coords -	_km.x = x; -	_km.y = y; - -	// Adjust for the screen scaling -	if (!_overlayVisible) { -		event.mouse.x /= _videoMode.scaleFactor; -		event.mouse.y /= _videoMode.scaleFactor; -		if (_videoMode.aspectRatioCorrection) -			event.mouse.y = aspect2Real(event.mouse.y); -	} -} - -void OSystem_SDL_SamsungTV::handleKbdMouse() { +void OSystem_SDL::handleKbdMouse() {  	uint32 curTime = getMillis();  	if (curTime >= _km.last_time + _km.delay_time) {  		_km.last_time = curTime; @@ -126,28 +92,12 @@ void OSystem_SDL_SamsungTV::handleKbdMouse() {  				_km.y_vel = 1;  				_km.y_down_count = 1;  			} - -			setMousePos(_km.x, _km.y);  		}  	}  } -static byte SDLModToOSystemKeyFlags(SDLMod mod) { -	byte b = 0; - -	if (mod & KMOD_SHIFT) -		b |= Common::KBD_SHIFT; -	if (mod & KMOD_ALT) -		b |= Common::KBD_ALT; -	if (mod & KMOD_CTRL) -		b |= Common::KBD_CTRL; - -	return b; -} - -bool OSystem_SDL_SamsungTV::pollEvent(Common::Event &event) { +bool OSystem_SDL::pollEvent(Common::Event &event) {  	SDL_Event ev; -	byte b = 0;  	handleKbdMouse(); @@ -160,8 +110,14 @@ bool OSystem_SDL_SamsungTV::pollEvent(Common::Event &event) {  	while (SDL_PollEvent(&ev)) {  		preprocessEvents(&ev); +		if (dispatchSDLEvent(ev, event)) +			return true; +	} +	return false; +} -		switch (ev.type) { +bool OSystem_SDL_SamsungTV::remapKey(SDL_Event &ev, Common::Event &event) { +	switch (ev.type) {  		case SDL_KEYDOWN:{  			if (ev.key.keysym.sym == SDLK_UP) {  				_km.y_vel = -1; @@ -201,59 +157,9 @@ bool OSystem_SDL_SamsungTV::pollEvent(Common::Event &event) {  				event.kbd.ascii = ' ';  				return true;  			} - -			b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); - -			// Alt-S: Create a screenshot -			if (b == Common::KBD_ALT && ev.key.keysym.sym == 's') { -				char filename[20]; - -				for (int n = 0;; n++) { -					SDL_RWops *file; - -					sprintf(filename, "scummvm%05d.bmp", n); -					file = SDL_RWFromFile(filename, "r"); -					if (!file) -						break; -					SDL_RWclose(file); -				} -				if (saveScreenshot(filename)) -					printf("Saved '%s'\n", filename); -				else -					printf("Could not save screenshot!\n"); -				break; -			} - -			// On other unices, Control-Q quits -			if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') { -				event.type = Common::EVENT_QUIT; -				return true; -			} - -			if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'u') { -				event.type = Common::EVENT_MUTE; -				return true; -			} - -			// Ctrl-Alt-<key> will change the GFX mode -			if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - -				handleScalerHotkeys(ev.key); -				break; -			} -			const bool event_complete = remapKey(ev, event); - -			if (event_complete) -				return true; - -			event.type = Common::EVENT_KEYDOWN; -			event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; -			event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - -			return true; -			} -		case SDL_KEYUP: -			{ +			break; +		} +		case SDL_KEYUP: {  			if (ev.key.keysym.sym == SDLK_UP || ev.key.keysym.sym == SDLK_DOWN || ev.key.keysym.sym == SDLK_LEFT || ev.key.keysym.sym == SDLK_RIGHT) {  				_km.x_vel = 0;  				_km.x_down_count = 0; @@ -276,82 +182,10 @@ bool OSystem_SDL_SamsungTV::pollEvent(Common::Event &event) {  				event.kbd.ascii = ' ';  				return true;  			} - -			const bool event_complete = remapKey(ev,event); - -			if (event_complete) -				return true; - -			event.type = Common::EVENT_KEYUP; -			event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; -			event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); -			b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState()); - -			// Ctrl-Alt-<key> will change the GFX mode -			if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { -				// Swallow these key up events -				break; -			} - -			return true; -			} -		case SDL_MOUSEMOTION: -			event.type = Common::EVENT_MOUSEMOVE; -			fillMouseEvent(event, ev.motion.x, ev.motion.y); - -			setMousePos(event.mouse.x, event.mouse.y); -			return true; - -		case SDL_MOUSEBUTTONDOWN: -			if (ev.button.button == SDL_BUTTON_LEFT) -				event.type = Common::EVENT_LBUTTONDOWN; -			else if (ev.button.button == SDL_BUTTON_RIGHT) -				event.type = Common::EVENT_RBUTTONDOWN; -#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN) -			else if (ev.button.button == SDL_BUTTON_WHEELUP) -				event.type = Common::EVENT_WHEELUP; -			else if (ev.button.button == SDL_BUTTON_WHEELDOWN) -				event.type = Common::EVENT_WHEELDOWN; -#endif -#if defined(SDL_BUTTON_MIDDLE) -			else if (ev.button.button == SDL_BUTTON_MIDDLE) -				event.type = Common::EVENT_MBUTTONDOWN; -#endif -			else -				break; - -			fillMouseEvent(event, ev.button.x, ev.button.y); - -			return true; - -		case SDL_MOUSEBUTTONUP: -			if (ev.button.button == SDL_BUTTON_LEFT) -				event.type = Common::EVENT_LBUTTONUP; -			else if (ev.button.button == SDL_BUTTON_RIGHT) -				event.type = Common::EVENT_RBUTTONUP; -#if defined(SDL_BUTTON_MIDDLE) -			else if (ev.button.button == SDL_BUTTON_MIDDLE) -				event.type = Common::EVENT_MBUTTONUP; -#endif -			else -				break; -			fillMouseEvent(event, ev.button.x, ev.button.y); - -			return true; - -		case SDL_VIDEOEXPOSE: -			_forceFull = true;  			break; - -		case SDL_QUIT: -			event.type = Common::EVENT_QUIT; -			return true;  		}  	} -	return false; -} -bool OSystem_SDL_SamsungTV::remapKey(SDL_Event &ev, Common::Event &event) {  	return false;  } diff --git a/backends/platform/samsungtv/graphics.cpp b/backends/platform/samsungtv/graphics.cpp index b7e02d9f1c..88f4674c54 100644 --- a/backends/platform/samsungtv/graphics.cpp +++ b/backends/platform/samsungtv/graphics.cpp @@ -34,20 +34,6 @@  #if defined(SAMSUNGTV) -static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { -	{"1x", "Normal (no scaling)", GFX_NORMAL}, -	{"2x", "2x", GFX_DOUBLESIZE}, -	{"3x", "3x", GFX_TRIPLESIZE}, -	{"2xsai", "2xSAI", GFX_2XSAI}, -	{"super2xsai", "Super2xSAI", GFX_SUPER2XSAI}, -	{"supereagle", "SuperEagle", GFX_SUPEREAGLE}, -	{"advmame2x", "AdvMAME2x", GFX_ADVMAME2X}, -	{"advmame3x", "AdvMAME3x", GFX_ADVMAME3X}, -	{"tv2x", "TV2x", GFX_TV2X}, -	{"dotmatrix", "DotMatrix", GFX_DOTMATRIX}, -	{0, 0, 0} -}; -  // Table of relative scalers magnitudes  // [definedScale - 1][scaleFactor - 1]  static ScalerProc *scalersMagn[3][3] = { @@ -62,141 +48,14 @@ static ScalerProc *scalersMagn[3][3] = {  #endif  }; -static const int s_gfxModeSwitchTable[][4] = { -		{ GFX_NORMAL, GFX_DOUBLESIZE, GFX_TRIPLESIZE, -1 }, -		{ GFX_NORMAL, GFX_ADVMAME2X, GFX_ADVMAME3X, -1 }, -		{ GFX_NORMAL, GFX_HQ2X, GFX_HQ3X, -1 }, -		{ GFX_NORMAL, GFX_2XSAI, -1, -1 }, -		{ GFX_NORMAL, GFX_SUPER2XSAI, -1, -1 }, -		{ GFX_NORMAL, GFX_SUPEREAGLE, -1, -1 }, -		{ GFX_NORMAL, GFX_TV2X, -1, -1 }, -		{ GFX_NORMAL, GFX_DOTMATRIX, -1, -1 } -	}; -  #ifndef DISABLE_SCALERS  static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY);  #endif -const OSystem::GraphicsMode *OSystem_SDL_SamsungTV::getSupportedGraphicsModes() const { -	return s_supportedGraphicsModes; -} -  int OSystem_SDL_SamsungTV::getDefaultGraphicsMode() const {  	return GFX_2XSAI;  } -void OSystem_SDL_SamsungTV::beginGFXTransaction(void) { -	assert(_transactionMode == kTransactionNone); - -	_transactionMode = kTransactionActive; - -	_transactionDetails.sizeChanged = false; - -	_transactionDetails.needHotswap = false; -	_transactionDetails.needUpdatescreen = false; - -	_transactionDetails.normal1xScaler = false; -	_transactionDetails.formatChanged = false; - -	_oldVideoMode = _videoMode; -} - -OSystem::TransactionError OSystem_SDL_SamsungTV::endGFXTransaction(void) { -	int errors = kTransactionSuccess; - -	assert(_transactionMode != kTransactionNone); - -	if (_transactionMode == kTransactionRollback) { -		if (_videoMode.fullscreen != _oldVideoMode.fullscreen) { -			errors |= kTransactionFullscreenFailed; - -			_videoMode.fullscreen = _oldVideoMode.fullscreen; -		} else if (_videoMode.aspectRatioCorrection != _oldVideoMode.aspectRatioCorrection) { -			errors |= kTransactionAspectRatioFailed; - -			_videoMode.aspectRatioCorrection = _oldVideoMode.aspectRatioCorrection; -		} else if (_videoMode.mode != _oldVideoMode.mode) { -			errors |= kTransactionModeSwitchFailed; - -			_videoMode.mode = _oldVideoMode.mode; -			_videoMode.scaleFactor = _oldVideoMode.scaleFactor; -		} else if (_videoMode.format != _oldVideoMode.format) { -			errors |= kTransactionFormatNotSupported; - -			_videoMode.format = _oldVideoMode.format; -			_screenFormat = _videoMode.format; -		} else if (_videoMode.screenWidth != _oldVideoMode.screenWidth || _videoMode.screenHeight != _oldVideoMode.screenHeight) { -			errors |= kTransactionSizeChangeFailed; - -			_videoMode.screenWidth = _oldVideoMode.screenWidth; -			_videoMode.screenHeight = _oldVideoMode.screenHeight; -			_videoMode.overlayWidth = _oldVideoMode.overlayWidth; -			_videoMode.overlayHeight = _oldVideoMode.overlayHeight; -		} - -		if (_videoMode.fullscreen == _oldVideoMode.fullscreen && -			_videoMode.aspectRatioCorrection == _oldVideoMode.aspectRatioCorrection && -			_videoMode.mode == _oldVideoMode.mode && -			_videoMode.screenWidth == _oldVideoMode.screenWidth && -		   	_videoMode.screenHeight == _oldVideoMode.screenHeight) { - -			// Our new video mode would now be exactly the same as the -			// old one. Since we still can not assume SDL_SetVideoMode -			// to be working fine, we need to invalidate the old video -			// mode, so loadGFXMode would error out properly. -			_oldVideoMode.setup = false; -		} -	} - -	if (_transactionDetails.sizeChanged || _transactionDetails.formatChanged) { -		unloadGFXMode(); -		if (!loadGFXMode()) { -			if (_oldVideoMode.setup) { -				_transactionMode = kTransactionRollback; -				errors |= endGFXTransaction(); -			} -		} else { -			setGraphicsModeIntern(); -			clearOverlay(); - -			_videoMode.setup = true; -			_modeChanged = true; -			// OSystem_SDL::pollEvent used to update the screen change count, -			// but actually it gives problems when a video mode was changed -			// but OSystem_SDL::pollEvent was not called. This for example -			// caused a crash under certain circumstances when doing an RTL. -			// To fix this issue we update the screen change count right here. -			_screenChangeCount++; -		} -	} else if (_transactionDetails.needHotswap) { -		setGraphicsModeIntern(); -		if (!hotswapGFXMode()) { -			if (_oldVideoMode.setup) { -				_transactionMode = kTransactionRollback; -				errors |= endGFXTransaction(); -			} -		} else { -			_videoMode.setup = true; -			_modeChanged = true; -			// OSystem_SDL::pollEvent used to update the screen change count, -			// but actually it gives problems when a video mode was changed -			// but OSystem_SDL::pollEvent was not called. This for example -			// caused a crash under certain circumstances when doing an RTL. -			// To fix this issue we update the screen change count right here. -			_screenChangeCount++; - -			if (_transactionDetails.needUpdatescreen) -				internUpdateScreen(); -		} -	} else if (_transactionDetails.needUpdatescreen) { -		setGraphicsModeIntern(); -		internUpdateScreen(); -	}  - -	_transactionMode = kTransactionNone; -	return (TransactionError)errors; -} -  Common::List<Graphics::PixelFormat> OSystem_SDL_SamsungTV::getSupportedFormats() {  	static Common::List<Graphics::PixelFormat>list;  	list.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); @@ -204,136 +63,6 @@ Common::List<Graphics::PixelFormat> OSystem_SDL_SamsungTV::getSupportedFormats()  	return list;  } -bool OSystem_SDL_SamsungTV::setGraphicsMode(int mode) { -	Common::StackLock lock(_graphicsMutex); - -	assert(_transactionMode == kTransactionActive); - -	if (_oldVideoMode.setup && _oldVideoMode.mode == mode) -		return true; - -	int newScaleFactor = 1; - -	switch (mode) { -	case GFX_NORMAL: -		newScaleFactor = 1; -		break; -#ifndef DISABLE_SCALERS -	case GFX_DOUBLESIZE: -		newScaleFactor = 2; -		break; -	case GFX_TRIPLESIZE: -		newScaleFactor = 3; -		break; -	case GFX_2XSAI: -		newScaleFactor = 2; -		break; -	case GFX_SUPER2XSAI: -		newScaleFactor = 2; -		break; -	case GFX_SUPEREAGLE: -		newScaleFactor = 2; -		break; -	case GFX_ADVMAME2X: -		newScaleFactor = 2; -		break; -	case GFX_ADVMAME3X: -		newScaleFactor = 3; -		break; -	case GFX_TV2X: -		newScaleFactor = 2; -		break; -	case GFX_DOTMATRIX: -		newScaleFactor = 2; -		break; -#endif // DISABLE_SCALERS - -	default: -		warning("unknown gfx mode %d", mode); -		return false; -	} - -	_transactionDetails.normal1xScaler = (mode == GFX_NORMAL); -	if (_oldVideoMode.setup && _oldVideoMode.scaleFactor != newScaleFactor) -		_transactionDetails.needHotswap = true; - -	_transactionDetails.needUpdatescreen = true; - -	_videoMode.mode = mode; -	_videoMode.scaleFactor = newScaleFactor; - -	return true; -} - -void OSystem_SDL_SamsungTV::setGraphicsModeIntern() { -	Common::StackLock lock(_graphicsMutex); -	ScalerProc *newScalerProc = 0; - -	switch (_videoMode.mode) { -	case GFX_NORMAL: -		newScalerProc = Normal1x; -		break; -#ifndef DISABLE_SCALERS -	case GFX_DOUBLESIZE: -		newScalerProc = Normal2x; -		break; -	case GFX_TRIPLESIZE: -		newScalerProc = Normal3x; -		break; -	case GFX_2XSAI: -		newScalerProc = _2xSaI; -		break; -	case GFX_SUPER2XSAI: -		newScalerProc = Super2xSaI; -		break; -	case GFX_SUPEREAGLE: -		newScalerProc = SuperEagle; -		break; -	case GFX_ADVMAME2X: -		newScalerProc = AdvMame2x; -		break; -	case GFX_ADVMAME3X: -		newScalerProc = AdvMame3x; -		break; -	case GFX_TV2X: -		newScalerProc = TV2x; -		break; -	case GFX_DOTMATRIX: -		newScalerProc = DotMatrix; -		break; -#endif // DISABLE_SCALERS - -	default: -		error("Unknown gfx mode %d", _videoMode.mode); -	} - -	_scalerProc = newScalerProc; - -	if (_videoMode.mode != GFX_NORMAL) { -		for (int i = 0; i < ARRAYSIZE(s_gfxModeSwitchTable); i++) { -			if (s_gfxModeSwitchTable[i][1] == _videoMode.mode || s_gfxModeSwitchTable[i][2] == _videoMode.mode) { -				_scalerType = i; -				break; -			} -		} -	} - -	if (!_screen || !_hwscreen || !_prehwscreen) -		return; - -	// Blit everything to the screen -	_forceFull = true; - -	// Even if the old and new scale factors are the same, we may have a -	// different scaler for the cursor now. -	blitCursor(); -} - -int OSystem_SDL_SamsungTV::getGraphicsMode() const { -	assert (_transactionMode == kTransactionNone); -	return _videoMode.mode; -} -  void OSystem_SDL_SamsungTV::initSize(uint w, uint h, const Graphics::PixelFormat *format) {  	assert(_transactionMode == kTransactionActive); @@ -634,14 +363,6 @@ bool OSystem_SDL_SamsungTV::hotswapGFXMode() {  	return true;  } -void OSystem_SDL_SamsungTV::updateScreen() { -	assert (_transactionMode == kTransactionNone); - -	Common::StackLock lock(_graphicsMutex);	// Lock the mutex until this function ends - -	internUpdateScreen(); -} -  void OSystem_SDL_SamsungTV::internUpdateScreen() {  	SDL_Surface *srcSurf, *origSurf;  	int height, width; @@ -808,13 +529,6 @@ void OSystem_SDL_SamsungTV::internUpdateScreen() {  	_mouseNeedsRedraw = false;  } -bool OSystem_SDL_SamsungTV::saveScreenshot(const char *filename) { -	assert(_hwscreen != NULL); - -	Common::StackLock lock(_graphicsMutex);	// Lock the mutex until this function ends -	return SDL_SaveBMP(_hwscreen, filename) == 0; -} -  void OSystem_SDL_SamsungTV::setFullscreenMode(bool enable) {  	Common::StackLock lock(_graphicsMutex); @@ -827,517 +541,6 @@ void OSystem_SDL_SamsungTV::setFullscreenMode(bool enable) {  	}  } -void OSystem_SDL_SamsungTV::setAspectRatioCorrection(bool enable) { -	Common::StackLock lock(_graphicsMutex); - -	if (_oldVideoMode.setup && _oldVideoMode.aspectRatioCorrection == enable) -		return; - -	if (_transactionMode == kTransactionActive) { -		_videoMode.aspectRatioCorrection = enable; -		_transactionDetails.needHotswap = true; -	} -} - -void OSystem_SDL_SamsungTV::copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h) { -	assert (_transactionMode == kTransactionNone); -	assert(src); - -	if (_screen == NULL) { -		warning("OSystem_SDL::copyRectToScreen: _screen == NULL"); -		return; -	} - -	Common::StackLock lock(_graphicsMutex);	// Lock the mutex until this function ends - -	assert(x >= 0 && x < _videoMode.screenWidth); -	assert(y >= 0 && y < _videoMode.screenHeight); -	assert(h > 0 && y + h <= _videoMode.screenHeight); -	assert(w > 0 && x + w <= _videoMode.screenWidth); - -	if (IS_ALIGNED(src, 4) && pitch == _videoMode.screenWidth && x == 0 && y == 0 && -			w == _videoMode.screenWidth && h == _videoMode.screenHeight && _modeFlags & DF_WANT_RECT_OPTIM) { -		/* Special, optimized case for full screen updates. -		 * It tries to determine what areas were actually changed, -		 * and just updates those, on the actual display. */ -		addDirtyRgnAuto(src); -	} else { -		_cksumValid = false; -		addDirtyRect(x, y, w, h); -	} - -	// Try to lock the screen surface -	if (SDL_LockSurface(_screen) == -1) -		error("SDL_LockSurface failed: %s", SDL_GetError()); - -	byte *dst = (byte *)_screen->pixels + y * _videoMode.screenWidth * _screenFormat.bytesPerPixel + x * _screenFormat.bytesPerPixel; -	if (_videoMode.screenWidth == w && pitch == w * _screenFormat.bytesPerPixel) { -		memcpy(dst, src, h*w*_screenFormat.bytesPerPixel); -	} else { -		do { -			memcpy(dst, src, w * _screenFormat.bytesPerPixel); -			src += pitch; -			dst += _videoMode.screenWidth * _screenFormat.bytesPerPixel; -		} while (--h); -	} - -	// Unlock the screen surface -	SDL_UnlockSurface(_screen); -} - -Graphics::Surface *OSystem_SDL_SamsungTV::lockScreen() { -	assert (_transactionMode == kTransactionNone); - -	// Lock the graphics mutex -	lockMutex(_graphicsMutex); - -	// paranoia check -	assert(!_screenIsLocked); -	_screenIsLocked = true; - -	// Try to lock the screen surface -	if (SDL_LockSurface(_screen) == -1) -		error("SDL_LockSurface failed: %s", SDL_GetError()); - -	_framebuffer.pixels = _screen->pixels; -	_framebuffer.w = _screen->w; -	_framebuffer.h = _screen->h; -	_framebuffer.pitch = _screen->pitch; -	_framebuffer.bytesPerPixel = _screenFormat.bytesPerPixel; - -	return &_framebuffer; -} - -void OSystem_SDL_SamsungTV::unlockScreen() { -	assert (_transactionMode == kTransactionNone); - -	// paranoia check -	assert(_screenIsLocked); -	_screenIsLocked = false; - -	// Unlock the screen surface -	SDL_UnlockSurface(_screen); - -	// Trigger a full screen update -	_forceFull = true; - -	// Finally unlock the graphics mutex -	unlockMutex(_graphicsMutex); -} - -void OSystem_SDL_SamsungTV::addDirtyRect(int x, int y, int w, int h, bool realCoordinates) { -	if (_forceFull) -		return; - -	if (_numDirtyRects == NUM_DIRTY_RECT) { -		_forceFull = true; -		return; -	} - -	int height, width; - -	if (!_overlayVisible && !realCoordinates) { -		width = _videoMode.screenWidth; -		height = _videoMode.screenHeight; -	} else { -		width = _videoMode.overlayWidth; -		height = _videoMode.overlayHeight; -	} - -	// Extend the dirty region by 1 pixel for scalers -	// that "smear" the screen, e.g. 2xSAI -	if (!realCoordinates) { -		x--; -		y--; -		w+=2; -		h+=2; -	} - -	// clip -	if (x < 0) { -		w += x; -		x = 0; -	} - -	if (y < 0) { -		h += y; -		y=0; -	} - -	if (w > width - x) { -		w = width - x; -	} - -	if (h > height - y) { -		h = height - y; -	} - -#ifndef DISABLE_SCALERS -	if (_videoMode.aspectRatioCorrection && !_overlayVisible && !realCoordinates) { -		makeRectStretchable(x, y, w, h); -	} -#endif - -	if (w == width && h == height) { -		_forceFull = true; -		return; -	} - -	if (w > 0 && h > 0) { -		SDL_Rect *r = &_dirtyRectList[_numDirtyRects++]; - -		r->x = x; -		r->y = y; -		r->w = w; -		r->h = h; -	} -} - - -void OSystem_SDL_SamsungTV::makeChecksums(const byte *buf) { -	assert(buf); -	uint32 *sums = _dirtyChecksums; -	uint x,y; -	const uint last_x = (uint)_videoMode.screenWidth / 8; -	const uint last_y = (uint)_videoMode.screenHeight / 8; - -	const uint BASE = 65521; /* largest prime smaller than 65536 */ - -	/* the 8x8 blocks in buf are enumerated starting in the top left corner and -	 * reading each line at a time from left to right */ -	for (y = 0; y != last_y; y++, buf += _videoMode.screenWidth * (8 - 1)) -		for (x = 0; x != last_x; x++, buf += 8) { -			// Adler32 checksum algorithm (from RFC1950, used by gzip and zlib). -			// This computes the Adler32 checksum of a 8x8 pixel block. Note -			// that we can do the modulo operation (which is the slowest part) -			// of the algorithm) at the end, instead of doing each iteration, -			// since we only have 64 iterations in total - and thus s1 and -			// s2 can't overflow anyway. -			uint32 s1 = 1; -			uint32 s2 = 0; -			const byte *ptr = buf; -			for (int subY = 0; subY < 8; subY++) { -				for (int subX = 0; subX < 8; subX++) { -					s1 += ptr[subX]; -					s2 += s1; -				} -				ptr += _videoMode.screenWidth; -			} - -			s1 %= BASE; -			s2 %= BASE; - -			/* output the checksum for this block */ -			*sums++ =  (s2 << 16) + s1; -	} -} - -void OSystem_SDL_SamsungTV::addDirtyRgnAuto(const byte *buf) { -	assert(buf); -	assert(IS_ALIGNED(buf, 4)); - -	/* generate a table of the checksums */ -	makeChecksums(buf); - -	if (!_cksumValid) { -		_forceFull = true; -		_cksumValid = true; -	} - -	/* go through the checksum list, compare it with the previous checksums, -		 and add all dirty rectangles to a list. try to combine small rectangles -		 into bigger ones in a simple way */ -	if (!_forceFull) { -		int x, y, w; -		uint32 *ck = _dirtyChecksums; - -		for (y = 0; y != _videoMode.screenHeight / 8; y++) { -			for (x = 0; x != _videoMode.screenWidth / 8; x++, ck++) { -				if (ck[0] != ck[_cksumNum]) { -					/* found a dirty 8x8 block, now go as far to the right as possible, -						 and at the same time, unmark the dirty status by setting old to new. */ -					w=0; -					do { -						ck[w + _cksumNum] = ck[w]; -						w++; -					} while (x + w != _videoMode.screenWidth / 8 && ck[w] != ck[w + _cksumNum]); - -					addDirtyRect(x * 8, y * 8, w * 8, 8); - -					if (_forceFull) -						goto get_out; -				} -			} -		} -	} else { -		get_out:; -		/* Copy old checksums to new */ -		memcpy(_dirtyChecksums + _cksumNum, _dirtyChecksums, _cksumNum * sizeof(uint32)); -	} -} - -int16 OSystem_SDL_SamsungTV::getHeight() { -	return _videoMode.screenHeight; -} - -int16 OSystem_SDL_SamsungTV::getWidth() { -	return _videoMode.screenWidth; -} - -void OSystem_SDL_SamsungTV::setPalette(const byte *colors, uint start, uint num) { -	assert(colors); - -	if (_screenFormat.bytesPerPixel > 1) -		return; //not using a paletted pixel format - -	// Setting the palette before _screen is created is allowed - for now - -	// since we don't actually set the palette until the screen is updated. -	// But it could indicate a programming error, so let's warn about it. - -	if (!_screen) -		warning("OSystem_SDL::setPalette: _screen == NULL"); - -	const byte *b = colors; -	uint i; -	SDL_Color *base = _currentPalette + start; -	for (i = 0; i < num; i++) { -		base[i].r = b[0]; -		base[i].g = b[1]; -		base[i].b = b[2]; -		b += 4; -	} - -	if (start < _paletteDirtyStart) -		_paletteDirtyStart = start; - -	if (start + num > _paletteDirtyEnd) -		_paletteDirtyEnd = start + num; - -	// Some games blink cursors with palette -	if (_cursorPaletteDisabled) -		blitCursor(); -} - -void OSystem_SDL_SamsungTV::grabPalette(byte *colors, uint start, uint num) { -	assert(colors); -	const SDL_Color *base = _currentPalette + start; - -	for (uint i = 0; i < num; ++i) { -		colors[i * 4] = base[i].r; -		colors[i * 4 + 1] = base[i].g; -		colors[i * 4 + 2] = base[i].b; -		colors[i * 4 + 3] = 0xFF; -	} -} - -void OSystem_SDL_SamsungTV::setCursorPalette(const byte *colors, uint start, uint num) { -	assert(colors); -	const byte *b = colors; -	uint i; -	SDL_Color *base = _cursorPalette + start; -	for (i = 0; i < num; i++) { -		base[i].r = b[0]; -		base[i].g = b[1]; -		base[i].b = b[2]; -		b += 4; -	} - -	_cursorPaletteDisabled = false; -	blitCursor(); -} - - -void OSystem_SDL_SamsungTV::setShakePos(int shake_pos) { -	assert (_transactionMode == kTransactionNone); - -	_newShakePos = shake_pos; -} - - -#pragma mark - -#pragma mark --- Overlays --- -#pragma mark - - -void OSystem_SDL_SamsungTV::showOverlay() { -	assert (_transactionMode == kTransactionNone); - -	int x, y; - -	if (_overlayVisible) -		return; - -	_overlayVisible = true; - -	// Since resolution could change, put mouse to adjusted position -	// Fixes bug #1349059 -	x = _mouseCurState.x * _videoMode.scaleFactor; -	if (_videoMode.aspectRatioCorrection) -		y = real2Aspect(_mouseCurState.y) * _videoMode.scaleFactor; -	else -		y = _mouseCurState.y * _videoMode.scaleFactor; - -	warpMouse(x, y); - -	clearOverlay(); -} - -void OSystem_SDL_SamsungTV::hideOverlay() { -	assert (_transactionMode == kTransactionNone); - -	if (!_overlayVisible) -		return; - -	int x, y; - -	_overlayVisible = false; - -	// Since resolution could change, put mouse to adjusted position -	// Fixes bug #1349059 -	x = _mouseCurState.x / _videoMode.scaleFactor; -	y = _mouseCurState.y / _videoMode.scaleFactor; -	if (_videoMode.aspectRatioCorrection) -		y = aspect2Real(y); - -	warpMouse(x, y); - -	clearOverlay(); - -	_forceFull = true; -} - -void OSystem_SDL_SamsungTV::clearOverlay() { -	//assert (_transactionMode == kTransactionNone); -	Common::StackLock lock(_graphicsMutex);	// Lock the mutex until this function ends - -	if (!_overlayVisible) -		return; - -	// Clear the overlay by making the game screen "look through" everywhere. -	SDL_Rect src, dst; -	src.x = src.y = 0; -	dst.x = dst.y = 1; -	src.w = dst.w = _videoMode.screenWidth; -	src.h = dst.h = _videoMode.screenHeight; -	if (SDL_BlitSurface(_screen, &src, _tmpscreen, &dst) != 0) -		error("SDL_BlitSurface failed: %s", SDL_GetError()); - -	SDL_LockSurface(_tmpscreen); -	SDL_LockSurface(_overlayscreen); -	 -	_scalerProc((byte *)(_tmpscreen->pixels) + _tmpscreen->pitch + 2, _tmpscreen->pitch, -	(byte *)_overlayscreen->pixels, _overlayscreen->pitch, _videoMode.screenWidth, _videoMode.screenHeight); - -#ifndef DISABLE_SCALERS -	if (_videoMode.aspectRatioCorrection) -		stretch200To240((uint8 *)_overlayscreen->pixels, _overlayscreen->pitch, -						_videoMode.overlayWidth, _videoMode.screenHeight * _videoMode.scaleFactor, 0, 0, 0); -#endif -	SDL_UnlockSurface(_tmpscreen); -	SDL_UnlockSurface(_overlayscreen); - -	_forceFull = true; -} - -void OSystem_SDL_SamsungTV::grabOverlay(OverlayColor *buf, int pitch) { -	assert (_transactionMode == kTransactionNone); - -	if (_overlayscreen == NULL) -		return; - -	if (SDL_LockSurface(_overlayscreen) == -1) -		error("SDL_LockSurface failed: %s", SDL_GetError()); - -	byte *src = (byte *)_overlayscreen->pixels; -	int h = _videoMode.overlayHeight; -	do { -		memcpy(buf, src, _videoMode.overlayWidth * 2); -		src += _overlayscreen->pitch; -		buf += pitch; -	} while (--h); - -	SDL_UnlockSurface(_overlayscreen); -} - -void OSystem_SDL_SamsungTV::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { -	assert (_transactionMode == kTransactionNone); - -	if (_overlayscreen == NULL) -		return; - -	// Clip the coordinates -	if (x < 0) { -		w += x; -		buf -= x; -		x = 0; -	} - -	if (y < 0) { -		h += y; buf -= y * pitch; -		y = 0; -	} - -	if (w > _videoMode.overlayWidth - x) { -		w = _videoMode.overlayWidth - x; -	} - -	if (h > _videoMode.overlayHeight - y) { -		h = _videoMode.overlayHeight - y; -	} - -	if (w <= 0 || h <= 0) -		return; - -	// Mark the modified region as dirty -	_cksumValid = false; -	addDirtyRect(x, y, w, h); - -	if (SDL_LockSurface(_overlayscreen) == -1) -		error("SDL_LockSurface failed: %s", SDL_GetError()); - -	byte *dst = (byte *)_overlayscreen->pixels + y * _overlayscreen->pitch + x * 2; -	do { -		memcpy(dst, buf, w * 2); -		dst += _overlayscreen->pitch; -		buf += pitch; -	} while (--h); - -	SDL_UnlockSurface(_overlayscreen); -} - - -#pragma mark - -#pragma mark --- Mouse --- -#pragma mark - - -bool OSystem_SDL_SamsungTV::showMouse(bool visible) { -	if (_mouseVisible == visible) -		return visible; - -	bool last = _mouseVisible; -	_mouseVisible = visible; -	_mouseNeedsRedraw = true; - -	return last; -} - -void OSystem_SDL_SamsungTV::setMousePos(int x, int y) { -	if (x != _mouseCurState.x || y != _mouseCurState.y) { -		_mouseNeedsRedraw = true; -		_mouseCurState.x = x; -		_mouseCurState.y = y; -	} -} - -void OSystem_SDL_SamsungTV::warpMouse(int x, int y) { -	int y1 = y; - -	if (_videoMode.aspectRatioCorrection && !_overlayVisible) -		y1 = real2Aspect(y); - -	if (_mouseCurState.x != x || _mouseCurState.y != y) -		setMousePos(x, y); -} -  void OSystem_SDL_SamsungTV::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) {  	if (!format)  		_cursorFormat = Graphics::PixelFormat::createFormatCLUT8(); @@ -1567,26 +770,6 @@ static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height  }  #endif -void OSystem_SDL_SamsungTV::toggleMouseGrab() { -	if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) -		SDL_WM_GrabInput(SDL_GRAB_ON); -	else -		SDL_WM_GrabInput(SDL_GRAB_OFF); -} - -void OSystem_SDL_SamsungTV::undrawMouse() { -	const int x = _mouseBackup.x; -	const int y = _mouseBackup.y; - -	// When we switch bigger overlay off mouse jumps. Argh! -	// This is intended to prevent undrawing offscreen mouse -	if (!_overlayVisible && (x >= _videoMode.screenWidth || y >= _videoMode.screenHeight)) -		return; - -	if (_mouseBackup.w != 0 && _mouseBackup.h != 0) -		addDirtyRect(x, y, _mouseBackup.w, _mouseBackup.h); -} -  void OSystem_SDL_SamsungTV::drawMouse() {  	if (!_mouseVisible || !_mouseSurface) {  		_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; @@ -1654,178 +837,8 @@ void OSystem_SDL_SamsungTV::drawMouse() {  	addDirtyRect(dst.x, dst.y, dst.w, dst.h, true);  } -#pragma mark - -#pragma mark --- On Screen Display --- -#pragma mark - - -#ifdef USE_OSD -void OSystem_SDL_SamsungTV::displayMessageOnOSD(const char *msg) { -	assert (_transactionMode == kTransactionNone); -	assert(msg); - -	Common::StackLock lock(_graphicsMutex);	// Lock the mutex until this function ends - -	uint i; - -	// Lock the OSD surface for drawing -	if (SDL_LockSurface(_osdSurface)) -		error("displayMessageOnOSD: SDL_LockSurface failed: %s", SDL_GetError()); - -	Graphics::Surface dst; -	dst.pixels = _osdSurface->pixels; -	dst.w = _osdSurface->w; -	dst.h = _osdSurface->h; -	dst.pitch = _osdSurface->pitch; -	dst.bytesPerPixel = _osdSurface->format->BytesPerPixel; - -	// The font we are going to use: -	const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kOSDFont); - -	// Clear everything with the "transparent" color, i.e. the colorkey -	SDL_FillRect(_osdSurface, 0, kOSDColorKey); - -	// Split the message into separate lines. -	Common::StringList lines; -	const char *ptr; -	for (ptr = msg; *ptr; ++ptr) { -		if (*ptr == '\n') { -			lines.push_back(Common::String(msg, ptr - msg)); -			msg = ptr + 1; -		} -	} -	lines.push_back(Common::String(msg, ptr - msg)); - -	// Determine a rect which would contain the message string (clipped to the -	// screen dimensions). -	const int vOffset = 6; -	const int lineSpacing = 1; -	const int lineHeight = font->getFontHeight() + 2 * lineSpacing; -	int width = 0; -	int height = lineHeight * lines.size() + 2 * vOffset; -	for (i = 0; i < lines.size(); i++) { -		width = MAX(width, font->getStringWidth(lines[i]) + 14); -	} - -	// Clip the rect -	if (width > dst.w) -		width = dst.w; -	if (height > dst.h) -		height = dst.h; - -	// Draw a dark gray rect -	// TODO: Rounded corners ? Border? -	SDL_Rect osdRect; -	osdRect.x = (dst.w - width) / 2; -	osdRect.y = (dst.h - height) / 2; -	osdRect.w = width; -	osdRect.h = height; -	SDL_FillRect(_osdSurface, &osdRect, SDL_MapRGB(_osdSurface->format, 64, 64, 64)); - -	// Render the message, centered, and in white -	for (i = 0; i < lines.size(); i++) { -		font->drawString(&dst, lines[i], -							osdRect.x, osdRect.y + i * lineHeight + vOffset + lineSpacing, osdRect.w, -							SDL_MapRGB(_osdSurface->format, 255, 255, 255), -							Graphics::kTextAlignCenter); -	} - -	// Finished drawing, so unlock the OSD surface again -	SDL_UnlockSurface(_osdSurface); - -	// Init the OSD display parameters, and the fade out -	_osdAlpha = SDL_ALPHA_TRANSPARENT +  kOSDInitialAlpha * (SDL_ALPHA_OPAQUE - SDL_ALPHA_TRANSPARENT) / 100; -	_osdFadeStartTime = SDL_GetTicks() + kOSDFadeOutDelay; -	SDL_SetAlpha(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, _osdAlpha); - -	// Ensure a full redraw takes place next time the screen is updated -	_forceFull = true; -} -#endif - - -#pragma mark - -#pragma mark --- Misc --- -#pragma mark - - -void OSystem_SDL_SamsungTV::handleScalerHotkeys(const SDL_KeyboardEvent &key) { -	// Ctrl-Alt-a toggles aspect ratio correction -	if (key.keysym.sym == 'a') { -		beginGFXTransaction(); -			setFeatureState(kFeatureAspectRatioCorrection, !_videoMode.aspectRatioCorrection); -		endGFXTransaction(); -#ifdef USE_OSD -		char buffer[128]; -		if (_videoMode.aspectRatioCorrection) -			sprintf(buffer, "Enabled aspect ratio correction\n%d x %d -> %d x %d", -				_videoMode.screenWidth, _videoMode.screenHeight, -				_hwscreen->w, _hwscreen->h -				); -		else -			sprintf(buffer, "Disabled aspect ratio correction\n%d x %d -> %d x %d", -				_videoMode.screenWidth, _videoMode.screenHeight, -				_hwscreen->w, _hwscreen->h -				); -		displayMessageOnOSD(buffer); -#endif -		internUpdateScreen(); -		return; -	} - -	int newMode = -1; -	int factor = _videoMode.scaleFactor - 1; - -	// Increase/decrease the scale factor -	if (key.keysym.sym == SDLK_EQUALS || key.keysym.sym == SDLK_PLUS || key.keysym.sym == SDLK_MINUS || -		key.keysym.sym == SDLK_KP_PLUS || key.keysym.sym == SDLK_KP_MINUS) { -		factor += (key.keysym.sym == SDLK_MINUS || key.keysym.sym == SDLK_KP_MINUS) ? -1 : +1; -		if (0 <= factor && factor <= 3) { -			newMode = s_gfxModeSwitchTable[_scalerType][factor]; -		} -	} - -	const bool isNormalNumber = (SDLK_1 <= key.keysym.sym && key.keysym.sym <= SDLK_9); -	const bool isKeypadNumber = (SDLK_KP1 <= key.keysym.sym && key.keysym.sym <= SDLK_KP9); -	if (isNormalNumber || isKeypadNumber) { -		_scalerType = key.keysym.sym - (isNormalNumber ? SDLK_1 : SDLK_KP1); -		if (_scalerType >= ARRAYSIZE(s_gfxModeSwitchTable)) -			return; - -		while (s_gfxModeSwitchTable[_scalerType][factor] < 0) { -			assert(factor > 0); -			factor--; -		} -		newMode = s_gfxModeSwitchTable[_scalerType][factor]; -	} - -	if (newMode >= 0) { -		beginGFXTransaction(); -			setGraphicsMode(newMode); -		endGFXTransaction(); -#ifdef USE_OSD -		if (_osdSurface) { -			const char *newScalerName = 0; -			const GraphicsMode *g = getSupportedGraphicsModes(); -			while (g->name) { -				if (g->id == _videoMode.mode) { -					newScalerName = g->description; -					break; -				} -				g++; -			} -			if (newScalerName) { -				char buffer[128]; -				sprintf(buffer, "Active graphics filter: %s\n%d x %d -> %d x %d", -					newScalerName, -					_videoMode.screenWidth, _videoMode.screenHeight, -					_hwscreen->w, _hwscreen->h -					); -				displayMessageOnOSD(buffer); -			} -		} -#endif -		internUpdateScreen(); -	} - +void OSystem_SDL_SamsungTV::warpMouse(int x, int y) { +	setMousePos(x, y);  }  #endif diff --git a/backends/platform/samsungtv/main.cpp b/backends/platform/samsungtv/main.cpp index 9bcec2ac48..ad921d83d6 100644 --- a/backends/platform/samsungtv/main.cpp +++ b/backends/platform/samsungtv/main.cpp @@ -34,47 +34,6 @@  extern "C" int Game_Main(char *path, char *) {  	chdir(path); -	// -	// Set up redirects for stdout/stderr under Windows and Symbian. -	// Code copied from SDL_main. -	// -/* -	// Symbian does not like any output to the console through any *print* function -	char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :) -	strcpy(STDOUT_FILE, "/dtv/usb/sda1/"); -	strcpy(STDERR_FILE, "/dtv/usb/sda1/"); -	strcat(STDOUT_FILE, "scummvm.stdout.txt"); -	strcat(STDERR_FILE, "scummvm.stderr.txt"); -*/ -	/* Flush the output in case anything is queued */ -/*	fclose(stdout); -	fclose(stderr); -*/ -	/* Redirect standard input and standard output */ -//	FILE *newfp = freopen(STDOUT_FILE, "w", stdout); -//	if (newfp == NULL) {	/* This happens on NT */ -/*#if !defined(stdout) -		stdout = fopen(STDOUT_FILE, "w"); -#else -		newfp = fopen(STDOUT_FILE, "w"); -		if (newfp) { -			*stdout = *newfp; -		} -#endif -	} -	newfp = freopen(STDERR_FILE, "w", stderr); -	if (newfp == NULL) {*/	/* This happens on NT */ -/*#if !defined(stderr) -		stderr = fopen(STDERR_FILE, "w"); -#else -		newfp = fopen(STDERR_FILE, "w"); -		if (newfp) { -			*stderr = *newfp; -		} -#endif -	} -	setbuf(stderr, NULL);*/			/* No buffering */ -  	g_system = new OSystem_SDL_SamsungTV();  	assert(g_system); diff --git a/backends/platform/samsungtv/sdl.cpp b/backends/platform/samsungtv/sdl.cpp index c60f4c6edc..ab6602fa35 100644 --- a/backends/platform/samsungtv/sdl.cpp +++ b/backends/platform/samsungtv/sdl.cpp @@ -36,8 +36,6 @@  #include <time.h>	// for getTimeAndDate() -#define SAMPLES_PER_SEC 22050 -  /*   * Include header files needed for the getFilesystemFactory() method.   */ @@ -141,91 +139,8 @@ void OSystem_SDL_SamsungTV::initBackend() {  	_inited = true;  } -OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() -	: -#ifdef USE_OSD -	_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0), -#endif -	_hwscreen(0), _prehwscreen(0), _screen(0), _tmpscreen(0), -	_screenFormat(Graphics::PixelFormat::createFormatCLUT8()), -	_cursorFormat(Graphics::PixelFormat::createFormatCLUT8()), -	_overlayVisible(false), -	_overlayscreen(0), _tmpscreen2(0), -	_samplesPerSec(0), -	_scalerProc(0), _modeChanged(false), _screenChangeCount(0), _dirtyChecksums(0), -	_mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0), -	_mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true), -	_currentShakePos(0), _newShakePos(0), -	_paletteDirtyStart(0), _paletteDirtyEnd(0), -	_fsFactory(0), -	_savefile(0), -	_mixer(0), -	_timer(0), -	_screenIsLocked(false), -	_graphicsMutex(0), _transactionMode(kTransactionNone) { - -	// allocate palette storage -	_currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); -	_cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); - -	_mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; - -	// reset mouse state -	memset(&_km, 0, sizeof(_km)); -	memset(&_mouseCurState, 0, sizeof(_mouseCurState)); - -	_inited = false; - -	_fsFactory = new POSIXFilesystemFactory(); -} - -OSystem_SDL_SamsungTV::~OSystem_SDL_SamsungTV() { -	SDL_RemoveTimer(_timerID); -	closeMixer(); - -	free(_dirtyChecksums); -	free(_currentPalette); -	free(_cursorPalette); -	free(_mouseData); - -	delete _savefile; -	delete _timer; -} - -uint32 OSystem_SDL_SamsungTV::getMillis() { -	uint32 millis = SDL_GetTicks(); -	g_eventRec.processMillis(millis); -	return millis; -} - -void OSystem_SDL_SamsungTV::delayMillis(uint msecs) { -	SDL_Delay(msecs); -} - -void OSystem_SDL_SamsungTV::getTimeAndDate(TimeDate &td) const { -	time_t curTime = time(0); -	struct tm t = *localtime(&curTime); -	td.tm_sec = t.tm_sec; -	td.tm_min = t.tm_min; -	td.tm_hour = t.tm_hour; -	td.tm_mday = t.tm_mday; -	td.tm_mon = t.tm_mon; -	td.tm_year = t.tm_year; -} - -Common::TimerManager *OSystem_SDL_SamsungTV::getTimerManager() { -	assert(_timer); -	return _timer; -} - -Common::SaveFileManager *OSystem_SDL_SamsungTV::getSavefileManager() { -	assert(_savefile); -	return _savefile; -} - -FilesystemFactory *OSystem_SDL_SamsungTV::getFilesystemFactory() { -	assert(_fsFactory); -	return _fsFactory; +OSystem_SDL_SamsungTV::OSystem_SDL_SamsungTV() : OSystem_SDL(), +	_prehwscreen(0) {  }  void OSystem_SDL_SamsungTV::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { @@ -233,7 +148,7 @@ void OSystem_SDL_SamsungTV::addSysArchivesToSearchSet(Common::SearchSet &s, int  	// FIXME: We use depth = 4 for now, to match the old code. May want to change that  	Common::FSNode dataNode(".");  	if (dataNode.exists() && dataNode.isDirectory()) { -		s.add(DATA_PATH, new Common::FSDirectory(dataNode, 4), priority); +		s.add("", new Common::FSDirectory(dataNode, 4), priority);  	}  } @@ -254,9 +169,6 @@ Common::WriteStream *OSystem_SDL_SamsungTV::createConfigWriteStream() {  	return file.createWriteStream();  } -void OSystem_SDL_SamsungTV::setWindowCaption(const char *caption) { -} -  bool OSystem_SDL_SamsungTV::hasFeature(Feature f) {  	return  		(f == kFeatureAutoComputeDirtyRects) || @@ -314,114 +226,4 @@ void OSystem_SDL_SamsungTV::quit() {  	delete _savefile;  } -void OSystem_SDL_SamsungTV::setupIcon() { -} - -OSystem::MutexRef OSystem_SDL_SamsungTV::createMutex(void) { -	return (MutexRef)SDL_CreateMutex(); -} - -void OSystem_SDL_SamsungTV::lockMutex(MutexRef mutex) { -	SDL_mutexP((SDL_mutex *) mutex); -} - -void OSystem_SDL_SamsungTV::unlockMutex(MutexRef mutex) { -	SDL_mutexV((SDL_mutex *) mutex); -} - -void OSystem_SDL_SamsungTV::deleteMutex(MutexRef mutex) { -	SDL_DestroyMutex((SDL_mutex *) mutex); -} - -void OSystem_SDL_SamsungTV::mixCallback(void *sys, byte *samples, int len) { -	OSystem_SDL_SamsungTV *this_ = (OSystem_SDL_SamsungTV *)sys; -	assert(this_); -	assert(this_->_mixer); - -	this_->_mixer->mixCallback(samples, len); -} - -void OSystem_SDL_SamsungTV::setupMixer() { -	SDL_AudioSpec desired; - -	// Determine the desired output sampling frequency. -	_samplesPerSec = 0; -	if (ConfMan.hasKey("output_rate")) -		_samplesPerSec = ConfMan.getInt("output_rate"); -	if (_samplesPerSec <= 0) -		_samplesPerSec = SAMPLES_PER_SEC; - -	// Determine the sample buffer size. We want it to store enough data for -	// about 1/16th of a second. Note that it must be a power of two. -	// So e.g. at 22050 Hz, we request a sample buffer size of 2048. -	int samples = 8192; -	while (16 * samples >= _samplesPerSec) { -		samples >>= 1; -	} - -	memset(&desired, 0, sizeof(desired)); -	desired.freq = _samplesPerSec; -	desired.format = AUDIO_S16SYS; -	desired.channels = 2; -	desired.samples = (uint16)samples; -	desired.callback = mixCallback; -	desired.userdata = this; - -	// Create the mixer instance -	assert(!_mixer); -	_mixer = new Audio::MixerImpl(this); -	assert(_mixer); - -	if (SDL_OpenAudio(&desired, &_obtainedRate) != 0) { -		warning("Could not open audio device: %s", SDL_GetError()); -		_samplesPerSec = 0; -		_mixer->setReady(false); -	} else { -		// Note: This should be the obtained output rate, but it seems that at -		// least on some platforms SDL will lie and claim it did get the rate -		// even if it didn't. Probably only happens for "weird" rates, though. -		_samplesPerSec = _obtainedRate.freq; -		debug(1, "Output sample rate: %d Hz", _samplesPerSec); - -		// Tell the mixer that we are ready and start the sound processing -		_mixer->setOutputRate(_samplesPerSec); -		_mixer->setReady(true); - -		// start the sound system -		SDL_PauseAudio(0); -	} -} - -void OSystem_SDL_SamsungTV::closeMixer() { -	if (_mixer) -		_mixer->setReady(false); - -	SDL_CloseAudio(); - -	delete _mixer; -	_mixer = 0; -} - -Audio::Mixer *OSystem_SDL_SamsungTV::getMixer() { -	assert(_mixer); -	return _mixer; -} - -bool OSystem_SDL_SamsungTV::openCD(int drive) { -	return false; -} - -void OSystem_SDL_SamsungTV::stopCD() { -} - -void OSystem_SDL_SamsungTV::playCD(int track, int num_loops, int start_frame, int duration) { -} - -bool OSystem_SDL_SamsungTV::pollCD() { -	return false; -} - -void OSystem_SDL_SamsungTV::updateCD() { -} -  #endif diff --git a/backends/platform/samsungtv/sdl.h b/backends/platform/samsungtv/sdl.h index 3b81bba7f5..26702faf95 100644 --- a/backends/platform/samsungtv/sdl.h +++ b/backends/platform/samsungtv/sdl.h @@ -23,12 +23,13 @@   *   */ -#ifndef SDL_COMMON_H +#ifndef SDL_SAMSUNGTV_COMMON_H  #define SDL_SAMSUNGTV_COMMON_H  #include <SDL.h>  #include "backends/base-backend.h" +#include "backends/platform/sdl/sdl.h"  #include "graphics/scaler.h"  #if defined(SAMSUNGTV) @@ -37,376 +38,62 @@ namespace Audio {  	class MixerImpl;  } -#define USE_OSD	1 - -enum { -	GFX_NORMAL = 0, -	GFX_DOUBLESIZE = 1, -	GFX_TRIPLESIZE = 2, -	GFX_2XSAI = 3, -	GFX_SUPER2XSAI = 4, -	GFX_SUPEREAGLE = 5, -	GFX_ADVMAME2X = 6, -	GFX_ADVMAME3X = 7, -	GFX_HQ2X = 8, -	GFX_HQ3X = 9, -	GFX_TV2X = 10, -	GFX_DOTMATRIX = 11 -}; - -class AspectRatio { -	int _kw, _kh; -public: -	AspectRatio() { _kw = _kh = 0; } -	AspectRatio(int w, int h); -  -	bool isAuto() const { return (_kw | _kh) == 0; } -	 -	int kw() const { return _kw; } -	int kh() const { return _kh; } -}; - - -class OSystem_SDL_SamsungTV : public BaseBackend { +class OSystem_SDL_SamsungTV : public OSystem_SDL {  public:  	OSystem_SDL_SamsungTV(); -	virtual ~OSystem_SDL_SamsungTV();  	virtual void initBackend(); -	void beginGFXTransaction(); -	TransactionError endGFXTransaction(); - -#ifdef USE_RGB_COLOR -	// Game screen -	virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; } -  	// Highest supported  	virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); -#endif  	// Set the size and format of the video bitmap.  	// Typically, 320x200 CLUT8 -	virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format); // overloaded by CE backend - -	virtual int getScreenChangeID() const { return _screenChangeCount; } - -	// Set colors of the palette -	void setPalette(const byte *colors, uint start, uint num); - -	// Get colors of the palette -	void grabPalette(byte *colors, uint start, uint num); +	virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format);  	// Draw a bitmap to screen.  	// The screen will not be updated to reflect the new bitmap  	virtual void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h); // overloaded by CE backend (FIXME) -	virtual Graphics::Surface *lockScreen(); -	virtual void unlockScreen(); - -	// Update the dirty areas of the screen -	void updateScreen(); - -	// Either show or hide the mouse cursor -	bool showMouse(bool visible); -  	// Warp the mouse cursor. Where set_mouse_pos() only informs the  	// backend of the mouse cursor's current position, this function  	// actually moves the cursor to the specified position. -	virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME) +	virtual void warpMouse(int x, int y);  	// Set the bitmap that's used when drawing the cursor.  	virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format); // overloaded by CE backend (FIXME) -	// Set colors of cursor palette -	void setCursorPalette(const byte *colors, uint start, uint num); - -	// Disables or enables cursor palette -	void disableCursorPalette(bool disable) { -		_cursorPaletteDisabled = disable; -		blitCursor(); -	} - -	// Shaking is used in SCUMM. Set current shake position. -	void setShakePos(int shake_pos); - -	// Get the number of milliseconds since the program was started. -	uint32 getMillis(); - -	// Delay for a specified amount of milliseconds -	void delayMillis(uint msecs); -  	// Get the next event.  	// Returns true if an event was retrieved. -	virtual bool pollEvent(Common::Event &event); // overloaded by CE backend +	virtual bool pollEvent(Common::Event &event);  	// Define all hardware keys for keymapper  	virtual Common::HardwareKeySet *getHardwareKeySet(); -	// Set function that generates samples -	virtual void setupMixer(); -	static void mixCallback(void *s, byte *samples, int len); - -	virtual void closeMixer(); - -	virtual Audio::Mixer *getMixer(); - -	// Poll CD status -	// Returns true if cd audio is playing -	bool pollCD(); - -	// Play CD audio track -	void playCD(int track, int num_loops, int start_frame, int duration); - -	// Stop CD audio track -	void stopCD(); - -	// Update CD audio status -	void updateCD(); -  	// Quit  	virtual void quit(); // overloaded by CE backend -	virtual void getTimeAndDate(TimeDate &t) const; -	virtual Common::TimerManager *getTimerManager(); - -	// Mutex handling -	MutexRef createMutex(); -	void lockMutex(MutexRef mutex); -	void unlockMutex(MutexRef mutex); -	void deleteMutex(MutexRef mutex); - -	// Overlay -	virtual Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; } - -	virtual void showOverlay(); -	virtual void hideOverlay(); -	virtual void clearOverlay(); -	virtual void grabOverlay(OverlayColor *buf, int pitch); -	virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); -	virtual int16 getHeight(); -	virtual int16 getWidth(); -	virtual int16 getOverlayHeight()  { return _videoMode.overlayHeight; } -	virtual int16 getOverlayWidth()   { return _videoMode.overlayWidth; } - -	virtual const GraphicsMode *getSupportedGraphicsModes() const;  	virtual int getDefaultGraphicsMode() const; -	virtual bool setGraphicsMode(int mode); -	virtual int getGraphicsMode() const; - -	virtual void setWindowCaption(const char *caption); -	virtual bool openCD(int drive);  	virtual bool hasFeature(Feature f);  	virtual void setFeatureState(Feature f, bool enable);  	virtual bool getFeatureState(Feature f); -	virtual void preprocessEvents(SDL_Event *event) {}; - -#ifdef USE_OSD -	void displayMessageOnOSD(const char *msg); -#endif -	virtual Common::SaveFileManager *getSavefileManager(); -	virtual FilesystemFactory *getFilesystemFactory();  	virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);  	virtual Common::SeekableReadStream *createConfigReadStream();  	virtual Common::WriteStream *createConfigWriteStream();  protected: -	bool _inited; -	SDL_AudioSpec _obtainedRate; - -#ifdef USE_OSD -	SDL_Surface *_osdSurface; -	Uint8 _osdAlpha;			// Transparency level of the OSD -	uint32 _osdFadeStartTime;	// When to start the fade out -	enum { -		kOSDFadeOutDelay = 2 * 1000,	// Delay before the OSD is faded out (in milliseconds) -		kOSDFadeOutDuration = 500,		// Duration of the OSD fade out (in milliseconds) -		kOSDColorKey = 1, -		kOSDInitialAlpha = 80			// Initial alpha level, in percent -	}; -#endif - -	// hardware screen -	SDL_Surface *_hwscreen, *_prehwscreen; -	// unseen game screen -	SDL_Surface *_screen; -#ifdef USE_RGB_COLOR -	Graphics::PixelFormat _screenFormat; -	Graphics::PixelFormat _cursorFormat; -#endif - -	// temporary screen (for scalers) -	SDL_Surface *_tmpscreen; -	SDL_Surface *_tmpscreen2; - -	// overlay -	SDL_Surface *_overlayscreen; -	bool _overlayVisible; -	Graphics::PixelFormat _overlayFormat; - -	// Audio -	int _samplesPerSec; - -	enum { -		DF_WANT_RECT_OPTIM			= 1 << 0 -	}; - -	enum { -		kTransactionNone = 0, -		kTransactionActive = 1, -		kTransactionRollback = 2 -	}; - -	struct TransactionDetails { -		bool sizeChanged; -		bool needHotswap; -		bool needUpdatescreen; -		bool normal1xScaler; -#ifdef USE_RGB_COLOR -		bool formatChanged; -#endif -	}; -	TransactionDetails _transactionDetails; +	SDL_Surface *_prehwscreen; -	struct VideoState { -		bool setup; - -		bool fullscreen; -		bool aspectRatioCorrection; -		AspectRatio desiredAspectRatio; - -		int mode; -		int scaleFactor; - -		int screenWidth, screenHeight; -		int overlayWidth, overlayHeight; -		int hardwareWidth, hardwareHeight; -#ifdef USE_RGB_COLOR -		Graphics::PixelFormat format; -#endif -	}; -	VideoState _videoMode, _oldVideoMode; - -	virtual void setGraphicsModeIntern(); // overloaded by CE backend - -	/** Force full redraw on next updateScreen */ -	bool _forceFull; -	ScalerProc *_scalerProc; -	int _scalerType; -	int _transactionMode; - -	bool _screenIsLocked; -	Graphics::Surface _framebuffer; - -	/** Current video mode flags (see DF_* constants) */ -	uint32 _modeFlags; -	bool _modeChanged; -	int _screenChangeCount; - -	enum { -		NUM_DIRTY_RECT = 100, -		MAX_SCALING = 3 -	}; - -	// Dirty rect management -	SDL_Rect _dirtyRectList[NUM_DIRTY_RECT]; -	int _numDirtyRects; -	uint32 *_dirtyChecksums; -	bool _cksumValid; -	int _cksumNum; - -	// Keyboard mouse emulation.  Disabled by fingolfin 2004-12-18. -	// I am keeping the rest of the code in for now, since the joystick -	// code (or rather, "hack") uses it, too. -	struct KbdMouse { -		int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count; -		uint32 last_time, delay_time, x_down_time, y_down_time; -	}; - -	struct MousePos { -		// The mouse position, using either virtual (game) or real -		// (overlay) coordinates. -		int16 x, y; - -		// The size and hotspot of the original cursor image. -		int16 w, h; -		int16 hotX, hotY; - -		// The size and hotspot of the pre-scaled cursor image, in real -		// coordinates. -		int16 rW, rH; -		int16 rHotX, rHotY; - -		// The size and hotspot of the pre-scaled cursor image, in game -		// coordinates. -		int16 vW, vH; -		int16 vHotX, vHotY; - -		MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0), -		             rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0), -		             vHotX(0), vHotY(0) -			{ } -	}; - -	// mouse -	KbdMouse _km; -	bool _mouseVisible; -	bool _mouseNeedsRedraw; -	byte *_mouseData; -	SDL_Rect _mouseBackup; -	MousePos _mouseCurState; -	byte _mouseKeyColor; -	int _cursorTargetScale; -	bool _cursorPaletteDisabled; -	SDL_Surface *_mouseOrigSurface; -	SDL_Surface *_mouseSurface; -	enum { -		kMouseColorKey = 1 -	}; - -	// Shake mode -	int _currentShakePos; -	int _newShakePos; - -	// Palette data -	SDL_Color *_currentPalette; -	uint _paletteDirtyStart, _paletteDirtyEnd; - -	// Cursor palette data -	SDL_Color *_cursorPalette; - -	/** -	 * Mutex which prevents multiple threads from interfering with each other -	 * when accessing the screen. -	 */ -	MutexRef _graphicsMutex; - -	FilesystemFactory *_fsFactory; -	Common::SaveFileManager *_savefile; -	Audio::MixerImpl *_mixer; - -	SDL_TimerID _timerID; -	Common::TimerManager *_timer; - -protected: -	void addDirtyRgnAuto(const byte *buf); -	void makeChecksums(const byte *buf); - -	virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false); // overloaded by CE backend +	virtual void setGraphicsModeIntern();  	virtual void drawMouse(); // overloaded by CE backend  	virtual void undrawMouse(); // overloaded by CE backend (FIXME)  	virtual void blitCursor(); // overloaded by CE backend (FIXME) -	/** Set the position of the virtual mouse cursor. */ -	void setMousePos(int x, int y); -	virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend -	void toggleMouseGrab(); -  	virtual void internUpdateScreen(); // overloaded by CE backend  	virtual bool loadGFXMode(); // overloaded by CE backend @@ -416,19 +103,9 @@ protected:  	void setFullscreenMode(bool enable);  	void setAspectRatioCorrection(bool enable); -	virtual bool saveScreenshot(const char *filename); // overloaded by CE backend - -	int effectiveScreenHeight() const { -		return (_videoMode.aspectRatioCorrection ? real2Aspect(_videoMode.screenHeight) : _videoMode.screenHeight) -			* _videoMode.scaleFactor; -	} - -	void setupIcon();  	void handleKbdMouse();  	virtual bool remapKey(SDL_Event &ev, Common::Event &event); - -	void handleScalerHotkeys(const SDL_KeyboardEvent &key);  };  #endif  | 
