scummvm/engines/saga2/videobox.cpp
2022-10-27 23:28:01 +02:00

192 lines
4.7 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* aint32 with this program; if not, write to the Free Software
*
*
* Based on the original sources
* Faery Tale II -- The Halls of the Dead
* (c) 1993-1996 The Wyrmkeep Entertainment Co.
*/
#include "saga2/saga2.h"
#include "saga2/videobox.h"
#include "saga2/vpal.h"
namespace Saga2 {
// imports
extern BackWindow *mainWindow;
/* ===================================================================== *
CVideoBox: Methods
* ===================================================================== */
CVideoBox::CVideoBox(const Rect16 &box,
uint16 ident,
AppFunc *cmd) : ModalWindow(box, ident, cmd) {
// set the size of the window panes
_vidPanRects[0] = Rect16(x, y, xBrushSize, yBrushSize);
_vidPanRects[1] = Rect16(x, y + yBrushSize, xBrushSize, yBrushSize);
// options dialog window decorations
_vidDec[0].set(_vidPanRects[0], vidPan1ResID);
_vidDec[1].set(_vidPanRects[1], vidPan2ResID);
// null out the _decRes pointer
_decRes = nullptr;
_rInfo.result = -1;
_rInfo.running = false;
}
CVideoBox::~CVideoBox() {
// remove the resource handle
if (_decRes)
resFile->disposeContext(_decRes);
_decRes = nullptr;
// stop video if not done
g_vm->abortVideo();
}
void CVideoBox::deactivate() {
_selected = 0;
gPanel::deactivate();
}
bool CVideoBox::activate(gEventType why) {
if (why == gEventMouseDown) { // momentarily depress
_selected = 1;
notify(why, 0); // notify App of successful hit
return true;
}
return false;
}
void CVideoBox::pointerMove(gPanelMessage &) {
notify(gEventMouseMove, 0);
}
bool CVideoBox::pointerHit(gPanelMessage &) {
// mouse hit detected, close video box
gWindow *win;
requestInfo *ri;
win = getWindow(); // get the window pointer
ri = win ? (requestInfo *)win->_userData : nullptr;
if (ri) {
ri->running = 0;
ri->result = _id;
}
activate(gEventMouseDown);
return true;
}
void CVideoBox::pointerDrag(gPanelMessage &) {
if (_selected) {
notify(gEventMouseDrag, 0);
}
}
void CVideoBox::pointerRelease(gPanelMessage &) {
if (_selected) notify(gEventMouseUp, 0); // notify App of successful hit
deactivate();
}
void CVideoBox::drawClipped(
gPort &port,
const Point16 &offset,
const Rect16 &clipRect) {
g_vm->_pointer->hide();
ModalWindow::drawClipped(port, offset, clipRect);
g_vm->_pointer->show();
}
void CVideoBox::draw() { // redraw the window
// draw the decoration stuff
drawClipped(g_vm->_mainPort, Point16(0, 0), _extent);
}
void CVideoBox::init() {
assert(resFile);
// set the result info to nominal startup values
_rInfo.result = -1;
_rInfo.running = true;
// init the resource context handle
_decRes = resFile->newContext(MKTAG('V', 'I', 'D', 'O'),
"Video border resources");
// get the decorations for this window
setDecorations(_vidDec,
ARRAYSIZE(_vidDec),
_decRes,
'V', 'B', 'D');
// attach the result info struct to this window
_userData = &_rInfo;
}
int16 CVideoBox::openVidBox(char *fileName) {
// initalize the graphics for this window
init();
// call the rest of the required functionality
ModalWindow::open();
// start the video playback
g_vm->startVideo(fileName, x + borderWidth, y + borderWidth);
// run this modal event loop
//EventLoop( _rInfo.running, true );
_rInfo.running = g_vm->checkVideo();
while (_rInfo.running)
_rInfo.running = g_vm->checkVideo();
// get the result
return _rInfo.result;
}
// this opens a video box for business
int16 openVidBox(char *fileName) {
// get the area of the vid box
Rect16 area = CVideoBox::getAreaRect();
g_vm->_pal->quickSavePalette();
// create a video box
CVideoBox videoBox(area, 0, nullptr);
// open this video box
int16 result = videoBox.openVidBox(fileName);
g_vm->_pal->quickRestorePalette();
// replace the damaged area
mainWindow->invalidate(&area);
// return the result code
return result;
}
} // end of namespace Saga2