mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-31 07:53:36 +00:00
Added support fir hi-res games to standard PalmOS 5 devices (BS, TOuche, ...)
Added aspect ratio selection too svn-id: r25131
This commit is contained in:
parent
ecf5b465bb
commit
0e36e6b500
@ -43,6 +43,40 @@ OSystem_PalmOS5::OSystem_PalmOS5() : OSystem_PalmBase() {
|
||||
_soundEx.sound = &_sound;
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::calc_scale() {
|
||||
for (int y = 0; y < _screenDest.h; y++) {
|
||||
int ys = y * _screenHeight / _screenDest.h;
|
||||
_scaleTableY[y] = ys * _screenWidth;
|
||||
}
|
||||
|
||||
for (int x = 0; x < _screenDest.w; x++) {
|
||||
int xs = x * _screenWidth / _screenDest.w;
|
||||
_scaleTableX[x] = xs;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::calc_rect(Boolean fullscreen) {
|
||||
Int32 w, h;
|
||||
|
||||
if (fullscreen) {
|
||||
w = (_ratio.adjustAspect == kRatioWidth) ? _ratio.width : gVars->screenFullWidth;
|
||||
h = (_ratio.adjustAspect == kRatioHeight) ? _ratio.height : gVars->screenFullHeight;
|
||||
|
||||
_screenOffset.x = (_ratio.adjustAspect == kRatioWidth) ? (gVars->screenFullWidth - _ratio.width) / 2 : 0;
|
||||
_screenOffset.y = (_ratio.adjustAspect == kRatioHeight) ? (gVars->screenFullHeight - _ratio.height) / 2 : 0;
|
||||
|
||||
} else {
|
||||
w = gVars->screenWidth;
|
||||
h = gVars->screenHeight - MIN_OFFSET * 2;
|
||||
|
||||
_screenOffset.x = 0;
|
||||
_screenOffset.y = MIN_OFFSET;
|
||||
}
|
||||
|
||||
_screenDest.w = w;
|
||||
_screenDest.h = h;
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::int_initBackend() {
|
||||
if (OPTIONS_TST(kOpt5WayNavigatorV1)) {
|
||||
_keyMouse.bitUp = keyBitPageUp;
|
||||
@ -71,6 +105,28 @@ bool OSystem_PalmOS5::hasFeature(Feature f) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::setFeatureState(Feature f, bool enable) {
|
||||
switch (f) {
|
||||
/* case kFeatureFullscreenMode:
|
||||
if (_gfxLoaded)
|
||||
if (OPTIONS_TST(kOptModeWide) && _initMode != GFX_WIDE) {
|
||||
_fullscreen = enable;
|
||||
hotswap_gfx_mode(_mode);
|
||||
}
|
||||
break;
|
||||
*/
|
||||
case kFeatureAspectRatioCorrection:
|
||||
if (_mode == GFX_WIDE) {
|
||||
_ratio.adjustAspect = (_ratio.adjustAspect + 1) % 3;
|
||||
//calc_rect(true);
|
||||
hotswap_gfx_mode(_mode);
|
||||
// TwGfxSetClip(_palmScreenP, &_dstRect);
|
||||
clearScreen();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::setWindowCaption(const char *caption) {
|
||||
Err e;
|
||||
Char buf[64];
|
||||
|
@ -27,6 +27,8 @@
|
||||
|
||||
#include "be_base.h"
|
||||
|
||||
#define MIN_OFFSET 20
|
||||
|
||||
#if !defined(SYSTEM_CALLBACK) || defined(PALMOS_68K)
|
||||
# define SYSTEM_CALLBACK
|
||||
# ifdef PALMOS_ARM
|
||||
@ -100,6 +102,9 @@ extern SoundExType _soundEx;
|
||||
|
||||
class OSystem_PalmOS5 : public OSystem_PalmBase {
|
||||
private:
|
||||
uint16 _scaleTableX[512];
|
||||
uint32 _scaleTableY[512];
|
||||
|
||||
typedef void (OSystem_PalmOS5::*RendererProc)(RectangleType &r, PointType &p);
|
||||
RendererProc _render;
|
||||
|
||||
@ -123,7 +128,10 @@ private:
|
||||
virtual void get_coordinates(EventPtr ev, Coord &x, Coord &y);
|
||||
virtual bool check_event(Event &event, EventPtr ev);
|
||||
virtual void extras_palette(uint8 index, uint8 r, uint8 g, uint8 b);
|
||||
void calc_rect(Boolean fullscreen);
|
||||
void calc_scale();
|
||||
|
||||
void render_landscapeAny(RectangleType &r, PointType &p);
|
||||
void render_landscape(RectangleType &r, PointType &p);
|
||||
void render_portrait(RectangleType &r, PointType &p);
|
||||
void render_1x(RectangleType &r, PointType &p);
|
||||
@ -139,11 +147,23 @@ protected:
|
||||
UInt16 _sysOldCoord, _sysOldOrientation;
|
||||
Boolean _stretched, _cursorPaletteDisabled;
|
||||
|
||||
enum {
|
||||
kRatioNone = 0,
|
||||
kRatioHeight,
|
||||
kRatioWidth
|
||||
};
|
||||
struct {
|
||||
UInt8 adjustAspect;
|
||||
Coord width; // (width x 320)
|
||||
Coord height; // (480 x height)
|
||||
} _ratio;
|
||||
|
||||
public:
|
||||
OSystem_PalmOS5();
|
||||
static OSystem *create();
|
||||
|
||||
bool hasFeature(Feature f);
|
||||
void setFeatureState(Feature f, bool enable);
|
||||
|
||||
void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h);
|
||||
void clearScreen();
|
||||
|
@ -32,16 +32,6 @@
|
||||
|
||||
class OSystem_PalmZodiac : public OSystem_PalmOS5Ex {
|
||||
private:
|
||||
enum {
|
||||
kRatioNone = 0,
|
||||
kRatioHeight,
|
||||
kRatioWidth
|
||||
};
|
||||
struct {
|
||||
UInt8 adjustAspect;
|
||||
Coord width; // (width x 320)
|
||||
Coord height; // (480 x height)
|
||||
} _ratio;
|
||||
|
||||
TwGfxType *_gfxH;
|
||||
TwGfxSurfaceType *_palmScreenP, *_tmpScreenP;
|
||||
|
@ -30,14 +30,23 @@ void OSystem_PalmOS5::get_coordinates(EventPtr ev, Coord &x, Coord &y) {
|
||||
|
||||
x = (ev->screenX - _screenOffset.x);
|
||||
y = (ev->screenY - _screenOffset.y);
|
||||
|
||||
|
||||
if (_stretched) {
|
||||
if (OPTIONS_TST(kOptModeLandscape)) {
|
||||
x = (x * 2 / 3);
|
||||
y = (y * 2 / 3);
|
||||
Int32 w, h;
|
||||
|
||||
if (_mode == GFX_NORMAL) {
|
||||
|
||||
h = gVars->screenHeight - MIN_OFFSET * 2;
|
||||
w = gVars->screenWidth;
|
||||
x = (_screenWidth * x) / w;
|
||||
y = (_screenHeight * y) / h;
|
||||
|
||||
} else {
|
||||
y = ((ev->screenX - _screenOffset.y) * 2) / 3;
|
||||
x = 320 - ((ev->screenY - _screenOffset.x) * 2) / 3 - 1;
|
||||
|
||||
h = (_ratio.adjustAspect == kRatioHeight ? _ratio.height : gVars->screenFullHeight);
|
||||
w = (_ratio.adjustAspect == kRatioWidth ? _ratio.width : gVars->screenFullWidth);
|
||||
x = (_screenWidth * x) / w;
|
||||
y = (_screenHeight * y) / h;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -56,21 +65,17 @@ bool OSystem_PalmOS5::check_event(Event &event, EventPtr ev) {
|
||||
if (_keyMouse.hasMore) {
|
||||
switch (ev->data.keyDown.chr) {
|
||||
// hot swap gfx
|
||||
case 0x1B04:
|
||||
// case 0x1B04:
|
||||
case vchrHard1:
|
||||
printf("swap\n");
|
||||
if (OPTIONS_TST(kOptCollapsible))
|
||||
hotswap_gfx_mode(_mode == GFX_WIDE ? GFX_NORMAL: GFX_WIDE);
|
||||
return false; // not a key
|
||||
|
||||
// ESC key
|
||||
// case 0x1B05:
|
||||
case vchrHard2:
|
||||
_lastKey = kKeyNone;
|
||||
event.type = EVENT_KEYDOWN;
|
||||
event.kbd.keycode = 27;
|
||||
event.kbd.ascii = 27;
|
||||
event.kbd.flags = 0;
|
||||
return true;
|
||||
setFeatureState(kFeatureAspectRatioCorrection, 0);
|
||||
return false; // not a key
|
||||
|
||||
// F5 = menu
|
||||
case vchrHard3:
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "be_os5.h"
|
||||
#include "graphics/surface.h"
|
||||
#include "common/config-manager.h"
|
||||
#include <PenInputMgr.h>
|
||||
#include <palmOneResources.h>
|
||||
|
||||
@ -54,11 +55,22 @@ void OSystem_PalmOS5::load_gfx_mode() {
|
||||
return;
|
||||
_gfxLoaded = true;
|
||||
|
||||
// get command line config
|
||||
// _fullscreen = ConfMan.getBool("fullscreen"); // TODO : (NORMAL mode)
|
||||
_ratio.adjustAspect = ConfMan.getBool("aspect_ratio") ? kRatioHeight : kRatioNone;
|
||||
|
||||
// precalc ratio (WIDE mode)
|
||||
_ratio.width = (gVars->screenFullHeight * _screenWidth / _screenHeight);
|
||||
_ratio.height = (gVars->screenFullWidth * _screenHeight / _screenWidth);
|
||||
|
||||
_mouseBackupP = (byte *)MemPtrNew(MAX_MOUSE_W * MAX_MOUSE_H * 2); // *2 if 16bit
|
||||
_mouseDataP = (byte *)MemPtrNew(MAX_MOUSE_W * MAX_MOUSE_H);
|
||||
_offScreenP = (byte *)malloc(_screenWidth * _screenHeight);
|
||||
|
||||
MemSet(_offScreenP, _screenWidth * _screenHeight, 0);
|
||||
MemSet(_nativePal, sizeof(_nativePal), 0);
|
||||
MemSet(_currentPalette, sizeof(_currentPalette), 0);
|
||||
|
||||
UInt32 depth = 16;
|
||||
WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL);
|
||||
clearScreen();
|
||||
@ -67,17 +79,13 @@ void OSystem_PalmOS5::load_gfx_mode() {
|
||||
gVars->indicator.off = RGBToColor(0,0,0);
|
||||
|
||||
_overlayH = alloc_screen(_screenWidth, _screenHeight);
|
||||
_screenH = WinGetDisplayWindow();
|
||||
|
||||
_overlayP = (OverlayColor *)(BmpGetBits(WinGetBitmap(_overlayH)));
|
||||
|
||||
_screenH = WinGetDisplayWindow();
|
||||
_screenP = (byte *)(BmpGetBits(WinGetBitmap(_screenH)));
|
||||
|
||||
MemSet(_offScreenP, _screenWidth * _screenHeight, 0);
|
||||
MemSet(_nativePal, sizeof(_nativePal), 0);
|
||||
MemSet(_currentPalette, sizeof(_currentPalette), 0);
|
||||
|
||||
_isSwitchable = (_screenWidth == 320 && _screenHeight == 200 && OPTIONS_TST(kOptCollapsible));
|
||||
if (_screenWidth > 320 || _screenHeight > 200 || !_isSwitchable)
|
||||
_isSwitchable = OPTIONS_TST(kOptModeLandscape) && OPTIONS_TST(kOptCollapsible);
|
||||
if (!_isSwitchable)
|
||||
_mode = GFX_NORMAL;
|
||||
|
||||
hotswap_gfx_mode(_mode);
|
||||
@ -85,62 +93,53 @@ void OSystem_PalmOS5::load_gfx_mode() {
|
||||
|
||||
void OSystem_PalmOS5::hotswap_gfx_mode(int mode) {
|
||||
Err e;
|
||||
UInt32 device;
|
||||
|
||||
if (_mode != GFX_NORMAL && !_isSwitchable)
|
||||
return;
|
||||
|
||||
if (_workScreenH)
|
||||
WinDeleteWindow(_workScreenH, false);
|
||||
_workScreenH = NULL;
|
||||
|
||||
#ifdef PALMOS_ARM
|
||||
UInt32 device;
|
||||
Boolean isT3 = false;
|
||||
if (!FtrGet(sysFileCSystem, sysFtrNumOEMDeviceID, &device))
|
||||
isT3 = (device == kPalmOneDeviceIDTungstenT3);
|
||||
#endif
|
||||
|
||||
if (_workScreenH)
|
||||
WinDeleteWindow(_workScreenH, false);
|
||||
_workScreenH = NULL;
|
||||
|
||||
_screenDest.w = _screenWidth;
|
||||
_screenDest.h = _screenHeight;
|
||||
|
||||
// prevent bad DIA redraw (Stat part)
|
||||
if (mode == GFX_NORMAL) {
|
||||
// only if this API is available
|
||||
if (_stretched && OPTIONS_TST(kOptCollapsible)) {
|
||||
#ifdef PALMOS_ARM
|
||||
if (isT3) {
|
||||
//AiaSetInputAreaState(aiaInputAreaShow);
|
||||
StatShow_68k();
|
||||
PINSetInputAreaState_68k(pinInputAreaOpen);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
StatShow();
|
||||
PINSetInputAreaState(pinInputAreaOpen);
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == GFX_NORMAL) {
|
||||
_redawOSD = true;
|
||||
_stretched = false;
|
||||
OPTIONS_RST(kOptDisableOnScrDisp);
|
||||
_screenDest.w = _screenWidth;
|
||||
_screenDest.h = _screenHeight;
|
||||
_stretched = (_screenWidth > gVars->screenWidth);
|
||||
|
||||
if (_wasRotated) {
|
||||
// restore controls rotation
|
||||
SWAP(_keyMouse.bitLeft, _keyMouse.bitRight);
|
||||
SWAP(_keyMouse.bitRight, _keyMouse.bitDown);
|
||||
SWAP(_keyMouse.bitLeft, _keyMouse.bitUp);
|
||||
_wasRotated = false;
|
||||
#ifdef PALMOS_ARM
|
||||
if (isT3) {
|
||||
//AiaSetInputAreaState(aiaInputAreaShow);
|
||||
StatShow_68k();
|
||||
PINSetInputAreaState_68k(pinInputAreaOpen);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
StatShow();
|
||||
PINSetInputAreaState(pinInputAreaOpen);
|
||||
}
|
||||
|
||||
_workScreenH = alloc_screen(_screenWidth, _screenHeight);
|
||||
_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
|
||||
MemSet(_workScreenP, _screenWidth * _screenHeight * 2, 0);
|
||||
|
||||
_screenOffset.x = (gVars->screenWidth - _screenWidth) / 2;
|
||||
_screenOffset.y = (gVars->screenHeight - _screenHeight) / 2;
|
||||
|
||||
_render = &OSystem_PalmOS5::render_1x;
|
||||
if (_stretched) {
|
||||
calc_rect(false);
|
||||
} else {
|
||||
// offsets
|
||||
_screenOffset.x = (gVars->screenWidth - _screenWidth) / 2;
|
||||
_screenOffset.y = (gVars->screenHeight - _screenHeight) / 2;
|
||||
}
|
||||
|
||||
} else {
|
||||
_redawOSD = false;
|
||||
_stretched = true;
|
||||
|
||||
#ifdef PALMOS_ARM
|
||||
// T3 DIA library is 68k base, there is no possible native call
|
||||
if (isT3) {
|
||||
@ -154,35 +153,22 @@ void OSystem_PalmOS5::hotswap_gfx_mode(int mode) {
|
||||
StatHide();
|
||||
}
|
||||
|
||||
_redawOSD = false;
|
||||
_stretched = true;
|
||||
OPTIONS_SET(kOptDisableOnScrDisp);
|
||||
|
||||
if (OPTIONS_TST(kOptModeLandscape)) {
|
||||
_screenDest.w = 480;
|
||||
_screenDest.h = 300;
|
||||
_workScreenH = alloc_screen(480, 300);
|
||||
_render = &OSystem_PalmOS5::render_landscape;
|
||||
|
||||
} else {
|
||||
_screenDest.w = 300;
|
||||
_screenDest.h = 480;
|
||||
_workScreenH = alloc_screen(300, 480);
|
||||
_render = &OSystem_PalmOS5::render_portrait;
|
||||
// This mode need a controls rotation
|
||||
SWAP(_keyMouse.bitLeft, _keyMouse.bitUp);
|
||||
SWAP(_keyMouse.bitRight, _keyMouse.bitDown);
|
||||
SWAP(_keyMouse.bitLeft, _keyMouse.bitRight);
|
||||
_wasRotated = true;
|
||||
}
|
||||
|
||||
_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
|
||||
MemSet(_workScreenP, 480 * 300 * 2, 0);
|
||||
|
||||
_screenOffset.x = 0;
|
||||
_screenOffset.y = 10;
|
||||
calc_rect(true);
|
||||
}
|
||||
|
||||
if (_stretched) {
|
||||
calc_scale();
|
||||
OPTIONS_SET(kOptDisableOnScrDisp);
|
||||
_render = &OSystem_PalmOS5::render_landscapeAny;
|
||||
} else {
|
||||
OPTIONS_RST(kOptDisableOnScrDisp);
|
||||
_render = &OSystem_PalmOS5::render_1x;
|
||||
}
|
||||
|
||||
_workScreenH = alloc_screen(_screenDest.w, _screenDest.h);
|
||||
_workScreenP = (int16 *)(BmpGetBits(WinGetBitmap(_workScreenH)));
|
||||
MemSet(_workScreenP, _screenDest.w * _screenDest.h * 2, 0);
|
||||
|
||||
_mode = mode;
|
||||
clearScreen();
|
||||
}
|
||||
|
@ -48,109 +48,30 @@ void OSystem_PalmOS5::render_1x(RectangleType &r, PointType &p) {
|
||||
RctSetRectangle(&r, 0, 0, _screenWidth, _screenHeight - o);
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::render_landscape(RectangleType &r, PointType &p) {
|
||||
void OSystem_PalmOS5::render_landscapeAny(RectangleType &r, PointType &p) {
|
||||
Coord x, y, o = 0;
|
||||
int16 *dst = _workScreenP;
|
||||
|
||||
if (_overlayVisible) {
|
||||
int16 *src = _overlayP;
|
||||
|
||||
for (y = 0; y < 100; y++) {
|
||||
// draw 2 lines
|
||||
for (x = 0; x < 320; x++) {
|
||||
*dst++ = *src++;
|
||||
*dst++ = *src;
|
||||
*dst++ = *src++;
|
||||
for (y = 0; y < _screenDest.h; y++) {
|
||||
int16 *src = _overlayP + *(_scaleTableY + y);
|
||||
for (x = 0; x < _screenDest.w; x++) {
|
||||
*dst++ = *(src + *(_scaleTableX + x));
|
||||
}
|
||||
// copy the second to the next line
|
||||
MemMove(dst, dst - 480, 480 * 2);
|
||||
dst += 480;
|
||||
}
|
||||
|
||||
} else {
|
||||
byte *src = _offScreenP;
|
||||
o = _current_shake_pos;
|
||||
|
||||
for (y = 0; y < 100; y++) {
|
||||
// draw 2 lines
|
||||
for (x = 0; x < 320; x++) {
|
||||
*dst++ = _nativePal[*src++];
|
||||
*dst++ = _nativePal[*src];
|
||||
*dst++ = _nativePal[*src++];
|
||||
for (y = 0; y < _screenDest.h; y++) {
|
||||
byte *src = _offScreenP + *(_scaleTableY + y);
|
||||
for (x = 0; x < _screenDest.w; x++) {
|
||||
*dst++ = *(_nativePal + *(src + *(_scaleTableX + x)));
|
||||
}
|
||||
// copy the second to the next line
|
||||
MemMove(dst, dst - 480, 480 * 2);
|
||||
dst += 480;
|
||||
}
|
||||
}
|
||||
|
||||
p.x = _screenOffset.x;
|
||||
p.y = _screenOffset.y + o;
|
||||
RctSetRectangle(&r, 0, 0, 480, 300 - o);
|
||||
RctSetRectangle(&r, 0, 0, _screenDest.w, _screenDest.h - o);
|
||||
}
|
||||
|
||||
void OSystem_PalmOS5::render_portrait(RectangleType &r, PointType &p) {
|
||||
Coord x, y, o = 0;
|
||||
int16 *dst = _workScreenP;
|
||||
|
||||
if (_overlayVisible) {
|
||||
int16 *src = _overlayP + 320 - 1;
|
||||
int16 *src2 = src;
|
||||
|
||||
for (x = 0; x < 160; x++) {
|
||||
for (y = 0; y < 100; y++) {
|
||||
*dst++ = *src;
|
||||
src += 320;
|
||||
*dst++ = *src;
|
||||
*dst++ = *src;
|
||||
src += 320;
|
||||
}
|
||||
src = --src2;
|
||||
|
||||
for (y = 0; y < 100; y++) {
|
||||
*dst++ = *src;
|
||||
src += 320;
|
||||
*dst++ = *src;
|
||||
*dst++ = *src;
|
||||
src += 320;
|
||||
}
|
||||
src = --src2;
|
||||
|
||||
MemMove(dst, dst - 300, 300 * 2); // 300 = 200 x 1.5
|
||||
dst += 300;
|
||||
}
|
||||
|
||||
} else {
|
||||
byte *src = _offScreenP + 320 - 1;
|
||||
byte *src2 = src;
|
||||
o = _current_shake_pos;
|
||||
|
||||
for (x = 0; x < 160; x++) {
|
||||
for (y = 0; y < 100; y++) {
|
||||
*dst++ = _nativePal[*src];
|
||||
src += 320;
|
||||
*dst++ = _nativePal[*src];
|
||||
*dst++ = _nativePal[*src];
|
||||
src += 320;
|
||||
}
|
||||
src = --src2;
|
||||
|
||||
for (y = 0; y < 100; y++) {
|
||||
*dst++ = _nativePal[*src];
|
||||
src += 320;
|
||||
*dst++ = _nativePal[*src];
|
||||
*dst++ = _nativePal[*src];
|
||||
src += 320;
|
||||
}
|
||||
src = --src2;
|
||||
|
||||
MemMove(dst, dst - 300, 300 * 2); // 300 = 200 x 1.5
|
||||
dst += 300;
|
||||
}
|
||||
}
|
||||
|
||||
p.y = _screenOffset.x;
|
||||
p.x = _screenOffset.y + o;
|
||||
RctSetRectangle(&r, 0, 0, 300 - o, 480);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user