Skip to content

Commit

Permalink
ACCESS: Implement dirty rect merging
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Dec 14, 2014
1 parent fda4ef6 commit 831a3f7
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
49 changes: 47 additions & 2 deletions engines/access/screen.cpp
Expand Up @@ -89,13 +89,19 @@ void Screen::setPanel(int num) {
}

void Screen::updateScreen() {
for (uint i = 0; i < _dirtyRects.size(); ++i) {
const Common::Rect &r = _dirtyRects[i];
// Merge the dirty rects
mergeDirtyRects();

// Loop through copying dirty areas to the physical screen
Common::List<Common::Rect>::iterator i;
for (i = _dirtyRects.begin(); i != _dirtyRects.end(); ++i) {
const Common::Rect &r = *i;
const byte *srcP = (const byte *)getBasePtr(r.left, r.top);
g_system->copyRectToScreen(srcP, this->pitch, r.left, r.top,
r.width(), r.height());
}

// Signal the physical screen to update
g_system->updateScreen();
_dirtyRects.clear();
}
Expand Down Expand Up @@ -321,4 +327,43 @@ void Screen::addDirtyRect(const Common::Rect &r) {
assert(r.isValidRect() && r.width() > 0 && r.height() > 0);
}

void Screen::mergeDirtyRects() {
Common::List<Common::Rect>::iterator rOuter, rInner;

// Ensure dirty rect list has at least two entries
rOuter = _dirtyRects.begin();
for (int i = 0; i < 2; ++i, ++rOuter) {
if (rOuter == _dirtyRects.end())
return;
}

// Process the dirty rect list to find any rects to merge
for (rOuter = _dirtyRects.begin(); rOuter != _dirtyRects.end(); ++rOuter) {
rInner = rOuter;
while (++rInner != _dirtyRects.end()) {

if ((*rOuter).intersects(*rInner)) {
// these two rectangles overlap or
// are next to each other - merge them

unionRectangle(*rOuter, *rOuter, *rInner);

// remove the inner rect from the list
_dirtyRects.erase(rInner);

// move back to beginning of list
rInner = rOuter;
}
}
}
}

bool Screen::unionRectangle(Common::Rect &destRect, const Common::Rect &src1, const Common::Rect &src2) {
destRect = src1;
destRect.extend(src2);

return !destRect.isEmpty();
}


} // End of namespace Access
6 changes: 5 additions & 1 deletion engines/access/screen.h
Expand Up @@ -63,9 +63,13 @@ class Screen: public ASurface {
int _startCycle;
int _cycleStart;
int _endCycle;
Common::Array<Common::Rect> _dirtyRects;
Common::List<Common::Rect> _dirtyRects;

void updatePalette();

void mergeDirtyRects();

bool unionRectangle(Common::Rect &destRect, const Common::Rect &src1, const Common::Rect &src2);
public:
int _vesaMode;
int _startColor, _numColors;
Expand Down

0 comments on commit 831a3f7

Please sign in to comment.