aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorBastien Bouclet2010-11-29 20:53:00 +0000
committerBastien Bouclet2010-11-29 20:53:00 +0000
commitb4913548d0b4e9e510653bf72aadd1e856663788 (patch)
tree1eafe23db987d79702b7a7f8777262995b7eb203 /engines
parent291bea1858c12b8557aeb46e6f57dc701293c956 (diff)
downloadscummvm-rg350-b4913548d0b4e9e510653bf72aadd1e856663788.tar.gz
scummvm-rg350-b4913548d0b4e9e510653bf72aadd1e856663788.tar.bz2
scummvm-rg350-b4913548d0b4e9e510653bf72aadd1e856663788.zip
MOHAWK: Implement sliders
svn-id: r54606
Diffstat (limited to 'engines')
-rw-r--r--engines/mohawk/myst_areas.cpp137
-rw-r--r--engines/mohawk/myst_areas.h11
2 files changed, 146 insertions, 2 deletions
diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp
index 665063403f..122fe6e537 100644
--- a/engines/mohawk/myst_areas.cpp
+++ b/engines/mohawk/myst_areas.cpp
@@ -26,6 +26,7 @@
#include "mohawk/graphics.h"
#include "mohawk/myst_areas.h"
#include "mohawk/myst_scripts.h"
+#include "mohawk/sound.h"
#include "mohawk/video.h"
namespace Mohawk {
@@ -463,6 +464,7 @@ MystResourceType10::MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableRe
debugC(kDebugResource, "\tdrag sound : %d", _dragSound);
+ _background = 0;
_sliderWidth = _rect.right - _rect.left;
_sliderHeigth = _rect.bottom - _rect.top;
@@ -470,7 +472,10 @@ MystResourceType10::MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableRe
}
MystResourceType10::~MystResourceType10() {
-
+ if (_background) {
+ _background->free();
+ delete _background;
+ }
}
void MystResourceType10::setStep(uint16 step) {
@@ -480,6 +485,136 @@ void MystResourceType10::setStep(uint16 step) {
_subImages[0].rect.bottom = 333 - _rect.top - 1;
}
+Common::Rect MystResourceType10::boundingBox() {
+ Common::Rect bb;
+
+ bb.top = _rect.top;
+ bb.bottom = _rect.bottom;
+ bb.left = _rect.left;
+ bb.right = _rect.right;
+
+ if (_flagHV & 1) {
+ bb.left = _minH - _sliderWidth / 2;
+ bb.right = _maxH + _sliderWidth / 2;
+ }
+
+ if (_flagHV & 2) {
+ bb.top = _minV - _sliderHeigth / 2;
+ bb.bottom = _maxV + _sliderHeigth / 2;
+ }
+
+ return bb;
+}
+
+void MystResourceType10::drawDataToScreen() {
+ // Save the background to be able to restore it
+ if (!_background) {
+ Common::Rect bb = boundingBox();
+ Graphics::PixelFormat pixelFormat = _vm->_system->getScreenFormat();
+
+ _background = new Graphics::Surface();
+ _background->create(bb.width(), bb.height(), pixelFormat.bytesPerPixel);
+ Graphics::Surface *screen = _vm->_system->lockScreen();
+
+ for (uint16 i = 0; i < bb.height(); i++)
+ memcpy(_background->getBasePtr(0, i), screen->getBasePtr(bb.left, bb.top + i), bb.width() * _background->bytesPerPixel);
+
+ _vm->_system->unlockScreen();
+ }
+
+
+ MystResourceType8::drawDataToScreen();
+}
+
+void MystResourceType10::handleMouseDown(Common::Point *mouse) {
+ updatePosition(mouse);
+
+ MystResourceType8::handleMouseDown(mouse);
+
+ // Restore background
+ Common::Rect bb = boundingBox();
+ _vm->_system->copyRectToScreen((byte *)_background->getBasePtr(0, 0), _background->pitch, bb.left, bb.top, bb.width(), bb.height());
+
+ // Draw slider
+ drawConditionalDataToScreen(2);
+}
+
+void MystResourceType10::handleMouseUp(Common::Point *mouse) {
+ updatePosition(mouse);
+
+ MystResourceType8::handleMouseUp(mouse);
+
+ // Restore background
+ Common::Rect bb = boundingBox();
+ _vm->_system->copyRectToScreen((byte *)_background->getBasePtr(0, 0), _background->pitch, bb.left, bb.top, bb.width(), bb.height());
+
+ // Draw slider
+ drawConditionalDataToScreen(1);
+}
+
+void MystResourceType10::handleMouseDrag(Common::Point *mouse) {
+ updatePosition(mouse);
+
+ MystResourceType8::handleMouseDrag(mouse);
+
+ // Restore background
+ Common::Rect bb = boundingBox();
+ _vm->_system->copyRectToScreen((byte *)_background->getBasePtr(0, 0), _background->pitch, bb.left, bb.top, bb.width(), bb.height());
+
+ // Draw slider
+ drawConditionalDataToScreen(2);
+}
+
+void MystResourceType10::updatePosition(Common::Point *mouse) {
+ bool positionChanged = false;
+
+ setPositionClipping(mouse, mouse);
+
+ if (_flagHV & 2) {
+ if (_stepV) {
+ uint16 center = _minV + _stepV * (mouse->y - _minV) / _stepV;
+ uint16 top = center - _sliderHeigth / 2;
+ if (_rect.top != top) {
+ positionChanged = true;
+ _pos.y = center;
+ _rect.top = top;
+ }
+ } else {
+ positionChanged = true;
+ _pos.y = mouse->y;
+ _rect.top = mouse->y - _sliderHeigth / 2;
+ }
+ if (positionChanged) {
+ _rect.bottom = _rect.top + _sliderHeigth;
+ _subImages[0].rect.top = 333 - _rect.bottom - 1;
+ _subImages[0].rect.bottom = 333 - _rect.top - 1;
+ }
+ }
+
+ if (_flagHV & 1) {
+ if (_stepH) {
+ uint16 center = _minH + _stepH * (mouse->x - _minH) / _stepH;
+ uint16 left = center - _sliderWidth / 2;
+ if (_rect.left != left) {
+ positionChanged = true;
+ _pos.x = center;
+ _rect.left = left;
+ }
+ } else {
+ positionChanged = true;
+ _pos.x = mouse->x;
+ _rect.left = mouse->x - _sliderWidth / 2;
+ }
+ if (positionChanged) {
+ _rect.right = _rect.left + _sliderWidth;
+ }
+ }
+
+ if (positionChanged && _dragSound) {
+ _vm->_sound->playSound(_dragSound);
+ }
+}
+
MystResourceType11::MystResourceType11(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent) : MystResourceType8(vm, rlstStream, parent) {
_flagHV = rlstStream->readUint16LE();
_minH = rlstStream->readUint16LE();
diff --git a/engines/mohawk/myst_areas.h b/engines/mohawk/myst_areas.h
index 61a8c00281..9f4b9bca16 100644
--- a/engines/mohawk/myst_areas.h
+++ b/engines/mohawk/myst_areas.h
@@ -117,7 +117,7 @@ class MystResourceType8 : public MystResourceType7 {
public:
MystResourceType8(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent);
virtual ~MystResourceType8();
- void drawDataToScreen();
+ virtual void drawDataToScreen();
void drawConditionalDataToScreen(uint16 state);
uint16 getType8Var();
@@ -169,12 +169,21 @@ public:
MystResourceType10(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent);
virtual ~MystResourceType10();
+ void drawDataToScreen();
+ void handleMouseDown(Common::Point *mouse);
+ void handleMouseUp(Common::Point *mouse);
+ void handleMouseDrag(Common::Point *mouse);
void setStep(uint16 step);
protected:
+ Common::Rect boundingBox();
+ void updatePosition(Common::Point *mouse);
+
uint16 _dragSound;
uint16 _sliderWidth;
uint16 _sliderHeigth;
+
+ Graphics::Surface *_background;
};
class MystResourceType12 : public MystResourceType11 {