added load/closeFile to Graphics::FlicPlayer (matching DXAPlayer class)

svn-id: r35170
This commit is contained in:
Gregory Montoir 2008-11-28 23:51:59 +00:00
parent b25257d4eb
commit 443c57146d
4 changed files with 55 additions and 40 deletions

View File

@ -482,7 +482,6 @@ AnimationSequencePlayer::AnimationSequencePlayer(OSystem *system, Audio::Mixer *
_newSeq = false;
memset(_animationPalette, 0, sizeof(_animationPalette));
memset(_paletteBuffer, 0, sizeof(_paletteBuffer));
memset(_flicPlayer, 0, sizeof(_flicPlayer));
_soundsListSeqData = 0;
_soundsList1 = 0;
_soundsList1Count = 0;
@ -836,10 +835,6 @@ void AnimationSequencePlayer::fadeOutPalette() {
void AnimationSequencePlayer::unloadAnimation() {
_mixer->stopAll();
for (int i = 0; i < ARRAYSIZE(_flicPlayer); ++i) {
delete _flicPlayer[i];
_flicPlayer[i] = 0;
}
free(_picBufPtr);
_picBufPtr = 0;
free(_pic2BufPtr);
@ -860,20 +855,24 @@ uint8 *AnimationSequencePlayer::loadPicture(const char *fileName) {
}
void AnimationSequencePlayer::openAnimation(int index, const char *fileName) {
_flicPlayer[index] = new ::Graphics::FlicPlayer(fileName);
_flicPlayer[index]->decodeFrame();
if (!_flicPlayer[index].loadFile(fileName)) {
warning("Unable to open flc animation file '%s'", fileName);
_seqNum = 1;
return;
}
_flicPlayer[index].decodeFrame();
if (index == 0) {
memcpy(_animationPalette, _flicPlayer[index]->getPalette(), 1024);
memcpy(_offscreenBuffer, _flicPlayer[index]->getOffscreen(), kScreenWidth * kScreenHeight);
memcpy(_animationPalette, _flicPlayer[index].getPalette(), 1024);
memcpy(_offscreenBuffer, _flicPlayer[index].getOffscreen(), kScreenWidth * kScreenHeight);
}
}
void AnimationSequencePlayer::decodeNextAnimationFrame(int index) {
_flicPlayer[index]->decodeFrame();
memcpy(_offscreenBuffer, _flicPlayer[index]->getOffscreen(), kScreenWidth * kScreenHeight);
_flicPlayer[index].decodeFrame();
memcpy(_offscreenBuffer, _flicPlayer[index].getOffscreen(), kScreenWidth * kScreenHeight);
if (index == 0) {
if (_flicPlayer[index]->isPaletteDirty()) {
memcpy(_animationPalette, _flicPlayer[index]->getPalette(), 1024);
if (_flicPlayer[index].isPaletteDirty()) {
memcpy(_animationPalette, _flicPlayer[index].getPalette(), 1024);
}
}
if (_seqNum != 19) {
@ -889,7 +888,7 @@ void AnimationSequencePlayer::introSeq17_18() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 19;
}
updateSounds();
@ -904,20 +903,20 @@ void AnimationSequencePlayer::introSeq19_20() {
_frameTime = 1;
_newSeq = false;
}
if (_flicPlayer[0]->getCurFrame() >= 116) {
_flicPlayer[1]->decodeFrame();
if (_flicPlayer[1]->getCurFrame() == _flicPlayer[1]->getFrameCount()) {
_flicPlayer[1]->reset();
if (_flicPlayer[0].getCurFrame() >= 116) {
_flicPlayer[1].decodeFrame();
if (_flicPlayer[1].isLastFrame()) {
_flicPlayer[1].reset();
}
}
_flicPlayer[0]->decodeFrame();
const uint8 *t = _flicPlayer[1]->getOffscreen();
_flicPlayer[0].decodeFrame();
const uint8 *t = _flicPlayer[1].getOffscreen();
for (int i = 0; i < 64000; ++i) {
const uint8 color = _flicPlayer[0]->getOffscreen()[i];
const uint8 color = _flicPlayer[0].getOffscreen()[i];
_offscreenBuffer[i] = color ? color : t[i];
}
updateSounds();
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 3;
}
}
@ -974,10 +973,10 @@ void AnimationSequencePlayer::introSeq3_4() {
}
if (!_updateScreenPicture) {
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == 706) {
if (_flicPlayer[0].getCurFrame() == 706) {
initPicPart4();
}
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 9;
}
} else {
@ -1018,7 +1017,7 @@ void AnimationSequencePlayer::drawPic1Part10() {
memcpy(_offscreenBuffer + y * 320, _picBufPtr + 800 + y * 640 + _updateScreenWidth, 320);
}
for (int i = 0; i < 64000; ++i) {
const uint8 color = _flicPlayer[0]->getOffscreen()[i];
const uint8 color = _flicPlayer[0].getOffscreen()[i];
if (color) {
_offscreenBuffer[i] = color;
}
@ -1036,20 +1035,20 @@ void AnimationSequencePlayer::introSeq9_10() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == 984) {
if (_flicPlayer[0].getCurFrame() == 984) {
drawPic2Part10();
}
if (_flicPlayer[0]->getCurFrame() >= 264 && _flicPlayer[0]->getCurFrame() <= 295) {
if (_flicPlayer[0].getCurFrame() >= 264 && _flicPlayer[0].getCurFrame() <= 295) {
drawPic1Part10();
_updateScreenWidth += 6;
} else if (_flicPlayer[0]->getCurFrame() >= 988 && _flicPlayer[0]->getCurFrame() <= 996) {
} else if (_flicPlayer[0].getCurFrame() >= 988 && _flicPlayer[0].getCurFrame() <= 996) {
drawPic1Part10();
_updateScreenWidth -= 25;
if (_updateScreenWidth < 0) {
_updateScreenWidth = 0;
}
}
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 21;
}
updateSounds();
@ -1063,7 +1062,7 @@ void AnimationSequencePlayer::introSeq21_22() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 1;
}
updateSounds();
@ -1077,7 +1076,7 @@ void AnimationSequencePlayer::introSeq13_14() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 15;
}
updateSounds();
@ -1091,7 +1090,7 @@ void AnimationSequencePlayer::introSeq15_16() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 27;
}
updateSounds();
@ -1105,7 +1104,7 @@ void AnimationSequencePlayer::introSeq27_28() {
_newSeq = false;
}
decodeNextAnimationFrame(0);
if (_flicPlayer[0]->getCurFrame() == _flicPlayer[0]->getFrameCount()) {
if (_flicPlayer[0].isLastFrame()) {
_seqNum = 1;
}
updateSounds();

View File

@ -865,7 +865,7 @@ private:
bool _newSeq;
int _seqNum, _currentSeqNum;
::Graphics::FlicPlayer *_flicPlayer[2];
::Graphics::FlicPlayer _flicPlayer[2];
uint8 _animationPalette[256 * 4], _paletteBuffer[256 * 4];
const int *_soundsListSeqData;
const char **_soundsList1;

View File

@ -27,12 +27,21 @@
namespace Graphics {
FlicPlayer::FlicPlayer(const char *fileName)
FlicPlayer::FlicPlayer()
: _paletteDirty(false), _offscreen(0), _currFrame(0) {
memset(&_flicInfo, 0, sizeof(_flicInfo));
_fileStream.open(fileName);
assert(_fileStream.isOpen());
}
FlicPlayer::~FlicPlayer() {
closeFile();
}
bool FlicPlayer::loadFile(const char *fileName) {
closeFile();
if (!_fileStream.open(fileName)) {
return false;
}
_flicInfo.size = _fileStream.readUint32LE();
_flicInfo.type = _fileStream.readUint16LE();
@ -56,10 +65,14 @@ FlicPlayer::FlicPlayer(const char *fileName)
// Seek to the first frame
_fileStream.seek(_flicInfo.offsetFrame1);
return true;
}
FlicPlayer::~FlicPlayer() {
void FlicPlayer::closeFile() {
memset(&_flicInfo, 0, sizeof(_flicInfo));
_fileStream.close();
delete[] _offscreen;
_offscreen = 0;
}
void FlicPlayer::redraw() {

View File

@ -60,15 +60,18 @@ struct FrameTypeChunkHeader {
class FlicPlayer {
public:
FlicPlayer(const char *fileName);
FlicPlayer();
~FlicPlayer();
bool loadFile(const char *fileName);
void closeFile();
void decodeFrame();
int getWidth() const { return _flicInfo.width; }
int getHeight() const { return _flicInfo.height; }
bool hasFrames() const { return _flicInfo.numFrames > 0; }
int getCurFrame() const { return _currFrame; }
int getFrameCount() const { return _flicInfo.numFrames; }
bool isLastFrame() const { return _currFrame == _flicInfo.numFrames; }
uint32 getSpeed() const { return _flicInfo.speed; }
bool isPaletteDirty() const { return _paletteDirty; }
const uint8 *getPalette() { _paletteDirty = false; return _palette; }