cleanup; tiny bug fix (file was opened, then opened again - not good)

svn-id: r8539
This commit is contained in:
Max Horn 2003-06-18 13:14:17 +00:00
parent f0a39d718a
commit ac23e56e85
2 changed files with 51 additions and 44 deletions

View File

@ -191,7 +191,7 @@ static StringResource *getStrings(const char *file, const char *directory, bool
SmushPlayer *player;
void smush_callback(void *ptr) {
void SmushPlayer::timerCallback(void *ptr) {
Scumm *scumm = (Scumm *)ptr;
if (!scumm->_smushPlay)
return;
@ -208,7 +208,7 @@ SmushPlayer::SmushPlayer(Scumm *scumm, int speed, bool subtitles) {
_smixer = 0;
_strings = NULL;
_skipNext = false;
_data = NULL;
_dst = NULL;
_storeFrame = false;
_width = 0;
_height = 0;
@ -247,8 +247,8 @@ void SmushPlayer::init() {
_scumm->setDirtyColors(0, 255);
_smixer->_silentMixer = _scumm->_silentDigitalImuse;
_scumm->_smushPlay = true;
_data = _scumm->virtscr[0].screenPtr + _scumm->virtscr[0].xstart;
_scumm->_timer->installProcedure(&smush_callback, _speed);
_dst = _scumm->virtscr[0].screenPtr + _scumm->virtscr[0].xstart;
_scumm->_timer->installProcedure(&timerCallback, _speed);
_alreadyInit = false;
}
@ -256,7 +256,7 @@ void SmushPlayer::init() {
void SmushPlayer::deinit() {
_scumm->_smushPlay = false;
while (_smushProcessFrame) {}
_scumm->_timer->releaseProcedure(&smush_callback);
_scumm->_timer->releaseProcedure(&timerCallback);
for (int i = 0; i < 5; i++) {
if (_sf[i]) {
@ -360,7 +360,7 @@ void SmushPlayer::handleFetch(Chunk &b) {
checkBlock(b, TYPE_FTCH, 6);
if (_frameBuffer != NULL) {
memcpy(_data, _frameBuffer, _width * _height);
memcpy(_dst, _frameBuffer, _width * _height);
}
}
@ -565,10 +565,10 @@ void SmushPlayer::handleTextResource(Chunk &b) {
// bit 3 - wrap around 8
switch (flags & 9) {
case 0:
sf->drawStringAbsolute(str, _data, _width, pos_x, pos_y);
sf->drawStringAbsolute(str, _dst, _width, pos_x, pos_y);
break;
case 1:
sf->drawStringCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top));
sf->drawStringCentered(str, _dst, _width, _height, pos_x, MAX(pos_y, top));
break;
case 8:
// FIXME: Is 'right' the maximum line width here, just
@ -576,7 +576,7 @@ void SmushPlayer::handleTextResource(Chunk &b) {
// in The Dig's intro, where 'left' and 'right' are
// always 0 and 321 respectively, and apparently we
// handle that correctly.
sf->drawStringWrap(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, right);
sf->drawStringWrap(str, _dst, _width, _height, pos_x, MAX(pos_y, top), left, right);
break;
case 9:
// In this case, the 'right' parameter is actually the
@ -585,7 +585,7 @@ void SmushPlayer::handleTextResource(Chunk &b) {
//
// Note that in The Dig's "Spacetime Six" movie it's
// 621. I have no idea what that means.
sf->drawStringWrapCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, MIN(left + right, _width));
sf->drawStringWrapCentered(str, _dst, _width, _height, pos_x, MAX(pos_y, top), left, MIN(left + right, _width));
break;
default:
warning("SmushPlayer::handleTextResource. Not handled flags: %d", flags);
@ -709,17 +709,17 @@ void SmushPlayer::handleFrameObject(Chunk &b) {
// BTW regarding codec 3: I haven't yet actually seen it being used,
// but is it really identical to codec 1? Or isn't it maybe a
// 'reverse' version (see also bompDecodeLineReverse).
decompressBomp(_data, chunk_buffer, _width, _height);
decompressBomp(_dst, chunk_buffer, _width, _height);
#else
extern void smush_decode_codec1(byte *dst, byte *src, int height);
smush_decode_codec1(_data, chunk_buffer, _height);
smush_decode_codec1(_dst, chunk_buffer, _height);
#endif
break;
case 37:
_codec37.decode(_data, chunk_buffer);
_codec37.decode(_dst, chunk_buffer);
break;
case 47:
_codec47.decode(_data, chunk_buffer);
_codec47.decode(_dst, chunk_buffer);
break;
default:
error("Invalid codec for frame object : %d", (int)codec);
@ -729,7 +729,7 @@ void SmushPlayer::handleFrameObject(Chunk &b) {
if (_frameBuffer == NULL) {
_frameBuffer = (byte *)malloc(_width * _height);
}
memcpy(_frameBuffer, _data, _width * _height);
memcpy(_frameBuffer, _dst, _width * _height);
_storeFrame = false;
}
@ -806,8 +806,12 @@ void SmushPlayer::handleAnimHeader(Chunk &b) {
}
void SmushPlayer::setupAnim(const char *file, const char *directory) {
Chunk *sub;
int i;
char file_font[11];
_base = new FileChunk(file, directory);
Chunk *sub = _base->subBlock();
sub = _base->subBlock();
checkBlock(*sub, TYPE_AHDR);
handleAnimHeader(*sub);
@ -819,16 +823,14 @@ void SmushPlayer::setupAnim(const char *file, const char *directory) {
_sf[0]->loadFont("scummfnt.nut", directory);
_sf[2]->loadFont("titlfnt.nut", directory);
} else if (_scumm->_gameId == GID_DIG) {
for (int i = 0; i < 4; i++) {
char file_font[11];
sprintf((char *)&file_font, "font%d.nut", i);
for (i = 0; i < 4; i++) {
sprintf(file_font, "font%d.nut", i);
_sf[i] = new SmushFont(i != 0, false);
_sf[i]->loadFont(file_font, directory);
}
} else if (_scumm->_gameId == GID_CMI) {
for (int i = 0; i < 5; i++) {
char file_font[11];
sprintf((char *)&file_font, "font%d.nut", i);
for (i = 0; i < 5; i++) {
sprintf(file_font, "font%d.nut", i);
_sf[i] = new SmushFont(false, true);
_sf[i]->loadFont(file_font, directory);
}
@ -856,16 +858,15 @@ void SmushPlayer::parseNextFrame() {
delete sub;
}
void SmushPlayer::setPalette(byte *palette) {
void SmushPlayer::setPalette(const byte *palette) {
byte palette_colors[1024];
byte *p = palette_colors;
byte *data = palette;
for (int i = 0; i != 256; i++, data += 3, p += 4) {
p[0] = data[0]; // red
p[1] = data[1]; // green
p[2] = data[2]; // blue
p[3] = 0;
for (int i = 0; i != 256; ++i) {
*p++ = *palette++; // red
*p++ = *palette++; // green
*p++ = *palette++; // blue
*p++ = 0;
}
_scumm->_system->set_palette(palette_colors, 0, 256);
@ -873,22 +874,26 @@ void SmushPlayer::setPalette(byte *palette) {
void SmushPlayer::updateScreen() {
uint32 end_time, start_time = _scumm->_system->get_msecs();
_scumm->_system->copy_rect(_data, _width, 0, 0, _width, _height);
_scumm->_system->copy_rect(_dst, _width, 0, 0, _width, _height);
_updateNeeded = true;
end_time = _scumm->_system->get_msecs();
debug(4, "Smush stats: updateScreen( %03d )", end_time - start_time);
}
void SmushPlayer::play(const char *filename, const char *directory) {
// Verify the specified file exists
File f;
f.open(filename, directory);
if (!f.isOpen()) {
warning("SmushPlayer::play() File not found %s", filename);
return;
}
f.close();
_updateNeeded = false;
// Load the video
setupAnim(filename, directory);
init();
@ -897,16 +902,17 @@ void SmushPlayer::play(const char *filename, const char *directory) {
_scumm->processKbd();
if (_updateNeeded) {
uint32 end_time, start_time = _scumm->_system->get_msecs();
uint32 end_time, start_time;
start_time = _scumm->_system->get_msecs();
_scumm->_system->update_screen();
_updateNeeded = false;
end_time = _scumm->_system->get_msecs();
debug(4, "Smush stats: BackendUpdateScreen( %03d )", end_time - start_time);
}
if (_scumm->_videoFinished || _scumm->_quit)
break;
if (_scumm->_saveLoadFlag)
if (_scumm->_videoFinished || _scumm->_quit || _scumm->_saveLoadFlag)
break;
_scumm->_system->delay_msecs(10);
};

View File

@ -33,7 +33,6 @@ class StringResource;
class SmushPlayer {
private:
Scumm *_scumm;
int _version;
int32 _nbframes;
@ -44,7 +43,6 @@ private:
SmushFont *_sf[5];
Codec37Decoder _codec37;
Codec47Decoder _codec47;
int dst_width, dst_height;
FileChunk *_base;
byte *_frameBuffer;
@ -63,25 +61,26 @@ private:
int _speed;
bool _outputSound;
public:
int _width, _height;
byte *_data;
volatile bool _smushProcessFrame;
byte *_dst;
bool _updateNeeded;
volatile bool _smushProcessFrame;
public:
SmushPlayer(Scumm *, int, bool);
~SmushPlayer();
void play(const char *filename, const char *directory);
private:
void updatePalette(void);
void parseNextFrame();
void init();
void deinit();
void setupAnim(const char *file, const char *directory);
void updateScreen();
void play(const char *filename, const char *directory);
void setPalette(byte *palette);
protected:
void setPalette(const byte *palette);
bool readString(const char *file, const char *directory);
void checkBlock(const Chunk &, Chunk::type, uint32 = 0);
@ -99,6 +98,8 @@ protected:
void handleTextResource(Chunk &);
void handleDeltaPalette(Chunk &);
void readPalette(byte *, Chunk &);
static void timerCallback(void *ptr);
};
#endif