diff options
author | Torbjörn Andersson | 2004-05-09 13:24:07 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2004-05-09 13:24:07 +0000 |
commit | 577600537c2e3cfdacb4e53ccfdab7e06b55a0ed (patch) | |
tree | 210092da6066bd3483978cd60113637d600c506c /sword2/driver | |
parent | ed9bac56b00e5a9f81588c5436a473c95a39cf6d (diff) | |
download | scummvm-rg350-577600537c2e3cfdacb4e53ccfdab7e06b55a0ed.tar.gz scummvm-rg350-577600537c2e3cfdacb4e53ccfdab7e06b55a0ed.tar.bz2 scummvm-rg350-577600537c2e3cfdacb4e53ccfdab7e06b55a0ed.zip |
When drawing lines and points, mark the corresponding screen area as dirty
so that it gets properly redrawn. Only the debugging code uses these
drawing primitives, so it's no big deal, but it's still the right thing to
do.
svn-id: r13811
Diffstat (limited to 'sword2/driver')
-rw-r--r-- | sword2/driver/d_draw.h | 1 | ||||
-rw-r--r-- | sword2/driver/rdwin.cpp | 15 | ||||
-rw-r--r-- | sword2/driver/render.cpp | 26 | ||||
-rw-r--r-- | sword2/driver/sprite.cpp | 12 |
4 files changed, 27 insertions, 27 deletions
diff --git a/sword2/driver/d_draw.h b/sword2/driver/d_draw.h index 326862772e..1177b3e6b7 100644 --- a/sword2/driver/d_draw.h +++ b/sword2/driver/d_draw.h @@ -193,6 +193,7 @@ public: int32 setMenuIcon(uint8 menu, uint8 pocket, byte *icon); void closeMenuImmediately(void); + void markAsDirty(int16 x0, int16 y0, int16 x1, int16 y1); void updateDisplay(bool redrawScene = true); void setWindowName(const char *windowName); void setNeedFullRedraw(void); diff --git a/sword2/driver/rdwin.cpp b/sword2/driver/rdwin.cpp index 025b99b164..e6bdc9cccd 100644 --- a/sword2/driver/rdwin.cpp +++ b/sword2/driver/rdwin.cpp @@ -76,6 +76,21 @@ void Graphics::setNeedFullRedraw(void) { } /** + * Mark an area of the screen as dirty, first generation. + */ + +void Graphics::markAsDirty(int16 x0, int16 y0, int16 x1, int16 y1) { + int16 gridX0 = x0 / CELLWIDE; + int16 gridY0 = y0 / CELLDEEP; + int16 gridX1 = x1 / CELLWIDE; + int16 gridY1 = y1 / CELLDEEP; + + for (int16 i = gridY0; i <= gridY1; i++) + for (int16 j = gridX0; j <= gridX1; j++) + _dirtyGrid[i * _gridWide + j] = 2; +} + +/** * This function has two purposes: It redraws the scene, and it handles input * events, palette fading, etc. It should be called at a high rate (> 20 per * second), but the scene is usually only redrawn about 12 times per second, diff --git a/sword2/driver/render.cpp b/sword2/driver/render.cpp index a6d83e615c..e76bdf7369 100644 --- a/sword2/driver/render.cpp +++ b/sword2/driver/render.cpp @@ -338,8 +338,10 @@ void Graphics::plotPoint(uint16 x, uint16 y, uint8 colour) { newx = x - _scrollX; newy = y - _scrollY; - if (newx >= 0 && newx < RENDERWIDE && newy >= 0 && newy < RENDERDEEP) + if (newx >= 0 && newx < RENDERWIDE && newy >= 0 && newy < RENDERDEEP) { buf[newy * RENDERWIDE + newx] = colour; + markAsDirty(newx, newy + 40, newx, newy + 40); + } } /** @@ -366,17 +368,13 @@ void Graphics::drawLine(int16 x0, int16 y0, int16 x1, int16 y1, uint8 colour) { x0 -= _scrollX; y0 -= _scrollY; - // Lock the surface if we're rendering to the back buffer. + markAsDirty(MIN(x0, x1), MIN(y0, y1) + 40, MAX(x0, x1), MAX(y0, y1) + 40); - //Make sure we're going from left to right + // Make sure we're going from left to right if (x1 < x0) { - x = x1; - x1 = x0; - x0 = x; - y = y1; - y1 = y0; - y0 = y; + SWAP(x0, x1); + SWAP(y0, y1); } dx = x1 - x0; @@ -443,15 +441,11 @@ void Graphics::drawLine(int16 x0, int16 y0, int16 x1, int16 y1, uint8 colour) { } } } else { - //OK, y is now going to be the single increment. + // OK, y is now going to be the single increment. // Ensure the line is going top to bottom if (y1 < y0) { - x = x1; - x1 = x0; - x0 = x; - y = y1; - y1 = y0; - y0 = y; + SWAP(x0, x1); + SWAP(y0, y1); } dx = x1 - x0; dy = y1 - y0; diff --git a/sword2/driver/sprite.cpp b/sword2/driver/sprite.cpp index 597d63f712..776c1d9d55 100644 --- a/sword2/driver/sprite.cpp +++ b/sword2/driver/sprite.cpp @@ -613,17 +613,7 @@ int32 Graphics::drawSprite(SpriteInfo *s) { if (freeSprite) free(sprite); - // Mark the approximate area of the sprite as "dirty", first generation - - int16 gridX1 = rd.left / CELLWIDE; - int16 gridY1 = rd.top / CELLDEEP; - int16 gridX2 = (rd.right - 1) / CELLWIDE; - int16 gridY2 = (rd.bottom - 1) / CELLDEEP; - - for (i = gridY1; i <= gridY2; i++) - for (j = gridX1; j <= gridX2; j++) - _dirtyGrid[i * _gridWide + j] = 2; - + markAsDirty(rd.left, rd.top, rd.right - 1, rd.bottom - 1); return RD_OK; } |