CRYO: Get rid of HnmContext, refactoring
This commit is contained in:
parent
b3fcb77053
commit
caec6a8de9
5 changed files with 189 additions and 203 deletions
|
@ -117,25 +117,6 @@ struct HNMHeader {
|
||||||
typedef struct HNMHeader HNMHeader;
|
typedef struct HNMHeader HNMHeader;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
struct hnm_t {
|
|
||||||
int _frameNum;
|
|
||||||
int _unused04;
|
|
||||||
Common::File *_file;
|
|
||||||
HNMHeader _header;
|
|
||||||
byte *tmpBuffer[2];
|
|
||||||
byte *finalBuffer;
|
|
||||||
byte *_newFrameBuffer;
|
|
||||||
byte *_oldFrameBuffer;
|
|
||||||
byte *_readBuffer;
|
|
||||||
byte *_dataPtr;
|
|
||||||
color_t _palette[256];
|
|
||||||
bool _canLoop;
|
|
||||||
int16 _unused896;
|
|
||||||
int16 _chunkId;
|
|
||||||
int _totalRead;
|
|
||||||
};
|
|
||||||
typedef struct hnm_t hnm_t;
|
|
||||||
|
|
||||||
class Sound {
|
class Sound {
|
||||||
private:
|
private:
|
||||||
int32 _headerOffset;
|
int32 _headerOffset;
|
||||||
|
|
|
@ -110,7 +110,6 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm) {
|
||||||
_hnmSoundChannel = nullptr;
|
_hnmSoundChannel = nullptr;
|
||||||
_voiceSound = nullptr;
|
_voiceSound = nullptr;
|
||||||
_view2 = _underSubtitlesView = _subtitlesView = _underBarsView = _mainView = _hnmView = nullptr;
|
_view2 = _underSubtitlesView = _subtitlesView = _underBarsView = _mainView = _hnmView = nullptr;
|
||||||
_hnmContext = nullptr;
|
|
||||||
_doubledScreen = false;
|
_doubledScreen = false;
|
||||||
_cirsorPanX = 0;
|
_cirsorPanX = 0;
|
||||||
_inventoryScrollDelay = 0;
|
_inventoryScrollDelay = 0;
|
||||||
|
@ -4741,8 +4740,8 @@ void EdenGame::openbigfile() {
|
||||||
_bigfileHeader->_files[j]._flag = _bigfile.readByte();
|
_bigfileHeader->_files[j]._flag = _bigfile.readByte();
|
||||||
}
|
}
|
||||||
|
|
||||||
_hnmContext = _vm->_video->resetInternals();
|
_vm->_video->resetInternals();
|
||||||
_vm->_video->setFile(_hnmContext, &_bigfile);
|
_vm->_video->setFile(&_bigfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdenGame::closebigfile() {
|
void EdenGame::closebigfile() {
|
||||||
|
@ -4839,7 +4838,7 @@ void EdenGame::shnmfl(uint16 num) {
|
||||||
int size = file->_size;
|
int size = file->_size;
|
||||||
int offs = file->_offs;
|
int offs = file->_offs;
|
||||||
debug("* Loading movie %d (%s) at 0x%X, %d bytes", num, file->_name.c_str(), (uint)offs, size);
|
debug("* Loading movie %d (%s) at 0x%X, %d bytes", num, file->_name.c_str(), (uint)offs, size);
|
||||||
_hnmContext->_file->seek(offs, SEEK_SET);
|
_vm->_video->_file->seek(offs, SEEK_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
int EdenGame::ssndfl(uint16 num) {
|
int EdenGame::ssndfl(uint16 num) {
|
||||||
|
@ -6351,21 +6350,21 @@ void EdenGame::mouse() {
|
||||||
////// film.c
|
////// film.c
|
||||||
// Original name: showfilm
|
// Original name: showfilm
|
||||||
void EdenGame::showMovie(char arg1) {
|
void EdenGame::showMovie(char arg1) {
|
||||||
_vm->_video->readHeader(_hnmContext);
|
_vm->_video->readHeader();
|
||||||
if (_vm->_video->_curVideoNum == 92) {
|
if (_vm->_video->_curVideoNum == 92) {
|
||||||
// _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless?
|
// _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless?
|
||||||
_hnmSoundChannel->setVolumeLeft(0);
|
_hnmSoundChannel->setVolumeLeft(0);
|
||||||
_hnmSoundChannel->setVolumeRight(0);
|
_hnmSoundChannel->setVolumeRight(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_vm->_video->getVersion(_hnmContext) != 4)
|
if (_vm->_video->getVersion() != 4)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool playing = true;
|
bool playing = true;
|
||||||
_vm->_video->allocMemory(_hnmContext);
|
_vm->_video->allocMemory();
|
||||||
_hnmView = new View(_vm, _hnmContext->_header._width, _hnmContext->_header._height);
|
_hnmView = new View(_vm, _vm->_video->_header._width, _vm->_video->_header._height);
|
||||||
_hnmView->setSrcZoomValues(0, 0);
|
_hnmView->setSrcZoomValues(0, 0);
|
||||||
_hnmView->setDisplayZoomValues(_hnmContext->_header._width * 2, _hnmContext->_header._height * 2);
|
_hnmView->setDisplayZoomValues(_vm->_video->_header._width * 2, _vm->_video->_header._height * 2);
|
||||||
_hnmView->centerIn(_vm->_screenView);
|
_hnmView->centerIn(_vm->_screenView);
|
||||||
_hnmViewBuf = _hnmView->_bufferPtr;
|
_hnmViewBuf = _hnmView->_bufferPtr;
|
||||||
if (arg1) {
|
if (arg1) {
|
||||||
|
@ -6374,12 +6373,12 @@ void EdenGame::showMovie(char arg1) {
|
||||||
_hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16;
|
_hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16;
|
||||||
_hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32;
|
_hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32;
|
||||||
}
|
}
|
||||||
_vm->_video->setFinalBuffer(_hnmContext, _hnmView->_bufferPtr);
|
_vm->_video->setFinalBuffer(_hnmView->_bufferPtr);
|
||||||
_hnmView->_doubled = _doubledScreen;
|
_hnmView->_doubled = _doubledScreen;
|
||||||
do {
|
do {
|
||||||
_hnmFrameNum = _vm->_video->getFrameNum(_hnmContext);
|
_hnmFrameNum = _vm->_video->getFrameNum();
|
||||||
_vm->_video->waitLoop(_hnmContext);
|
_vm->_video->waitLoop();
|
||||||
playing = _vm->_video->nextElement(_hnmContext);
|
playing = _vm->_video->nextElement();
|
||||||
if (_specialTextMode)
|
if (_specialTextMode)
|
||||||
handleHNMSubtitles();
|
handleHNMSubtitles();
|
||||||
else
|
else
|
||||||
|
@ -6411,7 +6410,7 @@ void EdenGame::showMovie(char arg1) {
|
||||||
}
|
}
|
||||||
} while (playing && !_videoCanceledFlag);
|
} while (playing && !_videoCanceledFlag);
|
||||||
delete _hnmView;
|
delete _hnmView;
|
||||||
_vm->_video->deallocMemory(_hnmContext);
|
_vm->_video->deallocMemory();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EdenGame::playHNM(int16 num) {
|
void EdenGame::playHNM(int16 num) {
|
||||||
|
@ -6436,8 +6435,8 @@ void EdenGame::playHNM(int16 num) {
|
||||||
_showVideoSubtitle = false;
|
_showVideoSubtitle = false;
|
||||||
_videoCanceledFlag = false;
|
_videoCanceledFlag = false;
|
||||||
shnmfl(num);
|
shnmfl(num);
|
||||||
_vm->_video->reset(_hnmContext);
|
_vm->_video->reset();
|
||||||
_vm->_video->flushPreloadBuffer(_hnmContext);
|
_vm->_video->flushPreloadBuffer();
|
||||||
if (_needToFade) {
|
if (_needToFade) {
|
||||||
fadeToBlack(4);
|
fadeToBlack(4);
|
||||||
clearScreen();
|
clearScreen();
|
||||||
|
|
|
@ -650,7 +650,6 @@ private:
|
||||||
View *_underBarsView;
|
View *_underBarsView;
|
||||||
View *_mainView;
|
View *_mainView;
|
||||||
View *_hnmView;
|
View *_hnmView;
|
||||||
hnm_t *_hnmContext;
|
|
||||||
Common::Rect _underSubtitlesBackupRect;
|
Common::Rect _underSubtitlesBackupRect;
|
||||||
Common::Rect _underSubtitlesScreenRect;
|
Common::Rect _underSubtitlesScreenRect;
|
||||||
Common::Rect _underBottomBarBackupRect;
|
Common::Rect _underBottomBarBackupRect;
|
||||||
|
|
|
@ -50,32 +50,27 @@ HnmPlayer::HnmPlayer(CryoEngine *vm) : _vm(vm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_New
|
// Original name: CLHNM_New
|
||||||
hnm_t *HnmPlayer::resetInternals() {
|
void HnmPlayer::resetInternals() {
|
||||||
|
_frameNum = 0;
|
||||||
hnm_t *hnm = (hnm_t *)malloc(sizeof(*hnm));
|
_unused04 = 0;
|
||||||
|
_file = nullptr;
|
||||||
hnm->_frameNum = 0;
|
tmpBuffer[0] = nullptr;
|
||||||
hnm->_unused04 = 0;
|
tmpBuffer[1] = nullptr;
|
||||||
hnm->_file = nullptr;
|
_finalBuffer = nullptr;
|
||||||
hnm->tmpBuffer[0] = nullptr;
|
_readBuffer = nullptr;
|
||||||
hnm->tmpBuffer[1] = nullptr;
|
_unused896 = 0;
|
||||||
hnm->finalBuffer = nullptr;
|
_totalRead = 0;
|
||||||
hnm->_readBuffer = nullptr;
|
|
||||||
hnm->_unused896 = 0;
|
|
||||||
hnm->_totalRead = 0;
|
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
hnm->_palette[i].a = 0;
|
_palette[i].a = 0;
|
||||||
hnm->_palette[i].r = 0;
|
_palette[i].r = 0;
|
||||||
hnm->_palette[i].g = 0;
|
_palette[i].g = 0;
|
||||||
hnm->_palette[i].b = 0;
|
_palette[i].b = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return hnm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_SetFile
|
// Original name: CLHNM_SetFile
|
||||||
void HnmPlayer::setFile(hnm_t *hnm, Common::File *file) {
|
void HnmPlayer::setFile(Common::File *file) {
|
||||||
hnm->_file = file;
|
_file = file;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_SetupTimer
|
// Original name: CLHNM_SetupTimer
|
||||||
|
@ -90,10 +85,10 @@ void HnmPlayer::resetInternalTimer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_Reset
|
// Original name: CLHNM_Reset
|
||||||
void HnmPlayer::reset(hnm_t *hnm) {
|
void HnmPlayer::reset() {
|
||||||
hnm->_frameNum = 0;
|
_frameNum = 0;
|
||||||
hnm->_unused04 = 0;
|
_unused04 = 0;
|
||||||
hnm->_totalRead = 0;
|
_totalRead = 0;
|
||||||
_soundStarted = false;
|
_soundStarted = false;
|
||||||
_pendingSounds = 0;
|
_pendingSounds = 0;
|
||||||
resetInternalTimer();
|
resetInternalTimer();
|
||||||
|
@ -111,7 +106,7 @@ void HnmPlayer::setForceZero2Black(bool forceblack) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_WaitLoop
|
// Original name: CLHNM_WaitLoop
|
||||||
void HnmPlayer::waitLoop(hnm_t *hnm) {
|
void HnmPlayer::waitLoop() {
|
||||||
_expectedFrameTime += _rate;
|
_expectedFrameTime += _rate;
|
||||||
_nextFrameTime = _expectedFrameTime - _timeDrift;
|
_nextFrameTime = _expectedFrameTime - _timeDrift;
|
||||||
if (_useSoundSync && _vm->_timerTicks > 1000.0 + _nextFrameTime)
|
if (_useSoundSync && _vm->_timerTicks > 1000.0 + _nextFrameTime)
|
||||||
|
@ -185,101 +180,102 @@ void HnmPlayer::decompADPCM(byte *buffer, int16 *output, int size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_ReadHeader
|
// Original name: CLHNM_ReadHeader
|
||||||
void HnmPlayer::readHeader(hnm_t *hnm) {
|
void HnmPlayer::readHeader() {
|
||||||
hnm->_header._signature = hnm->_file->readUint32BE();
|
_header._signature = _file->readUint32BE();
|
||||||
hnm->_header._unusedFlag1 = hnm->_file->readByte();
|
_header._unusedFlag1 = _file->readByte();
|
||||||
hnm->_header._unusedFlag2 = hnm->_file->readByte();
|
_header._unusedFlag2 = _file->readByte();
|
||||||
hnm->_header._unusedReserved = hnm->_file->readByte();
|
_header._unusedReserved = _file->readByte();
|
||||||
hnm->_header._unusedBpp = hnm->_file->readByte();
|
_header._unusedBpp = _file->readByte();
|
||||||
hnm->_header._width = hnm->_file->readUint16LE();
|
_header._width = _file->readUint16LE();
|
||||||
hnm->_header._height = hnm->_file->readUint16LE();
|
_header._height = _file->readUint16LE();
|
||||||
hnm->_header._unusedFileSize = hnm->_file->readSint32LE();
|
_header._unusedFileSize = _file->readSint32LE();
|
||||||
hnm->_header._numbFrame = hnm->_file->readSint32LE();
|
_header._numbFrame = _file->readSint32LE();
|
||||||
hnm->_header._unusedTableOffset = hnm->_file->readSint32LE();
|
_header._unusedTableOffset = _file->readSint32LE();
|
||||||
hnm->_header._unusedSpeed = hnm->_file->readSint16LE();
|
_header._unusedSpeed = _file->readSint16LE();
|
||||||
hnm->_header._unusedMaxBuffer = hnm->_file->readSint16LE();
|
_header._unusedMaxBuffer = _file->readSint16LE();
|
||||||
hnm->_header._bufferSize = hnm->_file->readSint32LE();
|
_header._bufferSize = _file->readSint32LE();
|
||||||
hnm->_header._unusedUnknown = hnm->_file->readSint16LE();
|
_header._unusedUnknown = _file->readSint16LE();
|
||||||
for (int i = 0; i < 14; i++)
|
for (int i = 0; i < 14; i++)
|
||||||
hnm->_header._unusedReserved2[i] = hnm->_file->readSByte();
|
_header._unusedReserved2[i] = _file->readSByte();
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
hnm->_header._unusedCopyright[i] = hnm->_file->readSByte();
|
_header._unusedCopyright[i] = _file->readSByte();
|
||||||
|
|
||||||
hnm->_header._bufferSize += 4096; //TODO: checkme
|
_header._bufferSize += 4096; //TODO: checkme
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_GetVersion
|
// Original name: CLHNM_GetVersion
|
||||||
int16 HnmPlayer::getVersion(hnm_t *hnm) {
|
int16 HnmPlayer::getVersion() {
|
||||||
if (hnm->_header._signature == MKTAG('H','N','M','4'))
|
if (_header._signature == MKTAG('H','N','M','4'))
|
||||||
return 4;
|
return 4;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_AllocMemory
|
// Original name: CLHNM_AllocMemory
|
||||||
void HnmPlayer::allocMemory(hnm_t *hnm) {
|
void HnmPlayer::allocMemory() {
|
||||||
hnm->tmpBuffer[0] = (byte *)malloc(hnm->_header._bufferSize + 2);
|
// TODO: rework this code
|
||||||
|
tmpBuffer[0] = (byte *)malloc(_header._bufferSize + 2);
|
||||||
|
|
||||||
if (!hnm->tmpBuffer[0])
|
if (!tmpBuffer[0])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hnm->tmpBuffer[1] = (byte *)malloc(hnm->_header._bufferSize + 2);
|
tmpBuffer[1] = (byte *)malloc(_header._bufferSize + 2);
|
||||||
|
|
||||||
if (!hnm->tmpBuffer[1]) {
|
if (!tmpBuffer[1]) {
|
||||||
free(hnm->tmpBuffer[0]);
|
free(tmpBuffer[0]);
|
||||||
hnm->tmpBuffer[0] = nullptr;
|
tmpBuffer[0] = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hnm->_readBuffer = (byte *)malloc(hnm->_header._bufferSize + 2);
|
_readBuffer = (byte *)malloc(_header._bufferSize + 2);
|
||||||
if (!hnm->_readBuffer) {
|
if (!_readBuffer) {
|
||||||
free(hnm->tmpBuffer[0]);
|
free(tmpBuffer[0]);
|
||||||
hnm->tmpBuffer[0] = nullptr;
|
tmpBuffer[0] = nullptr;
|
||||||
free(hnm->tmpBuffer[1]);
|
free(tmpBuffer[1]);
|
||||||
hnm->tmpBuffer[1] = nullptr;
|
tmpBuffer[1] = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_DeallocMemory
|
// Original name: CLHNM_DeallocMemory
|
||||||
void HnmPlayer::deallocMemory(hnm_t *hnm) {
|
void HnmPlayer::deallocMemory() {
|
||||||
free(hnm->tmpBuffer[0]);
|
free(tmpBuffer[0]);
|
||||||
free(hnm->tmpBuffer[1]);
|
free(tmpBuffer[1]);
|
||||||
free(hnm->_readBuffer);
|
free(_readBuffer);
|
||||||
|
|
||||||
hnm->tmpBuffer[0] = nullptr;
|
tmpBuffer[0] = nullptr;
|
||||||
hnm->tmpBuffer[1] = nullptr;
|
tmpBuffer[1] = nullptr;
|
||||||
hnm->_readBuffer = nullptr;
|
_readBuffer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_SetFinalBuffer
|
// Original name: CLHNM_SetFinalBuffer
|
||||||
void HnmPlayer::setFinalBuffer(hnm_t *hnm, byte *buffer) {
|
void HnmPlayer::setFinalBuffer(byte *buffer) {
|
||||||
hnm->finalBuffer = buffer;
|
_finalBuffer = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_GetFrameNum
|
// Original name: CLHNM_GetFrameNum
|
||||||
int HnmPlayer::getFrameNum(hnm_t *hnm) {
|
int HnmPlayer::getFrameNum() {
|
||||||
return hnm->_frameNum;
|
return _frameNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_TryRead
|
// Original name: CLHNM_TryRead
|
||||||
void HnmPlayer::tryRead(hnm_t *hnm, int size) {
|
void HnmPlayer::tryRead(int size) {
|
||||||
hnm->_file->read(hnm->_readBuffer, size);
|
_file->read(_readBuffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_LoadFrame
|
// Original name: CLHNM_LoadFrame
|
||||||
bool HnmPlayer::loadFrame(hnm_t *hnm) {
|
bool HnmPlayer::loadFrame() {
|
||||||
tryRead(hnm, 4);
|
tryRead(4);
|
||||||
int chunk = *(int *)hnm->_readBuffer;
|
int chunk = *(int *)_readBuffer;
|
||||||
chunk = LE32(chunk);
|
chunk = LE32(chunk);
|
||||||
chunk &= 0xFFFFFF; // upper bit - keyframe mark?
|
chunk &= 0xFFFFFF; // upper bit - keyframe mark?
|
||||||
if (!chunk)
|
if (!chunk)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (chunk - 4 > hnm->_header._bufferSize)
|
if (chunk - 4 > _header._bufferSize)
|
||||||
error("loadFrame - Chunk size");
|
error("loadFrame - Chunk size");
|
||||||
|
|
||||||
tryRead(hnm, chunk - 4);
|
tryRead(chunk - 4);
|
||||||
hnm->_dataPtr = hnm->_readBuffer;
|
_dataPtr = _readBuffer;
|
||||||
hnm->_totalRead += chunk;
|
_totalRead += chunk;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,13 +347,13 @@ void HnmPlayer::desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 h
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_Desentrelace
|
// Original name: CLHNM_Desentrelace
|
||||||
void HnmPlayer::desentrelace(hnm_t *hnm) {
|
void HnmPlayer::desentrelace() {
|
||||||
switch (hnm->_header._width) {
|
switch (_header._width) {
|
||||||
case 320:
|
case 320:
|
||||||
desentrelace320(hnm->_newFrameBuffer, hnm->finalBuffer, hnm->_header._height);
|
desentrelace320(_newFrameBuffer, _finalBuffer, _header._height);
|
||||||
break;
|
break;
|
||||||
// case 480:
|
// case 480:
|
||||||
// CLHNM_Desentrelace480(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height);
|
// CLHNM_Desentrelace480(_newFrameBuffer, finalBuffer, _header._height);
|
||||||
// break;
|
// break;
|
||||||
default:
|
default:
|
||||||
error("desentrelace - Unexpected width");
|
error("desentrelace - Unexpected width");
|
||||||
|
@ -467,51 +463,51 @@ void HnmPlayer::decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, by
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_NextElement
|
// Original name: CLHNM_NextElement
|
||||||
bool HnmPlayer::nextElement(hnm_t *hnm) {
|
bool HnmPlayer::nextElement() {
|
||||||
if (hnm->_frameNum == 0) {
|
if (_frameNum == 0) {
|
||||||
resetInternalTimer();
|
resetInternalTimer();
|
||||||
_prevLeft = _prevRight = 0;
|
_prevLeft = _prevRight = 0;
|
||||||
}
|
}
|
||||||
if (hnm->_frameNum == hnm->_header._numbFrame)
|
if (_frameNum == _header._numbFrame)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!loadFrame(hnm))
|
if (!loadFrame())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int sz = READ_LE_UINT32(hnm->_dataPtr) & 0xFFFFFF;
|
int sz = READ_LE_UINT32(_dataPtr) & 0xFFFFFF;
|
||||||
hnm->_dataPtr += 4;
|
_dataPtr += 4;
|
||||||
int16 id = READ_LE_UINT16(hnm->_dataPtr);
|
int16 id = READ_LE_UINT16(_dataPtr);
|
||||||
hnm->_dataPtr += 2;
|
_dataPtr += 2;
|
||||||
char h6 = *hnm->_dataPtr;
|
char h6 = *_dataPtr;
|
||||||
hnm->_dataPtr += 1;
|
_dataPtr += 1;
|
||||||
char h7 = *hnm->_dataPtr;
|
char h7 = *_dataPtr;
|
||||||
hnm->_dataPtr += 1;
|
_dataPtr += 1;
|
||||||
hnm->_chunkId = id;
|
_chunkId = id;
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case MKTAG16('L', 'P'):
|
case MKTAG16('L', 'P'):
|
||||||
changePalette(hnm);
|
changePalette();
|
||||||
hnm->_dataPtr += sz - 8;
|
_dataPtr += sz - 8;
|
||||||
break;
|
break;
|
||||||
case MKTAG16('Z', 'I'):
|
case MKTAG16('Z', 'I'):
|
||||||
hnm->_frameNum++;
|
_frameNum++;
|
||||||
selectBuffers(hnm);
|
selectBuffers();
|
||||||
decompLempelZiv(hnm->_dataPtr + 4, hnm->_newFrameBuffer);
|
decompLempelZiv(_dataPtr + 4, _newFrameBuffer);
|
||||||
switch (hnm->_header._width) {
|
switch (_header._width) {
|
||||||
// case 320: CLBlitter_RawCopy320ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break;
|
// case 320: CLBlitter_RawCopy320ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
|
||||||
// case 480: CLBlitter_RawCopy480ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break;
|
// case 480: CLBlitter_RawCopy480ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
|
||||||
// case 640: CLBlitter_RawCopy640ASM(hnm->new_frame_buffer, hnm->old_frame_buffer, hnm->header.height); break;
|
// case 640: CLBlitter_RawCopy640ASM(_newFrameBuffer, _oldFrameBuffer, _header._height); break;
|
||||||
// default: memcpy(hnm->old_frame_buffer, hnm->new_frame_buffer, hnm->header.width * hnm->header.height);
|
// default: memcpy(_oldFrameBuffer, _newFrameBuffer, _header._width * _header._height);
|
||||||
default:
|
default:
|
||||||
memcpy(hnm->_oldFrameBuffer, hnm->_newFrameBuffer, hnm->_header._bufferSize); //TODO strange buffer size here
|
memcpy(_oldFrameBuffer, _newFrameBuffer, _header._bufferSize); //TODO strange buffer size here
|
||||||
}
|
}
|
||||||
if (!(h6 & 1))
|
if (!(h6 & 1))
|
||||||
desentrelace(hnm);
|
desentrelace();
|
||||||
else {
|
else {
|
||||||
// if(hnm->header.width == 640)
|
// if(_header._width == 640)
|
||||||
// CLBlitter_RawCopy640(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height);
|
// CLBlitter_RawCopy640(_newFrameBuffer, finalBuffer, _header._height);
|
||||||
// else
|
// else
|
||||||
memcpy(hnm->finalBuffer, hnm->_newFrameBuffer, hnm->_header._height); //TODO: wrong size?
|
memcpy(_finalBuffer, _newFrameBuffer, _header._height); //TODO: wrong size?
|
||||||
}
|
}
|
||||||
if (_useAdpcm) {
|
if (_useAdpcm) {
|
||||||
if (!_soundStarted) {
|
if (!_soundStarted) {
|
||||||
|
@ -527,16 +523,16 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
case MKTAG16('U', 'I'):
|
case MKTAG16('U', 'I'):
|
||||||
hnm->_frameNum++;
|
_frameNum++;
|
||||||
selectBuffers(hnm);
|
selectBuffers();
|
||||||
decompUBA(hnm->_newFrameBuffer, hnm->_newFrameBuffer, hnm->_oldFrameBuffer, hnm->_dataPtr, hnm->_header._width, h6);
|
decompUBA(_newFrameBuffer, _newFrameBuffer, _oldFrameBuffer, _dataPtr, _header._width, h6);
|
||||||
if (!(h6 & 1))
|
if (!(h6 & 1))
|
||||||
desentrelace(hnm);
|
desentrelace();
|
||||||
else {
|
else {
|
||||||
// if(hnm->header.width == 640)
|
// if(_header._width == 640)
|
||||||
// CLBlitter_RawCopy640(hnm->new_frame_buffer, hnm->final_buffer, hnm->header.height);
|
// CLBlitter_RawCopy640(_newFrameBuffer, _finalBuffer, _header._height);
|
||||||
// else
|
// else
|
||||||
memcpy(hnm->finalBuffer, hnm->_newFrameBuffer, hnm->_header._width * hnm->_header._height);
|
memcpy(_finalBuffer, _newFrameBuffer, _header._width * _header._height);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -546,7 +542,7 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
|
||||||
if (!h6) {
|
if (!h6) {
|
||||||
int sound_size = sz - 8;
|
int sound_size = sz - 8;
|
||||||
if (!_useAdpcm) {
|
if (!_useAdpcm) {
|
||||||
_soundGroup->setDatas(hnm->_dataPtr, sound_size - 2, false);
|
_soundGroup->setDatas(_dataPtr, sound_size - 2, false);
|
||||||
if (_soundStarted)
|
if (_soundStarted)
|
||||||
_soundGroup->playNextSample(_soundChannel);
|
_soundGroup->playNextSample(_soundChannel);
|
||||||
else
|
else
|
||||||
|
@ -555,11 +551,11 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
|
||||||
int16 *sound_buffer = (int16 *)_soundGroupAdpcm->getNextBuffer();
|
int16 *sound_buffer = (int16 *)_soundGroupAdpcm->getNextBuffer();
|
||||||
if (!_pendingSounds) {
|
if (!_pendingSounds) {
|
||||||
const int kDecompTableSize = 256 * sizeof(int16);
|
const int kDecompTableSize = 256 * sizeof(int16);
|
||||||
loadDecompTable((int16 *)hnm->_dataPtr);
|
loadDecompTable((int16 *)_dataPtr);
|
||||||
decompADPCM(hnm->_dataPtr + kDecompTableSize, sound_buffer, sound_size - kDecompTableSize);
|
decompADPCM(_dataPtr + kDecompTableSize, sound_buffer, sound_size - kDecompTableSize);
|
||||||
_soundGroupAdpcm->assignDatas(sound_buffer, (sound_size - kDecompTableSize) * 2, false);
|
_soundGroupAdpcm->assignDatas(sound_buffer, (sound_size - kDecompTableSize) * 2, false);
|
||||||
} else {
|
} else {
|
||||||
decompADPCM(hnm->_dataPtr, sound_buffer, sound_size);
|
decompADPCM(_dataPtr, sound_buffer, sound_size);
|
||||||
_soundGroupAdpcm->assignDatas(sound_buffer, sound_size * 2, false);
|
_soundGroupAdpcm->assignDatas(sound_buffer, sound_size * 2, false);
|
||||||
}
|
}
|
||||||
_pendingSounds++;
|
_pendingSounds++;
|
||||||
|
@ -569,12 +565,12 @@ bool HnmPlayer::nextElement(hnm_t *hnm) {
|
||||||
} else
|
} else
|
||||||
error("nextElement - unexpected flag");
|
error("nextElement - unexpected flag");
|
||||||
}
|
}
|
||||||
hnm->_dataPtr += sz - 8;
|
_dataPtr += sz - 8;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (_customChunkHandler)
|
if (_customChunkHandler)
|
||||||
_customChunkHandler(hnm->_dataPtr, sz - 8, id, h6, h7);
|
_customChunkHandler(_dataPtr, sz - 8, id, h6, h7);
|
||||||
hnm->_dataPtr += sz - 8;
|
_dataPtr += sz - 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -586,13 +582,13 @@ SoundChannel *HnmPlayer::getSoundChannel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_FlushPreloadBuffer
|
// Original name: CLHNM_FlushPreloadBuffer
|
||||||
void HnmPlayer::flushPreloadBuffer(hnm_t *hnm) {
|
void HnmPlayer::flushPreloadBuffer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_ChangePalette
|
// Original name: CLHNM_ChangePalette
|
||||||
void HnmPlayer::changePalette(hnm_t *hnm) {
|
void HnmPlayer::changePalette() {
|
||||||
CLPalette_GetLastPalette(hnm->_palette);
|
CLPalette_GetLastPalette(_palette);
|
||||||
byte *pal = hnm->_dataPtr;
|
byte *pal = _dataPtr;
|
||||||
if (*(uint16 *)pal == 0xFFFF)
|
if (*(uint16 *)pal == 0xFFFF)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -609,7 +605,7 @@ void HnmPlayer::changePalette(hnm_t *hnm) {
|
||||||
mincolor = fst;
|
mincolor = fst;
|
||||||
if (maxcolor < fst + cnt)
|
if (maxcolor < fst + cnt)
|
||||||
maxcolor = fst + cnt;
|
maxcolor = fst + cnt;
|
||||||
color_t *color = hnm->_palette + fst;
|
color_t *color = _palette + fst;
|
||||||
if (_safePalette) {
|
if (_safePalette) {
|
||||||
while (cnt--) {
|
while (cnt--) {
|
||||||
byte r = *pal++;
|
byte r = *pal++;
|
||||||
|
@ -640,23 +636,23 @@ void HnmPlayer::changePalette(hnm_t *hnm) {
|
||||||
} while (*(uint16 *)pal != 0xFFFF);
|
} while (*(uint16 *)pal != 0xFFFF);
|
||||||
#if 0
|
#if 0
|
||||||
if (preserve_color0) {
|
if (preserve_color0) {
|
||||||
hnm->palette[0].r = 0;
|
_palette[0].r = 0;
|
||||||
hnm->palette[0].g = 0;
|
_palette[0].g = 0;
|
||||||
hnm->palette[0].b = 0;
|
_palette[0].b = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// CLBlitter_Send2ScreenNextCopy(hnm->palette, mincolor, maxcolor - mincolor);
|
// CLBlitter_Send2ScreenNextCopy(_palette, mincolor, maxcolor - mincolor);
|
||||||
CLBlitter_Send2ScreenNextCopy(hnm->_palette, 0, 256);
|
CLBlitter_Send2ScreenNextCopy(_palette, 0, 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_SelectBuffers
|
// Original name: CLHNM_SelectBuffers
|
||||||
void HnmPlayer::selectBuffers(hnm_t *hnm) {
|
void HnmPlayer::selectBuffers() {
|
||||||
if (hnm->_frameNum % 2) {
|
if (_frameNum % 2) {
|
||||||
hnm->_newFrameBuffer = hnm->tmpBuffer[1];
|
_newFrameBuffer = tmpBuffer[1];
|
||||||
hnm->_oldFrameBuffer = hnm->tmpBuffer[0];
|
_oldFrameBuffer = tmpBuffer[0];
|
||||||
} else {
|
} else {
|
||||||
hnm->_newFrameBuffer = hnm->tmpBuffer[0];
|
_newFrameBuffer = tmpBuffer[0];
|
||||||
hnm->_oldFrameBuffer = hnm->tmpBuffer[1];
|
_oldFrameBuffer = tmpBuffer[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,14 +660,9 @@ void HnmPlayer::selectBuffers(hnm_t *hnm) {
|
||||||
void HnmPlayer::done() {
|
void HnmPlayer::done() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_Dispose
|
|
||||||
void HnmPlayer::dispose(hnm_t *hnm) {
|
|
||||||
free(hnm);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Original name: CLHNM_CanLoop
|
// Original name: CLHNM_CanLoop
|
||||||
void HnmPlayer::canLoop(hnm_t *hnm, bool canLoop) {
|
void HnmPlayer::canLoop(bool canLoop) {
|
||||||
hnm->_canLoop = canLoop;
|
_canLoop = canLoop;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Original name: CLHNM_SoundInADPCM
|
// Original name: CLHNM_SoundInADPCM
|
||||||
|
|
|
@ -28,6 +28,23 @@ namespace Cryo {
|
||||||
class CryoEngine;
|
class CryoEngine;
|
||||||
|
|
||||||
class HnmPlayer {
|
class HnmPlayer {
|
||||||
|
public:
|
||||||
|
int _frameNum;
|
||||||
|
int _unused04;
|
||||||
|
Common::File *_file;
|
||||||
|
HNMHeader _header;
|
||||||
|
byte *tmpBuffer[2];
|
||||||
|
byte *_finalBuffer;
|
||||||
|
byte *_newFrameBuffer;
|
||||||
|
byte *_oldFrameBuffer;
|
||||||
|
byte *_readBuffer;
|
||||||
|
byte *_dataPtr;
|
||||||
|
color_t _palette[256];
|
||||||
|
bool _canLoop;
|
||||||
|
int16 _unused896;
|
||||||
|
int16 _chunkId;
|
||||||
|
int _totalRead;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CryoEngine *_vm;
|
CryoEngine *_vm;
|
||||||
|
|
||||||
|
@ -35,19 +52,18 @@ private:
|
||||||
void wantsSound(bool sound);
|
void wantsSound(bool sound);
|
||||||
void decompADPCM(byte *buffer, int16 *output, int size);
|
void decompADPCM(byte *buffer, int16 *output, int size);
|
||||||
void loadDecompTable(int16 *buffer);
|
void loadDecompTable(int16 *buffer);
|
||||||
bool loadFrame(hnm_t *hnm);
|
bool loadFrame();
|
||||||
void tryRead(hnm_t *hnm, int size);
|
void tryRead(int size);
|
||||||
void changePalette(hnm_t *hnm);
|
void changePalette();
|
||||||
void selectBuffers(hnm_t *hnm);
|
void selectBuffers();
|
||||||
void decompLempelZiv(byte *buffer, byte *output);
|
void decompLempelZiv(byte *buffer, byte *output);
|
||||||
void desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 height);
|
void desentrelace320(byte *frame_buffer, byte *final_buffer, uint16 height);
|
||||||
void desentrelace(hnm_t *hnm);
|
void desentrelace();
|
||||||
void decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, byte *input, int width, char flags);
|
void decompUBA(byte *output, byte *curr_buffer, byte *prev_buffer, byte *input, int width, char flags);
|
||||||
|
|
||||||
// Unused
|
// Unused
|
||||||
void done();
|
void done();
|
||||||
void dispose(hnm_t *hnm);
|
void canLoop(bool canLoop);
|
||||||
void canLoop(hnm_t *hnm, bool canLoop);
|
|
||||||
void soundInADPCM(bool is_adpcm);
|
void soundInADPCM(bool is_adpcm);
|
||||||
void soundMono(bool is_mono);
|
void soundMono(bool is_mono);
|
||||||
//
|
//
|
||||||
|
@ -81,23 +97,23 @@ public:
|
||||||
HnmPlayer(CryoEngine *vm);
|
HnmPlayer(CryoEngine *vm);
|
||||||
|
|
||||||
void setupTimer(float rate);
|
void setupTimer(float rate);
|
||||||
void reset(hnm_t *hnm);
|
void reset();
|
||||||
void closeSound();
|
void closeSound();
|
||||||
void waitLoop(hnm_t *hnm);
|
void waitLoop();
|
||||||
void flushPreloadBuffer(hnm_t *hnm);
|
void flushPreloadBuffer();
|
||||||
void setupSound(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
|
void setupSound(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
|
||||||
void setupSoundADPCM(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
|
void setupSoundADPCM(int16 numSounds, int16 length, int16 sampleSize, float rate, int16 mode);
|
||||||
bool nextElement(hnm_t *hnm);
|
bool nextElement();
|
||||||
void init();
|
void init();
|
||||||
void setForceZero2Black(bool forceblack);
|
void setForceZero2Black(bool forceblack);
|
||||||
void readHeader(hnm_t *hnm);
|
void readHeader();
|
||||||
int16 getVersion(hnm_t *hnm);
|
int16 getVersion();
|
||||||
void allocMemory(hnm_t *hnm);
|
void allocMemory();
|
||||||
void deallocMemory(hnm_t *hnm);
|
void deallocMemory();
|
||||||
void setFinalBuffer(hnm_t *hnm, byte *buffer);
|
void setFinalBuffer(byte *buffer);
|
||||||
int getFrameNum(hnm_t *hnm);
|
int getFrameNum();
|
||||||
hnm_t *resetInternals();
|
void resetInternals();
|
||||||
void setFile(hnm_t *hnm, Common::File *file);
|
void setFile(Common::File *file);
|
||||||
|
|
||||||
SoundChannel *getSoundChannel();
|
SoundChannel *getSoundChannel();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue