aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/wintermute/video/video_subtitle.cpp27
-rw-r--r--engines/wintermute/video/video_subtitle.h15
-rw-r--r--engines/wintermute/video/video_subtitler.cpp180
-rw-r--r--engines/wintermute/video/video_subtitler.h23
-rw-r--r--engines/wintermute/video/video_theora_player.cpp19
-rw-r--r--engines/wintermute/video/video_theora_player.h2
6 files changed, 134 insertions, 132 deletions
diff --git a/engines/wintermute/video/video_subtitle.cpp b/engines/wintermute/video/video_subtitle.cpp
index 3d0688d975..0fab6fb2b7 100644
--- a/engines/wintermute/video/video_subtitle.cpp
+++ b/engines/wintermute/video/video_subtitle.cpp
@@ -31,27 +31,26 @@
namespace Wintermute {
//////////////////////////////////////////////////////////////////////////
-CVidSubtitle::CVidSubtitle(BaseGame *inGame): BaseClass(inGame) {
- m_Text = NULL;
- m_StartFrame = m_EndFrame = 0;
+VideoSubtitle::VideoSubtitle(BaseGame *inGame): BaseClass(inGame) {
+ _text = NULL;
+ _startFrame = _endFrame = 0;
}
-
//////////////////////////////////////////////////////////////////////////
-CVidSubtitle::CVidSubtitle(BaseGame *inGame, char *Text, long StartFrame, long EndFrame): BaseClass(inGame) {
- m_Text = new char[strlen(Text) + 1];
- strcpy(m_Text, Text);
- // _gameRef->m_StringTable->Expand(&m_Text);
- m_StartFrame = StartFrame;
- m_EndFrame = EndFrame;
+VideoSubtitle::VideoSubtitle(BaseGame *inGame, char *text, long startFrame, long endFrame): BaseClass(inGame) {
+ _text = new char[strlen(text) + 1];
+ strcpy(_text, text);
+ // _gameRef->m_StringTable->Expand(&this->text);
+ _startFrame = startFrame;
+ _endFrame = endFrame;
}
//////////////////////////////////////////////////////////////////////////
-CVidSubtitle::~CVidSubtitle() {
- if (m_Text) {
- delete [] m_Text;
- m_Text = NULL;
+VideoSubtitle::~VideoSubtitle() {
+ if (_text) {
+ delete [] _text;
+ _text = NULL;
}
}
}
diff --git a/engines/wintermute/video/video_subtitle.h b/engines/wintermute/video/video_subtitle.h
index e93007bd3b..6d629b34d0 100644
--- a/engines/wintermute/video/video_subtitle.h
+++ b/engines/wintermute/video/video_subtitle.h
@@ -33,15 +33,14 @@
namespace Wintermute {
-class CVidSubtitle : public BaseClass {
+class VideoSubtitle : public BaseClass {
public:
- long m_EndFrame;
- long m_StartFrame;
- char *m_Text;
- CVidSubtitle(BaseGame *inGame);
- CVidSubtitle(BaseGame *inGame, char *Text, long StartFrame, long EndFrame);
- virtual ~CVidSubtitle();
-
+ long _endFrame;
+ long _startFrame;
+ char *_text;
+ VideoSubtitle(BaseGame *inGame);
+ VideoSubtitle(BaseGame *inGame, char *text, long startFrame, long endFrame);
+ virtual ~VideoSubtitle();
};
}
diff --git a/engines/wintermute/video/video_subtitler.cpp b/engines/wintermute/video/video_subtitler.cpp
index dd657876ba..9d0a066c20 100644
--- a/engines/wintermute/video/video_subtitler.cpp
+++ b/engines/wintermute/video/video_subtitler.cpp
@@ -35,143 +35,145 @@
namespace Wintermute {
//////////////////////////////////////////////////////////////////////////
-CVidSubtitler::CVidSubtitler(BaseGame *inGame): BaseClass(inGame) {
- m_LastSample = -1;
- m_CurrentSubtitle = 0;
- m_ShowSubtitle = false;
+VideoSubtitler::VideoSubtitler(BaseGame *inGame): BaseClass(inGame) {
+ _lastSample = -1;
+ _currentSubtitle = 0;
+ _showSubtitle = false;
}
//////////////////////////////////////////////////////////////////////////
-CVidSubtitler::~CVidSubtitler(void) {
- for (int i = 0; i < m_Subtitles.size(); i++) {
- delete m_Subtitles[i];
+VideoSubtitler::~VideoSubtitler(void) {
+ for (int i = 0; i < _subtitles.size(); i++) {
+ delete _subtitles[i];
}
- m_Subtitles.clear();
+ _subtitles.clear();
}
//////////////////////////////////////////////////////////////////////////
-bool CVidSubtitler::LoadSubtitles(const char *Filename, const char *SubtitleFile) {
+bool VideoSubtitler::loadSubtitles(const char *Filename, const char *subtitleFile) {
if (!Filename) {
return false;
}
- m_Subtitles.clear();
+ for (int i = 0; i < _subtitles.size(); i++) {
+ delete _subtitles[i];
+ }
+
+ _subtitles.clear();
- m_LastSample = -1;
- m_CurrentSubtitle = 0;
- m_ShowSubtitle = false;
+ _lastSample = -1;
+ _currentSubtitle = 0;
+ _showSubtitle = false;
- Common::String NewFile;
+ Common::String newFile;
- if (SubtitleFile) {
- NewFile = Common::String(SubtitleFile);
+ if (subtitleFile) {
+ newFile = Common::String(subtitleFile);
} else {
Common::String path = PathUtil::getDirectoryName(Filename);
Common::String name = PathUtil::getFileNameWithoutExtension(Filename);
Common::String ext = ".SUB";
- NewFile = PathUtil::combine(path, name + ext);
+ newFile = PathUtil::combine(path, name + ext);
}
- long Size;
+ long size;
- Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(NewFile, true, false);
+ Common::SeekableReadStream *file = BaseFileManager::getEngineInstance()->openFile(newFile, true, false);
if (file == nullptr) {
return false; // no subtitles
}
- Size = file->size();
- char *Buffer = new char[Size];
+ size = file->size();
+ char *buffer = new char[size];
+ file->read(buffer, size);
- file->read(Buffer, Size);
+ long start, end;
+ bool inToken;
+ char *tokenStart;
+ int tokenLength;
+ int tokenPos;
+ int textLength;
- long Start, End;
- bool InToken;
- char *TokenStart;
- int TokenLength;
- int TokenPos;
- int TextLength;
+ int pos = 0;
+ int lineLength = 0;
- int Pos = 0;
- int LineLength = 0;
+ while (pos < size) {
+ start = end = -1;
+ inToken = false;
+ tokenPos = -1;
+ textLength = 0;
- while (Pos < Size) {
- Start = End = -1;
- InToken = false;
- TokenPos = -1;
- TextLength = 0;
+ lineLength = 0;
+ while (pos + lineLength < size && buffer[pos + lineLength] != '\n' && buffer[pos + lineLength] != '\0') lineLength++;
- LineLength = 0;
- while (Pos + LineLength < Size && Buffer[Pos + LineLength] != '\n' && Buffer[Pos + LineLength] != '\0') {
- LineLength++;
- }
+ int realLength = lineLength - (pos + lineLength >= size ? 0 : 1);
+ char *Text = new char[realLength + 1];
+ char *line = (char *)&buffer[pos];
- int RealLength = LineLength - (Pos + LineLength >= Size ? 0 : 1);
- char *Text = new char[RealLength + 1];
- char *line = (char *)&Buffer[Pos];
-
- for (int i = 0; i < RealLength; i++) {
+ for (int i = 0; i < realLength; i++) {
if (line[i] == '{') {
- if (!InToken) {
- InToken = true;
- TokenStart = line + i + 1;
- TokenLength = 0;
- TokenPos++;
+ if (!inToken) {
+ inToken = true;
+ tokenStart = line + i + 1;
+ tokenLength = 0;
+ tokenPos++;
} else {
- TokenLength++;
+ tokenLength++;
}
} else if (line[i] == '}') {
- if (InToken) {
- InToken = false;
- char *Token = new char[TokenLength + 1];
- strncpy(Token, TokenStart, TokenLength);
- Token[TokenLength] = '\0';
- if (TokenPos == 0) {
- Start = atoi(Token);
- } else if (TokenPos == 1) {
- End = atoi(Token);
+ if (inToken) {
+ inToken = false;
+ char *token = new char[tokenLength + 1];
+ strncpy(token, tokenStart, tokenLength);
+ token[tokenLength] = '\0';
+ if (tokenPos == 0) {
+ start = atoi(token);
+ } else if (tokenPos == 1) {
+ end = atoi(token);
}
- delete [] Token;
+
+ delete[] token;
} else {
- Text[TextLength] = line[i];
- TextLength++;
+ Text[textLength] = line[i];
+ textLength++;
}
} else {
- if (InToken) {
- TokenLength++;
+ if (inToken) {
+ tokenLength++;
} else {
- Text[TextLength] = line[i];
- if (Text[TextLength] == '|') {
- Text[TextLength] = '\n';
+ Text[textLength] = line[i];
+ if (Text[textLength] == '|') {
+ Text[textLength] = '\n';
}
- TextLength++;
+ textLength++;
}
}
}
- Text[TextLength] = '\0';
+ Text[textLength] = '\0';
- if (Start != -1 && TextLength > 0 && (Start != 1 || End != 1)) {
- m_Subtitles.push_back(new CVidSubtitle(_gameRef, Text, Start, End));
+ if (start != -1 && textLength > 0 && (start != 1 || end != 1)) {
+ _subtitles.push_back(new VideoSubtitle(_gameRef, Text, start, end));
}
delete [] Text;
- Pos += LineLength + 1;
+ pos += lineLength + 1;
}
- delete [] Buffer;
+ delete[] buffer;
return false;
}
//////////////////////////////////////////////////////////////////////////
-bool CVidSubtitler::Display() {
- if (m_ShowSubtitle) {
+bool VideoSubtitler::display() {
+ if (_showSubtitle) {
BaseFont *font = _gameRef->getVideoFont() ? _gameRef->getVideoFont() : _gameRef->getSystemFont();
- int textHeight = font->getTextHeight((byte *)m_Subtitles[m_CurrentSubtitle]->m_Text, _gameRef->_renderer->getWidth());
- font->drawText((byte *)m_Subtitles[m_CurrentSubtitle]->m_Text,
+ int textHeight = font->getTextHeight((byte *)_subtitles[_currentSubtitle]->_text, _gameRef->_renderer->getWidth());
+ font->drawText((byte *)_subtitles[_currentSubtitle]->_text,
0,
(_gameRef->_renderer->getHeight() - textHeight - 5),
(_gameRef->_renderer->getWidth(), TAL_CENTER));
@@ -180,26 +182,26 @@ bool CVidSubtitler::Display() {
}
//////////////////////////////////////////////////////////////////////////
-bool CVidSubtitler::Update(long Frame) {
- if (Frame != m_LastSample) {
- m_LastSample = Frame;
+bool VideoSubtitler::update(long frame) {
+ if (frame != _lastSample) {
+ _lastSample = frame;
// process subtitles
- m_ShowSubtitle = false;
- while (m_CurrentSubtitle < m_Subtitles.size()) {
- int End = m_Subtitles[m_CurrentSubtitle]->m_EndFrame;
+ _showSubtitle = false;
+ while (_currentSubtitle < _subtitles.size()) {
+ int end = _subtitles[_currentSubtitle]->_endFrame;
- bool NextFrameOK = (m_CurrentSubtitle < m_Subtitles.size() - 1 && m_Subtitles[m_CurrentSubtitle + 1]->m_StartFrame <= Frame);
+ bool nextFrameOK = (_currentSubtitle < _subtitles.size() - 1 && _subtitles[_currentSubtitle + 1]->_startFrame <= frame);
- if (Frame > End) {
- if (NextFrameOK) {
- m_CurrentSubtitle++;
+ if (frame > end) {
+ if (nextFrameOK) {
+ _currentSubtitle++;
} else {
- m_ShowSubtitle = (End == 0);
+ _showSubtitle = (end == 0);
break;
}
} else {
- m_ShowSubtitle = true;
+ _showSubtitle = true;
break;
}
}
diff --git a/engines/wintermute/video/video_subtitler.h b/engines/wintermute/video/video_subtitler.h
index 25641bc574..e42fbeb505 100644
--- a/engines/wintermute/video/video_subtitler.h
+++ b/engines/wintermute/video/video_subtitler.h
@@ -34,19 +34,18 @@
namespace Wintermute {
-class CVidSubtitler :
- public BaseClass {
+class VideoSubtitler : public BaseClass {
public:
- CVidSubtitler(BaseGame *inGame);
- virtual ~CVidSubtitler(void);
-
- bool m_ShowSubtitle;
- int m_CurrentSubtitle;
- bool LoadSubtitles(const char *Filename, const char *SubtitleFile);
- bool Display();
- bool Update(long Frame);
- long m_LastSample;
- Common::Array<CVidSubtitle *> m_Subtitles;
+ VideoSubtitler(BaseGame *inGame);
+ virtual ~VideoSubtitler(void);
+
+ bool _showSubtitle;
+ int _currentSubtitle;
+ bool loadSubtitles(const char *filename, const char *subtitleFile);
+ bool display();
+ bool update(long frame);
+ long _lastSample;
+ Common::Array<VideoSubtitle *> _subtitles;
};
}
diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp
index 232c4847b1..a90fb02033 100644
--- a/engines/wintermute/video/video_theora_player.cpp
+++ b/engines/wintermute/video/video_theora_player.cpp
@@ -85,13 +85,16 @@ void VideoTheoraPlayer::SetDefaults() {
_volume = 100;
_theoraDecoder = nullptr;
- _subtitler = new CVidSubtitler(_gameRef);
+ _subtitler = new VideoSubtitler(_gameRef);
}
//////////////////////////////////////////////////////////////////////////
VideoTheoraPlayer::~VideoTheoraPlayer(void) {
cleanup();
-// SAFE_DELETE(_subtitler);
+ if(_subtitler) {
+ delete [] _subtitler;
+ _subtitler = NULL;
+ }
}
//////////////////////////////////////////////////////////////////////////
@@ -131,7 +134,7 @@ bool VideoTheoraPlayer::initialize(const Common::String &filename, const Common:
#endif
- _subtitler->LoadSubtitles(_filename.c_str(), subtitleFile.c_str());
+ _subtitler->loadSubtitles(_filename.c_str(), subtitleFile.c_str());
_theoraDecoder->loadStream(_file);
@@ -217,8 +220,8 @@ bool VideoTheoraPlayer::play(TVideoPlayback type, int x, int y, bool freezeGame,
_state = THEORA_STATE_PLAYING;
_looping = looping;
_playbackType = type;
- _subtitler->Update(_theoraDecoder->getFrameCount());
- _subtitler->Display();
+ _subtitler->update(_theoraDecoder->getFrameCount());
+ _subtitler->display();
_startTime = startTime;
_volume = volume;
_posX = x;
@@ -260,7 +263,7 @@ bool VideoTheoraPlayer::play(TVideoPlayback type, int x, int y, bool freezeGame,
#if 0 // Stubbed for now as theora isn't seekable
if (StartTime) SeekToTime(StartTime);
- Update();
+ update();
#endif
return STATUS_FAILED;
}
@@ -294,7 +297,7 @@ bool VideoTheoraPlayer::update() {
if (_theoraDecoder) {
- _subtitler->Update(_theoraDecoder->getCurFrame());
+ _subtitler->update(_theoraDecoder->getCurFrame());
if (_theoraDecoder->endOfVideo() && _looping) {
warning("Should loop movie %s, hacked for now", _filename.c_str());
@@ -423,7 +426,7 @@ bool VideoTheoraPlayer::display(uint32 alpha) {
/* if (m_Subtitler && _gameRef->m_VideoSubtitles) {
m_Subtitler->display();
}*/
- _subtitler->Display();
+ _subtitler->display();
return res;
}
diff --git a/engines/wintermute/video/video_theora_player.h b/engines/wintermute/video/video_theora_player.h
index 2d79c5404b..698326c29c 100644
--- a/engines/wintermute/video/video_theora_player.h
+++ b/engines/wintermute/video/video_theora_player.h
@@ -60,7 +60,7 @@ public:
Common::String _filename;
BaseSurface *_texture;
- CVidSubtitler *_subtitler;
+ VideoSubtitler *_subtitler;
// control methods
bool initialize(const Common::String &filename, const Common::String &subtitleFile = Common::String());