Another video player regression: When the palette changes, look up the

lightest/darkest available colours to use as white/black for the subtitles. It
is possible that we could get away with fixed values for Broken Sword 2, since
it has always had subtitles. But for Broken Sword 1, subtitles is a ScummVM
addition, and we can't.

svn-id: r49154
This commit is contained in:
Torbjörn Andersson 2010-05-23 11:16:10 +00:00
parent 8ed56e1834
commit 1b294306dd
4 changed files with 66 additions and 7 deletions

View file

@ -23,7 +23,6 @@
*
*/
#include "common/file.h"
#include "sword1/sword1.h"
#include "sword1/animation.h"
@ -72,6 +71,9 @@ MoviePlayer::MoviePlayer(SwordEngine *vm, Text *textMan, Audio::Mixer *snd, OSys
_bgSoundStream = NULL;
_decoderType = decoderType;
_decoder = decoder;
_white = 255;
_black = 0;
}
MoviePlayer::~MoviePlayer() {
@ -254,9 +256,35 @@ bool MoviePlayer::playVideo() {
if (frame)
_vm->_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h);
if (_decoder->hasDirtyPalette())
if (_decoder->hasDirtyPalette()) {
_decoder->setSystemPalette();
uint32 maxWeight = 0;
uint32 minWeight = 0xFFFFFFFF;
uint32 weight;
byte r, g, b;
byte *palette = _decoder->getPalette();
for (int i = 0; i < 256; i++) {
r = *palette++;
g = *palette++;
b = *palette++;
weight = 3 * r * r + 6 * g * g + 2 * b * b;
if (weight >= maxWeight) {
maxWeight = weight;
_white = i;
}
if (weight <= minWeight) {
minWeight = weight;
_black = i;
}
}
}
Graphics::Surface *screen = _vm->_system->lockScreen();
performPostProcessing((byte *)screen->pixels);
_vm->_system->unlockScreen();
@ -275,11 +303,11 @@ bool MoviePlayer::playVideo() {
}
byte MoviePlayer::findBlackPalIndex() {
return 0;
return _black;
}
byte MoviePlayer::findWhitePalIndex() {
return 0xff;
return _white;
}
DXADecoderWithSound::DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle)

View file

@ -85,6 +85,7 @@ protected:
OSystem *_system;
Common::Array<MovieText *> _movieTexts;
int _textX, _textY, _textWidth, _textHeight;
byte _white, _black;
DecoderType _decoderType;
Graphics::VideoDecoder *_decoder;

View file

@ -51,6 +51,9 @@ MoviePlayer::MoviePlayer(Sword2Engine *vm, Audio::Mixer *snd, OSystem *system, A
_bgSoundStream = NULL;
_decoderType = decoderType;
_decoder = decoder;
_white = 255;
_black = 0;
}
MoviePlayer:: ~MoviePlayer() {
@ -280,9 +283,35 @@ bool MoviePlayer::playVideo() {
if (frame)
_vm->_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h);
if (_decoder->hasDirtyPalette())
if (_decoder->hasDirtyPalette()) {
_decoder->setSystemPalette();
uint32 maxWeight = 0;
uint32 minWeight = 0xFFFFFFFF;
uint32 weight;
byte r, g, b;
byte *palette = _decoder->getPalette();
for (int i = 0; i < 256; i++) {
r = *palette++;
g = *palette++;
b = *palette++;
weight = 3 * r * r + 6 * g * g + 2 * b * b;
if (weight >= maxWeight) {
maxWeight = weight;
_white = i;
}
if (weight <= minWeight) {
minWeight = weight;
_black = i;
}
}
}
Graphics::Surface *screen = _vm->_system->lockScreen();
performPostProcessing((byte *)screen->pixels);
_vm->_system->unlockScreen();
@ -301,11 +330,11 @@ bool MoviePlayer::playVideo() {
}
byte MoviePlayer::findBlackPalIndex() {
return 0;
return _black;
}
byte MoviePlayer::findWhitePalIndex() {
return 0xff;
return _white;
}
DXADecoderWithSound::DXADecoderWithSound(Audio::Mixer *mixer, Audio::SoundHandle *bgSoundHandle)

View file

@ -87,6 +87,7 @@ protected:
uint32 _currentMovieText;
byte *_textSurface;
int _textX, _textY;
byte _white, _black;
DecoderType _decoderType;
Graphics::VideoDecoder *_decoder;