SHERLOCK: Change the screen _backBuffer to be a pointer

This commit is contained in:
Paul Gilbert 2015-03-28 20:13:57 -04:00
parent 073b7e075c
commit c28416f38e
8 changed files with 77 additions and 57 deletions

View File

@ -30,6 +30,7 @@ Inventory::Inventory(SherlockEngine *vm) : Common::Array<InventoryItem>(), _vm(v
_invGraphicsLoaded = false;
_invIndex = 0;
_holdings = 0;
_oldFlag = 0;
}
Inventory::~Inventory() {
@ -120,8 +121,24 @@ void Inventory::putInv(int slamit) {
// TODO
}
/**
* Put the game into inventory mode and open the interface window.
* The flag parameter specifies the mode:
* 0 = plain inventory mode
* 2 = use inventory mode
* 3 = give inventory mode
* 128 = Draw window in the back buffer, but don't display it
*/
void Inventory::invent(int flag) {
// TODO
Screen &screen = *_vm->_screen;
_oldFlag = 7;
loadInv();
if (flag == 128) {
screen._backBuffer = &screen._backBuffer2;
}
}
void Inventory::invCommands(bool slamIt) {

View File

@ -50,6 +50,7 @@ public:
int _invIndex;
int _holdings;
void freeGraphics();
int _oldFlag;
public:
Inventory(SherlockEngine *vm);
~Inventory();

View File

@ -656,7 +656,7 @@ bool Object::checkEndOfSequence() {
if (seq == 99) {
--_frameNumber;
screen._backBuffer.transBlitFrom(_imageFrame->_frame, _position);
screen._backBuffer1.transBlitFrom(_imageFrame->_frame, _position);
screen._backBuffer2.transBlitFrom(_imageFrame->_frame, _position);
_type = INVALID;
} else {

View File

@ -99,23 +99,23 @@ bool ScalpelEngine::showCityCutscene() {
if (finished) {
ImageFile titleImages("title2.vgs", true);
_screen->_backBuffer.blitFrom(*_screen);
_screen->_backBuffer1.blitFrom(*_screen);
_screen->_backBuffer2.blitFrom(*_screen);
// London, England
_screen->_backBuffer.transBlitFrom(titleImages[0], Common::Point(10, 11));
_screen->_backBuffer1.transBlitFrom(titleImages[0], Common::Point(10, 11));
_screen->randomTransition();
finished = _events->delay(1000, true);
// November, 1888
if (finished) {
_screen->_backBuffer.transBlitFrom(titleImages[1], Common::Point(101, 102));
_screen->_backBuffer1.transBlitFrom(titleImages[1], Common::Point(101, 102));
_screen->randomTransition();
finished = _events->delay(5000, true);
}
// Transition out the title
_screen->_backBuffer.blitFrom(_screen->_backBuffer2);
_screen->_backBuffer1.blitFrom(_screen->_backBuffer2);
_screen->randomTransition();
}
@ -124,21 +124,21 @@ bool ScalpelEngine::showCityCutscene() {
if (finished) {
ImageFile titleImages("title.vgs", true);
_screen->_backBuffer.blitFrom(*_screen);
_screen->_backBuffer1.blitFrom(*_screen);
_screen->_backBuffer2.blitFrom(*_screen);
// The Lost Files of
_screen->_backBuffer.transBlitFrom(titleImages[0], Common::Point(75, 6));
_screen->_backBuffer1.transBlitFrom(titleImages[0], Common::Point(75, 6));
// Sherlock Holmes
_screen->_backBuffer.transBlitFrom(titleImages[1], Common::Point(34, 21));
_screen->_backBuffer1.transBlitFrom(titleImages[1], Common::Point(34, 21));
// copyright
_screen->_backBuffer.transBlitFrom(titleImages[2], Common::Point(4, 190));
_screen->_backBuffer1.transBlitFrom(titleImages[2], Common::Point(4, 190));
_screen->verticalTransition();
finished = _events->delay(4000, true);
if (finished) {
_screen->_backBuffer.blitFrom(_screen->_backBuffer2);
_screen->_backBuffer1.blitFrom(_screen->_backBuffer2);
_screen->randomTransition();
finished = _events->delay(2000);
}

View File

@ -378,13 +378,13 @@ bool Scene::loadScene(const Common::String &filename) {
Common::SeekableReadStream *bgStream = !_lzwMode ? rrmStream :
decompressLZ(*rrmStream, SHERLOCK_SCREEN_WIDTH * SHERLOCK_SCENE_HEIGHT);
bgStream->read(screen._backBuffer.getPixels(), SHERLOCK_SCREEN_WIDTH * SHERLOCK_SCENE_HEIGHT);
bgStream->read(screen._backBuffer1.getPixels(), SHERLOCK_SCREEN_WIDTH * SHERLOCK_SCENE_HEIGHT);
if (_lzwMode)
delete bgStream;
// Set the palette
screen._backBuffer2.blitFrom(screen._backBuffer);
// Backup the image and set the palette
screen._backBuffer2.blitFrom(screen._backBuffer1);
screen.setPalette(screen._cMap);
delete rrmStream;
@ -658,7 +658,7 @@ void Scene::transitionToScene() {
if (screen._fadeStyle)
screen.randomTransition();
else
screen.blitFrom(screen._backBuffer);
screen.blitFrom(screen._backBuffer1);
if (cAnimNum != -1) {
CAnim &c = _cAnim[cAnimNum];
@ -696,7 +696,7 @@ int Scene::toggleObject(const Common::String &name) {
void Scene::updateBackground() {
People &people = *_vm->_people;
Screen &screen = *_vm->_screen;
Surface surface = screen._backBuffer.getSubArea(
Surface surface = screen._backBuffer1.getSubArea(
Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT));
Sprite &player = people[AL];
@ -1055,7 +1055,7 @@ void Scene::doBgAnim() {
Sound &sound = *_vm->_sound;
Talk &talk = *_vm->_talk;
UserInterface &ui = *_vm->_ui;
Surface surface = screen._backBuffer.getSubArea(Common::Rect(0, 0,
Surface surface = screen._backBuffer1.getSubArea(Common::Rect(0, 0,
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT));
int cursorId = events.getCursor();
Common::Point mousePos = events.mousePos();
@ -1126,7 +1126,7 @@ void Scene::doBgAnim() {
if (people[AL]._type == CHARACTER)
screen.restoreBackground(bounds);
else if (people[AL]._type == REMOVE)
screen._backBuffer.blitFrom(screen._backBuffer2, pt, bounds);
screen._backBuffer1.blitFrom(screen._backBuffer2, pt, bounds);
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
@ -1145,7 +1145,7 @@ void Scene::doBgAnim() {
Object &o = _bgShapes[idx];
if (o._type == NO_SHAPE && ((o._flags & 1) == 0)) {
// Restore screen area
screen._backBuffer.blitFrom(screen._backBuffer2, o._position,
screen._backBuffer1.blitFrom(screen._backBuffer2, o._position,
Common::Rect(o._position.x, o._position.y,
o._position.x + o._noShapeSize.x, o._position.y + o._noShapeSize.y));
@ -1191,14 +1191,14 @@ void Scene::doBgAnim() {
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
if (o._type == ACTIVE_BG_SHAPE && o._misc == BEHIND)
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
// Draw all canimations which are behind the person
for (uint idx = 0; idx < _canimShapes.size(); ++idx) {
Object &o = _canimShapes[idx];
if (o._type == ACTIVE_BG_SHAPE && o._misc == BEHIND) {
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
}
@ -1206,14 +1206,14 @@ void Scene::doBgAnim() {
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
if (o._type == ACTIVE_BG_SHAPE && o._misc == NORMAL_BEHIND)
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
// Draw all canimations which are NORMAL and behind the person
for (uint idx = 0; idx < _canimShapes.size(); ++idx) {
Object &o = _canimShapes[idx];
if (o._type == ACTIVE_BG_SHAPE && o._misc == NORMAL_BEHIND) {
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
}
@ -1226,7 +1226,7 @@ void Scene::doBgAnim() {
bool flipped = people[AL]._frameNumber == WALK_LEFT || people[AL]._frameNumber == STOP_LEFT ||
people[AL]._frameNumber == WALK_UPLEFT || people[AL]._frameNumber == STOP_UPLEFT ||
people[AL]._frameNumber == WALK_DOWNRIGHT || people[AL]._frameNumber == STOP_DOWNRIGHT;
screen._backBuffer.transBlitFrom(people[AL]._imageFrame->_frame,
screen._backBuffer1.transBlitFrom(people[AL]._imageFrame->_frame,
Common::Point(tempX, people[AL]._position.y / 100 - people[AL]._imageFrame->_frame.h), flipped);
}
@ -1234,14 +1234,14 @@ void Scene::doBgAnim() {
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == NORMAL_FORWARD)
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
// Draw all static and active canimations that are NORMAL and are in front of the person
for (uint idx = 0; idx < _canimShapes.size(); ++idx) {
Object &o = _canimShapes[idx];
if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == NORMAL_BEHIND) {
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
}
@ -1249,19 +1249,19 @@ void Scene::doBgAnim() {
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == FORWARD)
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
// Draw any active portrait
if (people._portraitLoaded && people._portrait._type == ACTIVE_BG_SHAPE)
screen._backBuffer.transBlitFrom(people._portrait._imageFrame->_frame,
screen._backBuffer1.transBlitFrom(people._portrait._imageFrame->_frame,
people._portrait._position, people._portrait._flags & 2);
// Draw all static and active canimations that are in front of the person
for (uint idx = 0; idx < _canimShapes.size(); ++idx) {
Object &o = _canimShapes[idx];
if ((o._type == ACTIVE_BG_SHAPE || o._type == STATIC_BG_SHAPE) && o._misc == FORWARD) {
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
}
@ -1269,7 +1269,7 @@ void Scene::doBgAnim() {
for (uint idx = 0; idx < _bgShapes.size(); ++idx) {
Object &o = _bgShapes[idx];
if (o._type == NO_SHAPE && (o._flags & 1) == 0)
screen._backBuffer.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
screen._backBuffer1.transBlitFrom(o._imageFrame->_frame, o._position, o._flags & 2);
}
// Bring the newly built picture to the screen

View File

@ -29,8 +29,9 @@
namespace Sherlock {
Screen::Screen(SherlockEngine *vm) : Surface(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT), _vm(vm),
_backBuffer(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT),
_backBuffer2(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT) {
_backBuffer1(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT),
_backBuffer2(SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT),
_backBuffer(&_backBuffer1) {
_transitionSeed = 1;
_fadeStyle = false;
_font = nullptr;
@ -201,7 +202,7 @@ void Screen::randomTransition() {
int offset = _transitionSeed & 65535;
if (offset < (SHERLOCK_SCREEN_WIDTH * SHERLOCK_SCREEN_HEIGHT))
*((byte *)getPixels() + offset) = *((const byte *)_backBuffer.getPixels() + offset);
*((byte *)getPixels() + offset) = *((const byte *)_backBuffer->getPixels() + offset);
if (idx != 0 && (idx % 100) == 0) {
// Ensure there's a full screen dirty rect for the next frame update
@ -214,7 +215,7 @@ void Screen::randomTransition() {
}
// Make sure everything has been transferred
blitFrom(_backBuffer);
blitFrom(_backBuffer1);
}
/**
@ -232,7 +233,7 @@ void Screen::verticalTransition() {
_vm->getRandomNumber(3) + 1;
if (temp) {
blitFrom(_backBuffer, Common::Point(xp, table[xp]),
blitFrom(_backBuffer1, Common::Point(xp, table[xp]),
Common::Rect(xp, table[xp], xp + 1, table[xp] + temp));
table[xp] += temp;
}
@ -251,7 +252,7 @@ void Screen::restoreBackground(const Common::Rect &r) {
tempRect.clip(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT));
if (tempRect.isValidRect())
_backBuffer.blitFrom(_backBuffer2, Common::Point(tempRect.left, tempRect.top), tempRect);
_backBuffer1.blitFrom(_backBuffer2, Common::Point(tempRect.left, tempRect.top), tempRect);
}
}
@ -271,7 +272,7 @@ void Screen::slamRect(const Common::Rect &r) {
tempRect.clip(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
if (tempRect.isValidRect())
blitFrom(_backBuffer, Common::Point(tempRect.left, tempRect.top), tempRect);
blitFrom(*_backBuffer, Common::Point(tempRect.left, tempRect.top), tempRect);
}
}
@ -394,7 +395,7 @@ void Screen::writeString(const Common::String &str, const Common::Point &pt, int
else {
assert(*c > ' ' && *c <= '~');
ImageFrame &frame = (*_font)[*c - 33];
_backBuffer.transBlitFrom(frame, charPos, false, color);
_backBuffer->transBlitFrom(frame, charPos, false, color);
charPos.x += frame._frame.w + 1;
}
}
@ -404,7 +405,7 @@ void Screen::writeString(const Common::String &str, const Common::Point &pt, int
* Fills an area on the back buffer, and then copies it to the screen
*/
void Screen::vgaBar(const Common::Rect &r, int color) {
_backBuffer.fillRect(r, color);
_backBuffer->fillRect(r, color);
slamRect(r);
}

View File

@ -69,7 +69,8 @@ private:
protected:
virtual void addDirtyRect(const Common::Rect &r);
public:
Surface _backBuffer, _backBuffer2;
Surface _backBuffer1, _backBuffer2;
Surface *_backBuffer;
bool _fadeStyle;
byte _cMap[PALETTE_SIZE];
byte _sMap[PALETTE_SIZE];

View File

@ -105,7 +105,7 @@ void UserInterface::drawInterface() {
Screen &screen = *_vm->_screen;
screen._backBuffer2.fillRect(0, INFO_LINE, SHERLOCK_SCREEN_WIDTH, INFO_LINE + 10, INFO_BLACK);
screen._backBuffer.transBlitFrom((*_controlPanel)[0], Common::Point(0, CONTROLS_Y));
screen._backBuffer1.transBlitFrom((*_controlPanel)[0], Common::Point(0, CONTROLS_Y));
screen._backBuffer2.transBlitFrom((*_controlPanel)[0], Common::Point(0, CONTROLS_Y));
}
@ -376,7 +376,7 @@ void UserInterface::depressButton(int num) {
Common::Point pt(MENU_POINTS[num][0], MENU_POINTS[num][1]);
Graphics::Surface &s = (*_controls)[num]._frame;
screen._backBuffer.transBlitFrom(s, pt);
screen._backBuffer1.transBlitFrom(s, pt);
screen.slamArea(pt.x, pt.y, pt.x + s.w, pt.y + s.h);
}
@ -389,7 +389,7 @@ void UserInterface::restoreButton(int num) {
Common::Point pt(MENU_POINTS[num][0], MENU_POINTS[num][1]);
Graphics::Surface &frame = (*_controls)[num]._frame;
screen._backBuffer.blitFrom(screen._backBuffer2, pt,
screen._backBuffer1.blitFrom(screen._backBuffer2, pt,
Common::Rect(pt.x, pt.y, pt.x + 90, pt.y + 19));
screen.slamArea(pt.x, pt.y, pt.x + frame.w, pt.y + frame.h);
@ -443,7 +443,7 @@ void UserInterface::toggleButton(int num) {
Graphics::Surface &s = (*_controls)[num]._frame;
Common::Point pt(MENU_POINTS[num][0], MENU_POINTS[num][1]);
screen._backBuffer.transBlitFrom(s, pt);
screen._backBuffer1.transBlitFrom(s, pt);
screen.slamArea(pt.x, pt.y, pt.x + s.w, pt.y + s.h);
}
} else {
@ -1199,7 +1199,7 @@ void UserInterface::printObjectDesc(const Common::String &str, bool firstTime) {
return;
}
Surface &bb = screen._backBuffer;
Surface &bb = *screen._backBuffer;
if (firstTime) {
// Only draw the border on the first call
_infoFlag = true;
@ -1286,10 +1286,10 @@ void UserInterface::printObjectDesc(const Common::String &str, bool firstTime) {
Surface tempSurface(SHERLOCK_SCREEN_WIDTH,
(SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y));
Common::Rect r(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT);
tempSurface.blitFrom(screen._backBuffer, Common::Point(0, 0), r);
tempSurface.blitFrom(screen._backBuffer1, Common::Point(0, 0), r);
// Remove drawn window with original user interface
screen._backBuffer.blitFrom(screen._backBuffer2,
screen._backBuffer1.blitFrom(screen._backBuffer2,
Common::Point(0, CONTROLS_Y), r);
// Display the window gradually on-screen
@ -1318,7 +1318,7 @@ void UserInterface::makeButton(const Common::Rect &bounds, int textX,
const Common::String &str) {
Screen &screen = *_vm->_screen;
Surface &bb = screen._backBuffer;
Surface &bb = *screen._backBuffer;
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.right, bounds.top + 1), BUTTON_TOP);
bb.fillRect(Common::Rect(bounds.left, bounds.top, bounds.left + 1, bounds.bottom), BUTTON_TOP);
bb.fillRect(Common::Rect(bounds.right - 1, bounds.top, bounds.right, bounds.bottom), BUTTON_BOTTOM);
@ -1343,7 +1343,7 @@ void UserInterface::summonWindow(const Surface &bgSurface) {
// Gradually slide up the display of the window
for (int idx = 1; idx <= bgSurface.h; idx += 2) {
screen._backBuffer.blitFrom(bgSurface, Common::Point(0, SHERLOCK_SCREEN_HEIGHT - idx),
screen._backBuffer->blitFrom(bgSurface, Common::Point(0, SHERLOCK_SCREEN_HEIGHT - idx),
Common::Rect(0, 0, bgSurface.w, idx));
screen.slamRect(Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - idx,
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
@ -1352,7 +1352,7 @@ void UserInterface::summonWindow(const Surface &bgSurface) {
}
// Final display of the entire window
screen._backBuffer.blitFrom(bgSurface, Common::Point(0, CONTROLS_Y),
screen._backBuffer->blitFrom(bgSurface, Common::Point(0, CONTROLS_Y),
Common::Rect(0, 0, bgSurface.w, bgSurface.h));
screen.slamArea(0, CONTROLS_Y, bgSurface.w, bgSurface.h);
@ -1374,13 +1374,13 @@ void UserInterface::banishWindow(bool flag) {
if (_windowStyle) {
for (int idx = 2; idx < (SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y); idx += 2) {
// Shift the window down by 2 lines
byte *pSrc = (byte *)screen._backBuffer.getBasePtr(0, CONTROLS_Y + idx - 2);
byte *pSrcEnd = (byte *)screen._backBuffer.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT - 2);
byte *pDest = (byte *)screen._backBuffer.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT);
byte *pSrc = (byte *)screen._backBuffer1.getBasePtr(0, CONTROLS_Y + idx - 2);
byte *pSrcEnd = (byte *)screen._backBuffer1.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT - 2);
byte *pDest = (byte *)screen._backBuffer1.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT);
Common::copy_backward(pSrc, pSrcEnd, pDest);
// Restore lines from the ui in the secondary back buffer
screen._backBuffer.blitFrom(screen._backBuffer2,
screen._backBuffer1.blitFrom(screen._backBuffer2,
Common::Point(0, CONTROLS_Y),
Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, CONTROLS_Y + idx));
@ -1390,14 +1390,14 @@ void UserInterface::banishWindow(bool flag) {
}
// Restore final two old lines
screen._backBuffer.blitFrom(screen._backBuffer2,
screen._backBuffer1.blitFrom(screen._backBuffer2,
Common::Point(0, SHERLOCK_SCREEN_HEIGHT - 2),
Common::Rect(0, SHERLOCK_SCREEN_HEIGHT - 2,
SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
screen.slamArea(0, SHERLOCK_SCREEN_HEIGHT - 2, SHERLOCK_SCREEN_WIDTH, 2);
} else {
// Restore old area to completely erase window
screen._backBuffer.blitFrom(screen._backBuffer2,
screen._backBuffer1.blitFrom(screen._backBuffer2,
Common::Point(0, CONTROLS_Y),
Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT));
screen.slamRect(Common::Rect(0, CONTROLS_Y, SHERLOCK_SCREEN_WIDTH,
@ -1408,7 +1408,7 @@ void UserInterface::banishWindow(bool flag) {
for (int idx = 1; idx < (SHERLOCK_SCREEN_HEIGHT - CONTROLS_Y1); idx += 2) {
byte *pSrc = (byte *)screen._backBuffer2.getBasePtr(0, CONTROLS_Y1);
byte *pSrcEnd = (byte *)screen._backBuffer2.getBasePtr(0, CONTROLS_Y1 + idx);
byte *pDest = (byte *)screen._backBuffer.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT - idx);
byte *pDest = (byte *)screen._backBuffer1.getBasePtr(0, SHERLOCK_SCREEN_HEIGHT - idx);
Common::copy(pSrc, pSrcEnd, pDest);
screen.slamArea(0, SHERLOCK_SCREEN_HEIGHT - idx, SHERLOCK_SCREEN_WIDTH,