diff options
Diffstat (limited to 'engines/zvision/scripting/controls')
6 files changed, 45 insertions, 16 deletions
| diff --git a/engines/zvision/scripting/controls/fist_control.cpp b/engines/zvision/scripting/controls/fist_control.cpp index 4a8e8b1bbd..f79c82dc79 100644 --- a/engines/zvision/scripting/controls/fist_control.cpp +++ b/engines/zvision/scripting/controls/fist_control.cpp @@ -105,7 +105,12 @@ bool FistControl::process(uint32 deltaTimeInMillis) {  		if (_animation->needsUpdate()) {  			const Graphics::Surface *frameData = _animation->decodeNextFrame();  			if (frameData) -				_engine->getRenderManager()->blitSurfaceToBkgScaled(*frameData, _anmRect); +				// WORKAROUND: Ignore the target frame dimensions for the finger animations. +				// The target dimensions specify an area smaller than expected, thus if we +				// scale the finger videos to fit these dimensions, they are not aligned +				// correctly. Not scaling these videos yields a result identical to the +				// original. Fixes bug #6784. +				_engine->getRenderManager()->blitSurfaceToBkg(*frameData, _anmRect.left, _anmRect.top);  		}  	} diff --git a/engines/zvision/scripting/controls/input_control.cpp b/engines/zvision/scripting/controls/input_control.cpp index 47da27fa08..9525333ef0 100644 --- a/engines/zvision/scripting/controls/input_control.cpp +++ b/engines/zvision/scripting/controls/input_control.cpp @@ -39,10 +39,10 @@ namespace ZVision {  InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream)  	: Control(engine, key, CONTROL_INPUT), +	  _background(0),  	  _nextTabstop(0),  	  _focused(false),  	  _textChanged(false), -	  _cursorOffset(0),  	  _enterPressed(false),  	  _readOnly(false),  	  _txtWidth(0), @@ -78,13 +78,13 @@ InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStre  			sscanf(values.c_str(), "%u", &fontFormatNumber); -			_stringInit.readAllStyle(_engine->getStringManager()->getTextLine(fontFormatNumber)); +			_stringInit.readAllStyles(_engine->getStringManager()->getTextLine(fontFormatNumber));  		} else if (param.matchString("chooser_init_string", true)) {  			uint fontFormatNumber;  			sscanf(values.c_str(), "%u", &fontFormatNumber); -			_stringChooserInit.readAllStyle(_engine->getStringManager()->getTextLine(fontFormatNumber)); +			_stringChooserInit.readAllStyles(_engine->getStringManager()->getTextLine(fontFormatNumber));  		} else if (param.matchString("next_tabstop", true)) {  			sscanf(values.c_str(), "%u", &_nextTabstop);  		} else if (param.matchString("cursor_dimensions", true)) { @@ -109,6 +109,15 @@ InputControl::InputControl(ZVision *engine, uint32 key, Common::SeekableReadStre  		_engine->getScriptManager()->trimCommentsAndWhiteSpace(&line);  		getParams(line, param, values);  	} + +	_maxTxtWidth = _textRectangle.width(); +	if (_animation) +		_maxTxtWidth -= _animation->getWidth(); +} + +InputControl::~InputControl() { +	_background->free(); +	delete _background;  }  bool InputControl::onMouseUp(const Common::Point &screenSpacePos, const Common::Point &backgroundImageSpacePos) { @@ -191,19 +200,31 @@ bool InputControl::process(uint32 deltaTimeInMillis) {  	if (_engine->getScriptManager()->getStateFlag(_key) & Puzzle::DISABLED)  		return false; +	if (!_background) { +		_background = _engine->getRenderManager()->getBkgRect(_textRectangle); +	} +  	// First see if we need to render the text  	if (_textChanged) {  		// Blit the text using the RenderManager  		Graphics::Surface txt; -		txt.create(_textRectangle.width(), _textRectangle.height(), _engine->_resourcePixelFormat); +		txt.copyFrom(*_background); + +		int32 oldTxtWidth = _txtWidth;  		if (!_readOnly || !_focused) -			_txtWidth = _engine->getTextRenderer()->drawTxt(_currentInputText, _stringInit, txt); +			_txtWidth = _engine->getTextRenderer()->drawText(_currentInputText, _stringInit, txt);  		else -			_txtWidth = _engine->getTextRenderer()->drawTxt(_currentInputText, _stringChooserInit, txt); +			_txtWidth = _engine->getTextRenderer()->drawText(_currentInputText, _stringChooserInit, txt); -		_engine->getRenderManager()->blitSurfaceToBkg(txt, _textRectangle.left, _textRectangle.top); +		if (_readOnly || _txtWidth <= _maxTxtWidth) +			_engine->getRenderManager()->blitSurfaceToBkg(txt, _textRectangle.left, _textRectangle.top); +		else { +			// Assume the last character caused the overflow. +			_currentInputText.deleteLastChar(); +			_txtWidth = oldTxtWidth; +		}  		txt.free();  	} diff --git a/engines/zvision/scripting/controls/input_control.h b/engines/zvision/scripting/controls/input_control.h index 99f7f5287d..6abdb3c692 100644 --- a/engines/zvision/scripting/controls/input_control.h +++ b/engines/zvision/scripting/controls/input_control.h @@ -38,25 +38,25 @@ namespace ZVision {  class InputControl : public Control {  public:  	InputControl(ZVision *engine, uint32 key, Common::SeekableReadStream &stream); +	~InputControl();  private: +	Graphics::Surface *_background;  	Common::Rect _textRectangle;  	Common::Rect _headerRectangle; -	cTxtStyle _stringInit; -	cTxtStyle _stringChooserInit; +	TextStyleState _stringInit; +	TextStyleState _stringChooserInit;  	uint32 _nextTabstop;  	bool _focused;  	Common::String _currentInputText;  	bool _textChanged; -	uint _cursorOffset;  	bool _enterPressed;  	bool _readOnly;  	int16 _txtWidth; +	int16 _maxTxtWidth;  	Video::VideoDecoder *_animation; -	int32 _frameDelay; -	int16 _frame;  public:  	void focus() { diff --git a/engines/zvision/scripting/controls/lever_control.cpp b/engines/zvision/scripting/controls/lever_control.cpp index bef51f0e91..0f105b424c 100644 --- a/engines/zvision/scripting/controls/lever_control.cpp +++ b/engines/zvision/scripting/controls/lever_control.cpp @@ -232,10 +232,13 @@ bool LeverControl::onMouseMove(const Common::Point &screenSpacePos, const Common  				if (angle >= (int)iter->angle - ANGLE_DELTA && angle <= (int)iter->angle + ANGLE_DELTA) {  					_currentFrame = iter->toFrame;  					renderFrame(_currentFrame); +					_engine->getScriptManager()->setStateValue(_key, _currentFrame);  					break;  				}  			}  		} +		_engine->getCursorManager()->changeCursor(_cursor); +		cursorWasChanged = true;  	} else if (_frameInfo[_currentFrame].hotspot.contains(backgroundImageSpacePos)) {  		_engine->getCursorManager()->changeCursor(_cursor);  		cursorWasChanged = true; diff --git a/engines/zvision/scripting/controls/safe_control.cpp b/engines/zvision/scripting/controls/safe_control.cpp index 6ba34106d0..4d2a91a1ad 100644 --- a/engines/zvision/scripting/controls/safe_control.cpp +++ b/engines/zvision/scripting/controls/safe_control.cpp @@ -123,6 +123,8 @@ bool SafeControl::process(uint32 deltaTimeInMillis) {  			_animation->seekToFrame(_animation->getCurFrame() - 1);  		const Graphics::Surface *frameData = _animation->decodeNextFrame(); +		if (_animation->getCurFrame() == _targetFrame) +			_engine->getScriptManager()->setStateValue(_key, _curState);  		if (frameData)  			_engine->getRenderManager()->blitSurfaceToBkg(*frameData, _rectangle.left, _rectangle.top);  	} @@ -169,8 +171,6 @@ bool SafeControl::onMouseUp(const Common::Point &screenSpacePos, const Common::P  			_curState = (_statesCount * 2 + tmp2) % _statesCount;  			_targetFrame = (_curState + _statesCount - _startPointer) % _statesCount; - -			_engine->getScriptManager()->setStateValue(_key, _curState);  			return true;  		}  	} diff --git a/engines/zvision/scripting/controls/titler_control.cpp b/engines/zvision/scripting/controls/titler_control.cpp index 542e0a0b67..683d6660af 100644 --- a/engines/zvision/scripting/controls/titler_control.cpp +++ b/engines/zvision/scripting/controls/titler_control.cpp @@ -82,7 +82,7 @@ TitlerControl::~TitlerControl() {  void TitlerControl::setString(int strLine) {  	if (strLine != _curString && strLine >= 0 && strLine < (int)_strings.size()) {  		_surface->fillRect(Common::Rect(_surface->w, _surface->h), 0); -		_engine->getTextRenderer()->drawTxtInOneLine(_strings[strLine], *_surface); +		_engine->getTextRenderer()->drawTextWithWordWrapping(_strings[strLine], *_surface);  		_engine->getRenderManager()->blitSurfaceToBkg(*_surface, _rectangle.left, _rectangle.top);  		_curString = strLine;  	} | 
