mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 17:57:14 +00:00
Experimental wide display support, new move_screen function
svn-id: r8053
This commit is contained in:
parent
9ef343ad33
commit
628e81944c
@ -85,21 +85,33 @@ void OSystem_PALMOS::load_gfx_mode() {
|
||||
switch(_mode)
|
||||
{
|
||||
case GFX_FLIPPING:
|
||||
gVars->screenLocked = true;
|
||||
_offScreenP = WinScreenLock(winLockErase) + _screeny;
|
||||
_screenP = _offScreenP;
|
||||
gVars->screenLocked = true;
|
||||
_offScreenH = WinGetDisplayWindow();
|
||||
_screenH = _offScreenH;
|
||||
_renderer_proc = &update_screen__flipping;
|
||||
break;
|
||||
case GFX_WIDE:
|
||||
case GFX_DOUBLEBUFFER:
|
||||
_screenH = WinGetDisplayWindow();
|
||||
_screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH))) + _screeny;
|
||||
_offScreenH = WinCreateOffscreenWindow(_screenWidth, _screenHeight, screenFormat, &e);
|
||||
_offScreenP = (byte *)(BmpGetBits(WinGetBitmap(_offScreenH)));
|
||||
_renderer_proc = &update_screen__dbuffer;
|
||||
|
||||
if (_mode == GFX_WIDE) {
|
||||
gVars->screenLocked = true;
|
||||
_screenP = WinScreenLock(winLockErase) + _screeny;
|
||||
_renderer_proc = &update_screen__wide;
|
||||
} else {
|
||||
_screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH))) + _screeny;
|
||||
_renderer_proc = &update_screen__dbuffer;
|
||||
}
|
||||
break;
|
||||
|
||||
case GFX_NORMAL:
|
||||
default:
|
||||
_offScreenH = WinGetDisplayWindow();
|
||||
_screenH = _offScreenH;
|
||||
_offScreenP = (byte *)(BmpGetBits(WinGetBitmap(_offScreenH))) + _screeny;
|
||||
_screenP = _offScreenP;
|
||||
_renderer_proc = &update_screen__direct;
|
||||
@ -121,6 +133,13 @@ void OSystem_PALMOS::unload_gfx_mode() {
|
||||
case GFX_FLIPPING:
|
||||
WinScreenUnlock();
|
||||
break;
|
||||
|
||||
case GFX_WIDE:
|
||||
WinScreenUnlock();
|
||||
if (_wideRefNum != sysInvalidRefNum)
|
||||
SilkLibClose(sysInvalidRefNum);
|
||||
// continue to GFX_DOUBLEBUFFER
|
||||
|
||||
case GFX_DOUBLEBUFFER:
|
||||
WinDeleteWindow(_offScreenH,false);
|
||||
break;
|
||||
@ -133,6 +152,29 @@ void OSystem_PALMOS::unload_gfx_mode() {
|
||||
free(_tmpScreenP);
|
||||
}
|
||||
|
||||
static UInt16 checkSilkScreen() {
|
||||
SonySysFtrSysInfoP sonySysFtrSysInfoP;
|
||||
Err error = errNone;
|
||||
UInt16 refNum = sysInvalidRefNum;
|
||||
|
||||
if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) {
|
||||
if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrSilk) {
|
||||
|
||||
if ((error = SysLibFind(sonySysLibNameSilk, &refNum)))
|
||||
if (error == sysErrLibNotFound)
|
||||
error = SysLibLoad( sonySysFileTSilkLib, sonySysFileCSilkLib, &refNum);
|
||||
|
||||
if (!error)
|
||||
error = SilkLibOpen(refNum);
|
||||
}
|
||||
}
|
||||
|
||||
if (error)
|
||||
refNum = sysInvalidRefNum;
|
||||
|
||||
return refNum;
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::init_size(uint w, uint h) {
|
||||
|
||||
_screenWidth = w;
|
||||
@ -141,8 +183,39 @@ void OSystem_PALMOS::init_size(uint w, uint h) {
|
||||
_overlay_visible = false;
|
||||
_quit = false;
|
||||
|
||||
_decaly = (320-h)/2;
|
||||
_screeny= _decaly * 320;
|
||||
|
||||
if (_mode == GFX_WIDE) {
|
||||
// check HiRes+
|
||||
_wideRefNum = checkSilkScreen();
|
||||
if (_wideRefNum != sysInvalidRefNum) {
|
||||
if (w == 320 && h == 200) { // only for 320x200 games
|
||||
SilkLibEnableResize(_wideRefNum);
|
||||
SilkLibResizeDispWin(_wideRefNum, silkResizeMax);
|
||||
SilkLibDisableResize(_wideRefNum);
|
||||
} else {
|
||||
SilkLibClose(_wideRefNum);
|
||||
_wideRefNum = sysInvalidRefNum;
|
||||
warning("Wide display not avalaible for this game, switching to GFX_NORMAL mode.");
|
||||
_mode = GFX_NORMAL;
|
||||
}
|
||||
} else {
|
||||
warning("HiRes+ not avalaible on this device, switching to GFX_NORMAL mode.");
|
||||
_mode = GFX_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (_mode == GFX_WIDE) {
|
||||
_decaly = 10;
|
||||
_screeny = 10;
|
||||
|
||||
// precalc 1.5x stuff
|
||||
for (UInt16 oh = 0; oh < 320; oh++)
|
||||
onehalf[oh] = ((oh % 2) == 0);
|
||||
|
||||
} else {
|
||||
_decaly = (320 - h )/ 2;
|
||||
_screeny= _decaly * 320;
|
||||
}
|
||||
|
||||
set_mouse_pos(200,150);
|
||||
|
||||
@ -166,9 +239,36 @@ void OSystem_PALMOS::copy_rect(const byte *buf, int pitch, int x, int y, int w,
|
||||
} while (--h);
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::update_screen__flipping()
|
||||
{
|
||||
RectangleType r;
|
||||
void OSystem_PALMOS::update_screen__wide() {
|
||||
Coord x, y;
|
||||
UInt32 pitch = 320;
|
||||
UInt32 next = _decaly << 1;
|
||||
UInt8 *dst = _screenP;
|
||||
UInt8 *src1 = _offScreenP + pitch - 1;
|
||||
UInt8 *src2 = src1;
|
||||
|
||||
for (x = 0; x < _screenWidth; x++) {
|
||||
for (y = 0; y < _screenHeight; y++) {
|
||||
*dst++ = *src1;
|
||||
if (onehalf[y])
|
||||
*dst++ = *src1;
|
||||
src1 += pitch;
|
||||
}
|
||||
src1 = --src2;
|
||||
dst += next;
|
||||
|
||||
if (onehalf[x]) {
|
||||
MemMove(dst, dst - pitch, 300); // 300 = 200 x 1.5
|
||||
dst += pitch;
|
||||
}
|
||||
}
|
||||
|
||||
WinScreenUnlock();
|
||||
_screenP = WinScreenLock(winLockErase) + _screeny;
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::update_screen__flipping() {
|
||||
RectangleType r, dummy;
|
||||
UInt8 *screen;
|
||||
UInt32 size = _screenWidth * _screenHeight + 6400; // 10 pix top and bottom border
|
||||
Boolean shaked = false;
|
||||
@ -176,9 +276,9 @@ void OSystem_PALMOS::update_screen__flipping()
|
||||
|
||||
// shake screen
|
||||
if (_current_shake_pos != _new_shake_pos) {
|
||||
if (gVars->HRrefNum) {
|
||||
if (_useHRmode) {
|
||||
RctSetRectangle(&r, 0, _decaly - _new_shake_pos, _screenWidth, _screenHeight + (_new_shake_pos << 2));
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winDown, _new_shake_pos, NULL);
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winDown, _new_shake_pos, &dummy);
|
||||
} else {
|
||||
move = (_new_shake_pos * _screenWidth);
|
||||
screen = _offScreenP - 3200;
|
||||
@ -199,8 +299,8 @@ void OSystem_PALMOS::update_screen__flipping()
|
||||
_offScreenP = WinScreenLock(winLockCopy) + _screeny;
|
||||
_screenP = _offScreenP;
|
||||
if (shaked) {
|
||||
if (gVars->HRrefNum) {
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winUp, _new_shake_pos, NULL);
|
||||
if (_useHRmode) {
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winUp, _new_shake_pos, &dummy);
|
||||
} else {
|
||||
screen = _offScreenP - 3200;
|
||||
MemMove(screen, screen + move, size);
|
||||
@ -209,8 +309,7 @@ void OSystem_PALMOS::update_screen__flipping()
|
||||
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::update_screen__dbuffer()
|
||||
{
|
||||
void OSystem_PALMOS::update_screen__dbuffer() {
|
||||
UInt32 move = 0;
|
||||
UInt32 size = _screenWidth * _screenHeight;
|
||||
|
||||
@ -231,8 +330,7 @@ void OSystem_PALMOS::update_screen__dbuffer()
|
||||
MemMove(_screenP + move, _offScreenP, size - move);
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::update_screen__direct()
|
||||
{
|
||||
void OSystem_PALMOS::update_screen__direct() {
|
||||
if (_current_shake_pos != _new_shake_pos) {
|
||||
if (_vibrate) {
|
||||
Boolean active = (_new_shake_pos >= 3);
|
||||
@ -347,8 +445,8 @@ void OSystem_PALMOS::update_screen() {
|
||||
|
||||
if (oldCol != gVars->indicator.on) {
|
||||
// redraw if needed
|
||||
if (lastKeyModifier)
|
||||
drawKeyState(this, lastKeyModifier);
|
||||
if (_lastKeyModifier)
|
||||
drawKeyState(this, _lastKeyModifier);
|
||||
|
||||
if(_useNumPad)
|
||||
drawNumPad(this, gVars->indicator.on);
|
||||
@ -460,16 +558,16 @@ void OSystem_PALMOS::SimulateArrowKeys(Event *event, Int8 iHoriz, Int8 iVert, Bo
|
||||
Int16 y = _mouseCurState.y;
|
||||
|
||||
if (repeat) {
|
||||
lastKeyRepeat += 100;
|
||||
_lastKeyRepeat += 100;
|
||||
|
||||
if (lastKeyRepeat > 3200)
|
||||
lastKeyRepeat = 3200;
|
||||
if (_lastKeyRepeat > 3200)
|
||||
_lastKeyRepeat = 3200;
|
||||
}
|
||||
else
|
||||
lastKeyRepeat = 100;
|
||||
_lastKeyRepeat = 100;
|
||||
|
||||
x = x + iHoriz * (lastKeyRepeat/100);
|
||||
y = y + iVert * (lastKeyRepeat/100);
|
||||
x = x + iHoriz * (_lastKeyRepeat/100);
|
||||
y = y + iVert * (_lastKeyRepeat/100);
|
||||
|
||||
x = (x < 0 ) ? 0 : x;
|
||||
x = (x >= _screenWidth ) ? _screenWidth-1 : x;
|
||||
@ -482,11 +580,21 @@ void OSystem_PALMOS::SimulateArrowKeys(Event *event, Int8 iHoriz, Int8 iVert, Bo
|
||||
event->mouse.y = y;
|
||||
}
|
||||
|
||||
static void getCoordinates(EventPtr event, Boolean wide, Coord *x, Coord *y) {
|
||||
if (wide) {
|
||||
*y = (event->screenX << 1) / 1.5;
|
||||
*x = 320 - (event->screenY << 1) / 1.5 - 1; // wide only for 320x200, so ...
|
||||
} else {
|
||||
*x = event->screenX << 1;
|
||||
*y = event->screenY << 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
EventType ev;
|
||||
Boolean handled;
|
||||
uint32 current_msecs;
|
||||
UInt32 keyCurrentState = 0;
|
||||
UInt32 keyCurrentState;
|
||||
Coord x, y;
|
||||
|
||||
if(_quit)
|
||||
@ -518,7 +626,7 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
if (ev.eType == keyDownEvent) {
|
||||
switch (ev.data.keyDown.chr) {
|
||||
case vchrLaunch:
|
||||
lastKeyPressed = -1;
|
||||
_lastKeyPressed = -1;
|
||||
event->event_code = EVENT_KEYDOWN;
|
||||
event->kbd.keycode = 27;
|
||||
event->kbd.ascii = 27;
|
||||
@ -526,7 +634,7 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
return true;
|
||||
|
||||
case vchrMenu:
|
||||
lastKeyPressed = -1;
|
||||
_lastKeyPressed = -1;
|
||||
event->event_code = EVENT_KEYDOWN;
|
||||
event->kbd.keycode = 319;
|
||||
event->kbd.ascii = 319;
|
||||
@ -540,12 +648,12 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
break;
|
||||
|
||||
case vchrCalc:
|
||||
if (lastKeyPressed == vchrCalc)
|
||||
if (_lastKeyPressed == vchrCalc)
|
||||
if ((get_msecs() - _exit_delay) <= (EXITDELAY))
|
||||
quit();
|
||||
|
||||
_exit_delay = get_msecs();
|
||||
lastKeyPressed = vchrCalc;
|
||||
_lastKeyPressed = vchrCalc;
|
||||
return true;
|
||||
|
||||
// mouse emulation
|
||||
@ -553,37 +661,36 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
event->event_code = EVENT_LBUTTONDOWN;
|
||||
event->mouse.x = _mouseCurState.x;
|
||||
event->mouse.y = _mouseCurState.y;
|
||||
lastKeyPressed = -1;
|
||||
_lastKeyPressed = -1;
|
||||
return true;
|
||||
|
||||
case vchrHard2: // move left
|
||||
SimulateArrowKeys(event, -1, 0, (lastKeyPressed == vchrHard2));
|
||||
lastKeyPressed = vchrHard2;
|
||||
SimulateArrowKeys(event, -1, 0, (_lastKeyPressed == vchrHard2));
|
||||
_lastKeyPressed = vchrHard2;
|
||||
return true;
|
||||
|
||||
case vchrPageUp: // move up
|
||||
SimulateArrowKeys(event, 0, -1, (lastKeyPressed == vchrPageUp));
|
||||
lastKeyPressed = vchrPageUp;
|
||||
SimulateArrowKeys(event, 0, -1, (_lastKeyPressed == vchrPageUp));
|
||||
_lastKeyPressed = vchrPageUp;
|
||||
return true;
|
||||
|
||||
case vchrPageDown: // move down
|
||||
SimulateArrowKeys(event, 0, 1, (lastKeyPressed == vchrPageDown));
|
||||
lastKeyPressed = vchrPageDown;
|
||||
SimulateArrowKeys(event, 0, 1, (_lastKeyPressed == vchrPageDown));
|
||||
_lastKeyPressed = vchrPageDown;
|
||||
return true;
|
||||
|
||||
case vchrHard3: // move right
|
||||
SimulateArrowKeys(event, 1, 0, (lastKeyPressed == vchrHard3));
|
||||
lastKeyPressed = vchrHard3;
|
||||
SimulateArrowKeys(event, 1, 0, (_lastKeyPressed == vchrHard3));
|
||||
_lastKeyPressed = vchrHard3;
|
||||
return true;
|
||||
|
||||
case vchrHard4: // right button
|
||||
event->event_code = EVENT_RBUTTONDOWN;
|
||||
event->mouse.x = _mouseCurState.x;
|
||||
event->mouse.y = _mouseCurState.y;
|
||||
lastKeyPressed = -1;
|
||||
_lastKeyPressed = -1;
|
||||
return true;
|
||||
|
||||
|
||||
case vchrJogUp:
|
||||
event->event_code = EVENT_WHEELUP;
|
||||
return true;
|
||||
@ -592,19 +699,20 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
event->event_code = EVENT_WHEELDOWN;
|
||||
return true;
|
||||
|
||||
// if hotsync pressed
|
||||
case vchrHardCradle:
|
||||
quit();
|
||||
}
|
||||
}
|
||||
// check for hardkey repeat
|
||||
if (lastKeyPressed != -1 && lastKeyPressed != vchrCalc &&
|
||||
if (_lastKeyPressed != -1 && _lastKeyPressed != vchrCalc &&
|
||||
!( (keyCurrentState & keyBitHard2) ||
|
||||
(keyCurrentState & keyBitPageUp) ||
|
||||
(keyCurrentState & keyBitPageDown) ||
|
||||
(keyCurrentState & keyBitHard3)
|
||||
)
|
||||
) {
|
||||
lastKeyPressed = -1;
|
||||
_lastKeyPressed = -1;
|
||||
}
|
||||
// prevent crash when alarm is raised
|
||||
handled = ((ev.eType == keyDownEvent) &&
|
||||
@ -612,7 +720,7 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
((ev.data.keyDown.chr == vchrAttnStateChanged) ||
|
||||
(ev.data.keyDown.chr == vchrAttnUnsnooze)));
|
||||
|
||||
// graffiti strokes, autooff, etc...
|
||||
// graffiti strokes, auto-off, etc...
|
||||
if (!handled)
|
||||
if (SysHandleEvent(&ev))
|
||||
continue;
|
||||
@ -621,22 +729,23 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
switch(ev.eType) {
|
||||
|
||||
case keyDownEvent: {
|
||||
lastEvent = keyDownEvent;
|
||||
lastKeyPressed = -1;
|
||||
_lastEvent = keyDownEvent;
|
||||
_lastKeyPressed = -1;
|
||||
//if (ev.data.keyDown.modifiers & shiftKeyMask) b |= KBD_SHIFT;
|
||||
|
||||
if (ev.data.keyDown.chr == vchrCommand && (ev.data.keyDown.modifiers & commandKeyMask)) {
|
||||
lastKeyModifier++;
|
||||
lastKeyModifier %= 3;
|
||||
drawKeyState(this, lastKeyModifier);
|
||||
_lastKeyModifier++;
|
||||
_lastKeyModifier %= 3;
|
||||
drawKeyState(this, _lastKeyModifier);
|
||||
|
||||
} else {
|
||||
byte b = 0;
|
||||
if (lastKeyModifier == MD_CTRL) b = KBD_CTRL;
|
||||
if (lastKeyModifier == MD_ALT) b = KBD_ALT;
|
||||
if (_lastKeyModifier == MD_CTRL) b = KBD_CTRL;
|
||||
if (_lastKeyModifier == MD_ALT) b = KBD_ALT;
|
||||
|
||||
if (ev.data.keyDown.chr == 'q' && b == KBD_CTRL) {
|
||||
quit();
|
||||
|
||||
} else if (ev.data.keyDown.chr == 'n' && b == KBD_CTRL) {
|
||||
UInt8 *scr = _screenP + _screenWidth * (_screenHeight + 2);
|
||||
_useNumPad = !_useNumPad;
|
||||
@ -647,31 +756,29 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
event->kbd.keycode = ev.data.keyDown.chr;
|
||||
event->kbd.ascii = (ev.data.keyDown.chr>='a' && ev.data.keyDown.chr<='z' && (event->kbd.flags & KBD_SHIFT) ? ev.data.keyDown.chr &~ 0x20 : ev.data.keyDown.chr);
|
||||
event->kbd.flags = b;
|
||||
lastKeyModifier = MD_NONE;
|
||||
drawKeyState(this, lastKeyModifier);
|
||||
_lastKeyModifier = MD_NONE;
|
||||
drawKeyState(this, _lastKeyModifier);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
case penMoveEvent:
|
||||
x = ev.screenX << 1;
|
||||
y = ev.screenY << 1;
|
||||
getCoordinates(&ev, (_wideRefNum != sysInvalidRefNum), &x, &y);
|
||||
|
||||
if ((y -_decaly) > _screenHeight || (y - _decaly) < 0)
|
||||
if ((y - _decaly) > _screenHeight || (y - _decaly) < 0)
|
||||
return true;
|
||||
|
||||
if (lastEvent != penMoveEvent && (abs(y - event->mouse.y) <= 2 || abs(x - event->mouse.x) <= 2)) // move only if
|
||||
if (_lastEvent != penMoveEvent && (abs(y - event->mouse.y) <= 2 || abs(x - event->mouse.x) <= 2)) // move only if
|
||||
return true;
|
||||
|
||||
lastEvent = penMoveEvent;
|
||||
_lastEvent = penMoveEvent;
|
||||
event->event_code = EVENT_MOUSEMOVE;
|
||||
event->mouse.x = x;
|
||||
event->mouse.y = y - _decaly;
|
||||
return true;
|
||||
|
||||
case penDownEvent:
|
||||
x = ev.screenX << 1;
|
||||
y = ev.screenY << 1;
|
||||
getCoordinates(&ev, (_wideRefNum != sysInvalidRefNum), &x, &y);
|
||||
|
||||
if (_useNumPad) {
|
||||
Coord y2 = _decaly + _screenHeight + 2;
|
||||
@ -679,8 +786,8 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
UInt8 key = '1';
|
||||
key += 9 - ( (3 - ((x - 254) / 21)) + (3 * ((y - y2) / 11)) );
|
||||
|
||||
lastEvent = keyDownEvent;
|
||||
lastKeyPressed = -1;
|
||||
_lastEvent = keyDownEvent;
|
||||
_lastKeyPressed = -1;
|
||||
|
||||
event->event_code = EVENT_KEYDOWN;
|
||||
event->kbd.keycode = key;
|
||||
@ -690,7 +797,7 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
}
|
||||
}
|
||||
|
||||
lastEvent = penDownEvent;
|
||||
_lastEvent = penDownEvent;
|
||||
if ((y -_decaly) > _screenHeight || (y - _decaly) < 0)
|
||||
return true;
|
||||
|
||||
@ -701,13 +808,14 @@ bool OSystem_PALMOS::poll_event(Event *event) {
|
||||
return true;
|
||||
|
||||
case penUpEvent:
|
||||
getCoordinates(&ev, (_wideRefNum != sysInvalidRefNum), &x, &y);
|
||||
event->event_code = EVENT_LBUTTONUP;
|
||||
|
||||
if (ev.screenY*2-_decaly > _screenHeight || ev.screenY*2-_decaly < 0)
|
||||
if ((y - _decaly) > _screenHeight || (y - _decaly) < 0)
|
||||
return true;
|
||||
|
||||
event->mouse.x = ev.screenX*2;
|
||||
event->mouse.y = ev.screenY*2 - _decaly;
|
||||
event->mouse.x = x;
|
||||
event->mouse.y = y - _decaly;
|
||||
set_mouse_pos(event->mouse.x, event->mouse.y);
|
||||
return true;
|
||||
|
||||
@ -733,7 +841,7 @@ uint32 OSystem_PALMOS::property(int param, Property *value) {
|
||||
WinSetTextColor(255);
|
||||
WinSetForeColor(255);
|
||||
|
||||
if (gVars->HRrefNum != sysInvalidRefNum) {
|
||||
if (_useHRmode) {
|
||||
HRFntSetFont(gVars->HRrefNum,hrTinyBoldFont);
|
||||
w1 = FntCharsWidth(caption,StrLen(caption));
|
||||
w1 = (320 - w1) / 2;
|
||||
@ -909,53 +1017,101 @@ OSystem_PALMOS::OSystem_PALMOS() {
|
||||
_currentPalette = NULL;
|
||||
_mouseBackupP = NULL;
|
||||
|
||||
lastKeyPressed = -1;
|
||||
lastKeyRepeat = 100;
|
||||
lastKeyModifier = MD_NONE;
|
||||
_lastKeyPressed = -1;
|
||||
_lastKeyRepeat = 100;
|
||||
_lastKeyModifier = MD_NONE;
|
||||
|
||||
_useNumPad = false;
|
||||
|
||||
// HiRes+
|
||||
_useHRmode = (gVars->HRrefNum != sysInvalidRefNum);
|
||||
_wideRefNum = sysInvalidRefNum;
|
||||
|
||||
// sound
|
||||
_isSndPlaying = false;
|
||||
_sndTempP = (UInt8 *)MemPtrNew(4096);
|
||||
_sndDataP = (UInt8 *)MemPtrNew(1024);
|
||||
_sndTempP = (UInt8 *)MemPtrNew(512);
|
||||
_sndDataP = NULL;
|
||||
// _sndTempP = (UInt8 *)MemPtrNew(4096);
|
||||
// _sndDataP = (UInt8 *)MemPtrNew(1024);
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::move_screen(int dx, int dy, int height) {
|
||||
|
||||
if ((dx == 0) && (dy == 0))
|
||||
// Short circuit check - do we have to do anything anyway?
|
||||
if ((dx == 0 && dy == 0) || height <= 0)
|
||||
return;
|
||||
|
||||
if (dx == 0) {
|
||||
// vertical movement
|
||||
if (dy > 0) {
|
||||
// move down
|
||||
// copy from bottom to top
|
||||
for (int y = height - 1; y >= dy; y--)
|
||||
copy_rect((byte *)_offScreenP + _screenWidth * (y - dy), _screenWidth, 0, y, _screenWidth, 1);
|
||||
} else {
|
||||
// move up
|
||||
// copy from top to bottom
|
||||
for (int y = 0; y < height + dx; y++)
|
||||
copy_rect((byte *)_offScreenP + _screenWidth * (y - dy), _screenWidth, 0, y, _screenWidth, 1);
|
||||
}
|
||||
} else if (dy == 0) {
|
||||
// horizontal movement
|
||||
if (dx > 0) {
|
||||
// move right
|
||||
// copy from right to left
|
||||
for (int x = _screenWidth - 1; x >= dx; x--)
|
||||
copy_rect((byte *)_offScreenP + x - dx, _screenWidth, x, 0, 1, height);
|
||||
} else {
|
||||
// move left
|
||||
// copy from left to right
|
||||
for (int x = 0; x < _screenWidth; x++)
|
||||
copy_rect((byte *)_offScreenP + x - dx, _screenWidth, x, 0, 1, height);
|
||||
}
|
||||
// Hide the mouse
|
||||
if (_mouseDrawn)
|
||||
undraw_mouse();
|
||||
|
||||
// FIXME : i divide dx/dy by 2 because WinScrollRectangle use low-density coordinates on Hi-Density
|
||||
// devices. Hope this will work, if not i will use the SDL-common definition with copy_rect :(
|
||||
|
||||
// FIXME - calling copy_rect repeatedly is horribly inefficient, as it (un)locks the surface repeatedly
|
||||
// and it performs unneeded clipping checks etc.
|
||||
// Furthermore, this code is not correct, techincally: the pixels members of an SDLSource may be 0
|
||||
// while it is not locked (e.g. for HW surfaces which are stored in the graphic card's VRAM).
|
||||
|
||||
RectangleType r, dummy;
|
||||
WinSetDrawWindow(_offScreenH);
|
||||
|
||||
if (_useHRmode) {
|
||||
RctSetRectangle(&r, 0, ((_offScreenH != _screenH) ? 0 : _decaly), _screenWidth, _screenHeight);
|
||||
} else {
|
||||
// free movement
|
||||
// not neccessary for now
|
||||
RctSetRectangle(&r, 0, ((_offScreenH != _screenH) ? 0 : _decaly >> 1), _screenWidth >> 1, _screenHeight >> 1);
|
||||
}
|
||||
|
||||
// vertical movement
|
||||
if (dy > 0) {
|
||||
// move down - copy from bottom to top
|
||||
if (_useHRmode) {
|
||||
// need to set the draw window
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winDown, dy, &dummy);
|
||||
} else {
|
||||
WinScrollRectangle(&r, winDown, dy >> 1, &dummy);
|
||||
// for (int y = height - 1; y >= dy; y--)
|
||||
// copy_rect((byte *)_offScreenP + _screenWidth * (y - dy), _screenWidth, 0, y, _screenWidth, 1);
|
||||
}
|
||||
} else if (dy < 0) {
|
||||
// move up - copy from top to bottom
|
||||
dy = -dy;
|
||||
if (_useHRmode) {
|
||||
// need to set the draw window
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winUp, dy, &dummy);
|
||||
} else {
|
||||
WinScrollRectangle(&r, winUp, dy >> 1, &dummy);
|
||||
// for (int y = dy; y < height; y++)
|
||||
// copy_rect((byte *)_offScreenP + _screenWidth * y, _screenWidth, 0, y - dy, _screenWidth, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// horizontal movement
|
||||
if (dx > 0) {
|
||||
// move right - copy from right to left
|
||||
if (_useHRmode) {
|
||||
// need to set the draw window
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winRight, dx, &dummy);
|
||||
} else {
|
||||
WinScrollRectangle(&r, winRight, dx >> 1, &dummy);
|
||||
// for (int x = _screenWidth - 1; x >= dx; x--)
|
||||
// copy_rect((byte *)_offScreenP + x - dx, _screenWidth, x, 0, 1, height);
|
||||
}
|
||||
} else if (dx < 0) {
|
||||
// move left - copy from left to right
|
||||
dx = -dx;
|
||||
if (_useHRmode) {
|
||||
// need to set the draw window
|
||||
HRWinScrollRectangle(gVars->HRrefNum, &r, winLeft, dx, &dummy);
|
||||
} else {
|
||||
WinScrollRectangle(&r, winLeft, dx >> 1, &dummy);
|
||||
// for (int x = dx; x < _screenWidth; x++)
|
||||
// copy_rect((byte *)_offScreenP + x, _screenWidth, x - dx, 0, 1, height);
|
||||
}
|
||||
}
|
||||
|
||||
WinSetDrawWindow(_screenH);
|
||||
SysTaskDelay(1); // prevent crash on Clie device using successive [HR]WinScrollRectangle !
|
||||
}
|
||||
|
||||
bool OSystem_PALMOS::set_sound_proc(void *param, SoundProc *proc, byte format) {
|
||||
@ -963,8 +1119,9 @@ bool OSystem_PALMOS::set_sound_proc(void *param, SoundProc *proc, byte format) {
|
||||
_sound.active = true;
|
||||
_sound.proc = proc;
|
||||
_sound.param = param;
|
||||
// _sound.active = false;
|
||||
|
||||
return true;
|
||||
return _sound.active;
|
||||
}
|
||||
|
||||
void OSystem_PALMOS::check_sound() {
|
||||
|
@ -148,6 +148,7 @@ private:
|
||||
void update_screen__flipping();
|
||||
void update_screen__dbuffer();
|
||||
void update_screen__direct();
|
||||
void update_screen__wide();
|
||||
|
||||
WinHandle _screenH;
|
||||
WinHandle _offScreenH;
|
||||
@ -226,13 +227,17 @@ private:
|
||||
|
||||
// PALM spec
|
||||
|
||||
Int32 lastKeyPressed;
|
||||
UInt32 lastKeyRepeat;
|
||||
UInt8 lastKeyModifier;
|
||||
Int32 _lastKeyPressed;
|
||||
UInt32 _lastKeyRepeat;
|
||||
UInt8 _lastKeyModifier;
|
||||
|
||||
Boolean _useNumPad;
|
||||
Boolean _useHRmode;
|
||||
|
||||
eventsEnum lastEvent;
|
||||
eventsEnum _lastEvent;
|
||||
|
||||
UInt16 _wideRefNum;
|
||||
Boolean onehalf[320];
|
||||
|
||||
OSystem_PALMOS();
|
||||
|
||||
|
@ -72,6 +72,7 @@ typedef struct {
|
||||
|
||||
//skin params
|
||||
SkinInfoType skin; // card where is located the skin
|
||||
Boolean soundClick;
|
||||
//
|
||||
Boolean vibrator;
|
||||
Boolean autoOff;
|
||||
@ -1903,7 +1904,7 @@ static void SkinsFormInit(Boolean bDraw) {
|
||||
FormPtr frmP;
|
||||
ListType *listP;
|
||||
MemHandle items = NULL;
|
||||
|
||||
ControlType *cck1P;
|
||||
DmSearchStateType stateInfo;
|
||||
UInt16 cardNo;
|
||||
LocalID dbID;
|
||||
@ -1936,6 +1937,9 @@ static void SkinsFormInit(Boolean bDraw) {
|
||||
|
||||
Int16 selected = -1;
|
||||
|
||||
cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox);
|
||||
CtlSetValue(cck1P, gPrefs->soundClick);
|
||||
|
||||
listP = (ListType *)GetObjectPtr(SkinsSkinList);
|
||||
skinsInfo = (SkinInfoType *)MemHandleLock(skins);
|
||||
SysQSort(skinsInfo, numSkins, sizeof(SkinInfoType), (CmpFuncPtr)SkinsFormCompare, 0);
|
||||
@ -2000,9 +2004,14 @@ static void SkinsFormExit(Boolean bSave) {
|
||||
itemsList = NULL;
|
||||
|
||||
if (bSave) {
|
||||
ControlType *cck1P;
|
||||
|
||||
StrCopy(gPrefs->skin.nameP, skinsInfo[selected].nameP);
|
||||
gPrefs->skin.cardNo = skinsInfo[selected].cardNo;
|
||||
gPrefs->skin.dbID = skinsInfo[selected].dbID;
|
||||
|
||||
cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox);
|
||||
gPrefs->soundClick = CtlGetValue(cck1P);
|
||||
}
|
||||
|
||||
FrmReturnToForm (MainForm);
|
||||
@ -2324,6 +2333,11 @@ static void StartScummVM() {
|
||||
case 2:
|
||||
AddArg(&argvP[argc], "-g", "dbuffer", &argc);
|
||||
break;
|
||||
case 3:
|
||||
AddArg(&argvP[argc], "-g", "wide", &argc);
|
||||
gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockErase);
|
||||
WinScreenUnlock();
|
||||
break;
|
||||
default:
|
||||
AddArg(&argvP[argc], "-g", "normal", &argc);
|
||||
break;
|
||||
@ -2664,7 +2678,9 @@ static Boolean MainFormHandleEvent(EventPtr eventP)
|
||||
case skinButtonGameStart:
|
||||
case skinButtonGameDelete:
|
||||
SknSetState(skinDBP, sknLastOn, sknStateSelected);
|
||||
SknShowObject(skinDBP, sknLastOn);
|
||||
SknShowObject(skinDBP, sknLastOn);
|
||||
if (gPrefs->soundClick)
|
||||
SndPlaySystemSound(sndClick);
|
||||
handled = true;
|
||||
break;
|
||||
default:
|
||||
@ -3014,7 +3030,7 @@ static Err AppStart(void)
|
||||
else
|
||||
gPrefs->volRefNum = parseCards(0); // get first volref
|
||||
|
||||
AppStartCheckNotify(); // not fatal error if not avalaible
|
||||
AppStartCheckNotify(); // not fatal error if not avalaible
|
||||
|
||||
return error;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user