[Scummvm-cvs-logs] scummvm master -> 574a2a64fe23f050032e12d3d85213a656a836be

wjp wjp at usecode.org
Tue Oct 1 15:07:28 CEST 2013


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

Summary:
aa24cb5e8d WINTERMUTE: Remove ticket batching
c6220a9cd1 WINTERMUTE: Remove _tempDisableDirtyRects
dbbf95ca50 WINTERMUTE: Mirror _drawNum with an iterator
b27ac796d8 WINTERMUTE: Remove unnecessary re-iteration
6d1ca9d94e WINTERMUTE: No longer use ticket->_drawNum
544e4a2f49 WINTERMUTE: No longer update ticket->_drawNum
4aa4c427da WINTERMUTE: Remove unnecessary loop
4386889dd5 WINTERMUTE: Remove left-over asserts
efdf2d3ab7 WINTERMUTE: Remove ticket->_drawNum
265f7e463e WINTERMUTE: Cleanup
4e12600d70 Merge branch 'wme_lineartickets' into wme_rendering
057b01951a WINTERMUTE: Add displayTiled function to replace repeatLastDraw
8e58be7a1d Merge branch 'master' into wme_rendering
2ec84600a9 WINTERMUTE: Fix up doxygen comment
574a2a64fe Merge pull request #402 from wjp/wme_rendering


Commit: aa24cb5e8dcd87b05ca09a1c4de89022126c2891
    https://github.com/scummvm/scummvm/commit/aa24cb5e8dcd87b05ca09a1c4de89022126c2891
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:05-07:00

Commit Message:
WINTERMUTE: Remove ticket batching

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/base/gfx/osystem/render_ticket.h



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index e4c19fd..875048c 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -53,8 +53,6 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) {
 	_blankSurface = new Graphics::Surface();
 	_drawNum = 1;
 	_needsFlip = true;
-	_spriteBatch = false;
-	_batchNum = 0;
 	_skipThisFrame = false;
 	_previousTicket = nullptr;
 
@@ -302,10 +300,6 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 
 	if (owner) { // Fade-tickets are owner-less
 		RenderTicket compare(owner, nullptr, srcRect, dstRect, transform);
-		compare._batchNum = _batchNum;
-		if (_spriteBatch) {
-			_batchNum++;
-		}
 		RenderQueueIterator it;
 		// Avoid calling end() and operator* every time, when potentially going through
 		// LOTS of tickets.
@@ -678,14 +672,10 @@ void BaseRenderOSystem::endSaveLoad() {
 }
 
 bool BaseRenderOSystem::startSpriteBatch() {
-	_spriteBatch = true;
-	_batchNum = 1;
 	return STATUS_OK;
 }
 
 bool BaseRenderOSystem::endSpriteBatch() {
-	_spriteBatch = false;
-	_batchNum = 0;
 	return STATUS_OK;
 }
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 306563a..87c0af0 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -139,8 +139,6 @@ private:
 
 	bool _disableDirtyRects;
 	uint32 _tempDisableDirtyRects;
-	bool _spriteBatch;
-	uint32 _batchNum;
 	float _ratioX;
 	float _ratioY;
 	uint32 _colorMod;
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
index d79d5ba..ad193bc 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@ -42,7 +42,6 @@ RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *s
 	_isValid(true),
 	_wantsDraw(true),
 	_transform(transform) {
-	_batchNum = 0;
 	if (surf) {
 		_surface = new Graphics::Surface();
 		_surface->create((uint16)srcRect->width(), (uint16)srcRect->height(), surf->format);
@@ -87,7 +86,6 @@ RenderTicket::~RenderTicket() {
 
 bool RenderTicket::operator==(const RenderTicket &t) const {
 	if ((t._owner != _owner) ||
-		(t._batchNum != _batchNum) ||
 		(t._transform != _transform)  || 
 		(t._dstRect != _dstRect) ||
 		(t._srcRect != _srcRect) 
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.h b/engines/wintermute/base/gfx/osystem/render_ticket.h
index 875102d..3690e34 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.h
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.h
@@ -61,7 +61,6 @@ public:
 	void drawToSurface(Graphics::Surface *_targetSurface, Common::Rect *dstRect, Common::Rect *clipRect) const;
 
 	Common::Rect _dstRect;
-	uint32 _batchNum;
 
 	bool _isValid;
 	bool _wantsDraw;


Commit: c6220a9cd1b5400242773dcb89dfbbc2a98453bd
    https://github.com/scummvm/scummvm/commit/c6220a9cd1b5400242773dcb89dfbbc2a98453bd
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:05-07:00

Commit Message:
WINTERMUTE: Remove _tempDisableDirtyRects

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index 875048c..96bc318 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -61,7 +61,6 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) {
 	_colorMod = kDefaultRgbaMod;
 	_dirtyRect = nullptr;
 	_disableDirtyRects = false;
-	_tempDisableDirtyRects = 0;
 	if (ConfMan.hasKey("dirty_rects")) {
 		_disableDirtyRects = !ConfMan.getBool("dirty_rects");
 	}
@@ -153,9 +152,6 @@ bool BaseRenderOSystem::indicatorFlip() {
 }
 
 bool BaseRenderOSystem::flip() {
-	if (_renderQueue.size() > DIRTY_RECT_LIMIT) {
-		_tempDisableDirtyRects++;
-	}
 	if (_skipThisFrame) {
 		_skipThisFrame = false;
 		delete _dirtyRect;
@@ -166,7 +162,7 @@ bool BaseRenderOSystem::flip() {
 		addDirtyRect(_renderRect);
 		return true;
 	}
-	if (!_tempDisableDirtyRects && !_disableDirtyRects) {
+	if (!_disableDirtyRects) {
 		drawTickets();
 	} else {
 		// Clear the scale-buffered tickets that wasn't reused.
@@ -182,8 +178,8 @@ bool BaseRenderOSystem::flip() {
 			}
 		}
 	}
-	if (_needsFlip || _disableDirtyRects || _tempDisableDirtyRects) {
-		if (_disableDirtyRects || _tempDisableDirtyRects) {
+	if (_needsFlip || _disableDirtyRects) {
+		if (_disableDirtyRects) {
 			g_system->copyRectToScreen((byte *)_renderSurface->getPixels(), _renderSurface->pitch, 0, 0, _renderSurface->w, _renderSurface->h);
 		}
 		//  g_system->copyRectToScreen((byte *)_renderSurface->getPixels(), _renderSurface->pitch, _dirtyRect->left, _dirtyRect->top, _dirtyRect->width(), _dirtyRect->height());
@@ -194,29 +190,13 @@ bool BaseRenderOSystem::flip() {
 	}
 	_drawNum = 1;
 
-	if (_tempDisableDirtyRects && !_disableDirtyRects) {
-		_tempDisableDirtyRects--;
-		if (!_tempDisableDirtyRects) {
-			Common::Rect screen(_screenRect.top, _screenRect.left, _screenRect.bottom, _screenRect.right);
-			addDirtyRect(screen);
-
-			// The queue has been ignored but updated, and is guaranteed to be in draw-order when run without dirty-rects.
-			RenderQueueIterator it = _renderQueue.begin();
-			int drawNum = 1;
-			while (it != _renderQueue.end()) {
-				(*it)->_drawNum = drawNum++;
-				++it;
-			}
-		}
-	}
-
 	return STATUS_OK;
 }
 
 //////////////////////////////////////////////////////////////////////////
 bool BaseRenderOSystem::fill(byte r, byte g, byte b, Common::Rect *rect) {
 	_clearColor = _renderSurface->format.ARGBToColor(0xFF, r, g, b);
-	if (!_disableDirtyRects && !_tempDisableDirtyRects) {
+	if (!_disableDirtyRects) {
 		return STATUS_OK;
 	}
 	if (!rect) {
@@ -277,7 +257,7 @@ Graphics::PixelFormat BaseRenderOSystem::getPixelFormat() const {
 
 void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, TransformStruct &transform) { 
 
-	if (_tempDisableDirtyRects || _disableDirtyRects) {
+	if (_disableDirtyRects) {
 		RenderTicket *ticket = new RenderTicket(owner, surf, srcRect, dstRect, transform);
 		ticket->_transform._rgbaMod = _colorMod;
 		ticket->_wantsDraw = true;
@@ -315,10 +295,6 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 					drawFromTicket(compareTicket);
 					_previousTicket = compareTicket;
 				}
-				if (_renderQueue.size() > DIRTY_RECT_LIMIT) {
-					drawTickets();
-					_tempDisableDirtyRects = 3;
-				}
 				return;
 			}
 		}
@@ -340,7 +316,7 @@ void BaseRenderOSystem::repeatLastDraw(int offsetX, int offsetY, int numTimesX,
 		RenderTicket *origTicket = _previousTicket;
 
 		// Make sure drawSurface WILL start from the correct _lastAddedTicket
-		if (!_tempDisableDirtyRects && !_disableDirtyRects && *_lastAddedTicket != origTicket) {
+		if (!_disableDirtyRects && *_lastAddedTicket != origTicket) {
 			RenderQueueIterator it;
 			RenderQueueIterator endIterator = _renderQueue.end();
 			for (it = _renderQueue.begin(); it != endIterator; ++it) {
@@ -553,7 +529,7 @@ void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *dstR
 bool BaseRenderOSystem::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
 	// This function isn't used outside of indicator-displaying, and thus quite unused in
 	// BaseRenderOSystem when dirty-rects are enabled.
-	if (!_tempDisableDirtyRects && !_disableDirtyRects && !_indicatorDisplay) {
+	if (!_disableDirtyRects && !_indicatorDisplay) {
 		error("BaseRenderOSystem::DrawLine - doesn't work for dirty rects yet");
 	}
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 87c0af0..dd3cc61 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -138,7 +138,6 @@ private:
 	int _borderBottom;
 
 	bool _disableDirtyRects;
-	uint32 _tempDisableDirtyRects;
 	float _ratioX;
 	float _ratioY;
 	uint32 _colorMod;


Commit: dbbf95ca50a9ebad1d6741c672192a9c93107e9e
    https://github.com/scummvm/scummvm/commit/dbbf95ca50a9ebad1d6741c672192a9c93107e9e
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:22-07:00

Commit Message:
WINTERMUTE: Mirror _drawNum with an iterator

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index 96bc318..3a78437 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -52,6 +52,7 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) {
 	_renderSurface = new Graphics::Surface();
 	_blankSurface = new Graphics::Surface();
 	_drawNum = 1;
+	_lastFrameIter = _renderQueue.end();
 	_needsFlip = true;
 	_skipThisFrame = false;
 	_previousTicket = nullptr;
@@ -159,6 +160,7 @@ bool BaseRenderOSystem::flip() {
 		g_system->updateScreen();
 		_needsFlip = false;
 		_drawNum = 1;
+		_lastFrameIter = _renderQueue.end();
 		addDirtyRect(_renderRect);
 		return true;
 	}
@@ -189,6 +191,7 @@ bool BaseRenderOSystem::flip() {
 		_needsFlip = false;
 	}
 	_drawNum = 1;
+	_lastFrameIter = _renderQueue.end();
 
 	return STATUS_OK;
 }
@@ -372,10 +375,15 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 	renderTicket->_wantsDraw = true;
 	// A new item always has _drawNum == 0
 	if (renderTicket->_drawNum == 0) {
+		++_lastFrameIter;
 		// In-order
 		if (_renderQueue.empty() || _drawNum > (_renderQueue.back())->_drawNum) {
+			assert(_renderQueue.empty() || _lastFrameIter == _renderQueue.end());
+			_lastFrameIter--;
 			renderTicket->_drawNum = _drawNum++;
 			_renderQueue.push_back(renderTicket);
+			++_lastFrameIter;
+			assert(*_lastFrameIter == renderTicket);
 			addDirtyRect(renderTicket->_dstRect);
 			++_lastAddedTicket;
 		} else {
@@ -386,23 +394,34 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 					break;
 				}
 			}
+			assert(!_renderQueue.empty() && _lastFrameIter != _renderQueue.end());
+			assert(pos == _lastFrameIter);
 			_renderQueue.insert(pos, renderTicket);
 			renderTicket->_drawNum = _drawNum++;
+			--_lastFrameIter;
+			assert(*_lastFrameIter == renderTicket);
 			// Increment the following tickets, so they still are in line
 			RenderQueueIterator it;
 			for (it = pos; it != _renderQueue.end(); ++it) {
 				(*it)->_drawNum++;
+				assert((*it)->_wantsDraw == false);
 				(*it)->_wantsDraw = false;
 			}
 			addDirtyRect(renderTicket->_dstRect);
 			_lastAddedTicket = pos;
 		}
 	} else {
+		++_lastFrameIter;
 		// Was drawn last round, still in the same order
 		if (_drawNum == renderTicket->_drawNum) {
+			assert((*_lastFrameIter)->_drawNum == _drawNum);
+			assert(*_lastFrameIter == renderTicket);
 			_drawNum++;
 			++_lastAddedTicket;
 		} else {
+			assert(*_lastFrameIter != renderTicket);
+			--_lastFrameIter;
+			assert(_drawNum < renderTicket->_drawNum);
 			// Remove the ticket from the list
 			RenderQueueIterator it = _renderQueue.begin();
 			while (it != _renderQueue.end()) {
@@ -470,6 +489,7 @@ void BaseRenderOSystem::drawTickets() {
 	// Apply the clear-color to the dirty rect.
 	_renderSurface->fillRect(*_dirtyRect, _clearColor);
 	_drawNum = 1;
+	_lastFrameIter = _renderQueue.end();
 	for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) {
 		RenderTicket *ticket = *it;
 		assert(ticket->_drawNum == _drawNum);
@@ -641,6 +661,7 @@ void BaseRenderOSystem::endSaveLoad() {
 	// so just skip this single frame.
 	_skipThisFrame = true;
 	_drawNum = 1;
+	_lastFrameIter = _renderQueue.end();
 
 	_renderSurface->fillRect(Common::Rect(0, 0, _renderSurface->h, _renderSurface->w), _renderSurface->format.ARGBToColor(255, 0, 0, 0));
 	g_system->copyRectToScreen((byte *)_renderSurface->getPixels(), _renderSurface->pitch, 0, 0, _renderSurface->w, _renderSurface->h);
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index dd3cc61..3de696f 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -128,6 +128,7 @@ private:
 
 	bool _needsFlip;
 	uint32 _drawNum; ///< The global number of the current draw-operation.
+	RenderQueueIterator _lastFrameIter;
 	Common::Rect _renderRect;
 	Graphics::Surface *_renderSurface;
 	Graphics::Surface *_blankSurface;


Commit: b27ac796d84670d77bff73276de5d6f8affb0323
    https://github.com/scummvm/scummvm/commit/b27ac796d84670d77bff73276de5d6f8affb0323
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:26-07:00

Commit Message:
WINTERMUTE: Remove unnecessary re-iteration

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index 3a78437..d7a8378 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -295,7 +295,7 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 				if (_disableDirtyRects) {
 					drawFromSurface(compareTicket);
 				} else {
-					drawFromTicket(compareTicket);
+					drawFromQueuedTicket(it);
 					_previousTicket = compareTicket;
 				}
 				return;
@@ -374,7 +374,8 @@ void BaseRenderOSystem::invalidateTicketsFromSurface(BaseSurfaceOSystem *surf) {
 void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 	renderTicket->_wantsDraw = true;
 	// A new item always has _drawNum == 0
-	if (renderTicket->_drawNum == 0) {
+	assert(renderTicket->_drawNum == 0);
+	{
 		++_lastFrameIter;
 		// In-order
 		if (_renderQueue.empty() || _drawNum > (_renderQueue.back())->_drawNum) {
@@ -410,7 +411,14 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 			addDirtyRect(renderTicket->_dstRect);
 			_lastAddedTicket = pos;
 		}
-	} else {
+	}
+}
+
+void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket) {
+	RenderTicket *renderTicket = *ticket;
+	renderTicket->_wantsDraw = true;
+	assert(renderTicket->_drawNum != 0);
+	{
 		++_lastFrameIter;
 		// Was drawn last round, still in the same order
 		if (_drawNum == renderTicket->_drawNum) {
@@ -423,15 +431,7 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 			--_lastFrameIter;
 			assert(_drawNum < renderTicket->_drawNum);
 			// Remove the ticket from the list
-			RenderQueueIterator it = _renderQueue.begin();
-			while (it != _renderQueue.end()) {
-				if ((*it) == renderTicket) {
-					it = _renderQueue.erase(it);
-					break;
-				} else {
-					++it;
-				}
-			}
+			RenderQueueIterator it = _renderQueue.erase(ticket);
 			if (it != _renderQueue.end()) {
 				// Decreement the following tickets.
 				for (; it != _renderQueue.end(); ++it) {
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 3de696f..fd5d336 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -62,6 +62,8 @@ public:
 	BaseRenderOSystem(BaseGame *inGame);
 	~BaseRenderOSystem();
 
+	typedef Common::List<RenderTicket *>::iterator RenderQueueIterator;
+
 	Common::String getName() const;
 
 	bool initRenderer(int width, int height, bool windowed) override;
@@ -79,11 +81,16 @@ public:
 	void invalidateTicket(RenderTicket *renderTicket);
 	void invalidateTicketsFromSurface(BaseSurfaceOSystem *surf);
 	/**
-	 * Insert a ticket into the queue, adding a dirty rect if it's
-	 * new, or out-of-order from last draw from the ticket.
+	 * Insert a new ticket into the queue, adding a dirty rect
 	 * param renderTicket the ticket to be added.
 	 */
 	void drawFromTicket(RenderTicket *renderTicket);
+	/**
+	 * Re-insert an existing ticket into the queue, adding a dirty rect
+	 * out-of-order from last draw from the ticket.
+	 * param ticket iterator pointing to the ticket to be added.
+	 */
+	void drawFromQueuedTicket(const RenderQueueIterator &ticket);
 
 	bool setViewport(int left, int top, int right, int bottom) override;
 	bool setViewport(Rect32 *rect) override { return BaseRenderer::setViewport(rect); }
@@ -120,7 +127,6 @@ private:
 	void drawFromSurface(RenderTicket *ticket);
 	// Dirty-rects:
 	void drawFromSurface(RenderTicket *ticket, Common::Rect *dstRect, Common::Rect *clipRect);
-	typedef Common::List<RenderTicket *>::iterator RenderQueueIterator;
 	Common::Rect *_dirtyRect;
 	Common::List<RenderTicket *> _renderQueue;
 	RenderQueueIterator _lastAddedTicket;


Commit: 6d1ca9d94eb2d7b1665814b23aa7b56b8dd6bfb3
    https://github.com/scummvm/scummvm/commit/6d1ca9d94eb2d7b1665814b23aa7b56b8dd6bfb3
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:26-07:00

Commit Message:
WINTERMUTE: No longer use ticket->_drawNum

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index d7a8378..a7df076 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -378,7 +378,7 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 	{
 		++_lastFrameIter;
 		// In-order
-		if (_renderQueue.empty() || _drawNum > (_renderQueue.back())->_drawNum) {
+		if (_renderQueue.empty() || _lastFrameIter == _renderQueue.end()) {
 			assert(_renderQueue.empty() || _lastFrameIter == _renderQueue.end());
 			_lastFrameIter--;
 			renderTicket->_drawNum = _drawNum++;
@@ -389,12 +389,7 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 			++_lastAddedTicket;
 		} else {
 			// Before something
-			RenderQueueIterator pos;
-			for (pos = _renderQueue.begin(); pos != _renderQueue.end(); pos++) {
-				if ((*pos)->_drawNum >= _drawNum) {
-					break;
-				}
-			}
+			RenderQueueIterator pos = _lastFrameIter;
 			assert(!_renderQueue.empty() && _lastFrameIter != _renderQueue.end());
 			assert(pos == _lastFrameIter);
 			_renderQueue.insert(pos, renderTicket);
@@ -421,7 +416,7 @@ void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket)
 	{
 		++_lastFrameIter;
 		// Was drawn last round, still in the same order
-		if (_drawNum == renderTicket->_drawNum) {
+		if (*_lastFrameIter == renderTicket) {
 			assert((*_lastFrameIter)->_drawNum == _drawNum);
 			assert(*_lastFrameIter == renderTicket);
 			_drawNum++;


Commit: 544e4a2f49630cecbf06fe5b1e11bdbab1bdb281
    https://github.com/scummvm/scummvm/commit/544e4a2f49630cecbf06fe5b1e11bdbab1bdb281
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:26-07:00

Commit Message:
WINTERMUTE: No longer update ticket->_drawNum

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index a7df076..afb2cd6 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -373,15 +373,12 @@ void BaseRenderOSystem::invalidateTicketsFromSurface(BaseSurfaceOSystem *surf) {
 
 void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 	renderTicket->_wantsDraw = true;
-	// A new item always has _drawNum == 0
-	assert(renderTicket->_drawNum == 0);
 	{
 		++_lastFrameIter;
 		// In-order
 		if (_renderQueue.empty() || _lastFrameIter == _renderQueue.end()) {
 			assert(_renderQueue.empty() || _lastFrameIter == _renderQueue.end());
 			_lastFrameIter--;
-			renderTicket->_drawNum = _drawNum++;
 			_renderQueue.push_back(renderTicket);
 			++_lastFrameIter;
 			assert(*_lastFrameIter == renderTicket);
@@ -393,13 +390,11 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 			assert(!_renderQueue.empty() && _lastFrameIter != _renderQueue.end());
 			assert(pos == _lastFrameIter);
 			_renderQueue.insert(pos, renderTicket);
-			renderTicket->_drawNum = _drawNum++;
 			--_lastFrameIter;
 			assert(*_lastFrameIter == renderTicket);
 			// Increment the following tickets, so they still are in line
 			RenderQueueIterator it;
 			for (it = pos; it != _renderQueue.end(); ++it) {
-				(*it)->_drawNum++;
 				assert((*it)->_wantsDraw == false);
 				(*it)->_wantsDraw = false;
 			}
@@ -412,29 +407,19 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket) {
 	RenderTicket *renderTicket = *ticket;
 	renderTicket->_wantsDraw = true;
-	assert(renderTicket->_drawNum != 0);
 	{
 		++_lastFrameIter;
 		// Was drawn last round, still in the same order
 		if (*_lastFrameIter == renderTicket) {
-			assert((*_lastFrameIter)->_drawNum == _drawNum);
 			assert(*_lastFrameIter == renderTicket);
 			_drawNum++;
 			++_lastAddedTicket;
 		} else {
 			assert(*_lastFrameIter != renderTicket);
 			--_lastFrameIter;
-			assert(_drawNum < renderTicket->_drawNum);
 			// Remove the ticket from the list
-			RenderQueueIterator it = _renderQueue.erase(ticket);
-			if (it != _renderQueue.end()) {
-				// Decreement the following tickets.
-				for (; it != _renderQueue.end(); ++it) {
-					(*it)->_drawNum--;
-				}
-			}
+			_renderQueue.erase(ticket);
 			// Is not in order, so readd it as if it was a new ticket
-			renderTicket->_drawNum = 0;
 			drawFromTicket(renderTicket);
 		}
 	}
@@ -464,7 +449,6 @@ void BaseRenderOSystem::drawTickets() {
 			delete ticket;
 			decrement++;
 		} else {
-			(*it)->_drawNum -= decrement;
 			++it;
 		}
 	}
@@ -487,7 +471,6 @@ void BaseRenderOSystem::drawTickets() {
 	_lastFrameIter = _renderQueue.end();
 	for (it = _renderQueue.begin(); it != _renderQueue.end(); ++it) {
 		RenderTicket *ticket = *it;
-		assert(ticket->_drawNum == _drawNum);
 		++_drawNum;
 		if (ticket->_dstRect.intersects(*_dirtyRect)) {
 			// dstClip is the area we want redrawn.
@@ -524,7 +507,6 @@ void BaseRenderOSystem::drawTickets() {
 			delete ticket;
 			decrement++;
 		} else {
-			(*it)->_drawNum -= decrement;
 			++it;
 		}
 	}


Commit: 4aa4c427da5f949578fcdfe6b913c9b6864379a4
    https://github.com/scummvm/scummvm/commit/4aa4c427da5f949578fcdfe6b913c9b6864379a4
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:28-07:00

Commit Message:
WINTERMUTE: Remove unnecessary loop

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index afb2cd6..ce746d3 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -392,12 +392,6 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 			_renderQueue.insert(pos, renderTicket);
 			--_lastFrameIter;
 			assert(*_lastFrameIter == renderTicket);
-			// Increment the following tickets, so they still are in line
-			RenderQueueIterator it;
-			for (it = pos; it != _renderQueue.end(); ++it) {
-				assert((*it)->_wantsDraw == false);
-				(*it)->_wantsDraw = false;
-			}
 			addDirtyRect(renderTicket->_dstRect);
 			_lastAddedTicket = pos;
 		}


Commit: 4386889dd5f87eeb972616d31bdb5b46133d03ef
    https://github.com/scummvm/scummvm/commit/4386889dd5f87eeb972616d31bdb5b46133d03ef
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:31-07:00

Commit Message:
WINTERMUTE: Remove left-over asserts

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index ce746d3..b362586 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -377,21 +377,16 @@ void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 		++_lastFrameIter;
 		// In-order
 		if (_renderQueue.empty() || _lastFrameIter == _renderQueue.end()) {
-			assert(_renderQueue.empty() || _lastFrameIter == _renderQueue.end());
 			_lastFrameIter--;
 			_renderQueue.push_back(renderTicket);
 			++_lastFrameIter;
-			assert(*_lastFrameIter == renderTicket);
 			addDirtyRect(renderTicket->_dstRect);
 			++_lastAddedTicket;
 		} else {
 			// Before something
 			RenderQueueIterator pos = _lastFrameIter;
-			assert(!_renderQueue.empty() && _lastFrameIter != _renderQueue.end());
-			assert(pos == _lastFrameIter);
 			_renderQueue.insert(pos, renderTicket);
 			--_lastFrameIter;
-			assert(*_lastFrameIter == renderTicket);
 			addDirtyRect(renderTicket->_dstRect);
 			_lastAddedTicket = pos;
 		}
@@ -405,11 +400,9 @@ void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket)
 		++_lastFrameIter;
 		// Was drawn last round, still in the same order
 		if (*_lastFrameIter == renderTicket) {
-			assert(*_lastFrameIter == renderTicket);
 			_drawNum++;
 			++_lastAddedTicket;
 		} else {
-			assert(*_lastFrameIter != renderTicket);
 			--_lastFrameIter;
 			// Remove the ticket from the list
 			_renderQueue.erase(ticket);


Commit: efdf2d3ab713faf922981a721e20c5d6665f7565
    https://github.com/scummvm/scummvm/commit/efdf2d3ab713faf922981a721e20c5d6665f7565
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-25T17:17:31-07:00

Commit Message:
WINTERMUTE: Remove ticket->_drawNum

Changed paths:
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/base/gfx/osystem/render_ticket.h



diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
index ad193bc..006dd77 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@ -38,7 +38,6 @@ RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *s
 	_owner(owner),
 	_srcRect(*srcRect),
 	_dstRect(*dstRect),
-	_drawNum(0),
 	_isValid(true),
 	_wantsDraw(true),
 	_transform(transform) {
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.h b/engines/wintermute/base/gfx/osystem/render_ticket.h
index 3690e34..e824c09 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.h
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.h
@@ -52,7 +52,7 @@ class BaseSurfaceOSystem;
 class RenderTicket {
 public:
 	RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRest, TransformStruct transform); 
-	RenderTicket() : _isValid(true), _wantsDraw(false), _drawNum(0), _transform(TransformStruct()) {}
+	RenderTicket() : _isValid(true), _wantsDraw(false), _transform(TransformStruct()) {}
 	~RenderTicket();
 	const Graphics::Surface *getSurface() const { return _surface; }
 	// Non-dirty-rects:
@@ -64,7 +64,6 @@ public:
 
 	bool _isValid;
 	bool _wantsDraw;
-	uint32 _drawNum;
 
 	TransformStruct _transform; 
 	


Commit: 265f7e463ee9265df7b675a43ce5861418090d2f
    https://github.com/scummvm/scummvm/commit/265f7e463ee9265df7b675a43ce5861418090d2f
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-26T01:49:25-07:00

Commit Message:
WINTERMUTE: Cleanup

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index b362586..37f577d 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -373,42 +373,40 @@ void BaseRenderOSystem::invalidateTicketsFromSurface(BaseSurfaceOSystem *surf) {
 
 void BaseRenderOSystem::drawFromTicket(RenderTicket *renderTicket) {
 	renderTicket->_wantsDraw = true;
-	{
+
+	++_lastFrameIter;
+	// In-order
+	if (_renderQueue.empty() || _lastFrameIter == _renderQueue.end()) {
+		_lastFrameIter--;
+		_renderQueue.push_back(renderTicket);
 		++_lastFrameIter;
-		// In-order
-		if (_renderQueue.empty() || _lastFrameIter == _renderQueue.end()) {
-			_lastFrameIter--;
-			_renderQueue.push_back(renderTicket);
-			++_lastFrameIter;
-			addDirtyRect(renderTicket->_dstRect);
-			++_lastAddedTicket;
-		} else {
-			// Before something
-			RenderQueueIterator pos = _lastFrameIter;
-			_renderQueue.insert(pos, renderTicket);
-			--_lastFrameIter;
-			addDirtyRect(renderTicket->_dstRect);
-			_lastAddedTicket = pos;
-		}
+		addDirtyRect(renderTicket->_dstRect);
+		++_lastAddedTicket;
+	} else {
+		// Before something
+		RenderQueueIterator pos = _lastFrameIter;
+		_renderQueue.insert(pos, renderTicket);
+		--_lastFrameIter;
+		addDirtyRect(renderTicket->_dstRect);
+		_lastAddedTicket = pos;
 	}
 }
 
 void BaseRenderOSystem::drawFromQueuedTicket(const RenderQueueIterator &ticket) {
 	RenderTicket *renderTicket = *ticket;
 	renderTicket->_wantsDraw = true;
-	{
-		++_lastFrameIter;
-		// Was drawn last round, still in the same order
-		if (*_lastFrameIter == renderTicket) {
-			_drawNum++;
-			++_lastAddedTicket;
-		} else {
-			--_lastFrameIter;
-			// Remove the ticket from the list
-			_renderQueue.erase(ticket);
-			// Is not in order, so readd it as if it was a new ticket
-			drawFromTicket(renderTicket);
-		}
+
+	++_lastFrameIter;
+	// Was drawn last round, still in the same order
+	if (*_lastFrameIter == renderTicket) {
+		_drawNum++;
+		++_lastAddedTicket;
+	} else {
+		--_lastFrameIter;
+		// Remove the ticket from the list
+		_renderQueue.erase(ticket);
+		// Is not in order, so readd it as if it was a new ticket
+		drawFromTicket(renderTicket);
 	}
 }
 
@@ -427,14 +425,12 @@ void BaseRenderOSystem::drawTickets() {
 	// Note: We draw invalid tickets too, otherwise we wouldn't be honouring
 	// the draw request they obviously made BEFORE becoming invalid, either way
 	// we have a copy of their data, so their invalidness won't affect us.
-	uint32 decrement = 0;
 	while (it != _renderQueue.end()) {
 		if ((*it)->_wantsDraw == false) {
 			RenderTicket *ticket = *it;
 			addDirtyRect((*it)->_dstRect);
 			it = _renderQueue.erase(it);
 			delete ticket;
-			decrement++;
 		} else {
 			++it;
 		}
@@ -485,14 +481,12 @@ void BaseRenderOSystem::drawTickets() {
 
 	it = _renderQueue.begin();
 	// Clean out the old tickets
-	decrement = 0;
 	while (it != _renderQueue.end()) {
 		if ((*it)->_isValid == false) {
 			RenderTicket *ticket = *it;
 			addDirtyRect((*it)->_dstRect);
 			it = _renderQueue.erase(it);
 			delete ticket;
-			decrement++;
 		} else {
 			++it;
 		}


Commit: 4e12600d7053cdd3740dc1b099f1c1071645ae34
    https://github.com/scummvm/scummvm/commit/4e12600d7053cdd3740dc1b099f1c1071645ae34
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-26T01:50:13-07:00

Commit Message:
Merge branch 'wme_lineartickets' into wme_rendering

This replaces the (quadratic time) renderqueue drawnum logic by a
(linear time) approach based on following along the queue with an iterator.

This branch first implements the new iterator logic next to the old drawnum
logic, adding asserts that they produce identical results to facilitate testing
and debugging. The old code is removed after that.

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/base/gfx/osystem/render_ticket.h





Commit: 057b01951a92cc17e6c7a5121d2bd866841c4f75
    https://github.com/scummvm/scummvm/commit/057b01951a92cc17e6c7a5121d2bd866841c4f75
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-30T13:03:48-07:00

Commit Message:
WINTERMUTE: Add displayTiled function to replace repeatLastDraw

This avoids queueing many tickets for a UITiledImage, replacing
them by a single tiled ticket.

Changed paths:
    engines/wintermute/base/gfx/base_surface.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_surface_osystem.h
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/graphics/transform_struct.cpp
    engines/wintermute/graphics/transform_struct.h
    engines/wintermute/ui/ui_tiled_image.cpp



diff --git a/engines/wintermute/base/gfx/base_surface.h b/engines/wintermute/base/gfx/base_surface.h
index 42fd593..a53748e 100644
--- a/engines/wintermute/base/gfx/base_surface.h
+++ b/engines/wintermute/base/gfx/base_surface.h
@@ -56,7 +56,7 @@ public:
 	virtual bool display(int x, int y, Rect32 rect, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) = 0;
 	virtual bool displayTransform(int x, int y, Rect32 rect, Rect32 newRect, const TransformStruct &transform) = 0;
 	virtual bool displayZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = 0xFFFFFFFF, bool transparent = false, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) = 0;
-	virtual bool repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) = 0;
+	virtual bool displayTiled(int x, int y, Rect32 rect, int numTimesX, int numTimesY) = 0;
 	virtual bool restore();
 	virtual bool create(const Common::String &filename, bool defaultCK, byte ckRed, byte ckGreen, byte ckBlue, int lifeTime = -1, bool keepLoaded = false) = 0;
 	virtual bool create(int width, int height);
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index 37f577d..b8e35d9 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -55,7 +55,6 @@ BaseRenderOSystem::BaseRenderOSystem(BaseGame *inGame) : BaseRenderer(inGame) {
 	_lastFrameIter = _renderQueue.end();
 	_needsFlip = true;
 	_skipThisFrame = false;
-	_previousTicket = nullptr;
 
 	_borderLeft = _borderRight = _borderTop = _borderBottom = 0;
 	_ratioX = _ratioY = 1.0f;
@@ -265,7 +264,6 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 		ticket->_transform._rgbaMod = _colorMod;
 		ticket->_wantsDraw = true;
 		_renderQueue.push_back(ticket);
-		_previousTicket = ticket;
 		drawFromSurface(ticket);
 		return;
 	}
@@ -296,7 +294,6 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 					drawFromSurface(compareTicket);
 				} else {
 					drawFromQueuedTicket(it);
-					_previousTicket = compareTicket;
 				}
 				return;
 			}
@@ -305,57 +302,13 @@ void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::S
 	RenderTicket *ticket = new RenderTicket(owner, surf, srcRect, dstRect, transform);
 	if (!_disableDirtyRects) {
 		drawFromTicket(ticket);
-		_previousTicket = ticket;
 	} else {
 		ticket->_wantsDraw = true;
 		_renderQueue.push_back(ticket);
-		_previousTicket = ticket;
 		drawFromSurface(ticket);
 	}
 }
 
-void BaseRenderOSystem::repeatLastDraw(int offsetX, int offsetY, int numTimesX, int numTimesY) {
-	if (_previousTicket && _lastAddedTicket != _renderQueue.end()) {
-		RenderTicket *origTicket = _previousTicket;
-
-		// Make sure drawSurface WILL start from the correct _lastAddedTicket
-		if (!_disableDirtyRects && *_lastAddedTicket != origTicket) {
-			RenderQueueIterator it;
-			RenderQueueIterator endIterator = _renderQueue.end();
-			for (it = _renderQueue.begin(); it != endIterator; ++it) {
-				if ((*it) == _previousTicket) {
-					_lastAddedTicket = it;
-					break;
-				}
-			}
-		}
-		Common::Rect srcRect(0, 0, 0, 0);
-		srcRect.setWidth(origTicket->getSrcRect()->width());
-		srcRect.setHeight(origTicket->getSrcRect()->height());
-
-		Common::Rect dstRect = origTicket->_dstRect;
-		int initLeft = dstRect.left;
-		int initRight = dstRect.right;
-
-		TransformStruct temp = TransformStruct(kDefaultZoomX, kDefaultZoomY, kDefaultAngle, kDefaultHotspotX, kDefaultHotspotY, BLEND_NORMAL, kDefaultRgbaMod, false, false, kDefaultOffsetX, kDefaultOffsetY);
-
-		for (int i = 0; i < numTimesY; i++) {
-			if (i == 0) {
-				dstRect.translate(offsetX, 0);
-			}
-			for (int j = (i == 0 ? 1 : 0); j < numTimesX; j++) {
-				drawSurface(origTicket->_owner, origTicket->getSurface(), &srcRect, &dstRect, temp); 
-				dstRect.translate(offsetX, 0);
-			}
-			dstRect.left = initLeft;
-			dstRect.right = initRight;
-			dstRect.translate(0, offsetY);
-		}
-	} else {
-		error("Repeat-draw failed (did you forget to draw something before this?)");
-	}
-}
-
 void BaseRenderOSystem::invalidateTicket(RenderTicket *renderTicket) {
 	addDirtyRect(renderTicket->_dstRect);
 	renderTicket->_isValid = false;
@@ -614,7 +567,6 @@ void BaseRenderOSystem::endSaveLoad() {
 		delete ticket;
 	}
 	_lastAddedTicket = _renderQueue.begin();
-	_previousTicket = nullptr;
 	// HACK: After a save the buffer will be drawn before the scripts get to update it,
 	// so just skip this single frame.
 	_skipThisFrame = true;
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index fd5d336..a6634d9 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -111,7 +111,6 @@ public:
 	virtual bool endSpriteBatch() override;
 	void endSaveLoad();
 	void drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, TransformStruct &transform);
-	void repeatLastDraw(int offsetX, int offsetY, int numTimesX, int numTimesY);
 	BaseSurface *createSurface() override;
 private:
 	/**
@@ -130,7 +129,6 @@ private:
 	Common::Rect *_dirtyRect;
 	Common::List<RenderTicket *> _renderQueue;
 	RenderQueueIterator _lastAddedTicket;
-	RenderTicket *_previousTicket;
 
 	bool _needsFlip;
 	uint32 _drawNum; ///< The global number of the current draw-operation.
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
index e04af45..67d8f3f 100644
--- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
@@ -381,6 +381,14 @@ bool BaseSurfaceOSystem::displayTransform(int x, int y, Rect32 rect, Rect32 newR
 }
 
 //////////////////////////////////////////////////////////////////////////
+bool BaseSurfaceOSystem::displayTiled(int x, int y, Rect32 rect, int numTimesX, int numTimesY) {
+	assert(numTimesX > 0 && numTimesY > 0);
+	TransformStruct transform(numTimesX, numTimesY);
+	return drawSprite(x, y, &rect, nullptr, transform);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
 bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, Rect32 *newRect, TransformStruct transform) {
 	BaseRenderOSystem *renderer = static_cast<BaseRenderOSystem *>(_gameRef->_renderer);
 
@@ -424,8 +432,8 @@ bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, Rect32 *newRect,
 		position.setWidth(newRect->width());
 		position.setHeight(newRect->height());
 	} else {
-		position.setWidth((int16)((float)srcRect.width() * transform._zoom.x / kDefaultZoomX));
-		position.setHeight((int16)((float)srcRect.height() * transform._zoom.y / kDefaultZoomY));
+		position.setWidth((int16)((float)srcRect.width() * transform._zoom.x / kDefaultZoomX) * transform._numTimesX);
+		position.setHeight((int16)((float)srcRect.height() * transform._zoom.y / kDefaultZoomY) * transform._numTimesY);
 	}
 	renderer->modTargetRect(&position);
 
@@ -441,12 +449,6 @@ bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, Rect32 *newRect,
 	return STATUS_OK;
 }
 
-bool BaseSurfaceOSystem::repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) {
-	BaseRenderOSystem *renderer = static_cast<BaseRenderOSystem *>(_gameRef->_renderer);
-	renderer->repeatLastDraw(offsetX, offsetY, numTimesX, numTimesY);
-	return STATUS_OK;
-}
-
 bool BaseSurfaceOSystem::putSurface(const Graphics::Surface &surface, bool hasAlpha) {
 	_loaded = true;
 	_surface->free();
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
index 340a5a5..67f45f6 100644
--- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.h
@@ -58,7 +58,7 @@ public:
 	bool display(int x, int y, Rect32 rect, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override;
 	bool displayZoom(int x, int y, Rect32 rect, float zoomX, float zoomY, uint32 alpha = kDefaultRgbaMod, bool transparent = false, TSpriteBlendMode blendMode = BLEND_NORMAL, bool mirrorX = false, bool mirrorY = false) override;
 	bool displayTransform(int x, int y, Rect32 rect, Rect32 newRect, const TransformStruct &transform) override;
-	bool repeatLastDisplayOp(int offsetX, int offsetY, int numTimesX, int numTimesY) override;
+	virtual bool displayTiled(int x, int y, Rect32 rect, int numTimesX, int numTimesY);
 	virtual bool putSurface(const Graphics::Surface &surface, bool hasAlpha = false) override;
 	/*  static unsigned DLL_CALLCONV ReadProc(void *buffer, unsigned size, unsigned count, fi_handle handle);
 	    static int DLL_CALLCONV SeekProc(fi_handle handle, long offset, int origin);
diff --git a/engines/wintermute/base/gfx/osystem/render_ticket.cpp b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
index 006dd77..11a4921 100644
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@ -50,13 +50,19 @@ RenderTicket::RenderTicket(BaseSurfaceOSystem *owner, const Graphics::Surface *s
 			memcpy(_surface->getBasePtr(0, i), surf->getBasePtr(srcRect->left, srcRect->top + i), srcRect->width() * _surface->format.bytesPerPixel);
 		}
 		// Then scale it if necessary
+		//
+		// NB: The numTimesX/numTimesY properties don't yet mix well with
+		// scaling and rotation, but there is no need for that functionality at
+		// the moment.
 		if (_transform._angle != kDefaultAngle) {
 			TransparentSurface src(*_surface, false);
 			Graphics::Surface *temp = src.rotoscale(transform);
 			_surface->free();
 			delete _surface;
 			_surface = temp;
-		} else if (dstRect->width() != srcRect->width() || dstRect->height() != srcRect->height()) { 
+		} else if ((dstRect->width() != srcRect->width() ||
+					dstRect->height() != srcRect->height()) &&
+					_transform._numTimesX * _transform._numTimesY == 1) {
 			TransparentSurface src(*_surface, false);
 			Graphics::Surface *temp = src.scale(dstRect->width(), dstRect->height());
 			_surface->free();
@@ -109,7 +115,19 @@ void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface) const {
 			src._alphaMode = _owner->getAlphaType();
 		}
 	}
-	src.blit(*_targetSurface, _dstRect.left, _dstRect.top, _transform._flip, &clipRect, _transform._rgbaMod, clipRect.width(), clipRect.height());
+
+	int y = _dstRect.top;
+	int w = _dstRect.width() / _transform._numTimesX;
+	int h = _dstRect.height() / _transform._numTimesY;
+
+	for (int ry = 0; ry < _transform._numTimesY; ++ry) {
+		int x = _dstRect.left;
+		for (int rx = 0; rx < _transform._numTimesX; ++rx) {
+			src.blit(*_targetSurface, x, y, _transform._flip, &clipRect, _transform._rgbaMod, clipRect.width(), clipRect.height());
+			x += w;
+		}
+		y += h;
+	}
 }
 
 void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface, Common::Rect *dstRect, Common::Rect *clipRect) const {
@@ -118,8 +136,8 @@ void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface, Common::Rect
 	if (!clipRect) {
 		doDelete = true;
 		clipRect = new Common::Rect();
-		clipRect->setWidth(getSurface()->w);
-		clipRect->setHeight(getSurface()->h);
+		clipRect->setWidth(getSurface()->w * _transform._numTimesX);
+		clipRect->setHeight(getSurface()->h * _transform._numTimesY);
 	}
 
 	if (_owner) {
@@ -129,7 +147,47 @@ void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface, Common::Rect
 			src._alphaMode = _owner->getAlphaType();
 		}
 	}
-	src.blit(*_targetSurface, dstRect->left, dstRect->top, _transform._flip, clipRect, _transform._rgbaMod, clipRect->width(), clipRect->height(), _transform._blendMode);
+
+	if (_transform._numTimesX * _transform._numTimesY == 1) {
+
+		src.blit(*_targetSurface, dstRect->left, dstRect->top, _transform._flip, clipRect, _transform._rgbaMod, clipRect->width(), clipRect->height(), _transform._blendMode);
+
+	} else {
+
+		// clipRect is a subrect of the full numTimesX*numTimesY rect
+		Common::Rect subRect;
+
+		int y = 0;
+		int w = getSurface()->w;
+		int h = getSurface()->h;
+		assert(w == _dstRect.width() / _transform._numTimesX);
+		assert(h == _dstRect.height() / _transform._numTimesY);
+
+		int basex = dstRect->left - clipRect->left;
+		int basey = dstRect->top - clipRect->top;
+
+		for (int ry = 0; ry < _transform._numTimesY; ++ry) {
+			int x = 0;
+			for (int rx = 0; rx < _transform._numTimesX; ++rx) {
+
+				subRect.left = x;
+				subRect.top = y;
+				subRect.setWidth(w);
+				subRect.setHeight(w);
+
+				if (subRect.intersects(*clipRect)) {
+					subRect.clip(*clipRect);
+					subRect.translate(-x, -y);
+					src.blit(*_targetSurface, basex + x + subRect.left, basey + y + subRect.top, _transform._flip, &subRect, _transform._rgbaMod, subRect.width(), subRect.height(), _transform._blendMode);
+
+				}
+
+				x += w;
+			}
+			y += h;
+		}
+	}
+
 	if (doDelete) {
 		delete clipRect;
 	}
diff --git a/engines/wintermute/graphics/transform_struct.cpp b/engines/wintermute/graphics/transform_struct.cpp
index 643c6b4..822c06f 100644
--- a/engines/wintermute/graphics/transform_struct.cpp
+++ b/engines/wintermute/graphics/transform_struct.cpp
@@ -35,6 +35,8 @@ void TransformStruct::init(Point32 zoom, uint32 angle, Point32 hotspot, bool alp
 	_flip += TransparentSurface::FLIP_H * mirrorX;
 	_flip += TransparentSurface::FLIP_V * mirrorY;
 	_offset = offset;
+	_numTimesX = 1;
+	_numTimesY = 1;
 }
 
 TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 rgbaMod, bool mirrorX, bool mirrorY, int32 offsetX, int32 offsetY) {
@@ -83,6 +85,19 @@ TransformStruct::TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 h
 		Point32(kDefaultOffsetX, kDefaultOffsetY));
 }
 
+TransformStruct::TransformStruct(int32 numTimesX, int32 numTimesY) {
+	init(Point32(kDefaultZoomX, kDefaultZoomY),
+		kDefaultAngle,
+		Point32(kDefaultHotspotX, kDefaultHotspotY),
+		false,
+		BLEND_NORMAL,
+		kDefaultRgbaMod,
+		false, false,
+		Point32(kDefaultOffsetX, kDefaultOffsetY));
+	_numTimesX = numTimesX;
+	_numTimesY = numTimesY;
+}
+
 TransformStruct::TransformStruct() {
 	init(Point32(kDefaultZoomX, kDefaultZoomY), 
 		kDefaultAngle, 
diff --git a/engines/wintermute/graphics/transform_struct.h b/engines/wintermute/graphics/transform_struct.h
index 90a4c1f..d5a03ea 100644
--- a/engines/wintermute/graphics/transform_struct.h
+++ b/engines/wintermute/graphics/transform_struct.h
@@ -51,6 +51,7 @@ public:
 	TransformStruct(float zoomX, float zoomY, uint32 angle, int32 hotspotX, int32 hotspotY, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX = false, bool mirrorY = false, int32 offsetX = 0, int32 offsetY = 0);
 	TransformStruct(int32 zoomX, int32 zoomY, TSpriteBlendMode blendMode, uint32 alpha, bool mirrorX = false, bool mirrorY = false);
 	TransformStruct(int32 zoomX, int32 zoomY, uint32 angle, int32 hotspotX = 0, int32 hotspotY = 0);
+	TransformStruct(int32 numTimesX, int32 numTimesY);
 	TransformStruct();
 
 	Point32 _zoom;   ///< Zoom; 100 = no zoom
@@ -61,6 +62,8 @@ public:
 	TSpriteBlendMode _blendMode;
 	uint32 _rgbaMod;      ///< RGBa
 	Point32 _offset;
+	int32 _numTimesX;
+	int32 _numTimesY;
 
 	bool getMirrorX() const;
 	bool getMirrorY() const;
@@ -72,7 +75,9 @@ public:
 				compare._offset == _offset &&
 				compare._alphaDisable == _alphaDisable  &&
 				compare._rgbaMod == _rgbaMod &&
-				compare._blendMode == _blendMode
+				compare._blendMode == _blendMode &&
+				compare._numTimesX == _numTimesX &&
+				compare._numTimesY == _numTimesY
 			   );
 	}
 
diff --git a/engines/wintermute/ui/ui_tiled_image.cpp b/engines/wintermute/ui/ui_tiled_image.cpp
index de4b86a..7c28c13 100644
--- a/engines/wintermute/ui/ui_tiled_image.cpp
+++ b/engines/wintermute/ui/ui_tiled_image.cpp
@@ -75,8 +75,6 @@ bool UITiledImage::display(int x, int y, int width, int height) {
 	int nuColumns = (width - (_middleLeft.right - _middleLeft.left) - (_middleRight.right - _middleRight.left)) / tileWidth;
 	int nuRows = (height - (_upMiddle.bottom - _upMiddle.top) - (_downMiddle.bottom - _downMiddle.top)) / tileHeight;
 
-	int col, row;
-
 	_gameRef->_renderer->startSpriteBatch();
 
 	// top left/right
@@ -88,27 +86,24 @@ bool UITiledImage::display(int x, int y, int width, int height) {
 	_image->_surface->displayTrans(x + (_upLeft.right - _upLeft.left) + nuColumns * tileWidth, y + (_upMiddle.bottom - _upMiddle.top) + nuRows * tileHeight, _downRight);
 
 	// left/right
-	int yyy = y + (_upMiddle.bottom - _upMiddle.top);
-	for (row = 0; row < nuRows; row++) {
-		_image->_surface->displayTrans(x,                                                       yyy, _middleLeft);
-		_image->_surface->displayTrans(x + (_middleLeft.right - _middleLeft.left) + nuColumns * tileWidth, yyy, _middleRight);
-		yyy += tileWidth;
+	if (nuRows > 0) {
+		int yyy = y + (_upMiddle.bottom - _upMiddle.top);
+		_image->_surface->displayTiled(x, yyy, _middleLeft, 1, nuRows);
+		_image->_surface->displayTiled(x + (_middleLeft.right - _middleLeft.left) + nuColumns * tileWidth, yyy, _middleRight, 1, nuRows);
 	}
 
 	// top/bottom
-	int xxx = x + (_upLeft.right - _upLeft.left);
-	for (col = 0; col < nuColumns; col++) {
-		_image->_surface->displayTrans(xxx, y, _upMiddle);
-		_image->_surface->displayTrans(xxx, y + (_upMiddle.bottom - _upMiddle.top) + nuRows * tileHeight, _downMiddle);
-		xxx += tileWidth;
+	if (nuColumns > 0) {
+		int xxx = x + (_upLeft.right - _upLeft.left);
+		_image->_surface->displayTiled(xxx, y, _upMiddle, nuColumns, 1);
+		_image->_surface->displayTiled(xxx, y + (_upMiddle.bottom - _upMiddle.top) + nuRows * tileHeight, _downMiddle, nuColumns, 1);
 	}
 
 	// tiles
 	if (nuRows > 0 && nuColumns > 0) {
-		yyy = y + (_upMiddle.bottom - _upMiddle.top);
-		xxx = x + (_upLeft.right - _upLeft.left);
-		_image->_surface->displayTrans(xxx, yyy, _middleMiddle);
-		_image->_surface->repeatLastDisplayOp(tileWidth, tileWidth, nuColumns, nuRows);
+		int yyy = y + (_upMiddle.bottom - _upMiddle.top);
+		int xxx = x + (_upLeft.right - _upLeft.left);
+		_image->_surface->displayTiled(xxx, yyy, _middleMiddle, nuColumns, nuRows);
 	}
 
 	_gameRef->_renderer->endSpriteBatch();


Commit: 8e58be7a1d39d8235ddd7beb876de1ff3988fca5
    https://github.com/scummvm/scummvm/commit/8e58be7a1d39d8235ddd7beb876de1ff3988fca5
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-30T13:05:32-07:00

Commit Message:
Merge branch 'master' into wme_rendering

Changed paths:
    base/plugins.h
    common/dcl.cpp
    common/scummsys.h
    configure
    devtools/convbdf.cpp
    devtools/create_mortdat/create_mortdat.cpp
    devtools/create_neverhood/create_neverhood.cpp
    devtools/create_project/create_project.h
    devtools/create_translations/create_translations.cpp
    devtools/create_translations/create_translations.h
    devtools/scumm-md5.txt
    engines/composer/composer.cpp
    engines/fullpipe/motion.cpp
    engines/fullpipe/motion.h
    engines/fullpipe/scenes.cpp
    engines/fullpipe/statics.cpp
    engines/fullpipe/statics.h
    engines/mohawk/cstime_game.cpp
    engines/mohawk/cstime_ui.cpp
    engines/mohawk/cstime_ui.h
    engines/mortevielle/mouse.h
    engines/neverhood/blbarchive.cpp
    engines/neverhood/console.cpp
    engines/neverhood/detection.cpp
    engines/neverhood/menumodule.cpp
    engines/neverhood/modules/module1000.cpp
    engines/neverhood/modules/module1200.h
    engines/neverhood/modules/module1300.cpp
    engines/neverhood/modules/module2800_sprites.cpp
    engines/neverhood/neverhood.h
    engines/neverhood/palette.cpp
    engines/neverhood/resource.cpp
    engines/neverhood/resourceman.cpp
    engines/neverhood/resourceman.h
    engines/neverhood/scene.cpp
    engines/neverhood/scene.h
    engines/neverhood/screen.cpp
    engines/neverhood/sound.cpp
    engines/neverhood/sprite.cpp
    engines/sci/engine/script_patches.cpp
    engines/scumm/scumm-md5.h
    engines/sword25/gfx/animation.cpp
    engines/sword25/gfx/animation.h
    engines/sword25/gfx/animationdescription.cpp
    engines/sword25/gfx/animationdescription.h
    engines/sword25/gfx/animationresource.cpp
    engines/sword25/gfx/animationtemplate.cpp
    engines/sword25/gfx/animationtemplateregistry.cpp
    engines/sword25/gfx/bitmap.h
    engines/sword25/gfx/image/renderedimage.cpp
    engines/sword25/gfx/panel.cpp
    engines/sword25/gfx/panel.h
    engines/sword25/gfx/renderobject.cpp
    engines/sword25/gfx/renderobject.h
    engines/sword25/gfx/renderobjectmanager.cpp
    engines/sword25/gfx/text.cpp
    engines/sword25/gfx/text.h
    engines/sword25/input/inputengine.cpp
    engines/sword25/kernel/inputpersistenceblock.cpp
    engines/sword25/kernel/inputpersistenceblock.h
    engines/sword25/kernel/objectregistry.h
    engines/sword25/kernel/outputpersistenceblock.cpp
    engines/sword25/kernel/outputpersistenceblock.h
    engines/sword25/math/polygon.cpp
    engines/sword25/math/polygon.h
    engines/sword25/math/region.cpp
    engines/sword25/math/regionregistry.cpp
    engines/sword25/math/walkregion.cpp
    engines/sword25/sfx/soundengine.cpp
    engines/sword25/sfx/soundengine.h
    engines/sword25/util/lua/lcode.cpp
    engines/sword25/util/lua/ldebug.cpp
    engines/sword25/util/lua/lfunc.cpp
    engines/sword25/util/lua/lgc.cpp
    engines/sword25/util/lua/llimits.h
    engines/sword25/util/lua/lmem.cpp
    engines/sword25/util/lua/lopcodes.cpp
    engines/sword25/util/lua/lparser.cpp
    engines/sword25/util/lua/lstate.cpp
    engines/sword25/util/lua/lstring.cpp
    engines/sword25/util/lua/lstrlib.cpp
    engines/sword25/util/lua/ltablib.cpp
    engines/tinsel/scene.cpp
    engines/tony/mpal/mpal.cpp
    engines/tsage/core.cpp
    engines/tsage/core.h
    engines/tsage/globals.cpp
    engines/tsage/ringworld2/ringworld2_dialogs.cpp
    engines/tsage/ringworld2/ringworld2_logic.cpp
    engines/tsage/ringworld2/ringworld2_logic.h
    engines/tsage/ringworld2/ringworld2_scenes0.cpp
    engines/tsage/ringworld2/ringworld2_scenes0.h
    engines/tsage/ringworld2/ringworld2_scenes1.cpp
    engines/tsage/ringworld2/ringworld2_scenes2.cpp
    engines/tsage/ringworld2/ringworld2_scenes3.cpp
    engines/tsage/ringworld2/ringworld2_scenes3.h
    engines/tsage/ringworld2/ringworld2_speakers.cpp
    engines/tsage/ringworld2/ringworld2_speakers.h
    engines/tsage/staticres.cpp
    engines/tsage/staticres.h
    engines/wintermute/ad/ad_inventory_box.cpp
    engines/wintermute/ad/ad_item.h
    engines/wintermute/ad/ad_response_box.cpp
    engines/wintermute/ad/ad_scene.cpp
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/font/base_font_truetype.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/graphics/transparent_surface.cpp
    engines/wintermute/graphics/transparent_surface.h
    engines/wintermute/ui/ui_button.cpp
    engines/wintermute/ui/ui_button.h
    engines/wintermute/ui/ui_edit.cpp
    engines/wintermute/ui/ui_edit.h
    engines/wintermute/ui/ui_entity.h
    engines/wintermute/ui/ui_object.cpp
    engines/wintermute/ui/ui_object.h
    engines/wintermute/ui/ui_text.h
    engines/wintermute/ui/ui_tiled_image.h
    engines/wintermute/ui/ui_window.cpp
    engines/wintermute/ui/ui_window.h
    graphics/cursorman.cpp
    graphics/decoders/png.cpp
    gui/recorderdialog.h
    gui/widgets/list.cpp



diff --cc engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index b8e35d9,4a1bfb8..3969162
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@@ -58,9 -59,10 +58,8 @@@ BaseRenderOSystem::BaseRenderOSystem(Ba
  
  	_borderLeft = _borderRight = _borderTop = _borderBottom = 0;
  	_ratioX = _ratioY = 1.0f;
- 	_colorMod = kDefaultRgbaMod;
  	_dirtyRect = nullptr;
  	_disableDirtyRects = false;
 -	_tempDisableDirtyRects = 0;
  	if (ConfMan.hasKey("dirty_rects")) {
  		_disableDirtyRects = !ConfMan.getBool("dirty_rects");
  	}
@@@ -259,11 -278,11 +258,10 @@@ Graphics::PixelFormat BaseRenderOSystem
  
  void BaseRenderOSystem::drawSurface(BaseSurfaceOSystem *owner, const Graphics::Surface *surf, Common::Rect *srcRect, Common::Rect *dstRect, TransformStruct &transform) { 
  
 -	if (_tempDisableDirtyRects || _disableDirtyRects) {
 +	if (_disableDirtyRects) {
  		RenderTicket *ticket = new RenderTicket(owner, surf, srcRect, dstRect, transform);
- 		ticket->_transform._rgbaMod = _colorMod;
  		ticket->_wantsDraw = true;
  		_renderQueue.push_back(ticket);
 -		_previousTicket = ticket;
  		drawFromSurface(ticket);
  		return;
  	}
@@@ -429,11 -518,9 +422,8 @@@ void BaseRenderOSystem::drawTickets() 
  	}
  	g_system->copyRectToScreen((byte *)_renderSurface->getBasePtr(_dirtyRect->left, _dirtyRect->top), _renderSurface->pitch, _dirtyRect->left, _dirtyRect->top, _dirtyRect->width(), _dirtyRect->height());
  
- 	// Revert the colorMod-state.
- 	_colorMod = oldColorMod;
- 
  	it = _renderQueue.begin();
  	// Clean out the old tickets
 -	decrement = 0;
  	while (it != _renderQueue.end()) {
  		if ((*it)->_isValid == false) {
  			RenderTicket *ticket = *it;
diff --cc engines/wintermute/base/gfx/osystem/base_render_osystem.h
index a6634d9,2ae3b6c..de97791
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@@ -143,9 -138,11 +143,8 @@@ private
  	int _borderBottom;
  
  	bool _disableDirtyRects;
 -	uint32 _tempDisableDirtyRects;
 -	bool _spriteBatch;
 -	uint32 _batchNum;
  	float _ratioX;
  	float _ratioY;
- 	uint32 _colorMod;
  	uint32 _clearColor;
  
  	bool _skipThisFrame;
diff --cc engines/wintermute/base/gfx/osystem/render_ticket.cpp
index 11a4921,94512eb..7a926c3
--- a/engines/wintermute/base/gfx/osystem/render_ticket.cpp
+++ b/engines/wintermute/base/gfx/osystem/render_ticket.cpp
@@@ -110,24 -107,12 +110,24 @@@ void RenderTicket::drawToSurface(Graphi
  
  	if (_owner) {
  		if (_transform._alphaDisable) {
- 			src._alphaMode = TransparentSurface::ALPHA_OPAQUE;
+ 			src.setAlphaMode(TransparentSurface::ALPHA_OPAQUE);
  		} else {
- 			src._alphaMode = _owner->getAlphaType();
+ 			src.setAlphaMode(_owner->getAlphaType());
  		}
  	}
 -	src.blit(*_targetSurface, _dstRect.left, _dstRect.top, _transform._flip, &clipRect, _transform._rgbaMod, clipRect.width(), clipRect.height());
 +
 +	int y = _dstRect.top;
 +	int w = _dstRect.width() / _transform._numTimesX;
 +	int h = _dstRect.height() / _transform._numTimesY;
 +
 +	for (int ry = 0; ry < _transform._numTimesY; ++ry) {
 +		int x = _dstRect.left;
 +		for (int rx = 0; rx < _transform._numTimesX; ++rx) {
 +			src.blit(*_targetSurface, x, y, _transform._flip, &clipRect, _transform._rgbaMod, clipRect.width(), clipRect.height());
 +			x += w;
 +		}
 +		y += h;
 +	}
  }
  
  void RenderTicket::drawToSurface(Graphics::Surface *_targetSurface, Common::Rect *dstRect, Common::Rect *clipRect) const {
@@@ -142,52 -127,12 +142,52 @@@
  
  	if (_owner) {
  		if (_transform._alphaDisable) {
- 			src._alphaMode = TransparentSurface::ALPHA_OPAQUE;
+ 			src.setAlphaMode(TransparentSurface::ALPHA_OPAQUE);
  		} else {
- 			src._alphaMode = _owner->getAlphaType();
+ 			src.setAlphaMode(_owner->getAlphaType());
  		}
  	}
 -	src.blit(*_targetSurface, dstRect->left, dstRect->top, _transform._flip, clipRect, _transform._rgbaMod, clipRect->width(), clipRect->height(), _transform._blendMode);
 +
 +	if (_transform._numTimesX * _transform._numTimesY == 1) {
 +
 +		src.blit(*_targetSurface, dstRect->left, dstRect->top, _transform._flip, clipRect, _transform._rgbaMod, clipRect->width(), clipRect->height(), _transform._blendMode);
 +
 +	} else {
 +
 +		// clipRect is a subrect of the full numTimesX*numTimesY rect
 +		Common::Rect subRect;
 +
 +		int y = 0;
 +		int w = getSurface()->w;
 +		int h = getSurface()->h;
 +		assert(w == _dstRect.width() / _transform._numTimesX);
 +		assert(h == _dstRect.height() / _transform._numTimesY);
 +
 +		int basex = dstRect->left - clipRect->left;
 +		int basey = dstRect->top - clipRect->top;
 +
 +		for (int ry = 0; ry < _transform._numTimesY; ++ry) {
 +			int x = 0;
 +			for (int rx = 0; rx < _transform._numTimesX; ++rx) {
 +
 +				subRect.left = x;
 +				subRect.top = y;
 +				subRect.setWidth(w);
 +				subRect.setHeight(w);
 +
 +				if (subRect.intersects(*clipRect)) {
 +					subRect.clip(*clipRect);
 +					subRect.translate(-x, -y);
 +					src.blit(*_targetSurface, basex + x + subRect.left, basey + y + subRect.top, _transform._flip, &subRect, _transform._rgbaMod, subRect.width(), subRect.height(), _transform._blendMode);
 +
 +				}
 +
 +				x += w;
 +			}
 +			y += h;
 +		}
 +	}
 +
  	if (doDelete) {
  		delete clipRect;
  	}


Commit: 2ec84600a9bcfd68366816d9e1f951d500a21637
    https://github.com/scummvm/scummvm/commit/2ec84600a9bcfd68366816d9e1f951d500a21637
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-09-30T23:11:27-07:00

Commit Message:
WINTERMUTE: Fix up doxygen comment

Changed paths:
    engines/wintermute/base/gfx/osystem/base_render_osystem.h



diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index de97791..ab62d24 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -82,13 +82,13 @@ public:
 	void invalidateTicketsFromSurface(BaseSurfaceOSystem *surf);
 	/**
 	 * Insert a new ticket into the queue, adding a dirty rect
-	 * param renderTicket the ticket to be added.
+	 * @param renderTicket the ticket to be added.
 	 */
 	void drawFromTicket(RenderTicket *renderTicket);
 	/**
 	 * Re-insert an existing ticket into the queue, adding a dirty rect
 	 * out-of-order from last draw from the ticket.
-	 * param ticket iterator pointing to the ticket to be added.
+	 * @param ticket iterator pointing to the ticket to be added.
 	 */
 	void drawFromQueuedTicket(const RenderQueueIterator &ticket);
 


Commit: 574a2a64fe23f050032e12d3d85213a656a836be
    https://github.com/scummvm/scummvm/commit/574a2a64fe23f050032e12d3d85213a656a836be
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2013-10-01T06:06:51-07:00

Commit Message:
Merge pull request #402 from wjp/wme_rendering

WINTERMUTE: Speed up rendering

Changed paths:
    engines/wintermute/base/gfx/base_surface.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_surface_osystem.h
    engines/wintermute/base/gfx/osystem/render_ticket.cpp
    engines/wintermute/base/gfx/osystem/render_ticket.h
    engines/wintermute/graphics/transform_struct.cpp
    engines/wintermute/graphics/transform_struct.h
    engines/wintermute/ui/ui_tiled_image.cpp









More information about the Scummvm-git-logs mailing list