[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.282,2.283

Max Horn fingolfin at users.sourceforge.net
Tue Aug 10 16:54:02 CEST 2004


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30853

Modified Files:
	gfx.cpp 
Log Message:
Perform proper clipping (this fixes some graphic regressions in The Dig)

Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.282
retrieving revision 2.283
diff -u -d -r2.282 -r2.283
--- gfx.cpp	8 Aug 2004 22:09:49 -0000	2.282
+++ gfx.cpp	10 Aug 2004 23:51:52 -0000	2.283
@@ -415,7 +415,6 @@
  * specified by top/bottom coordinate in the virtual screen.
  */
 void Gdi::drawStripToScreen(VirtScreen *vs, int x, int width, int top, int bottom) {
-	const int height = bottom - top;
 
 	if (bottom <= top)
 		return;
@@ -424,23 +423,28 @@
 		return;
 
 	assert(top >= 0 && bottom <= vs->height);	// Paranoia checks
-
-	// We don't clip height and width here, rather we rely on the backend to
-	// perform any needed clipping.
-	const int y = vs->topline + top - _vm->_screenTop;
-	const byte *src = vs->screenPtr + (x + vs->xstart) + top * vs->width;
-
+	assert(x >= 0 && width <= vs->width);
 	assert(_textSurface.pixels);
 	assert(_compositeBuf);
-	Common::Rect r(x, y, x+width, y+height);
-	r.clip(Common::Rect(_textSurface.w, _textSurface.h));
-	// TODO: is this enough clipping?
 
+	// Clip to the visible part of the scene
+	if (top < _vm->_screenTop)
+		top = _vm->_screenTop;
+	if (bottom > _vm->_screenTop + _vm->_screenHeight)
+		bottom = _vm->_screenTop + _vm->_screenHeight;
+
+	// Convert the vertical coordinates to real screen coords
+	const int y = vs->topline + top - _vm->_screenTop;
+	const int height = bottom - top;
+	
+	// Compute screen etc. buffer pointers 
+	const byte *src = vs->screenPtr + (x + vs->xstart) + top * vs->width;
 	byte *dst = _compositeBuf + x + y * _vm->_screenWidth;
 	const byte *text = (byte *)_textSurface.pixels + x + y * _textSurface.pitch;
 
-	for (int h = 0; h < r.height(); ++h) {
-		for (int w = 0; w < r.width(); ++w) {
+	// Compose the text over the game graphics
+	for (int h = 0; h < height; ++h) {
+		for (int w = 0; w < width; ++w) {
 			if (text[w] == CHARSET_MASK_TRANSPARENCY) 
 				dst[w] = src[w];
 			else
@@ -451,6 +455,7 @@
 		text += _textSurface.pitch;
 	}
 	
+	// Finally blit the whole thing to the screen
 	_vm->_system->copyRectToScreen(_compositeBuf + x + y * _vm->_screenWidth, _vm->_screenWidth, x, y, width, height);
 }
 





More information about the Scummvm-git-logs mailing list