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