diff options
Diffstat (limited to 'engines/sci/gui/gui.cpp')
-rw-r--r-- | engines/sci/gui/gui.cpp | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp new file mode 100644 index 0000000000..9ba4ebe37a --- /dev/null +++ b/engines/sci/gui/gui.cpp @@ -0,0 +1,330 @@ +/* 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 2 + * 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 + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/util.h" + +#include "sci/sci.h" +#include "sci/engine/state.h" +#include "sci/tools.h" +#include "sci/gui/gui_screen.h" +#include "sci/gui/gui_gfx.h" +#include "sci/gui/gui_windowmgr.h" +#include "sci/gui/gui_memmgr.h" +#include "sci/gui/gui_view.h" + +#include "sci/gfx/operations.h" + +namespace Sci { + +SciGUI::SciGUI(OSystem *system, EngineState *state) + : _system(system), _s(state) { + _screen = new SciGUIscreen(_system, _s); + _gfx = new SciGUIgfx(_system, _s, _screen); + _windowMgr = new SciGUIwindowMgr(_s, _gfx); +} + +SciGUI::SciGUI() { +} + +SciGUI::~SciGUI() { +} + +void SciGUI::init(bool oldGfxFunctions) { + _usesOldGfxFunctions = oldGfxFunctions; + + /* Set default SCI0 palette */ +} + +int16 SciGUI::getTimeTicks() { + return _gfx->_sysTicks; +} + +void SciGUI::wait(int16 ticks) { + uint32 waitto = _gfx->_sysTicks + ticks; + do { + //eventMgr->pollEvents(); + _system->delayMillis(_gfx->_sysSpeed >> 11); + } while (_gfx->_sysTicks < waitto); +} + +void SciGUI::setPort(uint16 portPtr) { + switch (portPtr) { + case 0: _gfx->SetPort(_windowMgr->_wmgrPort); break; + case 0xFFFF: _gfx->SetPort(_gfx->_menuPort); break; + default: + _gfx->SetPort((sciPort *)heap2Ptr(portPtr)); + }; +} + +void SciGUI::setPortPic(Common::Rect rect, int16 picTop, int16 picLeft) { + _windowMgr->_picWind->rect = rect; + _windowMgr->_picWind->top = picTop; + _windowMgr->_picWind->left = picLeft; + //if (argc >= 7) + //InitPri(42,190); +} + +reg_t SciGUI::getPort() { + return make_reg(0, ptr2heap((byte *)_gfx->GetPort())); +} + +void SciGUI::globalToLocal(int16 *x, int16 *y) { + sciPort *curPort = _gfx->GetPort(); + *x = *x - curPort->left; + *y = *y - curPort->top; +} + +void SciGUI::localToGlobal(int16 *x, int16 *y) { + sciPort *curPort = _gfx->GetPort(); + *x = *x + curPort->left; + *y = *y + curPort->top; +} + +reg_t SciGUI::newWindow(Common::Rect rect1, Common::Rect rect2, uint16 style, int16 priority, int16 colorPen, int16 colorBack, const char *title) { + sciWnd *wnd = NULL; + + if (rect2.top != 0 && rect2.left != 0 && rect2.height() != 0 && rect2.width() != 0) + wnd = _windowMgr->NewWindow(&rect1, &rect2, "", style, priority, 0); + else + wnd = _windowMgr->NewWindow(&rect1, NULL, "", style, priority, 0); + wnd->penClr = colorPen; + wnd->backClr = colorBack; + _windowMgr->DrawWindow(wnd); + return make_reg(0, ptr2heap((byte *)wnd)); +} + +void SciGUI::disposeWindow(uint16 windowPtr, int16 arg2) { + sciWnd *wnd = (sciWnd *)heap2Ptr(windowPtr); + _windowMgr->DisposeWindow(wnd, arg2); +} + +void SciGUI::display(const char *text, int argc, reg_t *argv) { + int displayArg; + sciPort oldPort; + int16 align = 0; + int16 bgcolor = -1, width = 0xFFFF, bRedraw = 1; + byte bSaveUnder = false; + Common::Rect rect, *orect = &((sciWnd *)_gfx->GetPort())->rect0; + + memcpy(&oldPort, _gfx->GetPort(), sizeof(sciPort)); + // setting defaults + _gfx->PenMode(0); + _gfx->PenColor(0); + _gfx->TextFace(0); + // processing codes in argv + while (argc > 0) { + displayArg = argv[0].toUint16(); + argc--; argv++; + switch (displayArg - 100) { + case 0: + _gfx->MoveTo(argv[0].toUint16(), argv[1].toUint16()); + argc -= 2; argv += 2; + break;// move pen + case 1: + align = argv[0].toUint16(); + argc--; argv++; + break;// set alignment + case 2: + _gfx->PenColor(argv[0].toUint16()); + argc--; argv++; + break;// set pen color + case 3: + bgcolor = argv[0].toUint16(); + argc--; argv++; + break; + case 4: + _gfx->TextFace(argv[0].toUint16()); + argc--; argv++; + break;// set text grayout flag + case 5: + _gfx->SetFont(argv[0].toUint16()); + argc--; argv++; + break;// set font + case 6: + width = argv[0].toUint16(); + argc--; argv++; + break; + case 7: + bSaveUnder = 1; + break; + case 8: // restore under +// if (hunk2Ptr(*pArgs)) { +// memcpy(&rect, hunk2Ptr(*pArgs), sizeof(Common::Rect)); +// // rect is now absolute. Have to move it to be port-relative +// rect.translate(-_gfx->RGetPort()->left, -_gfx->RGetPort()->top); +// _gfx->RestoreBits(*pArgs); +// ReAnimate(&rect); +// } + // finishing loop + argc = 0; + break; + case 0x15: + bRedraw = 0; + break; + default: + warning("Unknown kDisplay argument %X", displayArg); + break; + } + } + // now drawing the text + _gfx->TextSize(rect, text, -1, width); + _gfx->Move((orect->left <= 320 ? 0 : 320 - orect->left), (orect->top <= 200 ? 0 : 200 - orect->top)); // move port to (0,0) + rect.moveTo(_gfx->GetPort()->curLeft, _gfx->GetPort()->curTop); +// if (bSaveUnder) +// _acc = _gfx->SaveBits(rect, 1); + if (bgcolor != -1) + _gfx->FillRect(rect, 1, bgcolor, 0, 0); + _gfx->TextBox(text, 0, rect, align, 0xFFFF); +// if (_picNotValid == 0 && bRedraw) +// _gfx->ShowBits(rect, 1); + // restoring port and cursor pos + sciPort *currport = _gfx->GetPort(); + uint16 tTop = currport->curTop; + uint16 tLeft = currport->curLeft; + memcpy(currport, &oldPort, sizeof(sciPort)); + currport->curTop = tTop; + currport->curLeft = tLeft; + + _screen->UpdateWhole(); +} + +void SciGUI::textSize(const char *text, int16 font, int16 maxWidth, int16 *textWidth, int16 *textHeight) { + Common::Rect rect(0, 0, *textWidth, *textHeight); + _gfx->TextSize(rect, text, font, maxWidth); + *textWidth = rect.width(); *textHeight = rect.height(); +} + +// Used SCI1+ for text codes +void SciGUI::textFonts(int argc, reg_t *argv) { +} + +// Used SCI1+ for text codes +void SciGUI::textColors(int argc, reg_t *argv) { +} + +void SciGUI::drawPicture(sciResourceId pictureId, uint16 style, uint16 flags, int16 EGApaletteNo) { + bool addToFlag = flags ? true : false; + + sciPort *oldPort = _gfx->SetPort((sciPort *)_windowMgr->_picWind); + + if (_windowMgr->isFrontWindow(_windowMgr->_picWind)) { + _gfx->drawPicture(pictureId, style, addToFlag, EGApaletteNo); + } else { + _windowMgr->BeginUpdate(_windowMgr->_picWind); + _gfx->drawPicture(pictureId, style, addToFlag, EGApaletteNo); + _windowMgr->EndUpdate(_windowMgr->_picWind); + } + _screen->UpdateWhole(); + + _gfx->SetPort(oldPort); + _s->pic_not_valid = 1; +} + +void SciGUI::drawCell(sciResourceId viewId, uint16 loopNo, uint16 cellNo, uint16 leftPos, uint16 topPos, int16 priority, uint16 paletteNo) { + _gfx->drawCell(viewId, loopNo, cellNo, leftPos, topPos, priority, paletteNo); + _gfx->SetCLUT(&_gfx->_sysPalette); + _screen->UpdateWhole(); +} + +void SciGUI::drawControlButton(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 style, bool inverse) { + rect.grow(1); + _gfx->EraseRect(rect); + _gfx->FrameRect(rect); + rect.grow(-2); + _gfx->TextFace(style & 1 ? 0 : 1); + _gfx->TextBox(text, 0, rect, 1, fontId); + _gfx->TextFace(0); + if (style & 8) { // selected + rect.grow(1); + _gfx->FrameRect(rect); + } + _screen->UpdateWhole(); +} + +void SciGUI::drawControlText(Common::Rect rect, reg_t obj, const char *text, int16 fontId, int16 mode, int16 style, bool inverse) { + rect.grow(1); + _gfx->EraseRect(rect); + rect.grow(-1); + _gfx->TextBox(text, 0, rect, mode, fontId); + if (style & 8) { // selected + _gfx->FrameRect(rect); + } + _screen->UpdateWhole(); +} + +void SciGUI::graphFillBoxForeground(Common::Rect rect) { + _gfx->PaintRect(rect); + _screen->UpdateWhole(); +} + +void SciGUI::graphFillBoxBackground(Common::Rect rect) { + _gfx->EraseRect(rect); + _screen->UpdateWhole(); +} + +void SciGUI::graphFillBox(Common::Rect rect, uint16 colorMask, int16 color, int16 priority, int16 control) { + _gfx->FillRect(rect, colorMask, color, priority, control); + _screen->UpdateWhole(); +} + +void SciGUI::graphDrawLine(Common::Rect rect, int16 color, int16 priority, int16 control) { + _gfx->Draw_Line(rect.left, rect.top, rect.right, rect.bottom, color, priority, control); + _screen->UpdateWhole(); +} + +reg_t SciGUI::graphSaveBox(Common::Rect rect, uint16 flags) { + return _gfx->SaveBits(rect, flags); +} + +void SciGUI::graphRestoreBox(reg_t handle) { + _gfx->RestoreBits(handle); + _screen->UpdateWhole(); +} + +void SciGUI::paletteSet(int resourceNo, int flags) { + _gfx->SetResPalette(resourceNo, flags); +} + +int16 SciGUI::paletteFind(int r, int g, int b) { + return _gfx->MatchColor(&_gfx->_sysPalette, r, g, b) & 0xFF; +} + +void SciGUI::paletteAnimate(int fromColor, int toColor, int speed) { + _gfx->animatePalette(fromColor, toColor, speed); +} + +void SciGUI::moveCursor(int16 x, int16 y) { + Common::Point newPos; + sciPort *curPort = _gfx->GetPort(); + + x += _windowMgr->_picWind->rect.left; + y += _windowMgr->_picWind->rect.top; + newPos.x = CLIP<int16> (x, _windowMgr->_picWind->rect.left, _windowMgr->_picWind->rect.right - 1); + newPos.y = CLIP<int16> (y, _windowMgr->_picWind->rect.top, _windowMgr->_picWind->rect.bottom - 1); + + gfxop_set_pointer_position(_s->gfx_state, newPos); +} + +} // End of namespace Sci |