diff options
author | Nicola Mettifogo | 2008-12-06 06:17:10 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2008-12-06 06:17:10 +0000 |
commit | 4c377e03390d3d1f4ae2bd33ff4be39962ff2194 (patch) | |
tree | 03f216136d6278a6add483cf215089d9fdba878a /engines/parallaction | |
parent | 3fc72c63d930c07a52c9c34c36eb1ef58271e42a (diff) | |
download | scummvm-rg350-4c377e03390d3d1f4ae2bd33ff4be39962ff2194.tar.gz scummvm-rg350-4c377e03390d3d1f4ae2bd33ff4be39962ff2194.tar.bz2 scummvm-rg350-4c377e03390d3d1f4ae2bd33ff4be39962ff2194.zip |
Fixed positioning of overlayed graphics (dialogues, inventory, labels) in all locations. These items are now all handled in screen coordinates which are translated automatically by the renderer.
svn-id: r35255
Diffstat (limited to 'engines/parallaction')
-rw-r--r-- | engines/parallaction/gfxbase.cpp | 7 | ||||
-rw-r--r-- | engines/parallaction/graphics.cpp | 20 | ||||
-rw-r--r-- | engines/parallaction/graphics.h | 4 | ||||
-rw-r--r-- | engines/parallaction/input.cpp | 6 | ||||
-rw-r--r-- | engines/parallaction/inventory.cpp | 4 |
5 files changed, 27 insertions, 14 deletions
diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp index 5ed5c7a109..d24bfa9cfe 100644 --- a/engines/parallaction/gfxbase.cpp +++ b/engines/parallaction/gfxbase.cpp @@ -174,7 +174,12 @@ void Gfx::drawGfxObject(GfxObj *obj, Graphics::Surface &surf, bool scene) { byte *data; obj->getRect(obj->frame, rect); - rect.translate(obj->x, obj->y); + + int x = obj->x; + if (_overlayMode) { + x += _scrollPos; + } + rect.translate(x, obj->y); data = obj->getData(obj->frame); if (obj->getSize(obj->frame) == obj->getRawSize(obj->frame)) { diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index 74a936bb77..c72c0b7851 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -393,7 +393,6 @@ void Gfx::beginFrame() { } _varAnimRenderMode = getRenderMode("anim_render_mode"); - _varMiscRenderMode = getRenderMode("misc_render_mode"); } int32 Gfx::getRenderMode(const char *type) { @@ -410,6 +409,9 @@ int32 Gfx::getRenderMode(const char *type) { void Gfx::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { if (_doubleBuffering) { + if (_overlayMode) + x += _scrollPos; + byte *dst = (byte*)_backBuffer.getBasePtr(x, y); for (int i = 0; i < h; i++) { memcpy(dst, buf, w); @@ -465,6 +467,10 @@ void Gfx::setScrollPos(int scrollX) { void Gfx::updateScreen() { + // the scene is calculated in game coordinates, so no translation + // is needed + _overlayMode = false; + if (!_skipBackground) { // background may not cover the whole screen, so adjust bulk update size uint w = _backgroundInfo->width; @@ -527,8 +533,9 @@ void Gfx::updateScreen() { unlockScreen(); - _varRenderMode = _varMiscRenderMode; - + // the following items are handled in screen coordinates, so they need translation before + // being drawn + _overlayMode = true; drawInventory(); drawItems(); drawBalloons(); @@ -660,7 +667,7 @@ void Gfx::updateFloatingLabel() { FloatingLabelTraits traits_NS = { Common::Point(16 - r.width()/2, 34), Common::Point(8 - r.width()/2, 21), - 0, 0, _backgroundInfo->width - r.width(), 190 + 0, 0, _vm->_screenWidth - r.width(), 190 }; traits = &traits_NS; } else { @@ -668,13 +675,13 @@ void Gfx::updateFloatingLabel() { FloatingLabelTraits traits_BR = { Common::Point(34 - r.width()/2, 70), Common::Point(16 - r.width()/2, 37), - 0, 0, _backgroundInfo->width - r.width(), 390 + 0, 0, _vm->_screenWidth - r.width(), 390 }; traits = &traits_BR; } Common::Point cursor; - _vm->_input->getAbsoluteCursorPos(cursor); + _vm->_input->getCursorPos(cursor); Common::Point offset = (_vm->_input->_activeItem._id) ? traits->_offsetWithItem : traits->_offsetWithoutItem; _labels[_floatingLabel]->x = CLIP(cursor.x + offset.x, traits->_minX, traits->_maxX); @@ -816,7 +823,6 @@ Gfx::Gfx(Parallaction* vm) : _varBackgroundMode = 1; registerVar("anim_render_mode", 1); - registerVar("misc_render_mode", 1); registerVar("draw_path_zones", 0); diff --git a/engines/parallaction/graphics.h b/engines/parallaction/graphics.h index 662bfc6b59..9b2cfdf479 100644 --- a/engines/parallaction/graphics.h +++ b/engines/parallaction/graphics.h @@ -573,7 +573,6 @@ protected: // frame data stored in programmable variables int32 _varBackgroundMode; // 1 = normal, 2 = only mask int32 _varAnimRenderMode; // 1 = normal, 2 = flat - int32 _varMiscRenderMode; // 1 = normal, 2 = flat int32 _varRenderMode; int32 _varDrawPathZones; // 0 = don't draw, 1 = draw Graphics::Surface _bitmapMask; @@ -591,6 +590,9 @@ protected: int _scrollPos; int _minScroll, _maxScroll; + // overlay mode enables drawing of graphics with automatic screen-to-game coordinate translation + bool _overlayMode; + public: struct Item { diff --git a/engines/parallaction/input.cpp b/engines/parallaction/input.cpp index 8690c4b433..fca1ea790b 100644 --- a/engines/parallaction/input.cpp +++ b/engines/parallaction/input.cpp @@ -325,7 +325,7 @@ bool Input::translateGameInput() { void Input::enterInventoryMode() { Common::Point mousePos; - getAbsoluteCursorPos(mousePos); + getCursorPos(mousePos); bool hitCharacter = _vm->hitZone(kZoneYou, mousePos.x, mousePos.y); if (hitCharacter) { @@ -349,7 +349,7 @@ void Input::enterInventoryMode() { void Input::exitInventoryMode() { // right up hides inventory Common::Point mousePos; - getAbsoluteCursorPos(mousePos); + getCursorPos(mousePos); int pos = _vm->getHoverInventoryItem(mousePos.x, mousePos.y); _vm->highlightInventoryItem(-1); // disable @@ -390,7 +390,7 @@ bool Input::updateInventoryInput() { } Common::Point mousePos; - getAbsoluteCursorPos(mousePos); + getCursorPos(mousePos); int16 _si = _vm->getHoverInventoryItem(mousePos.x, mousePos.y); if (_si != _transCurrentHoverItem) { diff --git a/engines/parallaction/inventory.cpp b/engines/parallaction/inventory.cpp index e1ba5bce34..7b92974205 100644 --- a/engines/parallaction/inventory.cpp +++ b/engines/parallaction/inventory.cpp @@ -180,9 +180,9 @@ void InventoryRenderer::showInventory() { uint16 lines = getNumLines(); Common::Point p; - _vm->_input->getAbsoluteCursorPos(p); + _vm->_input->getCursorPos(p); - _pos.x = CLIP((int)(p.x - (_props->_width / 2)), 0, (int)(_vm->_gfx->_backgroundInfo->width - _props->_width)); + _pos.x = CLIP((int)(p.x - (_props->_width / 2)), 0, (int)(_vm->_screenWidth - _props->_width)); _pos.y = CLIP((int)(p.y - 2 - (lines * _props->_itemHeight)), 0, (int)(_vm->_screenHeight - lines * _props->_itemHeight)); refresh(); |