[Scummvm-cvs-logs] scummvm master -> 4318e0072b9f4dc8df25a5dce40ed0094bd20cf6

dreammaster dreammaster at scummvm.org
Sat Jun 20 21:50:21 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
4318e0072b SHERLOCK: RT: Simplify drawing of tooltips


Commit: 4318e0072b9f4dc8df25a5dce40ed0094bd20cf6
    https://github.com/scummvm/scummvm/commit/4318e0072b9f4dc8df25a5dce40ed0094bd20cf6
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-06-20T15:48:18-04:00

Commit Message:
SHERLOCK: RT: Simplify drawing of tooltips

All drawing code has been refactored into WidgetBase, so the
different descendants don't have to duplicate drawing to the screen

Changed paths:
    engines/sherlock/tattoo/tattoo_user_interface.cpp
    engines/sherlock/tattoo/widget_base.cpp
    engines/sherlock/tattoo/widget_base.h
    engines/sherlock/tattoo/widget_tooltip.cpp
    engines/sherlock/tattoo/widget_tooltip.h



diff --git a/engines/sherlock/tattoo/tattoo_user_interface.cpp b/engines/sherlock/tattoo/tattoo_user_interface.cpp
index d7de2de..d12f0e7 100644
--- a/engines/sherlock/tattoo/tattoo_user_interface.cpp
+++ b/engines/sherlock/tattoo/tattoo_user_interface.cpp
@@ -322,9 +322,6 @@ void TattooUserInterface::drawInterface(int bufferNum) {
 		_oldInvMenuBounds.left = _oldInvMenuBounds.top = _oldInvMenuBounds.right = _oldInvMenuBounds.bottom = 0;
 	}
 
-	// Clear the tooltip if necessary
-	_tooltipWidget.erase();
-
 	// See if we need to flush areas assocaited with the inventory graphic
 	if (_oldInvGraphicBounds.right) {
 		screen.slamArea(_oldInvGraphicBounds.left - _currentScroll.x, _oldInvGraphicBounds.top,
@@ -360,7 +357,7 @@ void TattooUserInterface::doBgAnimRestoreUI() {
 		screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(_invMenuBounds.left, _invMenuBounds.top), _invMenuBounds);
 
 	// If there is a Text Tag being display, restore the area underneath it
-	_tooltipWidget.erasePrevious();
+	_tooltipWidget.erase();
 
 	// If there is an Inventory being shown, restore the graphics underneath it
 	if (_oldInvGraphicBounds.width() > 0)
diff --git a/engines/sherlock/tattoo/widget_base.cpp b/engines/sherlock/tattoo/widget_base.cpp
index 0fddb27..adb09d5 100644
--- a/engines/sherlock/tattoo/widget_base.cpp
+++ b/engines/sherlock/tattoo/widget_base.cpp
@@ -44,6 +44,35 @@ void WidgetBase::banishWindow() {
 	_surface.free();
 }
 
+void WidgetBase::erase() {
+	Screen &screen = *_vm->_screen;
+
+	if (_oldBounds.width() > 0) {
+		screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(_oldBounds.left, _oldBounds.top), _oldBounds);
+		screen.slamRect(_oldBounds);
+
+		_oldBounds = Common::Rect(0, 0, 0, 0);
+	}
+}
+
+void WidgetBase::draw() {
+	Screen &screen = *_vm->_screen;
+
+	// If there was a previously drawn frame in a different position that hasn't yet been erased, then erase it
+	if (_oldBounds.width() > 0 && _oldBounds != _bounds)
+		erase();
+
+	if (_bounds.width() > 0 && !_surface.empty()) {
+		// Copy any area to be drawn on from the secondary back buffer, and then draw surface on top
+		screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(_bounds.left, _bounds.top), _bounds);
+		screen._backBuffer1.transBlitFrom(_surface, Common::Point(_bounds.left, _bounds.top));
+		screen.slamRect(_bounds);
+
+		// Store a copy of the drawn area for later erasing
+		_oldBounds = _bounds;
+	}
+}
+
 Common::String WidgetBase::splitLines(const Common::String &str, Common::StringArray &lines, int maxWidth, uint maxLines) {
 	Talk &talk = *_vm->_talk;
 	const char *strP = str.c_str();
diff --git a/engines/sherlock/tattoo/widget_base.h b/engines/sherlock/tattoo/widget_base.h
index 4b7ae2e..5eacad6 100644
--- a/engines/sherlock/tattoo/widget_base.h
+++ b/engines/sherlock/tattoo/widget_base.h
@@ -36,9 +36,11 @@ class ImageFile;
 namespace Tattoo {
 
 class WidgetBase {
+private:
+	Common::Rect _oldBounds;
 protected:
 	SherlockEngine *_vm;
-	Common::Rect _bounds, _oldBounds;
+	Common::Rect _bounds;
 	Surface _surface;
 	ImageFile *_images;
 	bool _outsideMenu;
@@ -59,6 +61,16 @@ public:
 	virtual ~WidgetBase() {}
 
 	/**
+	 * Erase any previous display of the widget on the screen
+	 */
+	void erase();
+
+	/**
+	 * Update the display of the widget on the screen
+	 */
+	void draw();
+
+	/**
 	 * Summon the window
 	 */
 	virtual void summonWindow();
diff --git a/engines/sherlock/tattoo/widget_tooltip.cpp b/engines/sherlock/tattoo/widget_tooltip.cpp
index 2e55d4b..69a9300 100644
--- a/engines/sherlock/tattoo/widget_tooltip.cpp
+++ b/engines/sherlock/tattoo/widget_tooltip.cpp
@@ -117,36 +117,15 @@ void WidgetTooltip::setText(const Common::String &str) {
 	}
 }
 
-void WidgetTooltip::draw() {
-	Screen &screen = *_vm->_screen;
-
-	if (!_surface.empty())
-		screen._backBuffer1.transBlitFrom(_surface, Common::Point(_bounds.left, _bounds.top));
-}
-
-void WidgetTooltip::erase() {
-	Screen &screen = *_vm->_screen;
-	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
-
-	if (_bounds.width() > 0) {
-		screen.slamArea(_oldBounds.left - ui._currentScroll.x, _oldBounds.top, _oldBounds.width(), _oldBounds.height());
-
-		// If there's no text actually being displayed, then reset bounds so we don't keep restoring the area
-		if (_surface.empty()) {
-			_bounds.left = _bounds.top = _bounds.right = _bounds.bottom = 0;
-			_oldBounds.left = _oldBounds.top = _oldBounds.right = _oldBounds.bottom = 0;
-		}
-	}
+void WidgetTooltip::handleEvents() {
+	Events &events = *_vm->_events;
+	Common::Point mousePos = events.mousePos();
 
-	if (!_surface.empty())
-		screen.slamArea(_bounds.left - ui._currentScroll.x, _bounds.top, _bounds.width(), _bounds.height());
-}
+	// Set the new position for the tooltip
+	int xp = CLIP(mousePos.x - _bounds.width() / 2, 0, SHERLOCK_SCREEN_WIDTH - _bounds.width());
+	int yp = MAX(mousePos.y - _bounds.height(), 0);
 
-void WidgetTooltip::erasePrevious() {
-	Screen &screen = *_vm->_screen;
-	if (_oldBounds.width() > 0)
-		screen._backBuffer1.blitFrom(screen._backBuffer2, Common::Point(_oldBounds.left, _oldBounds.top),
-		_oldBounds);
+	_bounds.moveTo(xp, yp);
 }
 
 /*----------------------------------------------------------------*/
@@ -155,17 +134,13 @@ void WidgetSceneTooltip::handleEvents() {
 	Events &events = *_vm->_events;
 	People &people = *_vm->_people;
 	Scene &scene = *_vm->_scene;
-	Screen &screen = *_vm->_screen;
 	TattooUserInterface &ui = *(TattooUserInterface *)_vm->_ui;
 	Common::Point mousePos = events.mousePos();
 
 	// See if thay are pointing at a different object and we need to regenerate the tooltip text
 	if (ui._bgFound != ui._oldBgFound || (ui._bgFound != -1 && _surface.empty()) ||
 			ui._arrowZone != ui._oldArrowZone || (ui._arrowZone != -1 && _surface.empty())) {
-		// Keep track of the last place we drew the text
-		_oldBounds = _bounds;
-
-		// See if there is a new object to be displayed
+		// See if there is a new object to display text for
 		if ((ui._bgFound != -1 && (ui._bgFound != ui._oldBgFound || (ui._bgFound != -1 && _surface.empty()))) ||
 				(ui._arrowZone != -1 && (ui._arrowZone != ui._oldArrowZone || (ui._arrowZone != -1 && _surface.empty())))) {
 			Common::String str;
@@ -189,10 +164,8 @@ void WidgetSceneTooltip::handleEvents() {
 
 		ui._oldBgFound = ui._bgFound;
 	} else {
-		// Keep track of the last place we drew the Text
-		_oldBounds = _bounds;
 
-		// Set the New position of the Text Tag
+		// Set the new position for the tooltip
 		int tagX = CLIP(mousePos.x - _bounds.width() / 2, 0, SHERLOCK_SCREEN_WIDTH - _bounds.width());
 		int tagY = MAX(mousePos.y - _bounds.height(), 0);
 
diff --git a/engines/sherlock/tattoo/widget_tooltip.h b/engines/sherlock/tattoo/widget_tooltip.h
index ae93f15..a44faac 100644
--- a/engines/sherlock/tattoo/widget_tooltip.h
+++ b/engines/sherlock/tattoo/widget_tooltip.h
@@ -44,19 +44,9 @@ public:
 	void setText(const Common::String &str);
 
 	/**
-	 * Draw the tooltip if necessary
-	 */
-	void draw();
-
-	/**
-	 * Erase the area covered by the tooltip if it's active
-	 */
-	void erase();
-
-	/**
-	 * Erase any area of the screen drawn by the tooltip in the previous frame
+	 * Handle updating the tooltip state
 	 */
-	void erasePrevious();
+	virtual void handleEvents();
 };
 
 class WidgetSceneTooltip : public WidgetTooltip {






More information about the Scummvm-git-logs mailing list