aboutsummaryrefslogtreecommitdiff
path: root/engines/pink
diff options
context:
space:
mode:
authorAndrei Prykhodko2018-07-29 21:22:01 +0300
committerAndrei Prykhodko2018-07-29 21:23:04 +0300
commitbb732cd9c8675a4ea09bd6f2e491e4ea471a1c1d (patch)
tree321912f0e63e4aa25b87fa7a37bb0d7981ddae9c /engines/pink
parent75eceedfa515c652d0698de11a9f605fe23c336d (diff)
downloadscummvm-rg350-bb732cd9c8675a4ea09bd6f2e491e4ea471a1c1d.tar.gz
scummvm-rg350-bb732cd9c8675a4ea09bd6f2e491e4ea471a1c1d.tar.bz2
scummvm-rg350-bb732cd9c8675a4ea09bd6f2e491e4ea471a1c1d.zip
PINK: add partial implementation of ActionText
Diffstat (limited to 'engines/pink')
-rw-r--r--engines/pink/director.cpp30
-rw-r--r--engines/pink/director.h6
-rw-r--r--engines/pink/objects/actions/action_text.cpp88
-rw-r--r--engines/pink/objects/actions/action_text.h22
4 files changed, 137 insertions, 9 deletions
diff --git a/engines/pink/director.cpp b/engines/pink/director.cpp
index 0bd707b268..eef250629e 100644
--- a/engines/pink/director.cpp
+++ b/engines/pink/director.cpp
@@ -20,13 +20,15 @@
*
*/
-#include "graphics/managed_surface.h"
+#include "graphics/macgui/macfontmanager.h"
+#include "graphics/macgui/mactext.h"
#include "graphics/palette.h"
#include "pink/cel_decoder.h"
#include "pink/director.h"
#include "pink/objects/actions/action_sound.h"
#include "pink/objects/actions/action_cel.h"
+#include "pink/objects/actions/action_text.h"
#include "pink/objects/actors/actor.h"
#include "graphics/macgui/macmenu.h"
@@ -78,7 +80,7 @@ static const Graphics::MacMenuData menuSubItems[] = {
*/
Director::Director()
- : _surface(640, 480) {
+ : _surface(640, 480), _textRendered(false) {
_wm.setScreen(&_surface);
_wm.setMode(Graphics::kWMModeNoDesktop | Graphics::kWMModeAutohideMenu | Graphics::kWMModalMenuMode);
_wm.setMenuHotzone(Common::Rect(0, 0, 640, 23));
@@ -116,6 +118,19 @@ void Director::setPalette(const byte *palette) {
_wm.passPalette(palette, 256);
}
+void Director::addTextAction(ActionText *txt) {
+ _textActions.push_back(txt);
+ _textRendered = false;
+}
+
+void Director::removeTextAction(ActionText *action) {
+ for (uint i = 0; i < _textActions.size(); ++i) {
+ if (_textActions[i] == action) {
+ _textActions.remove_at(i);
+ break;
+ }
+ }
+}
void Director::addSprite(ActionCEL *sprite) {
_sprites.push_back(sprite);
@@ -188,13 +203,20 @@ Actor *Director::getActorByPoint(const Common::Point point) {
}
void Director::draw() {
- if (!_dirtyRects.empty()) {
+ if (!_dirtyRects.empty() || !_textRendered) {
mergeDirtyRects();
for (uint i = 0; i < _dirtyRects.size(); ++i) {
drawRect(_dirtyRects[i]);
}
+ if (!_textRendered) {
+ _textRendered = true;
+ for (uint i = 0; i < _textActions.size(); ++i) {
+ _textActions[i]->draw(&_surface);
+ }
+ }
+
_dirtyRects.resize(0);
_surface.update();
} else
@@ -253,4 +275,4 @@ void Director::drawRect(const Common::Rect &rect) {
}
}
-}
+} // End of namespace Pink
diff --git a/engines/pink/director.h b/engines/pink/director.h
index 7a5b57c90e..7273b6521b 100644
--- a/engines/pink/director.h
+++ b/engines/pink/director.h
@@ -43,6 +43,7 @@ namespace Pink {
class Actor;
class ActionCEL;
class ActionSound;
+class ActionText;
class Director {
public:
@@ -53,6 +54,9 @@ public:
void setPalette(const byte *palette);
+ void addTextAction(ActionText *action);
+ void removeTextAction(ActionText *action);
+
void addSprite(ActionCEL *sprite);
void removeSprite(ActionCEL *sprite);
@@ -85,6 +89,8 @@ private:
Common::Array<ActionCEL *> _sprites;
Common::Array<ActionCEL *> _savedSprites;
Common::Array<ActionSound *> _sounds;
+ Common::Array<ActionText *> _textActions;
+ bool _textRendered;
};
} // End of namespace Pink
diff --git a/engines/pink/objects/actions/action_text.cpp b/engines/pink/objects/actions/action_text.cpp
index 1af06d5e82..174ad8c65f 100644
--- a/engines/pink/objects/actions/action_text.cpp
+++ b/engines/pink/objects/actions/action_text.cpp
@@ -21,15 +21,37 @@
*/
#include "common/debug.h"
+#include "common/substream.h"
#include "pink/archive.h"
#include "pink/director.h"
#include "pink/pink.h"
#include "pink/objects/actors/actor.h"
#include "pink/objects/actions/action_text.h"
+#include "pink/objects/pages/page.h"
namespace Pink {
+ActionText::ActionText() {
+ _txtWnd = nullptr;
+
+ _xLeft = _xRight = 0;
+ _yTop = _yBottom = 0;
+
+ _centered = 0;
+ _scrollBar = 0;
+
+ _textRGB = 0;
+ _backgroundRGB = 0;
+
+ _textColorIndex = 0;
+ _backgroundColorIndex = 0;
+}
+
+ActionText::~ActionText() {
+ end();
+}
+
void ActionText::deserialize(Archive &archive) {
Action::deserialize(archive);
_fileName = archive.readString();
@@ -41,22 +63,82 @@ void ActionText::deserialize(Archive &archive) {
_centered = archive.readDWORD();
_scrollBar = archive.readDWORD();
- _textColor = archive.readDWORD();
- _backgroundColor = archive.readDWORD();
+ _textRGB = archive.readDWORD();
+ _backgroundRGB = archive.readDWORD();
}
void ActionText::toConsole() {
debugC(6, kPinkDebugLoadingObjects, "\tActionText: _name = %s, _fileName = %s, "
"_xLeft = %u, _yTop = %u, _xRight = %u, _yBottom = %u _centered = %u, _scrollBar = %u, _textColor = %u _backgroundColor = %u",
- _name.c_str(), _fileName.c_str(), _xLeft, _yTop, _xRight, _yBottom, _centered, _scrollBar, _textColor, _backgroundColor);
+ _name.c_str(), _fileName.c_str(), _xLeft, _yTop, _xRight, _yBottom, _centered, _scrollBar, _textRGB, _backgroundRGB);
}
void ActionText::start() {
+ findColorsInPalette();
+ Director *director = _actor->getPage()->getGame()->getDirector();
+ Graphics::TextAlign align = _centered ? Graphics::kTextAlignCenter : Graphics::kTextAlignLeft;
+
+ if (_scrollBar) {
+ Graphics::MacFont *font = new Graphics::MacFont;
+ _txtWnd = director->getWndManager().addTextWindow(font, _textColorIndex, _backgroundColorIndex,
+ _xRight - _xLeft, align, nullptr, false);
+ _txtWnd->move(_xLeft, _yTop);
+ _txtWnd->resize(_xRight - _xLeft, _yBottom - _yTop);
+ _txtWnd->appendText("Testing ActionText", font);
+ } else {
+ director->addTextAction(this);
+ }
}
void ActionText::end() {
+ Director *director = _actor->getPage()->getGame()->getDirector();
+ if (_scrollBar && _txtWnd) {
+ director->getWndManager().removeWindow(_txtWnd);
+ _txtWnd = nullptr;
+ } else {
+ director->removeTextAction(this);
+ }
+}
+
+void ActionText::draw(Graphics::ManagedSurface *surface) {
+ // not working
+ /*Graphics::TextAlign alignment = _centered ? Graphics::kTextAlignCenter : Graphics::kTextAlignLeft;
+ Graphics::MacFont *font = new Graphics::MacFont;
+ Director *director = _actor->getPage()->getGame()->getDirector();
+ Graphics::MacText text("", &director->getWndManager(), font, _textColorIndex, _backgroundColorIndex, _xRight - _xLeft, alignment);
+ text.appendText("TESTING", font->getId(), font->getSize(), font->getSlant(), 0);
+ text.draw(surface, _xLeft, _yTop, _xRight - _xLeft, _yBottom - _yTop, 0, 0);*/
+}
+
+#define RED(rgb) ((rgb) & 0xFF)
+#define GREEN(rgb) (((rgb) >> 8) & 0xFF)
+#define BLUE(rgb) (((rgb) >> 16) & 0xFF)
+
+static uint findBestColor(byte *palette, uint32 rgb) {
+ uint bestColor = 0;
+ double min = 0xFFFFFFFF;
+ for (uint i = 0; i < 256; ++i) {
+ int rmean = (*(palette + 3 * i + 0) + RED(rgb)) / 2;
+ int r = *(palette + 3 * i + 0) - RED(rgb);
+ int g = *(palette + 3 * i + 1) - GREEN(rgb);
+ int b = *(palette + 3 * i + 2) - BLUE(rgb);
+
+ double dist = sqrt((((512 + rmean) * r * r) >> 8) + 4 * g * g + (((767 - rmean) * b * b) >> 8));
+ if (min > dist) {
+ bestColor = i;
+ min = dist;
+ }
+ }
+ return bestColor;
+}
+
+void ActionText::findColorsInPalette() {
+ byte palette[256 * 3];
+ g_system->getPaletteManager()->grabPalette(palette, 0, 255);
+ _textColorIndex = findBestColor(palette, _textRGB);
+ _backgroundColorIndex = findBestColor(palette, _backgroundRGB);
}
} // End of namespace Pink
diff --git a/engines/pink/objects/actions/action_text.h b/engines/pink/objects/actions/action_text.h
index bcf0a3520f..6a3a96642d 100644
--- a/engines/pink/objects/actions/action_text.h
+++ b/engines/pink/objects/actions/action_text.h
@@ -23,12 +23,20 @@
#ifndef PINK_ACTION_TEXT_H
#define PINK_ACTION_TEXT_H
+#include "common/events.h"
+
+#include "graphics/macgui/macwindow.h"
+#include "graphics/macgui/macmenu.h"
+#include "graphics/macgui/mactextwindow.h"
+
#include "pink/objects/actions/action.h"
namespace Pink {
class ActionText : public Action {
public:
+ ActionText();
+ ~ActionText() override;
void deserialize(Archive &archive) override;
void toConsole() override;
@@ -36,8 +44,15 @@ public:
void start() override;
void end() override;
+ void draw(Graphics::ManagedSurface *surface); // only for non-scrollable text
+
+private:
+
+ void findColorsInPalette();
+
private:
Common::String _fileName;
+ Graphics::MacTextWindow *_txtWnd;
uint32 _xLeft;
uint32 _yTop;
@@ -46,8 +61,11 @@ private:
uint32 _centered;
uint32 _scrollBar;
- uint32 _textColor;
- uint32 _backgroundColor;
+ uint32 _textRGB;
+ uint32 _backgroundRGB;
+
+ byte _textColorIndex;
+ byte _backgroundColorIndex;
};
} // End of namespace Pink