2003-04-30 21:08:44 +00:00
/* ScummVM - Scumm Interpreter
* Copyright ( C ) 2001 Ludvig Strigeus
* Copyright ( C ) 2001 - 2003 The ScummVM project
*
* 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 . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
* $ Header $
*
*/
2003-04-30 11:37:10 +00:00
# include "scumm.h"
# include "common/scaler.h"
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
# include "palm.h"
2003-05-06 08:24:21 +00:00
# include "vibrate.h"
2003-04-30 11:37:10 +00:00
2003-05-06 08:24:21 +00:00
# define EXITDELAY (500) // delay to exit : calc button : double tap 1/500 sec
# define ftrOverlayPtr (1000)
2003-07-07 08:45:20 +00:00
# define SND_BLOCK (3072) // is this correct ? 4096 should be better, must use it with a timer to prevent scenes to be cut off
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
OSystem * OSystem_PALMOS : : create ( UInt16 gfx_mode ) {
OSystem_PALMOS * syst = new OSystem_PALMOS ( ) ;
syst - > _mode = gfx_mode ;
syst - > _vibrate = gVars - > vibrator ;
return syst ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
OSystem * OSystem_PALMOS_create ( int gfx_mode ) {
return OSystem_PALMOS : : create ( gfx_mode ) ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : set_palette ( const byte * colors , uint start , uint num ) {
const byte * b = colors ;
uint i ;
RGBColorType * base = _currentPalette + start ;
for ( i = 0 ; i < num ; i + + ) {
base [ i ] . r = b [ 0 ] ;
base [ i ] . g = b [ 1 ] ;
base [ i ] . b = b [ 2 ] ;
b + = 4 ;
}
if ( start < _paletteDirtyStart )
_paletteDirtyStart = start ;
if ( start + num > _paletteDirtyEnd )
_paletteDirtyEnd = start + num ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : load_gfx_mode ( ) {
Err e ;
const byte startupPalette [ ] = {
0 , 0 , 0 , 0 ,
0 , 0 , 171 , 0 ,
0 , 171 , 0 , 0 ,
0 , 171 , 171 , 0 ,
171 , 0 , 0 , 0 ,
171 , 0 , 171 , 0 ,
171 , 87 , 0 , 0 ,
171 , 171 , 171 , 0 ,
87 , 87 , 87 , 0 ,
87 , 87 , 255 , 0 ,
87 , 255 , 87 , 0 ,
87 , 255 , 255 , 0 ,
255 , 87 , 87 , 0 ,
255 , 87 , 255 , 0 ,
255 , 255 , 87 , 0 ,
255 , 255 , 255 , 0
} ;
switch ( _mode )
{
case GFX_FLIPPING :
2003-05-28 18:42:16 +00:00
gVars - > screenLocked = true ;
2003-05-06 08:24:21 +00:00
_offScreenP = WinScreenLock ( winLockErase ) + _screeny ;
_screenP = _offScreenP ;
2003-05-28 18:42:16 +00:00
_offScreenH = WinGetDisplayWindow ( ) ;
_screenH = _offScreenH ;
2003-04-30 11:37:10 +00:00
_renderer_proc = & update_screen__flipping ;
break ;
2003-05-28 18:42:16 +00:00
case GFX_WIDE :
2003-04-30 11:37:10 +00:00
case GFX_DOUBLEBUFFER :
2003-05-06 08:24:21 +00:00
_screenH = WinGetDisplayWindow ( ) ;
_offScreenH = WinCreateOffscreenWindow ( _screenWidth , _screenHeight , screenFormat , & e ) ;
_offScreenP = ( byte * ) ( BmpGetBits ( WinGetBitmap ( _offScreenH ) ) ) ;
2003-05-28 18:42:16 +00:00
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 ;
}
2003-04-30 11:37:10 +00:00
break ;
2003-05-28 18:42:16 +00:00
2003-04-30 11:37:10 +00:00
case GFX_NORMAL :
default :
2003-05-06 08:24:21 +00:00
_offScreenH = WinGetDisplayWindow ( ) ;
2003-05-28 18:42:16 +00:00
_screenH = _offScreenH ;
2003-05-06 08:24:21 +00:00
_offScreenP = ( byte * ) ( BmpGetBits ( WinGetBitmap ( _offScreenH ) ) ) + _screeny ;
_screenP = _offScreenP ;
2003-04-30 11:37:10 +00:00
_renderer_proc = & update_screen__direct ;
break ;
}
2003-07-07 08:45:20 +00:00
// palette for preload dialog
set_palette ( startupPalette , 0 , 16 ) ;
2003-05-06 08:24:21 +00:00
// try to allocate on storage heap
FtrPtrNew ( appFileCreator , ftrOverlayPtr , _screenWidth * _screenHeight , ( void * * ) & _tmpScreenP ) ;
// failed ? dynamic heap
if ( ! _tmpScreenP )
_tmpScreenP = ( byte * ) malloc ( _screenWidth * _screenHeight ) ;
2003-04-30 11:37:10 +00:00
_overlaySaved = false ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : unload_gfx_mode ( ) {
switch ( _mode )
{
case GFX_FLIPPING :
WinScreenUnlock ( ) ;
break ;
2003-05-28 18:42:16 +00:00
case GFX_WIDE :
WinScreenUnlock ( ) ;
if ( _wideRefNum ! = sysInvalidRefNum )
SilkLibClose ( sysInvalidRefNum ) ;
// continue to GFX_DOUBLEBUFFER
2003-04-30 11:37:10 +00:00
case GFX_DOUBLEBUFFER :
2003-05-06 08:24:21 +00:00
WinDeleteWindow ( _offScreenH , false ) ;
2003-04-30 11:37:10 +00:00
break ;
}
2003-05-06 08:24:21 +00:00
if ( _tmpScreenP )
if ( MemPtrDataStorage ( _tmpScreenP ) )
FtrPtrFree ( appFileCreator , ftrOverlayPtr ) ;
else
free ( _tmpScreenP ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-05-28 18:42:16 +00:00
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 ;
}
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : init_size ( uint w , uint h ) {
2003-05-06 08:24:21 +00:00
_screenWidth = w ;
_screenHeight = h ;
2003-04-30 11:37:10 +00:00
_overlay_visible = false ;
_quit = false ;
2003-05-28 18:42:16 +00:00
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 ;
} else {
2003-08-06 08:33:38 +00:00
_decaly = ( 320 - h ) / 2 ;
2003-05-28 18:42:16 +00:00
_screeny = _decaly * 320 ;
}
2003-04-30 11:37:10 +00:00
set_mouse_pos ( 200 , 150 ) ;
_currentPalette = ( RGBColorType * ) calloc ( sizeof ( RGBColorType ) , 256 ) ;
2003-05-06 08:24:21 +00:00
_mouseBackupP = ( byte * ) malloc ( MAX_MOUSE_W * MAX_MOUSE_H ) ;
2003-04-30 11:37:10 +00:00
load_gfx_mode ( ) ;
}
void OSystem_PALMOS : : copy_rect ( const byte * buf , int pitch , int x , int y , int w , int h ) {
2003-06-08 09:18:21 +00:00
/* Clip the coordinates */
if ( x < 0 ) {
w + = x ;
buf - = x ;
x = 0 ;
}
if ( y < 0 ) {
h + = y ;
buf - = y * pitch ;
y = 0 ;
}
if ( w > _screenWidth - x ) {
w = _screenWidth - x ;
}
if ( h > _screenHeight - y ) {
h = _screenHeight - y ;
}
if ( w < = 0 | | h < = 0 )
return ;
2003-04-30 11:37:10 +00:00
/* FIXME: undraw mouse only if the draw rect intersects with the mouse rect */
2003-05-06 08:24:21 +00:00
if ( _mouseDrawn )
2003-04-30 11:37:10 +00:00
undraw_mouse ( ) ;
2003-05-06 08:24:21 +00:00
byte * dst = _offScreenP + y * _screenWidth + x ;
2003-04-30 11:37:10 +00:00
2003-06-08 09:18:21 +00:00
if ( _screenWidth = = pitch & & pitch = = w ) {
memcpy ( dst , buf , h * w ) ;
} else {
do {
memcpy ( dst , buf , w ) ;
dst + = _screenWidth ;
buf + = pitch ;
} while ( - - h ) ;
}
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-08-06 08:33:38 +00:00
// only avalaible for 320x200 games, so use values instead of vars
# define WIDE_PITCH 320
# define WIDE_HALF_HEIGHT 100 // 200 / 2
2003-05-28 18:42:16 +00:00
void OSystem_PALMOS : : update_screen__wide ( ) {
Coord x , y ;
UInt32 next = _decaly < < 1 ;
UInt8 * dst = _screenP ;
2003-08-06 08:33:38 +00:00
UInt8 * src1 = _offScreenP + WIDE_PITCH - 1 ;
2003-05-28 18:42:16 +00:00
UInt8 * src2 = src1 ;
2003-08-06 08:33:38 +00:00
for ( x = 0 ; x < _screenWidth > > 1 ; x + + )
{
for ( y = 0 ; y < WIDE_HALF_HEIGHT ; y + + )
{
2003-05-28 18:42:16 +00:00
* dst + + = * src1 ;
2003-08-06 08:33:38 +00:00
src1 + = WIDE_PITCH ;
* dst + + = * src1 ;
* dst + + = * src1 ;
src1 + = WIDE_PITCH ;
2003-05-28 18:42:16 +00:00
}
src1 = - - src2 ;
dst + = next ;
2003-08-06 08:33:38 +00:00
for ( y = 0 ; y < WIDE_HALF_HEIGHT ; y + + )
{
* dst + + = * src1 ;
src1 + = WIDE_PITCH ;
* dst + + = * src1 ;
* dst + + = * src1 ;
src1 + = WIDE_PITCH ;
2003-05-28 18:42:16 +00:00
}
2003-08-06 08:33:38 +00:00
src1 = - - src2 ;
dst + = next ;
MemMove ( dst , dst - WIDE_PITCH , 300 ) ; // 300 = 200 x 1.5
dst + = WIDE_PITCH ;
}
2003-05-28 18:42:16 +00:00
WinScreenUnlock ( ) ;
2003-06-08 09:18:21 +00:00
_screenP = WinScreenLock ( winLockCopy ) + _screeny ;
2003-05-28 18:42:16 +00:00
}
void OSystem_PALMOS : : update_screen__flipping ( ) {
RectangleType r , dummy ;
2003-04-30 11:37:10 +00:00
UInt8 * screen ;
2003-05-06 08:24:21 +00:00
UInt32 size = _screenWidth * _screenHeight + 6400 ; // 10 pix top and bottom border
2003-04-30 11:37:10 +00:00
Boolean shaked = false ;
UInt32 move = 0 ;
// shake screen
if ( _current_shake_pos ! = _new_shake_pos ) {
2003-05-28 18:42:16 +00:00
if ( _useHRmode ) {
2003-05-06 08:24:21 +00:00
RctSetRectangle ( & r , 0 , _decaly - _new_shake_pos , _screenWidth , _screenHeight + ( _new_shake_pos < < 2 ) ) ;
2003-05-28 18:42:16 +00:00
HRWinScrollRectangle ( gVars - > HRrefNum , & r , winDown , _new_shake_pos , & dummy ) ;
2003-04-30 11:37:10 +00:00
} else {
2003-05-06 08:24:21 +00:00
move = ( _new_shake_pos * _screenWidth ) ;
screen = _offScreenP - 3200 ;
2003-04-30 11:37:10 +00:00
MemMove ( screen + move , screen , size ) ;
}
if ( _vibrate ) {
Boolean active = ( _new_shake_pos > = 3 ) ;
HwrVibrateAttributes ( 1 , kHwrVibrateActive , & active ) ;
}
_current_shake_pos = _new_shake_pos ;
shaked = true ;
}
// update screen
WinScreenUnlock ( ) ;
2003-05-06 08:24:21 +00:00
_offScreenP = WinScreenLock ( winLockCopy ) + _screeny ;
_screenP = _offScreenP ;
2003-04-30 11:37:10 +00:00
if ( shaked ) {
2003-05-28 18:42:16 +00:00
if ( _useHRmode ) {
HRWinScrollRectangle ( gVars - > HRrefNum , & r , winUp , _new_shake_pos , & dummy ) ;
2003-04-30 11:37:10 +00:00
} else {
2003-05-06 08:24:21 +00:00
screen = _offScreenP - 3200 ;
2003-04-30 11:37:10 +00:00
MemMove ( screen , screen + move , size ) ;
}
}
}
2003-05-28 18:42:16 +00:00
void OSystem_PALMOS : : update_screen__dbuffer ( ) {
2003-04-30 11:37:10 +00:00
UInt32 move = 0 ;
2003-05-06 08:24:21 +00:00
UInt32 size = _screenWidth * _screenHeight ;
2003-04-30 11:37:10 +00:00
// shake screen
if ( _current_shake_pos ! = _new_shake_pos ) {
2003-05-06 08:24:21 +00:00
move = ( _new_shake_pos * _screenWidth ) ;
2003-04-30 11:37:10 +00:00
// copy clear bottom of the screen to top to cover shaking image
2003-05-06 08:24:21 +00:00
MemMove ( _screenP , _screenP + size , move ) ;
2003-04-30 11:37:10 +00:00
if ( _vibrate ) {
Boolean active = ( _new_shake_pos > = 3 ) ;
HwrVibrateAttributes ( 1 , kHwrVibrateActive , & active ) ;
}
_current_shake_pos = _new_shake_pos ;
}
// update screen
2003-05-06 08:24:21 +00:00
MemMove ( _screenP + move , _offScreenP , size - move ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-28 18:42:16 +00:00
void OSystem_PALMOS : : update_screen__direct ( ) {
2003-04-30 11:37:10 +00:00
if ( _current_shake_pos ! = _new_shake_pos ) {
if ( _vibrate ) {
Boolean active = ( _new_shake_pos > = 3 ) ;
HwrVibrateAttributes ( 1 , kHwrVibrateActive , & active ) ;
}
_current_shake_pos = _new_shake_pos ;
}
}
2003-05-19 11:02:59 +00:00
# define MD_NONE 0
# define MD_CTRL 1
# define MD_ALT 2
static void drawKeyState ( OSystem_PALMOS * sys , UInt8 state ) {
UInt8 i , j ;
UInt16 bmpID = 3000 + state - 1 ;
MemHandle hTemp ;
BitmapType * bmTemp ;
UInt32 * bmData ;
UInt32 pitch = sys - > get_width ( ) ;
UInt8 * scr = sys - > _screenP + sys - > get_width ( ) * ( sys - > get_height ( ) + 2 ) + 2 ;
hTemp = DmGetResource ( bitmapRsc , bmpID ) ;
if ( hTemp ) { // draw
bmTemp = ( BitmapType * ) MemHandleLock ( hTemp ) ;
bmData = ( UInt32 * ) BmpGetBits ( bmTemp ) ;
for ( i = 0 ; i < 7 ; i + + ) {
for ( j = 0 ; j < 32 ; j + + ) {
if ( * bmData & ( 1 < < ( 31 - j ) ) )
* scr + + = gVars - > indicator . on ;
else
* scr + + = gVars - > indicator . off ;
}
scr + = pitch - 32 ;
bmData + + ;
}
MemPtrUnlock ( bmTemp ) ;
DmReleaseResource ( hTemp ) ;
} else { // undraw
for ( i = 0 ; i < 7 ; i + + ) {
for ( j = 0 ; j < 32 ; j + + ) {
* scr + + = gVars - > indicator . off ;
}
scr + = pitch - 32 ;
}
}
}
static void drawNumPad ( OSystem_PALMOS * sys , UInt8 color ) {
UInt8 i , j , k ;
UInt16 bmpID = 3010 ; // numPadBitmap 64x34
MemHandle hTemp ;
BitmapType * bmTemp ;
UInt32 * bmData ;
UInt32 pitch = sys - > get_width ( ) ;
UInt8 * scr = sys - > _screenP + sys - > get_width ( ) * ( sys - > get_height ( ) + 2 ) ;
scr + = pitch - 66 ;
hTemp = DmGetResource ( bitmapRsc , bmpID ) ;
if ( hTemp ) {
bmTemp = ( BitmapType * ) MemHandleLock ( hTemp ) ;
bmData = ( UInt32 * ) BmpGetBits ( bmTemp ) ;
for ( i = 0 ; i < 34 ; i + + ) {
for ( k = 0 ; k < 2 ; k + + ) {
for ( j = 0 ; j < 32 ; j + + ) {
if ( * bmData & ( 1 < < ( 31 - j ) ) )
* scr + + = color ;
else
* scr + + = 0 ;
}
bmData + + ;
}
scr + = pitch - 64 ;
}
MemPtrUnlock ( bmTemp ) ;
DmReleaseResource ( hTemp ) ;
}
}
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : update_screen ( ) {
if ( _quit )
return ;
// Make sure the mouse is drawn, if it should be drawn.
draw_mouse ( ) ;
// Check whether the palette was changed in the meantime and update the
// screen surface accordingly.
if ( _paletteDirtyEnd ! = 0 ) {
2003-05-19 11:02:59 +00:00
UInt8 oldCol ;
2003-04-30 11:37:10 +00:00
2003-05-19 11:02:59 +00:00
if ( gVars - > stdPalette ) {
WinSetDrawWindow ( WinGetDisplayWindow ( ) ) ; // hack by Doug
WinPalette ( winPaletteSet , _paletteDirtyStart , _paletteDirtyEnd - _paletteDirtyStart , _currentPalette + _paletteDirtyStart ) ;
} else {
HwrDisplayPalette ( winPaletteSet , _paletteDirtyStart , _paletteDirtyEnd - _paletteDirtyStart , _currentPalette + _paletteDirtyStart ) ;
}
2003-04-30 11:37:10 +00:00
_paletteDirtyEnd = 0 ;
2003-05-19 11:02:59 +00:00
oldCol = gVars - > indicator . on ;
2003-04-30 11:37:10 +00:00
gVars - > indicator . on = RGBToColor ( 0 , 255 , 0 ) ;
2003-05-19 11:02:59 +00:00
if ( oldCol ! = gVars - > indicator . on ) {
// redraw if needed
2003-05-28 18:42:16 +00:00
if ( _lastKeyModifier )
drawKeyState ( this , _lastKeyModifier ) ;
2003-05-19 11:02:59 +00:00
if ( _useNumPad )
drawNumPad ( this , gVars - > indicator . on ) ;
}
2003-04-30 11:37:10 +00:00
}
2003-07-07 08:45:20 +00:00
// redraw the screen
( ( this ) - > * ( _renderer_proc ) ) ( ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
bool OSystem_PALMOS : : show_mouse ( bool visible ) {
2003-05-06 08:24:21 +00:00
if ( _mouseVisible = = visible )
2003-04-30 11:37:10 +00:00
return visible ;
2003-05-06 08:24:21 +00:00
bool last = _mouseVisible ;
_mouseVisible = visible ;
2003-04-30 11:37:10 +00:00
if ( visible )
draw_mouse ( ) ;
else
undraw_mouse ( ) ;
return last ;
}
2003-05-02 15:30:06 +00:00
2003-08-06 08:33:38 +00:00
void OSystem_PALMOS : : warp_mouse ( int x , int y ) { }
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : set_mouse_pos ( int x , int y ) {
2003-05-06 08:24:21 +00:00
if ( x ! = _mouseCurState . x | | y ! = _mouseCurState . y ) {
_mouseCurState . x = x ;
_mouseCurState . y = y ;
2003-04-30 11:37:10 +00:00
undraw_mouse ( ) ;
}
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : set_mouse_cursor ( const byte * buf , uint w , uint h , int hotspot_x , int hotspot_y ) {
2003-05-06 08:24:21 +00:00
_mouseCurState . w = w ;
_mouseCurState . h = h ;
2003-04-30 11:37:10 +00:00
2003-05-06 08:24:21 +00:00
_mouseHotspotX = hotspot_x ;
_mouseHotspotY = hotspot_y ;
2003-04-30 11:37:10 +00:00
2003-05-06 08:24:21 +00:00
_mouseDataP = ( byte * ) buf ;
2003-04-30 11:37:10 +00:00
undraw_mouse ( ) ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : set_shake_pos ( int shake_pos ) {
_new_shake_pos = shake_pos ;
if ( shake_pos = = 0 & & _vibrate )
{
Boolean active = false ;
HwrVibrateAttributes ( 1 , kHwrVibrateActive , & active ) ;
}
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
uint32 OSystem_PALMOS : : get_msecs ( ) {
uint32 ticks = TimGetTicks ( ) ;
ticks * = ( 1000 / SysTicksPerSecond ( ) ) ;
return ticks ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : delay_msecs ( uint msecs ) {
SysTaskDelay ( ( SysTicksPerSecond ( ) * msecs ) / 1000 ) ;
}
2003-05-02 15:30:06 +00:00
2003-05-29 21:45:26 +00:00
void OSystem_PALMOS : : create_thread ( ThreadProc * proc , void * param ) {
2003-07-07 08:45:20 +00:00
if ( _threadCounter = = MAX_THREAD ) {
warning ( " Cannot create thread. " ) ;
return ;
}
_thread [ _threadCounter ] . active = true ;
_thread [ _threadCounter ] . proc = proc ;
_thread [ _threadCounter ] . param = param ;
_thread [ _threadCounter ] . old_time = get_msecs ( ) ;
_thread [ _threadCounter ] . sleep = true ;
_threadCounter + + ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-07-07 08:45:20 +00:00
void OSystem_PALMOS : : set_timer ( int timer , int ( * callback ) ( int ) ) {
2003-04-30 11:37:10 +00:00
if ( callback ! = NULL ) {
_timer . duration = timer ;
_timer . next_expiry = get_msecs ( ) + timer ;
_timer . callback = callback ;
_timer . active = true ;
} else {
_timer . active = false ;
}
}
/* Mutex handling */
2003-07-07 08:45:20 +00:00
OSystem : : MutexRef OSystem_PALMOS : : create_mutex ( ) { return NULL ; }
void OSystem_PALMOS : : lock_mutex ( MutexRef mutex ) { }
void OSystem_PALMOS : : unlock_mutex ( MutexRef mutex ) { }
void OSystem_PALMOS : : delete_mutex ( MutexRef mutex ) { }
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : SimulateArrowKeys ( Event * event , Int8 iHoriz , Int8 iVert , Boolean repeat ) {
2003-05-06 08:24:21 +00:00
Int16 x = _mouseCurState . x ;
Int16 y = _mouseCurState . y ;
2003-04-30 11:37:10 +00:00
if ( repeat ) {
2003-05-28 18:42:16 +00:00
_lastKeyRepeat + = 100 ;
2003-04-30 11:37:10 +00:00
2003-05-28 18:42:16 +00:00
if ( _lastKeyRepeat > 3200 )
_lastKeyRepeat = 3200 ;
2003-04-30 11:37:10 +00:00
}
else
2003-05-28 18:42:16 +00:00
_lastKeyRepeat = 100 ;
2003-04-30 11:37:10 +00:00
2003-05-28 18:42:16 +00:00
x = x + iHoriz * ( _lastKeyRepeat / 100 ) ;
y = y + iVert * ( _lastKeyRepeat / 100 ) ;
2003-04-30 11:37:10 +00:00
x = ( x < 0 ) ? 0 : x ;
2003-05-06 08:24:21 +00:00
x = ( x > = _screenWidth ) ? _screenWidth - 1 : x ;
2003-04-30 11:37:10 +00:00
y = ( y < 0 ) ? 0 : y ;
2003-05-06 08:24:21 +00:00
y = ( y > = _screenHeight ) ? _screenHeight - 1 : y ;
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_MOUSEMOVE ;
event - > mouse . x = x ;
event - > mouse . y = y ;
}
2003-05-28 18:42:16 +00:00
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 ;
}
}
2003-04-30 11:37:10 +00:00
bool OSystem_PALMOS : : poll_event ( Event * event ) {
EventType ev ;
Boolean handled ;
2003-07-07 08:45:20 +00:00
UInt32 current_msecs ;
2003-05-28 18:42:16 +00:00
UInt32 keyCurrentState ;
2003-05-19 11:02:59 +00:00
Coord x , y ;
2003-07-22 08:33:13 +00:00
if ( _quit ) {
exit ( 0 ) ; // resend an exit event
2003-05-19 11:02:59 +00:00
return false ;
2003-07-22 08:33:13 +00:00
}
2003-04-30 11:37:10 +00:00
2003-05-12 12:14:13 +00:00
current_msecs = get_msecs ( ) ;
//thread handler
2003-07-07 08:45:20 +00:00
for ( _threadID = 0 ; _threadID < _threadCounter ; _threadID + + ) {
if ( _thread [ _threadID ] . active )
_thread [ _threadID ] . proc ( _thread [ _threadID ] . param ) ;
}
2003-05-12 12:14:13 +00:00
// sound handler
if ( _sound . active )
check_sound ( ) ;
2003-04-30 11:37:10 +00:00
2003-05-12 12:14:13 +00:00
// timer handler
if ( _timer . active & & ( current_msecs > = _timer . next_expiry ) ) {
_timer . duration = _timer . callback ( _timer . duration ) ;
_timer . next_expiry = current_msecs + _timer . duration ;
}
2003-04-30 11:37:10 +00:00
2003-07-22 08:33:13 +00:00
if ( _selfQuit )
quit ( ) ;
2003-05-12 12:14:13 +00:00
for ( ; ; ) {
EvtGetEvent ( & ev , evtNoWait ) ;
if ( ev . eType = = nilEvent )
return false ;
keyCurrentState = KeyCurrentState ( ) ;
2003-04-30 11:37:10 +00:00
if ( ev . eType = = keyDownEvent ) {
switch ( ev . data . keyDown . chr ) {
case vchrLaunch :
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_KEYDOWN ;
event - > kbd . keycode = 27 ;
event - > kbd . ascii = 27 ;
event - > kbd . flags = 0 ;
return true ;
2003-05-19 11:02:59 +00:00
2003-06-08 09:18:21 +00:00
case vchrJogPushRepeat :
2003-04-30 11:37:10 +00:00
case vchrMenu :
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_KEYDOWN ;
event - > kbd . keycode = 319 ;
event - > kbd . ascii = 319 ;
event - > kbd . flags = 0 ;
return true ;
case vchrBrightness :
case vchrContrast :
case vchrFind :
WinPalette ( winPaletteSet , 0 , 256 , _currentPalette ) ;
break ;
case vchrCalc :
2003-05-28 18:42:16 +00:00
if ( _lastKeyPressed = = vchrCalc )
2003-07-22 08:33:13 +00:00
if ( ( get_msecs ( ) - _exit_delay ) < = ( EXITDELAY ) )
2003-07-07 08:45:20 +00:00
_selfQuit = true ;
2003-04-30 11:37:10 +00:00
_exit_delay = get_msecs ( ) ;
2003-05-28 18:42:16 +00:00
_lastKeyPressed = vchrCalc ;
2003-04-30 11:37:10 +00:00
return true ;
// mouse emulation
2003-06-08 09:18:21 +00:00
case vchrJogPush :
2003-04-30 11:37:10 +00:00
case vchrHard1 : // left button
event - > event_code = EVENT_LBUTTONDOWN ;
2003-05-06 08:24:21 +00:00
event - > mouse . x = _mouseCurState . x ;
event - > mouse . y = _mouseCurState . y ;
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
return true ;
case vchrHard2 : // move left
2003-05-28 18:42:16 +00:00
SimulateArrowKeys ( event , - 1 , 0 , ( _lastKeyPressed = = vchrHard2 ) ) ;
_lastKeyPressed = vchrHard2 ;
2003-04-30 11:37:10 +00:00
return true ;
case vchrPageUp : // move up
2003-05-28 18:42:16 +00:00
SimulateArrowKeys ( event , 0 , - 1 , ( _lastKeyPressed = = vchrPageUp ) ) ;
_lastKeyPressed = vchrPageUp ;
2003-04-30 11:37:10 +00:00
return true ;
case vchrPageDown : // move down
2003-05-28 18:42:16 +00:00
SimulateArrowKeys ( event , 0 , 1 , ( _lastKeyPressed = = vchrPageDown ) ) ;
_lastKeyPressed = vchrPageDown ;
2003-04-30 11:37:10 +00:00
return true ;
case vchrHard3 : // move right
2003-05-28 18:42:16 +00:00
SimulateArrowKeys ( event , 1 , 0 , ( _lastKeyPressed = = vchrHard3 ) ) ;
_lastKeyPressed = vchrHard3 ;
2003-04-30 11:37:10 +00:00
return true ;
2003-06-08 09:18:21 +00:00
case vchrJogBack :
2003-04-30 11:37:10 +00:00
case vchrHard4 : // right button
event - > event_code = EVENT_RBUTTONDOWN ;
2003-05-06 08:24:21 +00:00
event - > mouse . x = _mouseCurState . x ;
event - > mouse . y = _mouseCurState . y ;
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
return true ;
case vchrJogUp :
event - > event_code = EVENT_WHEELUP ;
return true ;
case vchrJogDown :
event - > event_code = EVENT_WHEELDOWN ;
return true ;
2003-05-28 18:42:16 +00:00
// if hotsync pressed
2003-04-30 11:37:10 +00:00
case vchrHardCradle :
2003-07-07 08:45:20 +00:00
case vchrHardCradle2 :
_selfQuit = true ;
2003-04-30 11:37:10 +00:00
}
}
// check for hardkey repeat
2003-05-28 18:42:16 +00:00
if ( _lastKeyPressed ! = - 1 & & _lastKeyPressed ! = vchrCalc & &
2003-04-30 11:37:10 +00:00
! ( ( keyCurrentState & keyBitHard2 ) | |
( keyCurrentState & keyBitPageUp ) | |
( keyCurrentState & keyBitPageDown ) | |
( keyCurrentState & keyBitHard3 )
)
) {
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
}
// prevent crash when alarm is raised
handled = ( ( ev . eType = = keyDownEvent ) & &
( ev . data . keyDown . modifiers & commandKeyMask ) & &
( ( ev . data . keyDown . chr = = vchrAttnStateChanged ) | |
( ev . data . keyDown . chr = = vchrAttnUnsnooze ) ) ) ;
2003-05-28 18:42:16 +00:00
// graffiti strokes, auto-off, etc...
2003-05-12 12:14:13 +00:00
if ( ! handled )
2003-04-30 11:37:10 +00:00
if ( SysHandleEvent ( & ev ) )
continue ;
// others events
switch ( ev . eType ) {
case keyDownEvent : {
2003-05-28 18:42:16 +00:00
_lastEvent = keyDownEvent ;
_lastKeyPressed = - 1 ;
2003-04-30 11:37:10 +00:00
//if (ev.data.keyDown.modifiers & shiftKeyMask) b |= KBD_SHIFT;
2003-05-12 12:14:13 +00:00
if ( ev . data . keyDown . chr = = vchrCommand & & ( ev . data . keyDown . modifiers & commandKeyMask ) ) {
2003-05-28 18:42:16 +00:00
_lastKeyModifier + + ;
_lastKeyModifier % = 3 ;
drawKeyState ( this , _lastKeyModifier ) ;
2003-05-12 12:14:13 +00:00
2003-04-30 11:37:10 +00:00
} else {
byte b = 0 ;
2003-05-28 18:42:16 +00:00
if ( _lastKeyModifier = = MD_CTRL ) b = KBD_CTRL ;
if ( _lastKeyModifier = = MD_ALT ) b = KBD_ALT ;
2003-05-12 12:14:13 +00:00
2003-07-07 08:45:20 +00:00
if ( ev . data . keyDown . chr = = ' z ' & & b = = KBD_CTRL ) {
_selfQuit = true ;
2003-05-28 18:42:16 +00:00
2003-05-19 11:02:59 +00:00
} else if ( ev . data . keyDown . chr = = ' n ' & & b = = KBD_CTRL ) {
UInt8 * scr = _screenP + _screenWidth * ( _screenHeight + 2 ) ;
_useNumPad = ! _useNumPad ;
drawNumPad ( this , _useNumPad ? gVars - > indicator . on : 0 ) ;
}
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_KEYDOWN ;
event - > kbd . keycode = ev . data . keyDown . chr ;
2003-05-12 12:14:13 +00:00
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 ) ;
2003-04-30 11:37:10 +00:00
event - > kbd . flags = b ;
2003-05-28 18:42:16 +00:00
_lastKeyModifier = MD_NONE ;
drawKeyState ( this , _lastKeyModifier ) ;
2003-04-30 11:37:10 +00:00
}
return true ;
}
case penMoveEvent :
2003-05-28 18:42:16 +00:00
getCoordinates ( & ev , ( _wideRefNum ! = sysInvalidRefNum ) , & x , & y ) ;
2003-05-19 11:02:59 +00:00
2003-05-28 18:42:16 +00:00
if ( ( y - _decaly ) > _screenHeight | | ( y - _decaly ) < 0 )
2003-04-30 11:37:10 +00:00
return true ;
2003-05-28 18:42:16 +00:00
if ( _lastEvent ! = penMoveEvent & & ( abs ( y - event - > mouse . y ) < = 2 | | abs ( x - event - > mouse . x ) < = 2 ) ) // move only if
2003-04-30 11:37:10 +00:00
return true ;
2003-05-28 18:42:16 +00:00
_lastEvent = penMoveEvent ;
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_MOUSEMOVE ;
2003-05-19 11:02:59 +00:00
event - > mouse . x = x ;
event - > mouse . y = y - _decaly ;
2003-08-02 00:36:38 +00:00
set_mouse_pos ( event - > mouse . x , event - > mouse . y ) ;
2003-04-30 11:37:10 +00:00
return true ;
case penDownEvent :
2003-05-28 18:42:16 +00:00
getCoordinates ( & ev , ( _wideRefNum ! = sysInvalidRefNum ) , & x , & y ) ;
2003-04-30 11:37:10 +00:00
2003-05-19 11:02:59 +00:00
if ( _useNumPad ) {
Coord y2 = _decaly + _screenHeight + 2 ;
if ( y > = y2 & & y < ( y2 + 34 ) & & x > = 254 & & x < 318 ) { // numpad location
UInt8 key = ' 1 ' ;
key + = 9 - ( ( 3 - ( ( x - 254 ) / 21 ) ) + ( 3 * ( ( y - y2 ) / 11 ) ) ) ;
2003-05-28 18:42:16 +00:00
_lastEvent = keyDownEvent ;
_lastKeyPressed = - 1 ;
2003-05-19 11:02:59 +00:00
event - > event_code = EVENT_KEYDOWN ;
event - > kbd . keycode = key ;
event - > kbd . ascii = key ;
event - > kbd . flags = 0 ;
return true ;
}
}
2003-05-28 18:42:16 +00:00
_lastEvent = penDownEvent ;
2003-05-19 11:02:59 +00:00
if ( ( y - _decaly ) > _screenHeight | | ( y - _decaly ) < 0 )
2003-04-30 11:37:10 +00:00
return true ;
event - > event_code = EVENT_LBUTTONDOWN ;
2003-05-19 11:02:59 +00:00
event - > mouse . x = x ;
event - > mouse . y = y - _decaly ;
2003-04-30 11:37:10 +00:00
set_mouse_pos ( event - > mouse . x , event - > mouse . y ) ;
return true ;
case penUpEvent :
2003-05-28 18:42:16 +00:00
getCoordinates ( & ev , ( _wideRefNum ! = sysInvalidRefNum ) , & x , & y ) ;
2003-04-30 11:37:10 +00:00
event - > event_code = EVENT_LBUTTONUP ;
2003-05-28 18:42:16 +00:00
if ( ( y - _decaly ) > _screenHeight | | ( y - _decaly ) < 0 )
2003-04-30 11:37:10 +00:00
return true ;
2003-05-28 18:42:16 +00:00
event - > mouse . x = x ;
event - > mouse . y = y - _decaly ;
2003-04-30 11:37:10 +00:00
set_mouse_pos ( event - > mouse . x , event - > mouse . y ) ;
return true ;
default :
return false ;
}
}
}
///////////////////////////////////////////////////////////////////////////////
uint32 OSystem_PALMOS : : property ( int param , Property * value ) {
switch ( param ) {
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
case PROP_SET_WINDOW_CAPTION :
if ( StrCaselessCompare ( value - > caption , " ScummVM " ) = = 0 )
return 1 ;
2003-05-06 08:24:21 +00:00
Char * caption = " Loading... \0 " ;
Char * build = " Build on " __DATE__ " , " __TIME__ " GMT+1 \0 " ;
UInt16 h0 = FntLineHeight ( ) + 2 ;
UInt16 w1 ;
WinSetTextColor ( 255 ) ;
WinSetForeColor ( 255 ) ;
2003-04-30 11:37:10 +00:00
2003-05-28 18:42:16 +00:00
if ( _useHRmode ) {
2003-04-30 11:37:10 +00:00
HRFntSetFont ( gVars - > HRrefNum , hrTinyBoldFont ) ;
2003-05-06 08:24:21 +00:00
w1 = FntCharsWidth ( caption , StrLen ( caption ) ) ;
2003-04-30 11:37:10 +00:00
w1 = ( 320 - w1 ) / 2 ;
HRWinDrawChars ( gVars - > HRrefNum , caption , StrLen ( caption ) , w1 , 80 ) ;
HRFntSetFont ( gVars - > HRrefNum , hrTinyFont ) ;
2003-05-06 08:24:21 +00:00
w1 = FntCharsWidth ( value - > caption , StrLen ( value - > caption ) ) ;
2003-04-30 11:37:10 +00:00
w1 = ( 320 - w1 ) / 2 ;
HRWinDrawChars ( gVars - > HRrefNum , value - > caption , StrLen ( value - > caption ) , w1 , 80 + h0 ) ;
2003-05-06 08:24:21 +00:00
HRWinDrawLine ( gVars - > HRrefNum , 40 , 85 + h0 * 2 , 280 , 85 + h0 * 2 ) ;
w1 = FntCharsWidth ( build , StrLen ( build ) ) ;
w1 = ( 320 - w1 ) / 2 ;
HRWinDrawChars ( gVars - > HRrefNum , build , StrLen ( build ) , w1 , 90 + h0 * 2 ) ;
2003-04-30 11:37:10 +00:00
} else {
FntSetFont ( boldFont ) ;
w1 = FntCharsWidth ( caption , StrLen ( caption ) ) ;
w1 = ( 160 - w1 ) / 2 ;
WinDrawChars ( caption , StrLen ( caption ) , w1 , 40 ) ;
}
return 1 ;
case PROP_OPEN_CD :
break ;
case PROP_GET_SAMPLE_RATE :
2003-07-07 08:45:20 +00:00
return 8000 ;
2003-04-30 11:37:10 +00:00
}
return 0 ;
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : quit ( ) {
if ( _quit )
return ;
2003-05-06 08:24:21 +00:00
2003-07-07 08:45:20 +00:00
if ( _selfQuit & & g_scumm )
2003-04-30 11:37:10 +00:00
g_scumm - > _quit = true ;
2003-07-07 08:45:20 +00:00
free ( _currentPalette ) ;
free ( _mouseBackupP ) ;
// free(_sndDataP);
free ( _sndTempP ) ;
2003-04-30 11:37:10 +00:00
2003-07-23 20:17:07 +00:00
if ( _msaRefNum ! = sysInvalidRefNum ) {
MsaStop ( _msaRefNum , true ) ; // stop the current track if any (needed if we use enforce open to prevent the track to play after exit)
2003-06-08 09:18:21 +00:00
MsaLibClose ( _msaRefNum , msaLibOpenModeAlbum ) ;
2003-07-23 20:17:07 +00:00
}
2003-06-08 09:18:21 +00:00
2003-05-06 08:24:21 +00:00
unload_gfx_mode ( ) ;
2003-04-30 11:37:10 +00:00
_quit = true ;
2003-07-07 08:45:20 +00:00
exit ( 1 ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : draw_mouse ( ) {
2003-05-06 08:24:21 +00:00
if ( _mouseDrawn | | ! _mouseVisible | | _quit )
2003-04-30 11:37:10 +00:00
return ;
2003-05-06 08:24:21 +00:00
_mouseCurState . y = _mouseCurState . y > = _screenHeight ? _screenHeight - 1 : _mouseCurState . y ;
2003-04-30 11:37:10 +00:00
2003-05-06 08:24:21 +00:00
int x = _mouseCurState . x - _mouseHotspotX ;
int y = _mouseCurState . y - _mouseHotspotY ;
int w = _mouseCurState . w ;
int h = _mouseCurState . h ;
2003-04-30 11:37:10 +00:00
byte color ;
2003-05-06 08:24:21 +00:00
byte * src = _mouseDataP ; // Image representing the mouse
byte * bak = _mouseBackupP ; // Surface used to backup the area obscured by the mouse
byte * dst ; // Surface we are drawing into
2003-04-30 11:37:10 +00:00
// clip the mouse rect, and addjust the src pointer accordingly
if ( x < 0 ) {
w + = x ;
src - = x ;
x = 0 ;
}
if ( y < 0 ) {
h + = y ;
2003-05-06 08:24:21 +00:00
src - = y * _mouseCurState . w ;
2003-04-30 11:37:10 +00:00
y = 0 ;
}
2003-05-06 08:24:21 +00:00
if ( w > _screenWidth - x )
w = _screenWidth - x ;
if ( h > _screenHeight - y )
h = _screenHeight - y ;
2003-04-30 11:37:10 +00:00
// Quick check to see if anything has to be drawn at all
if ( w < = 0 | | h < = 0 )
return ;
2003-05-06 08:24:21 +00:00
// Store the bounding box so that undraw mouse can restore the area the
// mouse currently covers to its original content.
_mouseOldState . x = x ;
_mouseOldState . y = y ;
_mouseOldState . w = w ;
_mouseOldState . h = h ;
2003-04-30 11:37:10 +00:00
// Draw the mouse cursor; backup the covered area in "bak"
2003-05-06 08:24:21 +00:00
dst = _offScreenP + y * _screenWidth + x ;
2003-04-30 11:37:10 +00:00
while ( h > 0 ) {
int width = w ;
while ( width > 0 ) {
* bak + + = * dst ;
color = * src + + ;
if ( color ! = 0xFF ) // 0xFF = transparent, don't draw
* dst = color ;
dst + + ;
width - - ;
}
2003-05-06 08:24:21 +00:00
src + = _mouseCurState . w - w ;
2003-04-30 11:37:10 +00:00
bak + = MAX_MOUSE_W - w ;
2003-05-06 08:24:21 +00:00
dst + = _screenWidth - w ;
2003-04-30 11:37:10 +00:00
h - - ;
}
// Finally, set the flag to indicate the mouse has been drawn
2003-05-06 08:24:21 +00:00
_mouseDrawn = true ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : undraw_mouse ( ) {
2003-05-06 08:24:21 +00:00
if ( ! _mouseDrawn | | _quit )
2003-04-30 11:37:10 +00:00
return ;
2003-05-06 08:24:21 +00:00
_mouseDrawn = false ;
2003-04-30 11:37:10 +00:00
2003-05-06 08:24:21 +00:00
byte * dst , * bak = _mouseBackupP ;
const int old_mouse_x = _mouseOldState . x ;
const int old_mouse_y = _mouseOldState . y ;
const int old_mouse_w = _mouseOldState . w ;
const int old_mouse_h = _mouseOldState . h ;
2003-04-30 11:37:10 +00:00
int x , y ;
// No need to do clipping here, since draw_mouse() did that already
2003-05-06 08:24:21 +00:00
dst = _offScreenP + old_mouse_y * _screenWidth + old_mouse_x ;
for ( y = 0 ; y < old_mouse_h ; + + y , bak + = MAX_MOUSE_W , dst + = _screenWidth ) {
2003-04-30 11:37:10 +00:00
for ( x = 0 ; x < old_mouse_w ; + + x ) {
dst [ x ] = bak [ x ] ;
}
}
}
2003-05-02 15:30:06 +00:00
2003-06-08 09:18:21 +00:00
// TODO : unify lib check functions
static UInt16 checkMSA ( ) {
SonySysFtrSysInfoP sonySysFtrSysInfoP ;
Err error = errNone ;
UInt16 refNum = sysInvalidRefNum ;
if ( ! ( error = FtrGet ( sonySysFtrCreator , sonySysFtrNumSysInfoP , ( UInt32 * ) & sonySysFtrSysInfoP ) ) ) {
// not found with audio adapter ?!
//if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrMsa) {
if ( ( error = SysLibFind ( sonySysLibNameMsa , & refNum ) ) )
if ( error = = sysErrLibNotFound )
error = SysLibLoad ( sonySysFileTMsaLib , sonySysFileCMsaLib , & refNum ) ;
2003-07-07 08:45:20 +00:00
if ( ! error ) {
// Char buf[100];
// StrPrintF(buf,"MSA refNum %ld, Try to open lib ...", refNum);
// FrmCustomAlert(1000,buf,0,0);
2003-08-06 08:33:38 +00:00
MsaLibClose ( refNum , msaLibOpenModeAlbum ) ; // close the lib if we previously let it open (?) Need to add Notify for sonySysNotifyMsaEnforceOpenEvent just in case ...
2003-07-07 08:45:20 +00:00
error = MsaLibOpen ( refNum , msaLibOpenModeAlbum ) ;
/* switch (error) {
case msaErrAlreadyOpen :
FrmCustomAlert ( 1000 , " msaErrAlreadyOpen " , 0 , 0 ) ;
break ;
case msaErrMemory :
FrmCustomAlert ( 1000 , " msaErrMemory " , 0 , 0 ) ;
break ;
case msaErrDifferentMode :
FrmCustomAlert ( 1000 , " msaErrDifferentMode " , 0 , 0 ) ;
break ;
case expErrCardNotPresent :
FrmCustomAlert ( 1000 , " expErrCardNotPresent " , 0 , 0 ) ;
break ;
}
2003-07-23 20:17:07 +00:00
*/
if ( error = = msaErrAlreadyOpen )
error = MsaLibEnforceOpen ( refNum , msaLibOpenModeAlbum , appFileCreator ) ;
error = ( error ! = msaErrStillOpen ) ? error : errNone ;
2003-07-07 08:45:20 +00:00
}
2003-06-08 09:18:21 +00:00
//}
}
if ( error )
refNum = sysInvalidRefNum ;
return refNum ;
}
void OSystem_PALMOS : : stop_cdrom ( ) { /* Stop CD Audio in 1/10th of a second */
_msaStopTime = get_msecs ( ) + 100 ;
_msaLoops = 0 ;
2003-04-30 11:37:10 +00:00
return ;
}
2003-05-02 15:30:06 +00:00
2003-06-08 09:18:21 +00:00
// frames are 1/75 sec
2003-07-07 08:45:20 +00:00
# define CD_FPS 75
# define TO_MSECS(frame) ((UInt32)((frame) * 1000 / CD_FPS))
2003-06-08 09:18:21 +00:00
// consider frame at 1/1000 sec
# define TO_SEC(msecs) ((UInt16)((msecs) / 1000))
# define TO_MIN(msecs) ((UInt16)(TO_SEC((msecs)) / 60))
# define FROM_MIN(mins) ((UInt32)((mins) * 60 * 1000))
# define FROM_SEC(secs) ((UInt32)((secs) * 1000))
2003-07-07 08:45:20 +00:00
static void doErr ( Err e , const Char * msg ) {
Char err [ 100 ] ;
StrPrintF ( err , " %ld : " , e ) ;
StrCat ( err , msg ) ;
FrmCustomAlert ( 1000 , err , 0 , 0 ) ;
}
2003-07-22 20:36:43 +00:00
void OSystem_PALMOS : : play_cdrom ( int track , int num_loops , int start_frame , int duration ) {
2003-07-07 08:45:20 +00:00
if ( ! _isCDRomAvalaible )
2003-06-08 09:18:21 +00:00
return ;
if ( ! num_loops & & ! start_frame )
return ;
2003-07-07 08:45:20 +00:00
Err e ;
2003-06-08 09:18:21 +00:00
// open MSA lib if needed
if ( _msaRefNum = = sysInvalidRefNum ) {
_msaRefNum = checkMSA ( ) ;
2003-07-07 08:45:20 +00:00
// if not found disable CD-Rom if needed
2003-06-08 09:18:21 +00:00
if ( _msaRefNum = = sysInvalidRefNum ) {
2003-07-07 08:45:20 +00:00
// FrmCustomAlert(1000,"MSA Lib not found",0,0);
_isCDRomAvalaible = ( gVars - > music . setDefaultTrackLength ) ;
2003-06-08 09:18:21 +00:00
return ;
}
UInt32 dummy , albumIterater = albumIteratorStart ;
Char nameP [ 256 ] ;
MemSet ( & _msaAlbum , sizeof ( _msaAlbum ) , 0 ) ;
_msaAlbum . maskflag = msa_INF_ALBUM ;
_msaAlbum . code = msa_LANG_CODE_ASCII ;
_msaAlbum . nameP = nameP ;
_msaAlbum . fileNameLength = 256 ;
2003-07-07 08:45:20 +00:00
e = MsaAlbumEnumerate ( _msaRefNum , & albumIterater , & _msaAlbum ) ;
// if (e) doErr(e, "MsaAlbumEnumerate");
e = MsaSetAlbum ( _msaRefNum , _msaAlbum . albumRefNum , & dummy ) ;
// if (e) doErr(e, "MsaSetAlbum");
e = MsaGetPBRate ( _msaRefNum , & _msaPBRate ) ;
// if (e) doErr(e, "MsaGetPBRate");
2003-06-08 09:18:21 +00:00
// TODO : use RMC to control volume
MsaOutSetVolume ( _msaRefNum , 20 , 20 ) ;
}
2003-07-07 08:45:20 +00:00
if ( start_frame > 0 )
start_frame + = CD_FPS > > 1 ;
2003-07-22 20:36:43 +00:00
if ( duration > 0 )
duration + = CD_FPS > > 1 ;
2003-06-08 09:18:21 +00:00
_msaLoops = num_loops ;
2003-07-07 08:45:20 +00:00
_msaTrack = track + gVars - > music . firstTrack - 1 ; // first track >= 1 ?, not 0 (0=album)
2003-06-08 09:18:21 +00:00
_msaStartFrame = TO_MSECS ( start_frame ) ;
2003-07-22 20:36:43 +00:00
_msaEndFrame = TO_MSECS ( duration ) ;
2003-06-08 09:18:21 +00:00
// if gVars->MP3 audio track
2003-07-07 08:45:20 +00:00
// Err e;
2003-06-08 09:18:21 +00:00
MemHandle trackH ;
2003-07-07 08:45:20 +00:00
// stop current play if any
MsaStop ( _msaRefNum , true ) ;
2003-07-22 08:33:13 +00:00
// retreive track infos
2003-06-08 09:18:21 +00:00
e = MsaGetTrackInfo ( _msaRefNum , _msaTrack , 0 , msa_LANG_CODE_ASCII , & trackH ) ;
2003-07-07 08:45:20 +00:00
// if (e) doErr(e, "MsaGetTrackInfo");
2003-06-08 09:18:21 +00:00
// track exists
if ( ! e & & trackH ) {
MsaTime tTime ;
UInt32 SU , fullLength ;
2003-07-07 08:45:20 +00:00
MsaTrackInfo * tiP ;
2003-06-08 09:18:21 +00:00
2003-07-07 08:45:20 +00:00
// FIXME : this enable MsaSuToTime to return the right value
MsaPlay ( _msaRefNum , _msaTrack , 0 , _msaPBRate ) ;
MsaStop ( _msaRefNum , true ) ;
tiP = ( MsaTrackInfo * ) MemHandleLock ( trackH ) ;
2003-06-08 09:18:21 +00:00
MsaSuToTime ( _msaRefNum , tiP - > totalsu , & tTime ) ;
SU = tiP - > totalsu ;
MemPtrUnlock ( tiP ) ;
MemHandleFree ( trackH ) ;
2003-07-07 08:45:20 +00:00
// Char buf[200];
// StrPrintF(buf,"Track : %ld - %ld%:%ld.%ld (%ld)", track, tTime.minute, tTime.second, tTime.frame, SU);
// FrmCustomAlert(1000,buf,0,0);
2003-06-08 09:18:21 +00:00
_msaStopTime = 0 ;
fullLength = FROM_MIN ( tTime . minute ) + FROM_SEC ( tTime . second ) + tTime . frame ;
if ( _msaEndFrame > 0 ) {
_msaTrackLength = _msaEndFrame - _msaStartFrame ;
} else if ( _msaStartFrame > 0 ) {
_msaTrackLength = fullLength ;
_msaTrackLength - = _msaStartFrame ;
} else {
_msaTrackLength = fullLength ;
}
_msaEndTime = get_msecs ( ) + _msaTrackLength - 2000 ; // 2sec less ...
// try to play the track
2003-07-22 20:36:43 +00:00
if ( start_frame = = 0 & & duration = = 0 ) {
2003-06-08 09:18:21 +00:00
MsaPlay ( _msaRefNum , _msaTrack , 0 , _msaPBRate ) ;
} else {
2003-07-07 08:45:20 +00:00
// FIXME : MsaTimeToSu doesn't work ... (may work with previous FIXME)
_msaTrackStart = ( UInt32 ) ( ( float ) ( _msaStartFrame ) / ( ( float ) fullLength / ( float ) SU ) ) ;
2003-06-08 09:18:21 +00:00
MsaPlay ( _msaRefNum , _msaTrack , _msaTrackStart , _msaPBRate ) ;
}
}
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
bool OSystem_PALMOS : : poll_cdrom ( ) {
2003-06-08 09:18:21 +00:00
if ( ! _isCDRomAvalaible )
return false ;
if ( _msaRefNum = = sysInvalidRefNum )
return false ;
MsaPBStatus pb ;
MsaGetPBStatus ( _msaRefNum , & pb ) ;
return ( _msaLoops ! = 0 & & ( get_msecs ( ) < _msaEndTime | | pb . status ! = msa_STOPSTATUS ) ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : update_cdrom ( ) {
2003-06-08 09:18:21 +00:00
if ( ! _isCDRomAvalaible )
return ;
if ( _msaRefNum = = sysInvalidRefNum )
return ;
if ( _msaStopTime ! = 0 & & get_msecs ( ) > = _msaStopTime ) {
MsaStop ( _msaRefNum , true ) ;
_msaLoops = 0 ;
_msaStopTime = 0 ;
return ;
}
if ( _msaLoops = = 0 | | get_msecs ( ) < _msaEndTime )
return ;
if ( _msaLoops ! = 1 ) {
MsaPBStatus pb ;
MsaGetPBStatus ( _msaRefNum , & pb ) ;
if ( pb . status ! = msa_STOPSTATUS ) {
MsaStop ( _msaRefNum , true ) ;
return ;
}
}
if ( _msaLoops > 0 ) {
MsaStop ( _msaRefNum , true ) ;
_msaLoops - - ;
}
if ( _msaLoops ! = 0 ) {
_msaEndTime = get_msecs ( ) + _msaTrackLength ;
MsaStop ( _msaRefNum , true ) ;
if ( _msaStartFrame = = 0 & & _msaEndFrame = = 0 )
MsaPlay ( _msaRefNum , _msaTrack , 0 , _msaPBRate ) ;
else
MsaPlay ( _msaRefNum , _msaTrack , _msaTrackStart , _msaPBRate ) ;
}
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
OSystem_PALMOS : : OSystem_PALMOS ( ) {
2003-04-30 11:37:10 +00:00
_quit = false ;
2003-07-07 08:45:20 +00:00
_selfQuit = false ; // prevent illegal access to g_scumm
2003-04-30 11:37:10 +00:00
_current_shake_pos = 0 ;
_new_shake_pos = 0 ;
2003-05-06 08:24:21 +00:00
memset ( & _mouseOldState , 0 , sizeof ( MousePos ) ) ;
memset ( & _mouseCurState , 0 , sizeof ( MousePos ) ) ;
2003-04-30 11:37:10 +00:00
_paletteDirtyStart = 0 ;
_paletteDirtyEnd = 0 ;
2003-07-13 11:03:33 +00:00
memset ( & _sound , 0 , sizeof ( SoundDataType ) ) ;
2003-07-07 08:45:20 +00:00
memset ( _thread , 0 , sizeof ( _thread ) ) ;
_threadID = 0 ;
_threadCounter = 0 ;
2003-04-30 11:37:10 +00:00
_currentPalette = NULL ;
2003-05-06 08:24:21 +00:00
_mouseBackupP = NULL ;
2003-04-30 11:37:10 +00:00
2003-05-28 18:42:16 +00:00
_lastKeyPressed = - 1 ;
_lastKeyRepeat = 100 ;
_lastKeyModifier = MD_NONE ;
2003-04-30 11:37:10 +00:00
2003-05-19 11:02:59 +00:00
_useNumPad = false ;
2003-05-28 18:42:16 +00:00
// HiRes+
_useHRmode = ( gVars - > HRrefNum ! = sysInvalidRefNum ) ;
_wideRefNum = sysInvalidRefNum ;
2003-06-08 09:18:21 +00:00
// cd-rom
2003-07-07 08:45:20 +00:00
_isCDRomAvalaible = ( gVars - > music . MP3 | | gVars - > music . setDefaultTrackLength ) ; // true by default, set to false if MSA not avalaible
2003-06-08 09:18:21 +00:00
_msaRefNum = sysInvalidRefNum ;
2003-05-06 08:24:21 +00:00
// sound
_isSndPlaying = false ;
2003-07-07 08:45:20 +00:00
_sndTempP = ( UInt8 * ) MemPtrNew ( SND_BLOCK ) ;
2003-05-28 18:42:16 +00:00
_sndDataP = NULL ;
2003-04-30 11:37:10 +00:00
}
2003-05-02 15:30:06 +00:00
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : move_screen ( int dx , int dy , int height ) {
2003-05-28 18:42:16 +00:00
// Short circuit check - do we have to do anything anyway?
if ( ( dx = = 0 & & dy = = 0 ) | | height < = 0 )
2003-04-30 11:37:10 +00:00
return ;
2003-05-28 18:42:16 +00:00
// 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 {
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 ) ;
2003-04-30 11:37:10 +00:00
} else {
2003-05-28 18:42:16 +00:00
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);
2003-04-30 11:37:10 +00:00
}
2003-05-28 18:42:16 +00:00
} 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 ) ;
2003-04-30 11:37:10 +00:00
} else {
2003-05-28 18:42:16 +00:00
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);
2003-04-30 11:37:10 +00:00
}
}
2003-05-28 18:42:16 +00:00
WinSetDrawWindow ( _screenH ) ;
SysTaskDelay ( 1 ) ; // prevent crash on Clie device using successive [HR]WinScrollRectangle !
2003-04-30 11:37:10 +00:00
}
2003-05-29 22:34:35 +00:00
bool OSystem_PALMOS : : set_sound_proc ( SoundProc * proc , void * param , SoundFormat format ) {
2003-04-30 11:37:10 +00:00
_sound . active = true ;
_sound . proc = proc ;
_sound . param = param ;
2003-06-08 09:18:21 +00:00
_sound . format = format ;
2003-04-30 11:37:10 +00:00
2003-05-28 18:42:16 +00:00
return _sound . active ;
2003-04-30 11:37:10 +00:00
}
2003-06-09 09:48:53 +00:00
void OSystem_PALMOS : : clear_sound_proc ( ) {
_sound . active = false ;
}
2003-04-30 11:37:10 +00:00
void OSystem_PALMOS : : check_sound ( ) {
2003-05-02 15:30:06 +00:00
// currently not supported
2003-05-12 12:14:13 +00:00
// but i need to use this function to prevent out of memory
// on zak256 because the sound buffer growns and it's never
// freed.
2003-07-07 08:45:20 +00:00
_sound . proc ( _sound . param , _sndTempP , SND_BLOCK ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : show_overlay ( ) {
2003-04-30 11:37:10 +00:00
// hide the mouse
undraw_mouse ( ) ;
_overlay_visible = true ;
clear_overlay ( ) ;
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : hide_overlay ( ) {
2003-04-30 11:37:10 +00:00
// hide the mouse
undraw_mouse ( ) ;
_overlay_visible = false ;
_overlaySaved = false ;
2003-05-06 08:24:21 +00:00
memmove ( _offScreenP , _tmpScreenP , _screenWidth * _screenHeight ) ;
2003-04-30 11:37:10 +00:00
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : clear_overlay ( ) {
2003-04-30 11:37:10 +00:00
if ( ! _overlay_visible )
return ;
// hide the mouse
undraw_mouse ( ) ;
2003-05-06 08:24:21 +00:00
if ( ! _overlaySaved ) {
if ( MemPtrDataStorage ( _tmpScreenP ) )
DmWrite ( _tmpScreenP , 0 , _offScreenP , _screenWidth * _screenHeight ) ;
else
MemMove ( _tmpScreenP , _offScreenP , _screenWidth * _screenHeight ) ;
2003-04-30 11:37:10 +00:00
_overlaySaved = true ;
}
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : grab_overlay ( byte * buf , int pitch ) {
2003-04-30 11:37:10 +00:00
if ( ! _overlay_visible )
return ;
// hide the mouse
undraw_mouse ( ) ;
2003-05-06 08:24:21 +00:00
byte * src = _tmpScreenP ;
int h = _screenHeight ;
2003-04-30 11:37:10 +00:00
do {
2003-05-06 08:24:21 +00:00
memcpy ( buf , src , _screenWidth ) ;
src + = _screenWidth ;
2003-04-30 11:37:10 +00:00
buf + = pitch ;
} while ( - - h ) ;
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : copy_rect_overlay ( const byte * buf , int pitch , int x , int y , int w , int h ) {
2003-04-30 11:37:10 +00:00
if ( ! _overlay_visible )
return ;
undraw_mouse ( ) ;
2003-05-06 08:24:21 +00:00
byte * dst = _offScreenP + y * _screenWidth + x ;
2003-04-30 11:37:10 +00:00
do {
memcpy ( dst , buf , w ) ;
2003-05-06 08:24:21 +00:00
dst + = _screenWidth ;
2003-04-30 11:37:10 +00:00
buf + = pitch ;
} while ( - - h ) ;
}
int16 OSystem_PALMOS : : get_height ( ) {
2003-05-06 08:24:21 +00:00
return _screenHeight ;
2003-04-30 11:37:10 +00:00
}
int16 OSystem_PALMOS : : get_width ( ) {
2003-05-06 08:24:21 +00:00
return _screenWidth ;
2003-04-30 11:37:10 +00:00
}
2003-05-06 08:24:21 +00:00
byte OSystem_PALMOS : : RGBToColor ( uint8 r , uint8 g , uint8 b ) {
2003-04-30 11:37:10 +00:00
NewGuiColor color = 255 ;
byte nearest = 255 ;
byte check ;
byte r2 , g2 , b2 ;
2003-05-06 08:24:21 +00:00
for ( int i = 0 ; i < 256 ; i + + )
2003-04-30 11:37:10 +00:00
{
r2 = _currentPalette [ i ] . r ;
g2 = _currentPalette [ i ] . g ;
b2 = _currentPalette [ i ] . b ;
2003-05-06 08:24:21 +00:00
check = ( ABS ( r2 - r ) + ABS ( g2 - g ) + ABS ( b2 - b ) ) / 3 ;
2003-04-30 11:37:10 +00:00
if ( check = = 0 ) // perfect match
return i ;
2003-05-06 08:24:21 +00:00
else if ( check < nearest ) { // else save and continue
2003-04-30 11:37:10 +00:00
color = i ;
nearest = check ;
}
}
return color ;
}
2003-05-06 08:24:21 +00:00
void OSystem_PALMOS : : ColorToRGB ( byte color , uint8 & r , uint8 & g , uint8 & b ) {
2003-04-30 11:37:10 +00:00
r = _currentPalette [ color ] . r ;
g = _currentPalette [ color ] . g ;
b = _currentPalette [ color ] . b ;
2003-05-19 11:02:59 +00:00
}