os2: a _lot_ of coding style cleanup, sot that they match the SDL style.

also renamed the 'debug' macro to debug_os2: the former was dangerously
a common name.

the binary (dll) output is precisely the same as before.
This commit is contained in:
Ozkan Sezer 2020-10-15 21:37:30 +03:00
parent bdc5129f13
commit a90f0400a5
29 changed files with 3536 additions and 3806 deletions

View File

@ -34,62 +34,59 @@
/* /*
void lockIncr(volatile int *piVal); void lockIncr(volatile int *piVal);
#pragma aux lockIncr = \ #pragma aux lockIncr = \
" lock add [eax], 1 "\ " lock add [eax], 1 "\
parm [eax]; parm [eax];
void lockDecr(volatile int *piVal); void lockDecr(volatile int *piVal);
#pragma aux lockDecr = \ #pragma aux lockDecr = \
" lock sub [eax], 1 "\ " lock sub [eax], 1 "\
parm [eax]; parm [eax];
*/ */
static ULONG _getEnvULong(PSZ pszName, ULONG ulMax, ULONG ulDefault) static ULONG _getEnvULong(PSZ pszName, ULONG ulMax, ULONG ulDefault)
{ {
ULONG ulValue; ULONG ulValue;
PCHAR pcEnd; PCHAR pcEnd;
PSZ pszEnvVal = SDL_getenv( pszName ); PSZ pszEnvVal = SDL_getenv(pszName);
if ( pszEnvVal == NULL ) if (pszEnvVal == NULL)
return ulDefault; return ulDefault;
ulValue = SDL_strtoul( (const char *)pszEnvVal, &pcEnd, 10 ); ulValue = SDL_strtoul((const char *)pszEnvVal, &pcEnd, 10);
return ( pcEnd == pszEnvVal ) || ( ulValue > ulMax ) ? ulDefault : ulMax; return (pcEnd == pszEnvVal) || (ulValue > ulMax)? ulDefault : ulMax;
} }
static int _MCIError(PSZ pszFunc, ULONG ulResult) static int _MCIError(PSZ pszFunc, ULONG ulResult)
{ {
CHAR acBuf[128]; CHAR acBuf[128];
mciGetErrorString(ulResult, acBuf, sizeof(acBuf));
mciGetErrorString( ulResult, acBuf, sizeof(acBuf) ); return SDL_SetError("[%s] %s", pszFunc, acBuf);
return SDL_SetError( "[%s] %s", pszFunc, acBuf );
} }
static void _mixIOError(PSZ pszFunction, ULONG ulRC) static void _mixIOError(PSZ pszFunction, ULONG ulRC)
{ {
debug( "%s() - failed, rc = 0x%X (%s)", debug_os2("%s() - failed, rc = 0x%X (%s)",
pszFunction, ulRC, pszFunction, ulRC,
ulRC == MCIERR_INVALID_MODE ? "Mixer mode does not match request" (ulRC == MCIERR_INVALID_MODE) ? "Mixer mode does not match request" :
: ulRC == MCIERR_INVALID_BUFFER ? "Caller sent an invalid buffer" (ulRC == MCIERR_INVALID_BUFFER) ? "Caller sent an invalid buffer" : "unknown");
: "unknown" );
} }
LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer, LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
ULONG ulFlags) ULONG ulFlags)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)pBuffer->ulUserParm; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)pBuffer->ulUserParm;
ULONG ulRC; ULONG ulRC;
if ( ulFlags != MIX_WRITE_COMPLETE ) if (ulFlags != MIX_WRITE_COMPLETE) {
{ debug_os2("flags = 0x%X", ulFlags);
debug( "flags = 0x%X", ulFlags );
return 0; return 0;
} }
// lockDecr( (int *)&pAData->ulQueuedBuf ); /*lockDecr((int *)&pAData->ulQueuedBuf);*/
ulRC = DosPostEventSem( pAData->hevBuf ); ulRC = DosPostEventSem(pAData->hevBuf);
if ( ( ulRC != NO_ERROR ) && ( ulRC != ERROR_ALREADY_POSTED ) ) if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
debug( "DosPostEventSem(), rc = %u", ulRC ); debug_os2("DosPostEventSem(), rc = %u", ulRC);
}
return 1; // It seems, return value is not matter. return 1; // It seems, return value is not matter.
} }
@ -97,21 +94,20 @@ LONG APIENTRY cbAudioWriteEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
LONG APIENTRY cbAudioReadEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer, LONG APIENTRY cbAudioReadEvent(ULONG ulStatus, PMCI_MIX_BUFFER pBuffer,
ULONG ulFlags) ULONG ulFlags)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)pBuffer->ulUserParm; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)pBuffer->ulUserParm;
ULONG ulRC; ULONG ulRC;
if ( ulFlags != MIX_READ_COMPLETE ) if (ulFlags != MIX_READ_COMPLETE) {
{ debug_os2("flags = 0x%X", ulFlags);
debug( "flags = 0x%X", ulFlags );
return 0; return 0;
} }
pAData->stMCIMixSetup.pmixRead( pAData->stMCIMixSetup.ulMixHandle, pBuffer, pAData->stMCIMixSetup.pmixRead(pAData->stMCIMixSetup.ulMixHandle, pBuffer, 1);
1 );
ulRC = DosPostEventSem( pAData->hevBuf ); ulRC = DosPostEventSem(pAData->hevBuf);
if ( ( ulRC != NO_ERROR ) && ( ulRC != ERROR_ALREADY_POSTED ) ) if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
debug( "DosPostEventSem(), rc = %u", ulRC ); debug_os2("DosPostEventSem(), rc = %u", ulRC);
}
return 1; return 1;
} }
@ -131,138 +127,135 @@ static void OS2_DetectDevices(void)
stMCISysInfo.pszReturn = acBuf; stMCISysInfo.pszReturn = acBuf;
stMCISysInfo.ulRetSize = sizeof(acBuf); stMCISysInfo.ulRetSize = sizeof(acBuf);
stMCISysInfo.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX; stMCISysInfo.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
ulRC = mciSendCommand( 0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_QUANTITY, ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_QUANTITY,
&stMCISysInfo, 0 ); &stMCISysInfo, 0);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("MCI_SYSINFO, MCI_SYSINFO_QUANTITY - failed, rc = 0x%X", ulRC);
debug( "MCI_SYSINFO, MCI_SYSINFO_QUANTITY - failed, rc = 0x%X", ulRC );
return; return;
} }
ulDevicesNum = atol( stMCISysInfo.pszReturn ); ulDevicesNum = atol(stMCISysInfo.pszReturn);
for( stSysInfoParams.ulNumber = 0; stSysInfoParams.ulNumber < ulDevicesNum; for (stSysInfoParams.ulNumber = 0; stSysInfoParams.ulNumber < ulDevicesNum;
stSysInfoParams.ulNumber++ ) stSysInfoParams.ulNumber++) {
{ /* Get device install name. */
// Get device install name.
stSysInfoParams.pszReturn = acBuf; stSysInfoParams.pszReturn = acBuf;
stSysInfoParams.ulRetSize = sizeof( acBuf ); stSysInfoParams.ulRetSize = sizeof(acBuf);
stSysInfoParams.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX; stSysInfoParams.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
ulRC = mciSendCommand( 0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_INSTALLNAME, ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_INSTALLNAME,
&stSysInfoParams, 0 ); &stSysInfoParams, 0);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME - failed, rc = 0x%X", ulRC);
debug( "MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME - failed, rc = 0x%X", ulRC );
continue; continue;
} }
// Get textual product description. /* Get textual product description. */
stSysInfoParams.ulItem = MCI_SYSINFO_QUERY_DRIVER; stSysInfoParams.ulItem = MCI_SYSINFO_QUERY_DRIVER;
stSysInfoParams.pSysInfoParm = &stLogDevice; stSysInfoParams.pSysInfoParm = &stLogDevice;
strcpy( stLogDevice.szInstallName, stSysInfoParams.pszReturn ); strcpy(stLogDevice.szInstallName, stSysInfoParams.pszReturn);
ulRC = mciSendCommand( 0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_ITEM, ulRC = mciSendCommand(0, MCI_SYSINFO, MCI_WAIT | MCI_SYSINFO_ITEM,
&stSysInfoParams, 0 ); &stSysInfoParams, 0);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("MCI_SYSINFO, MCI_SYSINFO_ITEM - failed, rc = 0x%X", ulRC);
debug( "MCI_SYSINFO, MCI_SYSINFO_ITEM - failed, rc = 0x%X", ulRC );
continue; continue;
} }
ulHandle++; ulHandle++;
SDL_AddAudioDevice( 0, stLogDevice.szProductInfo, (void *)(ulHandle) ); SDL_AddAudioDevice(0, stLogDevice.szProductInfo, (void *)(ulHandle));
ulHandle++; ulHandle++;
SDL_AddAudioDevice( 1, stLogDevice.szProductInfo, (void *)(ulHandle) ); SDL_AddAudioDevice(1, stLogDevice.szProductInfo, (void *)(ulHandle));
} }
} }
static void OS2_WaitDevice(_THIS) static void OS2_WaitDevice(_THIS)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)this->hidden; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)this->hidden;
ULONG ulRC; ULONG ulRC;
/* Wait for an audio chunk to finish */ /* Wait for an audio chunk to finish */
ulRC = DosWaitEventSem( pAData->hevBuf, 5000 ); ulRC = DosWaitEventSem(pAData->hevBuf, 5000);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
debug( "DosWaitEventSem(), rc = %u", ulRC ); debug_os2("DosWaitEventSem(), rc = %u", ulRC);
}
} }
static Uint8 *OS2_GetDeviceBuf(_THIS) static Uint8 *OS2_GetDeviceBuf(_THIS)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)this->hidden; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)this->hidden;
return pAData->aMixBuffers[pAData->ulNextBuf].pBuffer; return pAData->aMixBuffers[pAData->ulNextBuf].pBuffer;
} }
static void OS2_PlayDevice(_THIS) static void OS2_PlayDevice(_THIS)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)this->hidden; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)this->hidden;
ULONG ulRC; ULONG ulRC;
PMCI_MIX_BUFFER pMixBuffer = &pAData->aMixBuffers[pAData->ulNextBuf]; PMCI_MIX_BUFFER pMixBuffer = &pAData->aMixBuffers[pAData->ulNextBuf];
/* Queue it up */ /* Queue it up */
// lockIncr( (int *)&pAData->ulQueuedBuf ); /*lockIncr((int *)&pAData->ulQueuedBuf);*/
ulRC = pAData->stMCIMixSetup.pmixWrite( pAData->stMCIMixSetup.ulMixHandle, ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
pMixBuffer, 1 ); pMixBuffer, 1);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
_mixIOError( "pmixWrite", ulRC ); _mixIOError("pmixWrite", ulRC);
else } else {
pAData->ulNextBuf = (pAData->ulNextBuf + 1) % pAData->cMixBuffers; pAData->ulNextBuf = (pAData->ulNextBuf + 1) % pAData->cMixBuffers;
}
} }
static void OS2_CloseDevice(_THIS) static void OS2_CloseDevice(_THIS)
{ {
PSDL_PrivateAudioData pAData = (PSDL_PrivateAudioData)this->hidden; SDL_PrivateAudioData *pAData = (SDL_PrivateAudioData *)this->hidden;
MCI_GENERIC_PARMS sMCIGenericParms; MCI_GENERIC_PARMS sMCIGenericParms;
ULONG ulRC; ULONG ulRC;
if ( pAData == NULL ) if (pAData == NULL)
return; return;
/* Close up audio */ /* Close up audio */
if ( pAData->usDeviceId != (USHORT)~0 ) if (pAData->usDeviceId != (USHORT)~0) {
{ /* Device is open. */
// Device is open. if (pAData->stMCIMixSetup.ulBitsPerSample != 0) {
if ( pAData->stMCIMixSetup.ulBitsPerSample != 0 ) /* Mixer was initialized. */
{ ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
// Mixer was initialized.
ulRC = mciSendCommand( pAData->usDeviceId, MCI_MIXSETUP,
MCI_WAIT | MCI_MIXSETUP_DEINIT, MCI_WAIT | MCI_MIXSETUP_DEINIT,
&pAData->stMCIMixSetup, 0 ); &pAData->stMCIMixSetup, 0);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
debug( "MCI_MIXSETUP, MCI_MIXSETUP_DEINIT - failed" ); debug_os2("MCI_MIXSETUP, MCI_MIXSETUP_DEINIT - failed");
}
} }
if ( pAData->cMixBuffers != 0 ) if (pAData->cMixBuffers != 0) {
{ /* Buffers was allocated. */
// Buffers was allocated.
MCI_BUFFER_PARMS stMCIBuffer; MCI_BUFFER_PARMS stMCIBuffer;
stMCIBuffer.ulBufferSize = pAData->aMixBuffers[0].ulBufferLength; stMCIBuffer.ulBufferSize = pAData->aMixBuffers[0].ulBufferLength;
stMCIBuffer.ulNumBuffers = pAData->cMixBuffers; stMCIBuffer.ulNumBuffers = pAData->cMixBuffers;
stMCIBuffer.pBufList = &pAData->aMixBuffers; stMCIBuffer.pBufList = &pAData->aMixBuffers;
ulRC = mciSendCommand( pAData->usDeviceId, MCI_BUFFER, ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
MCI_WAIT | MCI_DEALLOCATE_MEMORY, &stMCIBuffer, 0 ); MCI_WAIT | MCI_DEALLOCATE_MEMORY, &stMCIBuffer, 0);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
debug( "MCI_BUFFER, MCI_DEALLOCATE_MEMORY - failed" ); debug_os2("MCI_BUFFER, MCI_DEALLOCATE_MEMORY - failed");
}
} }
ulRC = mciSendCommand( pAData->usDeviceId, MCI_CLOSE, MCI_WAIT, ulRC = mciSendCommand(pAData->usDeviceId, MCI_CLOSE, MCI_WAIT,
&sMCIGenericParms, 0 ); &sMCIGenericParms, 0);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
debug( "MCI_CLOSE - failed" ); debug_os2("MCI_CLOSE - failed");
}
} }
if ( pAData->hevBuf != NULLHANDLE ) if (pAData->hevBuf != NULLHANDLE)
DosCloseEventSem( pAData->hevBuf ); DosCloseEventSem(pAData->hevBuf);
SDL_free( pAData ); SDL_free(pAData);
} }
static int OS2_OpenDevice(_THIS, void *handle, const char *devname, static int OS2_OpenDevice(_THIS, void *handle, const char *devname,
int iscapture) int iscapture)
{ {
PSDL_PrivateAudioData pAData; SDL_PrivateAudioData *pAData;
SDL_AudioFormat SDLAudioFmt; SDL_AudioFormat SDLAudioFmt;
MCI_AMP_OPEN_PARMS stMCIAmpOpen; MCI_AMP_OPEN_PARMS stMCIAmpOpen;
MCI_BUFFER_PARMS stMCIBuffer; MCI_BUFFER_PARMS stMCIBuffer;
@ -274,130 +267,116 @@ static int OS2_OpenDevice(_THIS, void *handle, const char *devname,
SDL_zero(stMCIAmpOpen); SDL_zero(stMCIAmpOpen);
SDL_zero(stMCIBuffer); SDL_zero(stMCIBuffer);
for( SDLAudioFmt = SDL_FirstAudioFormat( this->spec.format ); for (SDLAudioFmt = SDL_FirstAudioFormat(this->spec.format);
SDLAudioFmt != 0; SDLAudioFmt = SDL_NextAudioFormat() ) SDLAudioFmt != 0; SDLAudioFmt = SDL_NextAudioFormat()) {
{ if (SDLAudioFmt == AUDIO_U8 || SDLAudioFmt == AUDIO_S16)
if ( ( SDLAudioFmt == AUDIO_U8 ) || ( SDLAudioFmt == AUDIO_S16 ) )
break; break;
} }
if (SDLAudioFmt == 0) {
if ( SDLAudioFmt == 0 ) debug_os2("Unsupported audio format, AUDIO_S16 used");
{
debug( "Unsupported audio format, AUDIO_S16 used" );
SDLAudioFmt = AUDIO_S16; SDLAudioFmt = AUDIO_S16;
} }
pAData = SDL_calloc( 1, sizeof(SDL_PrivateAudioData) ); pAData = SDL_calloc(1, sizeof(SDL_PrivateAudioData));
if ( pAData == NULL ) if (pAData == NULL)
return SDL_OutOfMemory(); return SDL_OutOfMemory();
this->hidden = pAData; this->hidden = pAData;
ulRC = DosCreateEventSem( NULL, &pAData->hevBuf, DCE_AUTORESET, TRUE ); ulRC = DosCreateEventSem(NULL, &pAData->hevBuf, DCE_AUTORESET, TRUE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosCreateEventSem() failed, rc = %u", ulRC);
debug( "DosCreateEventSem() failed, rc = %u", ulRC );
return -1; return -1;
} }
// Open audio device /* Open audio device */
stMCIAmpOpen.usDeviceID = handle != NULL ? ( ((ULONG)handle) - 1 ) : 0; stMCIAmpOpen.usDeviceID = (handle != NULL) ? ((ULONG)handle - 1) : 0;
stMCIAmpOpen.pszDeviceType = (PSZ)MCI_DEVTYPE_AUDIO_AMPMIX; stMCIAmpOpen.pszDeviceType = (PSZ)MCI_DEVTYPE_AUDIO_AMPMIX;
ulRC = mciSendCommand( 0, MCI_OPEN, ulRC = mciSendCommand(0, MCI_OPEN,
_getEnvULong( "SDL_AUDIO_SHARE", 1, 0 ) != 0 (_getEnvULong("SDL_AUDIO_SHARE", 1, 0) != 0)?
? MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE MCI_WAIT | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE :
: MCI_WAIT | MCI_OPEN_TYPE_ID, MCI_WAIT | MCI_OPEN_TYPE_ID,
&stMCIAmpOpen, 0 ); &stMCIAmpOpen, 0);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
{
stMCIAmpOpen.usDeviceID = (USHORT)~0; stMCIAmpOpen.usDeviceID = (USHORT)~0;
return _MCIError( "MCI_OPEN", ulRC ); return _MCIError("MCI_OPEN", ulRC);
} }
pAData->usDeviceId = stMCIAmpOpen.usDeviceID; pAData->usDeviceId = stMCIAmpOpen.usDeviceID;
if ( iscapture != 0 ) if (iscapture != 0) {
{
MCI_CONNECTOR_PARMS stMCIConnector; MCI_CONNECTOR_PARMS stMCIConnector;
MCI_AMP_SET_PARMS stMCIAmpSet; MCI_AMP_SET_PARMS stMCIAmpSet;
BOOL fLineIn = _getEnvULong( "SDL_AUDIO_LINEIN", 1, 0 ); BOOL fLineIn = _getEnvULong("SDL_AUDIO_LINEIN", 1, 0);
// Set particular connector. /* Set particular connector. */
SDL_zero(stMCIConnector); SDL_zero(stMCIConnector);
stMCIConnector.ulConnectorType = fLineIn ? MCI_LINE_IN_CONNECTOR stMCIConnector.ulConnectorType = (fLineIn)? MCI_LINE_IN_CONNECTOR :
: MCI_MICROPHONE_CONNECTOR; MCI_MICROPHONE_CONNECTOR;
mciSendCommand( stMCIAmpOpen.usDeviceID, MCI_CONNECTOR, mciSendCommand(stMCIAmpOpen.usDeviceID, MCI_CONNECTOR,
MCI_WAIT | MCI_ENABLE_CONNECTOR | MCI_WAIT | MCI_ENABLE_CONNECTOR |
MCI_CONNECTOR_TYPE, &stMCIConnector, 0 ); MCI_CONNECTOR_TYPE, &stMCIConnector, 0);
// Disable monitor. /* Disable monitor. */
SDL_zero(stMCIAmpSet); SDL_zero(stMCIAmpSet);
stMCIAmpSet.ulItem = MCI_AMP_SET_MONITOR; stMCIAmpSet.ulItem = MCI_AMP_SET_MONITOR;
mciSendCommand( stMCIAmpOpen.usDeviceID, MCI_SET, mciSendCommand(stMCIAmpOpen.usDeviceID, MCI_SET,
MCI_WAIT | MCI_SET_OFF | MCI_SET_ITEM, MCI_WAIT | MCI_SET_OFF | MCI_SET_ITEM,
&stMCIAmpSet, 0 ); &stMCIAmpSet, 0);
// Set record volume. /* Set record volume. */
stMCIAmpSet.ulLevel = _getEnvULong( "SDL_AUDIO_RECVOL", 100, 90 ); stMCIAmpSet.ulLevel = _getEnvULong("SDL_AUDIO_RECVOL", 100, 90);
stMCIAmpSet.ulItem = MCI_AMP_SET_AUDIO; stMCIAmpSet.ulItem = MCI_AMP_SET_AUDIO;
stMCIAmpSet.ulAudio = MCI_SET_AUDIO_ALL; // Both cnannels. stMCIAmpSet.ulAudio = MCI_SET_AUDIO_ALL; /* Both cnannels. */
stMCIAmpSet.ulValue = fLineIn ? MCI_LINE_IN_CONNECTOR stMCIAmpSet.ulValue = (fLineIn) ? MCI_LINE_IN_CONNECTOR :
: MCI_MICROPHONE_CONNECTOR ; MCI_MICROPHONE_CONNECTOR ;
mciSendCommand( stMCIAmpOpen.usDeviceID, MCI_SET, mciSendCommand(stMCIAmpOpen.usDeviceID, MCI_SET,
MCI_WAIT | MCI_SET_AUDIO | MCI_AMP_SET_GAIN, MCI_WAIT | MCI_SET_AUDIO | MCI_AMP_SET_GAIN,
&stMCIAmpSet, 0 ); &stMCIAmpSet, 0);
} }
this->spec.format = SDLAudioFmt; this->spec.format = SDLAudioFmt;
this->spec.channels = this->spec.channels > 1 ? 2 : 1; this->spec.channels = this->spec.channels > 1 ? 2 : 1;
if ( this->spec.freq < 8000 ) if (this->spec.freq < 8000) {
{
this->spec.freq = 8000; this->spec.freq = 8000;
new_freq = TRUE; new_freq = TRUE;
} } else if (this->spec.freq > 48000) {
else if ( this->spec.freq > 48000 )
{
this->spec.freq = 48000; this->spec.freq = 48000;
new_freq = TRUE; new_freq = TRUE;
} }
// Setup mixer. /* Setup mixer. */
pAData->stMCIMixSetup.ulFormatTag = MCI_WAVE_FORMAT_PCM; pAData->stMCIMixSetup.ulFormatTag = MCI_WAVE_FORMAT_PCM;
pAData->stMCIMixSetup.ulBitsPerSample = SDL_AUDIO_BITSIZE( SDLAudioFmt ); pAData->stMCIMixSetup.ulBitsPerSample = SDL_AUDIO_BITSIZE(SDLAudioFmt);
pAData->stMCIMixSetup.ulSamplesPerSec = this->spec.freq; pAData->stMCIMixSetup.ulSamplesPerSec = this->spec.freq;
pAData->stMCIMixSetup.ulChannels = this->spec.channels; pAData->stMCIMixSetup.ulChannels = this->spec.channels;
pAData->stMCIMixSetup.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO; pAData->stMCIMixSetup.ulDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
if ( iscapture == 0 ) if (iscapture == 0) {
{ pAData->stMCIMixSetup.ulFormatMode= MCI_PLAY;
pAData->stMCIMixSetup.ulFormatMode = MCI_PLAY;
pAData->stMCIMixSetup.pmixEvent = cbAudioWriteEvent; pAData->stMCIMixSetup.pmixEvent = cbAudioWriteEvent;
} } else {
else pAData->stMCIMixSetup.ulFormatMode= MCI_RECORD;
{
pAData->stMCIMixSetup.ulFormatMode = MCI_RECORD;
pAData->stMCIMixSetup.pmixEvent = cbAudioReadEvent; pAData->stMCIMixSetup.pmixEvent = cbAudioReadEvent;
} }
ulRC = mciSendCommand( pAData->usDeviceId, MCI_MIXSETUP, ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0 ); MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
if ( ( ulRC != MCIERR_SUCCESS ) && ( this->spec.freq > 44100 ) ) if (ulRC != MCIERR_SUCCESS && this->spec.freq > 44100) {
{
new_freq = TRUE; new_freq = TRUE;
pAData->stMCIMixSetup.ulSamplesPerSec = 44100; pAData->stMCIMixSetup.ulSamplesPerSec = 44100;
this->spec.freq = 44100; this->spec.freq = 44100;
ulRC = mciSendCommand( pAData->usDeviceId, MCI_MIXSETUP, ulRC = mciSendCommand(pAData->usDeviceId, MCI_MIXSETUP,
MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0 ); MCI_WAIT | MCI_MIXSETUP_INIT, &pAData->stMCIMixSetup, 0);
} }
debug( "Setup mixer [BPS: %u, Freq.: %u, Channels: %u]: %s", debug_os2("Setup mixer [BPS: %u, Freq.: %u, Channels: %u]: %s",
pAData->stMCIMixSetup.ulBitsPerSample, pAData->stMCIMixSetup.ulBitsPerSample,
pAData->stMCIMixSetup.ulSamplesPerSec, pAData->stMCIMixSetup.ulSamplesPerSec,
pAData->stMCIMixSetup.ulChannels, pAData->stMCIMixSetup.ulChannels,
ulRC == MCIERR_SUCCESS ? "SUCCESS" : "FAIL" ); (ulRC == MCIERR_SUCCESS)? "SUCCESS" : "FAIL");
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
{
pAData->stMCIMixSetup.ulBitsPerSample = 0; pAData->stMCIMixSetup.ulBitsPerSample = 0;
return _MCIError( "MCI_MIXSETUP", ulRC ); return _MCIError("MCI_MIXSETUP", ulRC);
} }
if (this->spec.samples == 0 || new_freq == TRUE) { if (this->spec.samples == 0 || new_freq == TRUE) {
@ -411,43 +390,38 @@ static int OS2_OpenDevice(_THIS, void *handle, const char *devname,
this->spec.samples = power2; this->spec.samples = power2;
} }
/* Update the fragment size as size in bytes */ /* Update the fragment size as size in bytes */
SDL_CalculateAudioSpec( &this->spec ); SDL_CalculateAudioSpec(&this->spec);
// Allocate memory buffers /* Allocate memory buffers */
stMCIBuffer.ulBufferSize = this->spec.size;/* (this->spec.freq / 1000) * 100 */
stMCIBuffer.ulBufferSize = this->spec.size;// (this->spec.freq / 1000) * 100;
stMCIBuffer.ulNumBuffers = NUM_BUFFERS; stMCIBuffer.ulNumBuffers = NUM_BUFFERS;
stMCIBuffer.pBufList = &pAData->aMixBuffers; stMCIBuffer.pBufList = &pAData->aMixBuffers;
ulRC = mciSendCommand( pAData->usDeviceId, MCI_BUFFER, ulRC = mciSendCommand(pAData->usDeviceId, MCI_BUFFER,
MCI_WAIT | MCI_ALLOCATE_MEMORY, &stMCIBuffer, 0 ); MCI_WAIT | MCI_ALLOCATE_MEMORY, &stMCIBuffer, 0);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
{ return _MCIError("MCI_BUFFER", ulRC);
return _MCIError( "MCI_BUFFER", ulRC );
} }
pAData->cMixBuffers = stMCIBuffer.ulNumBuffers; pAData->cMixBuffers = stMCIBuffer.ulNumBuffers;
this->spec.size = stMCIBuffer.ulBufferSize; this->spec.size = stMCIBuffer.ulBufferSize;
// Fill all device buffers with data /* Fill all device buffers with data */
for (ulIdx = 0; ulIdx < stMCIBuffer.ulNumBuffers; ulIdx++) {
for( ulIdx = 0; ulIdx < stMCIBuffer.ulNumBuffers; ulIdx++ )
{
pAData->aMixBuffers[ulIdx].ulFlags = 0; pAData->aMixBuffers[ulIdx].ulFlags = 0;
pAData->aMixBuffers[ulIdx].ulBufferLength = stMCIBuffer.ulBufferSize; pAData->aMixBuffers[ulIdx].ulBufferLength = stMCIBuffer.ulBufferSize;
pAData->aMixBuffers[ulIdx].ulUserParm = (ULONG)pAData; pAData->aMixBuffers[ulIdx].ulUserParm = (ULONG)pAData;
memset( ((PMCI_MIX_BUFFER)stMCIBuffer.pBufList)[ulIdx].pBuffer, memset(((PMCI_MIX_BUFFER)stMCIBuffer.pBufList)[ulIdx].pBuffer,
this->spec.silence, stMCIBuffer.ulBufferSize ); this->spec.silence, stMCIBuffer.ulBufferSize);
} }
// Write buffers to kick off the amp mixer /* Write buffers to kick off the amp mixer */
// pAData->ulQueuedBuf = 1;//stMCIBuffer.ulNumBuffers; /*pAData->ulQueuedBuf = 1;//stMCIBuffer.ulNumBuffers;*/
ulRC = pAData->stMCIMixSetup.pmixWrite( pAData->stMCIMixSetup.ulMixHandle, ulRC = pAData->stMCIMixSetup.pmixWrite(pAData->stMCIMixSetup.ulMixHandle,
&pAData->aMixBuffers, &pAData->aMixBuffers,
1 );//stMCIBuffer.ulNumBuffers ); 1 /*stMCIBuffer.ulNumBuffers*/);
if ( ulRC != MCIERR_SUCCESS ) if (ulRC != MCIERR_SUCCESS) {
{ _mixIOError("pmixWrite", ulRC);
_mixIOError( "pmixWrite", ulRC );
return -1; return -1;
} }
@ -465,11 +439,11 @@ static int OS2_Init(SDL_AudioDriverImpl * impl)
impl->GetDeviceBuf = OS2_GetDeviceBuf; impl->GetDeviceBuf = OS2_GetDeviceBuf;
impl->CloseDevice = OS2_CloseDevice; impl->CloseDevice = OS2_CloseDevice;
// TODO: IMPLEMENT CAPTURE SUPPORT: /* TODO: IMPLEMENT CAPTURE SUPPORT:
// impl->CaptureFromDevice = ; impl->CaptureFromDevice = ;
// impl->FlushCapture = ; impl->FlushCapture = ;
// impl->HasCaptureSupport = SDL_TRUE; impl->HasCaptureSupport = SDL_TRUE;
*/
return 1; /* this audio target is available. */ return 1; /* this audio target is available. */
} }

View File

@ -46,8 +46,8 @@ typedef struct SDL_PrivateAudioData
ULONG ulNextBuf; ULONG ulNextBuf;
ULONG cMixBuffers; ULONG cMixBuffers;
MCI_MIX_BUFFER aMixBuffers[NUM_BUFFERS]; MCI_MIX_BUFFER aMixBuffers[NUM_BUFFERS];
// ULONG ulQueuedBuf; /* ULONG ulQueuedBuf;*/
} SDL_PrivateAudioData, *PSDL_PrivateAudioData; } SDL_PrivateAudioData;
#endif /* SDL_os2mm_h_ */ #endif /* SDL_os2mm_h_ */

View File

@ -18,19 +18,21 @@
misrepresented as being the original software. misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#include "../../SDL_internal.h" #include "../../SDL_internal.h"
#if defined(__OS2__) #if defined(__OS2__)
#include "geniconv/geniconv.h" #include "geniconv/geniconv.h"
// SDL_OS2Quit() will be called from SDL_QuitSubSystem(). /* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */
void SDL_OS2Quit(void)
void SDL_OS2Quit()
{ {
// Unload DLL used for iconv. We can do it at any time and use iconv again - /* Unload DLL used for iconv. We can do it at any time and use iconv again -
// dynamic library will be loaded on first call iconv_open() (see geniconv). * dynamic library will be loaded on first call iconv_open() (see geniconv). */
libiconv_clean(); libiconv_clean();
} }
#endif #endif
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -27,24 +27,26 @@
#ifdef OS2DEBUG #ifdef OS2DEBUG
#if (OS2DEBUG-0 >= 2) #if (OS2DEBUG-0 >= 2)
# define debug(s,...) SDL_LogDebug( SDL_LOG_CATEGORY_APPLICATION, \ # define debug_os2(s,...) SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, \
__func__"(): "##s, ##__VA_ARGS__ ) __func__ "(): " ##s, ##__VA_ARGS__)
#else #else
# define debug(s,...) printf( __func__"(): "##s"\n", ##__VA_ARGS__ ) # define debug_os2(s,...) printf(__func__ "(): " ##s "\n", ##__VA_ARGS__)
#endif #endif
#else #else /* no debug */
# define debug(s,...) # define debug_os2(s,...) do {} while (0)
#endif /* OS2DEBUG */ #endif /* OS2DEBUG */
/* StrUTF8New() - geniconv/sys2utf8.c */ /* StrUTF8New() - geniconv/sys2utf8.c */
#define OS2_SysToUTF8(S) StrUTF8New( 1, S, SDL_strlen( S ) + 1 ) #define OS2_SysToUTF8(S) StrUTF8New(1, (S), SDL_strlen((S)) + 1)
#define OS2_UTF8ToSys(S) StrUTF8New( 0, (char *)(S), SDL_strlen( S ) + 1 ) #define OS2_UTF8ToSys(S) StrUTF8New(0, (char *)(S), SDL_strlen((S)) + 1)
/* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */ /* SDL_OS2Quit() will be called from SDL_QuitSubSystem() */
void SDL_OS2Quit(); void SDL_OS2Quit(void);
#endif /* SDL_os2_h_ */ #endif /* SDL_os2_h_ */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -31,32 +31,32 @@
#include "geniconv.h" #include "geniconv.h"
//#define DEBUG /*#define DEBUG*/
#ifdef DEBUG #ifdef DEBUG
# include <stdio.h> # include <stdio.h>
# define debug(s,...) printf(__func__"(): "##s"\n" ,##__VA_ARGS__) # define debug(s,...) printf(__func__"(): "##s"\n" ,##__VA_ARGS__)
#else #else
# define debug(s,...) # define debug(s,...) do {} while (0)
#endif #endif
// Exports from os2iconv.c. /* Exports from os2iconv.c */
extern iconv_t _System os2_iconv_open(const char* tocode, const char* fromcode); extern iconv_t _System os2_iconv_open(const char* tocode, const char* fromcode);
extern size_t _System os2_iconv(iconv_t cd, char* * inbuf, extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
size_t *inbytesleft, char* * outbuf, size_t *inbytesleft, char* * outbuf,
size_t *outbytesleft); size_t *outbytesleft);
extern int _System os2_iconv_close(iconv_t cd); extern int _System os2_iconv_close(iconv_t cd);
// Functions pointers types. /* Functions pointers types */
typedef iconv_t _System (*FNICONV_OPEN)(const char* tocode, const char* fromcode); typedef iconv_t _System (*FNICONV_OPEN)(const char* tocode, const char* fromcode);
typedef size_t _System (*FNICONV)(iconv_t cd, char* * inbuf, typedef size_t _System (*FNICONV)(iconv_t cd, char* * inbuf,
size_t *inbytesleft, char* * outbuf, size_t *inbytesleft, char* * outbuf,
size_t *outbytesleft); size_t *outbytesleft);
typedef int _System (*FNICONV_CLOSE)(iconv_t cd); typedef int _System (*FNICONV_CLOSE)(iconv_t cd);
// Used DLL module handle. /* Used DLL module handle */
static HMODULE hmIconv = NULLHANDLE; static HMODULE hmIconv = NULLHANDLE;
// Functions pointers. /* Functions pointers */
static FNICONV_OPEN fn_iconv_open = NULL; static FNICONV_OPEN fn_iconv_open = NULL;
static FNICONV fn_iconv = NULL; static FNICONV fn_iconv = NULL;
static FNICONV_CLOSE fn_iconv_close = NULL; static FNICONV_CLOSE fn_iconv_close = NULL;
@ -68,60 +68,51 @@ static BOOL _loadDLL(PSZ pszName, PSZ pszIconvOpen, PSZ pszIconv,
ULONG ulRC; ULONG ulRC;
CHAR acError[256]; CHAR acError[256];
ulRC = DosLoadModule( acError, sizeof(acError), pszName, &hmIconv ); ulRC = DosLoadModule(acError, sizeof(acError), pszName, &hmIconv);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug("DLL not loaded: %s", &acError);
debug( "DLL not loaded: %s", &acError );
return FALSE; return FALSE;
} }
do do {
{ ulRC = DosQueryProcAddr(hmIconv, 0, pszIconvOpen, (PFN *)&fn_iconv_open);
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconvOpen, (PFN *)&fn_iconv_open ); if (ulRC != NO_ERROR) {
if ( ulRC != NO_ERROR ) debug("Error: cannot find entry %s in %s", pszIconvOpen, pszName);
{
debug( "Error: cannot find entry %s in %s", pszIconvOpen, pszName );
break; break;
} }
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconv, (PFN *)&fn_iconv ); ulRC = DosQueryProcAddr(hmIconv, 0, pszIconv, (PFN *)&fn_iconv);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug("Error: cannot find entry %s in %s", pszIconv, pszName);
debug( "Error: cannot find entry %s in %s", pszIconv, pszName );
break; break;
} }
ulRC = DosQueryProcAddr( hmIconv, 0, pszIconvClose, (PFN *)&fn_iconv_close ); ulRC = DosQueryProcAddr(hmIconv, 0, pszIconvClose, (PFN *)&fn_iconv_close);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug("Error: cannot find entry %s in %s", pszIconvClose, pszName);
debug( "Error: cannot find entry %s in %s", pszIconvClose, pszName );
break; break;
} }
debug( "DLL %s used", pszName ); debug("DLL %s used", pszName);
return TRUE; return TRUE;
} } while (FALSE);
while( FALSE );
DosFreeModule( hmIconv ); DosFreeModule(hmIconv);
hmIconv = NULLHANDLE; hmIconv = NULLHANDLE;
return FALSE; return FALSE;
} }
static void _init() static void _init(void)
{ {
if ( fn_iconv_open != NULL ) if (fn_iconv_open != NULL) /* Already was initialized */
// Already was initialized.
return; return;
// Try to load kiconv.dll, iconv2.dll or iconv.dll. /* Try to load kiconv.dll, iconv2.dll or iconv.dll */
if ( !_loadDLL( "KICONV", "_libiconv_open", "_libiconv", "_libiconv_close" ) if (!_loadDLL("KICONV", "_libiconv_open", "_libiconv", "_libiconv_close") &&
&& !_loadDLL( "ICONV2", "_libiconv_open", "_libiconv", "_libiconv_close" ) !_loadDLL("ICONV2", "_libiconv_open", "_libiconv", "_libiconv_close") &&
&& !_loadDLL( "ICONV", "_iconv_open", "_iconv", "_iconv_close" ) ) !_loadDLL("ICONV", "_iconv_open", "_iconv", "_iconv_close") ) {
{ /* No DLL was loaded - use OS/2 conversion objects API */
// No one DLL was loaded - use OS/2 conversion objects API. debug("Uni*() API used");
debug( "Uni*() API used" );
fn_iconv_open = os2_iconv_open; fn_iconv_open = os2_iconv_open;
fn_iconv = os2_iconv; fn_iconv = os2_iconv;
fn_iconv_close = os2_iconv_close; fn_iconv_close = os2_iconv_close;
@ -129,15 +120,15 @@ static void _init()
} }
// Public routines. /* Public routines.
// ---------------- * ----------------
*/
// Non-standard function for iconv to unload the used dynamic library. /* Non-standard function for iconv to unload the used dynamic library */
void libiconv_clean() void libiconv_clean(void)
{ {
if ( hmIconv != NULLHANDLE ) if (hmIconv != NULLHANDLE) {
{ DosFreeModule(hmIconv);
DosFreeModule( hmIconv );
hmIconv = NULLHANDLE; hmIconv = NULLHANDLE;
fn_iconv_open = NULL; fn_iconv_open = NULL;
@ -149,16 +140,18 @@ void libiconv_clean()
iconv_t libiconv_open(const char* tocode, const char* fromcode) iconv_t libiconv_open(const char* tocode, const char* fromcode)
{ {
_init(); _init();
return fn_iconv_open( tocode, fromcode ); return fn_iconv_open(tocode, fromcode);
} }
size_t libiconv(iconv_t cd, char* * inbuf, size_t *inbytesleft, size_t libiconv(iconv_t cd, char* * inbuf, size_t *inbytesleft,
char* * outbuf, size_t *outbytesleft) char* * outbuf, size_t *outbytesleft)
{ {
return fn_iconv( cd, inbuf, inbytesleft, outbuf, outbytesleft ); return fn_iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft);
} }
int libiconv_close(iconv_t cd) int libiconv_close(iconv_t cd)
{ {
return fn_iconv_close( cd ); return fn_iconv_close(cd);
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -47,34 +47,39 @@
#define iconv_clean libiconv_clean #define iconv_clean libiconv_clean
// Non-standard function for iconv to unload the used dynamic library. /* Non-standard function for iconv to unload the used dynamic library */
void libiconv_clean(); void libiconv_clean(void);
iconv_t libiconv_open(const char* tocode, const char* fromcode); iconv_t libiconv_open (const char *tocode, const char *fromcode);
size_t libiconv(iconv_t cd, char* * inbuf, size_t *inbytesleft,
char* * outbuf, size_t *outbytesleft);
int libiconv_close(iconv_t cd); int libiconv_close(iconv_t cd);
size_t libiconv (iconv_t cd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
// System codepage <-> UTF-8. /* System codepage <-> UTF-8
*
// StrUTF8() * StrUTF8()
// Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to * Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
// the system cp (fToUTF8 is 0). Converted ASCIIZ string will be placed at the * the system cp (fToUTF8 is 0). Converted ASCIIZ string will be placed at the
// buffer pcDst, up to cbDst - 1 (for sys->utf8) or 2 (for utf8->sys) bytes. * buffer pcDst, up to cbDst - 1 (for sys->utf8) or 2 (for utf8->sys) bytes.
// Returns the number of bytes written into pcDst, not counting the terminating * Returns the number of bytes written into pcDst, not counting the terminating
// 0 byte(s) or -1 on error. * 0 byte(s) or -1 on error.
*/
int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc); int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc);
// StrUTF8New() /* StrUTF8New()
// Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to * Coverts string from system cp to UTF-8 (fToUTF8 is not 0) or from UTF-8 to
// the system cp (fToUTF8 is 0). Memory for the new string is obtained by * the system cp (fToUTF8 is 0). Memory for the new string is obtained by
// using libc malloc(). * using libc malloc().
// Returns converted string, terminating two bytes 0 is appended to the result. * Returns converted string, terminating two bytes 0 is appended to the result.
// Returns null on error. * Returns null on error.
*/
char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr); char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr);
// StrUTF8Free() /* StrUTF8Free()
// Deallocates the memory block located by StrUTF8New() (just libc free()). * Deallocates the memory block located by StrUTF8New() (just libc free()).
*/
void StrUTF8Free(char *pszStr); void StrUTF8Free(char *pszStr);
#endif // GENICONV_H #endif /* GENICONV_H */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -37,8 +37,7 @@ typedef struct _NAME2CP {
ULONG ulCode; ULONG ulCode;
} NAME2CP; } NAME2CP;
static CP2NAME aCP2Name[] = static CP2NAME aCP2Name[] = {
{
{367, "ANSI_X3.4-1968"}, {367, "ANSI_X3.4-1968"},
{813, "ECMA-118"}, {813, "ECMA-118"},
{819, "CP819"}, {819, "CP819"},
@ -85,8 +84,7 @@ static CP2NAME aCP2Name[] =
{62210, "HEBREW"} {62210, "HEBREW"}
}; };
static NAME2CP aName2CP[] = static NAME2CP aName2CP[] = {
{
{"850", 850}, {"850", 850},
{"862", 862}, {"862", 862},
{"866", 866}, {"866", 866},
@ -297,109 +295,107 @@ static NAME2CP aName2CP[] =
{"X0201", 896} {"X0201", 896}
}; };
char * os2cpToName(unsigned long cp) char *os2cpToName(unsigned long cp)
{ {
ULONG ulLo = 0; ULONG ulLo = 0;
ULONG ulHi = ( sizeof(aCP2Name) / sizeof(struct _CP2NAME) ) - 1; ULONG ulHi = (sizeof(aCP2Name) / sizeof(struct _CP2NAME)) - 1;
ULONG ulNext; ULONG ulNext;
LONG lFound = -1; LONG lFound = -1;
if ( cp == SYSTEM_CP ) if (cp == SYSTEM_CP) {
{
ULONG aulCP[3]; ULONG aulCP[3];
ULONG cCP; ULONG cCP;
if ( DosQueryCp( sizeof(aulCP), aulCP, &cCP ) != NO_ERROR ) if (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR)
return NULL; return NULL;
cp = aulCP[0]; cp = aulCP[0];
} }
if ( ( aCP2Name[0].ulCode > cp ) || ( aCP2Name[ulHi].ulCode < cp ) ) if (aCP2Name[0].ulCode > cp || aCP2Name[ulHi].ulCode < cp)
return NULL; return NULL;
if ( aCP2Name[0].ulCode == cp ) if (aCP2Name[0].ulCode == cp)
return aCP2Name[0].pszName; return aCP2Name[0].pszName;
if ( aCP2Name[ulHi].ulCode == cp ) if (aCP2Name[ulHi].ulCode == cp)
return aCP2Name[ulHi].pszName; return aCP2Name[ulHi].pszName;
while( ( ulHi - ulLo ) > 1 ) while ((ulHi - ulLo) > 1) {
{ ulNext = (ulLo + ulHi) / 2;
ulNext = ( ulLo + ulHi ) / 2;
if ( aCP2Name[ulNext].ulCode < cp ) if (aCP2Name[ulNext].ulCode < cp)
ulLo = ulNext; ulLo = ulNext;
else if ( aCP2Name[ulNext].ulCode > cp ) else if (aCP2Name[ulNext].ulCode > cp)
ulHi = ulNext; ulHi = ulNext;
else else {
{
lFound = ulNext; lFound = ulNext;
break; break;
} }
} }
return lFound == -1 ? NULL : aCP2Name[lFound].pszName; return (lFound == -1)? NULL : aCP2Name[lFound].pszName;
} }
unsigned long os2cpFromName(char *cp) unsigned long os2cpFromName(char *cp)
{ {
ULONG ulLo = 0; ULONG ulLo = 0;
ULONG ulHi = ( sizeof(aName2CP) / sizeof(struct _NAME2CP) ) - 1; ULONG ulHi = (sizeof(aName2CP) / sizeof(struct _NAME2CP)) - 1;
ULONG ulNext; ULONG ulNext;
LONG lFound = -1; LONG lFound = -1;
LONG lCmp; LONG lCmp;
PCHAR pcEnd; PCHAR pcEnd;
CHAR acBuf[64]; CHAR acBuf[64];
if ( cp == NULL ) if (cp == NULL) {
{
ULONG aulCP[3]; ULONG aulCP[3];
ULONG cCP; ULONG cCP;
return DosQueryCp( sizeof(aulCP), aulCP, &cCP ) != NO_ERROR ? 0 : aulCP[0]; return (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR)? 0 : aulCP[0];
} }
while( isspace( *cp ) ) cp++; while (isspace(*cp))
pcEnd = strchr( cp, ' ' ); cp++;
if ( pcEnd == NULL )
pcEnd = strchr( cp, '\0' ); pcEnd = strchr(cp, ' ');
if (pcEnd == NULL)
pcEnd = strchr(cp, '\0');
ulNext = pcEnd - cp; ulNext = pcEnd - cp;
if ( ulNext >= sizeof(acBuf) ) if (ulNext >= sizeof(acBuf))
return 0; return 0;
memcpy( acBuf, cp, ulNext ); memcpy(acBuf, cp, ulNext);
acBuf[ulNext] = '\0'; acBuf[ulNext] = '\0';
strupr( acBuf ); strupr(acBuf);
lCmp = strcmp( aName2CP[0].pszName, acBuf ); lCmp = strcmp(aName2CP[0].pszName, acBuf);
if ( lCmp > 0 ) if (lCmp > 0)
return 0; return 0;
else if ( lCmp == 0 ) else if (lCmp == 0)
return aName2CP[0].ulCode; return aName2CP[0].ulCode;
lCmp = strcmp( aName2CP[ulHi].pszName, acBuf ); lCmp = strcmp(aName2CP[ulHi].pszName, acBuf);
if ( lCmp < 0 ) if (lCmp < 0)
return 0; return 0;
else if ( lCmp == 0 ) else if (lCmp == 0)
return aName2CP[ulHi].ulCode; return aName2CP[ulHi].ulCode;
while( ( ulHi - ulLo ) > 1 ) while ((ulHi - ulLo) > 1) {
{ ulNext = (ulLo + ulHi) / 2;
ulNext = ( ulLo + ulHi ) / 2;
lCmp = strcmp( aName2CP[ulNext].pszName, acBuf ); lCmp = strcmp(aName2CP[ulNext].pszName, acBuf);
if ( lCmp < 0 ) if (lCmp < 0)
ulLo = ulNext; ulLo = ulNext;
else if ( lCmp > 0 ) else if (lCmp > 0)
ulHi = ulNext; ulHi = ulNext;
else else {
{
lFound = ulNext; lFound = ulNext;
break; break;
} }
} }
return lFound == -1 ? 0 : aName2CP[lFound].ulCode; return (lFound == -1)? 0 : aName2CP[lFound].ulCode;
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -24,7 +24,9 @@
#define SYSTEM_CP 0 #define SYSTEM_CP 0
char * os2cpToName(unsigned long cp); char *os2cpToName(unsigned long cp);
unsigned long os2cpFromName(char *cp); unsigned long os2cpFromName(char *cp);
#endif // OS2CP_H #endif /* OS2CP_H */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -58,39 +58,36 @@ static int _createUconvObj(const char *code, UconvObject *uobj)
int i; int i;
const char *ch = code; const char *ch = code;
if ( code == NULL ) if (code == NULL)
uc_code[0] = 0; uc_code[0] = 0;
else else {
{ for (i = 0; i < MAX_CP_NAME_LEN; i++) {
for( i = 0; i < MAX_CP_NAME_LEN; i++ )
{
uc_code[i] = (unsigned short)*ch; uc_code[i] = (unsigned short)*ch;
if ( !(*ch) ) break; if (! (*ch))
break;
ch++; ch++;
} }
} }
return UniCreateUconvObject( uc_code, uobj ); return UniCreateUconvObject(uc_code, uobj);
} }
static int uconv_open(const char *code, UconvObject *uobj) static int uconv_open(const char *code, UconvObject *uobj)
{ {
int rc; int rc;
if ( !stricmp( code, "UTF-16" ) ) if (!stricmp(code, "UTF-16")) {
{
*uobj = NULL; *uobj = NULL;
return ULS_SUCCESS; return ULS_SUCCESS;
} }
rc = _createUconvObj( code, uobj ); rc = _createUconvObj(code, uobj);
if ( rc != ULS_SUCCESS ) if (rc != ULS_SUCCESS) {
{ unsigned long cp = os2cpFromName((char *)code);
unsigned long cp = os2cpFromName( (char *)code );
char cp_name[16]; char cp_name[16];
if ( cp != 0 && _snprintf( cp_name, sizeof(cp_name), "IBM-%u", cp ) > 0 ) if (cp != 0 && _snprintf(cp_name, sizeof(cp_name), "IBM-%u", cp) > 0)
rc = _createUconvObj( cp_name, uobj ); rc = _createUconvObj(cp_name, uobj);
} }
return rc; return rc;
@ -104,41 +101,37 @@ extern iconv_t _System os2_iconv_open(const char* tocode, const char* fromcode)
int rc; int rc;
iuconv_obj *iuobj; iuconv_obj *iuobj;
if ( tocode == NULL ) if (tocode == NULL)
tocode = ""; tocode = "";
if ( fromcode == NULL ) if (fromcode == NULL)
fromcode = ""; fromcode = "";
if ( stricmp(tocode, fromcode) != 0 ) if (stricmp(tocode, fromcode) != 0) {
{ rc = uconv_open(fromcode, &uo_fromcode);
rc = uconv_open( fromcode, &uo_fromcode ); if (rc != ULS_SUCCESS) {
if ( rc != ULS_SUCCESS )
{
errno = EINVAL; errno = EINVAL;
return (iconv_t)(-1); return (iconv_t)(-1);
} }
rc = uconv_open( tocode, &uo_tocode ); rc = uconv_open(tocode, &uo_tocode);
if ( rc != ULS_SUCCESS ) if (rc != ULS_SUCCESS) {
{ UniFreeUconvObject(uo_fromcode);
UniFreeUconvObject( uo_fromcode );
errno = EINVAL; errno = EINVAL;
return (iconv_t)(-1); return (iconv_t)(-1);
} }
} } else {
else {
uo_tocode = NULL; uo_tocode = NULL;
uo_fromcode = NULL; uo_fromcode = NULL;
} }
iuobj = malloc( sizeof(iuconv_obj) ); iuobj = malloc(sizeof(iuconv_obj));
iuobj->uo_tocode = uo_tocode; iuobj->uo_tocode = uo_tocode;
iuobj->uo_fromcode = uo_fromcode; iuobj->uo_fromcode = uo_fromcode;
iuobj->buf_len = 0; iuobj->buf_len = 0;
iuobj->buf = NULL; iuobj->buf = NULL;
#ifdef ICONV_THREAD_SAFE #ifdef ICONV_THREAD_SAFE
DosCreateMutexSem( NULL, &iuobj->hMtx, 0, FALSE ); DosCreateMutexSem(NULL, &iuobj->hMtx, 0, FALSE);
#endif #endif
return iuobj; return iuobj;
@ -158,10 +151,9 @@ extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
int rc; int rc;
size_t ret = (size_t)(-1); size_t ret = (size_t)(-1);
if ( uo_tocode == NULL && uo_fromcode == NULL ) if (uo_tocode == NULL && uo_fromcode == NULL) {
{ uc_buf_len = min(*inbytesleft, *outbytesleft);
uc_buf_len = min( *inbytesleft, *outbytesleft ); memcpy(*outbuf, *inbuf, uc_buf_len);
memcpy( *outbuf, *inbuf, uc_buf_len );
*inbytesleft -= uc_buf_len; *inbytesleft -= uc_buf_len;
*outbytesleft -= uc_buf_len; *outbytesleft -= uc_buf_len;
outbuf += uc_buf_len; outbuf += uc_buf_len;
@ -170,70 +162,59 @@ extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
} }
#ifdef ICONV_THREAD_SAFE #ifdef ICONV_THREAD_SAFE
DosRequestMutexSem( ((iuconv_obj *)(cd))->hMtx, SEM_INDEFINITE_WAIT ); DosRequestMutexSem(((iuconv_obj *)(cd))->hMtx, SEM_INDEFINITE_WAIT);
#endif #endif
if ( uo_tocode && uo_fromcode && if (uo_tocode && uo_fromcode &&
(( ((iuconv_obj *)(cd))->buf_len >> 1 ) < (*inbytesleft)) ) (((iuconv_obj *)cd)->buf_len >> 1) < *inbytesleft) {
{ if (((iuconv_obj *)cd)->buf != NULL)
if ( ( ((iuconv_obj *)(cd))->buf ) != NULL ) free(((iuconv_obj *)cd)->buf);
free( ((iuconv_obj *)(cd))->buf ); ((iuconv_obj *)cd)->buf_len = *inbytesleft << 1;
((iuconv_obj *)(cd))->buf_len = *inbytesleft << 1; ((iuconv_obj *)cd)->buf = (UniChar *)malloc(((iuconv_obj *)cd)->buf_len);
((iuconv_obj *)(cd))->buf = (UniChar *)malloc( ((iuconv_obj *)(cd))->buf_len );
} }
if ( uo_fromcode ) if (uo_fromcode) {
{ if (uo_tocode) {
if ( uo_tocode ) uc_buf = ((iuconv_obj *)cd)->buf;
{ uc_buf_len = ((iuconv_obj *)cd)->buf_len;
uc_buf = ((iuconv_obj *)(cd))->buf;
uc_buf_len = ((iuconv_obj *)(cd))->buf_len;
uc_str = &uc_buf; uc_str = &uc_buf;
} } else {
else {
uc_str = (UniChar **)outbuf; uc_str = (UniChar **)outbuf;
uc_buf_len = *outbytesleft; uc_buf_len = *outbytesleft;
} }
uc_buf_len = uc_buf_len >> 1; uc_buf_len = uc_buf_len >> 1;
uc_str_len = &uc_buf_len; uc_str_len = &uc_buf_len;
rc = UniUconvToUcs( uo_fromcode, (void **)inbuf, inbytesleft, rc = UniUconvToUcs(uo_fromcode, (void **)inbuf, inbytesleft,
uc_str, uc_str_len, &nonIdenticalConv ); uc_str, uc_str_len, &nonIdenticalConv);
uc_buf_len = uc_buf_len << 1; uc_buf_len = uc_buf_len << 1;
if ( !uo_tocode ) if (!uo_tocode)
*outbytesleft = uc_buf_len; *outbytesleft = uc_buf_len;
if ( rc != ULS_SUCCESS ) if (rc != ULS_SUCCESS) {
{
errno = EILSEQ; errno = EILSEQ;
goto done; goto done;
} } else if (*inbytesleft && !*uc_str_len) {
else
if ( *inbytesleft && !*uc_str_len )
{
errno = E2BIG; errno = E2BIG;
goto done; goto done;
} }
if ( !uo_tocode ) if (!uo_tocode)
return nonIdenticalConv; return nonIdenticalConv;
uc_buf = ((iuconv_obj *)(cd))->buf; uc_buf = ((iuconv_obj *)cd)->buf;
uc_buf_len = ((iuconv_obj *)(cd))->buf_len - uc_buf_len; uc_buf_len = ((iuconv_obj *)cd)->buf_len - uc_buf_len;
uc_str = &uc_buf; uc_str = &uc_buf;
uc_str_len = &uc_buf_len; uc_str_len = &uc_buf_len;
} } else {
else {
uc_str = (UniChar **)inbuf; uc_str = (UniChar **)inbuf;
uc_str_len = inbytesleft; uc_str_len = inbytesleft;
} }
*uc_str_len = *uc_str_len>>1; *uc_str_len = *uc_str_len>>1;
rc = UniUconvFromUcs( uo_tocode, uc_str, uc_str_len, (void **)outbuf, rc = UniUconvFromUcs(uo_tocode, uc_str, uc_str_len, (void **)outbuf,
outbytesleft, &nonIdenticalConv ); outbytesleft, &nonIdenticalConv);
if ( rc != ULS_SUCCESS ) if (rc != ULS_SUCCESS) {
{ switch (rc) {
switch ( rc )
{
case ULS_BUFFERFULL: case ULS_BUFFERFULL:
errno = E2BIG; errno = E2BIG;
break; break;
@ -245,10 +226,7 @@ extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
break; break;
} }
goto done; goto done;
} } else if (*uc_str_len && !*outbytesleft) {
else
if ( *uc_str_len && !*outbytesleft )
{
errno = E2BIG; errno = E2BIG;
goto done; goto done;
} }
@ -258,28 +236,29 @@ extern size_t _System os2_iconv(iconv_t cd, char* * inbuf,
done: done:
#ifdef ICONV_THREAD_SAFE #ifdef ICONV_THREAD_SAFE
DosReleaseMutexSem( ((iuconv_obj *)(cd))->hMtx ); DosReleaseMutexSem(((iuconv_obj *)cd)->hMtx);
#endif #endif
return ret; return ret;
} }
extern int _System os2_iconv_close(iconv_t cd) int _System os2_iconv_close(iconv_t cd)
{ {
if ( !cd ) if (!cd) return 0;
return 0;
#ifdef ICONV_THREAD_SAFE #ifdef ICONV_THREAD_SAFE
DosCloseMutexSem( ((iuconv_obj *)(cd))->hMtx ); DosCloseMutexSem(((iuconv_obj *)cd)->hMtx);
#endif #endif
if ( ((iuconv_obj *)(cd))->uo_tocode != NULL ) if (((iuconv_obj *)cd)->uo_tocode != NULL)
UniFreeUconvObject( ((iuconv_obj *)(cd))->uo_tocode ); UniFreeUconvObject(((iuconv_obj *)cd)->uo_tocode);
if ( ((iuconv_obj *)(cd))->uo_fromcode != NULL ) if (((iuconv_obj *)cd)->uo_fromcode != NULL)
UniFreeUconvObject( ((iuconv_obj *)(cd))->uo_fromcode ); UniFreeUconvObject(((iuconv_obj *)cd)->uo_fromcode);
if ( ( ((iuconv_obj *)(cd))->buf ) != NULL ) if (((iuconv_obj *)cd)->buf != NULL)
free( ((iuconv_obj *)(cd))->buf ); free(((iuconv_obj *)cd)->buf);
free(cd); free(cd);
return 0; return 0;
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -30,32 +30,26 @@ int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc)
char *pszToCP, *pszFromCP; char *pszToCP, *pszFromCP;
int fError = 0; int fError = 0;
if ( cbDst < 4 ) if (cbDst < 4)
return -1; return -1;
if ( fToUTF8 ) if (fToUTF8) {
{
pszToCP = "UTF-8"; pszToCP = "UTF-8";
pszFromCP = ""; pszFromCP = "";
} } else {
else
{
pszToCP = ""; pszToCP = "";
pszFromCP = "UTF-8"; pszFromCP = "UTF-8";
} }
cd = iconv_open( pszToCP, pszFromCP ); cd = iconv_open(pszToCP, pszFromCP);
if ( cd == (iconv_t)-1 ) if (cd == (iconv_t)-1)
return -1; return -1;
while( cbSrc > 0 ) while (cbSrc > 0) {
{ rc = iconv(cd, &pcSrc, (size_t *)&cbSrc, &pcDst, (size_t *)&cbDst);
rc = iconv( cd, &pcSrc, (size_t *)&cbSrc, &pcDst, (size_t *)&cbDst ); if (rc == (size_t)-1) {
if ( rc == (size_t)-1 ) if (errno == EILSEQ) {
{ /* Try to skip invalid character */
if ( errno == EILSEQ )
{
// Try to skip invalid character.
pcSrc++; pcSrc++;
cbSrc--; cbSrc--;
continue; continue;
@ -66,52 +60,48 @@ int StrUTF8(int fToUTF8, char *pcDst, int cbDst, char *pcSrc, int cbSrc)
} }
} }
iconv_close( cd ); iconv_close(cd);
// Write trailing ZERO (1 byte for UTF-8, 2 bytes for the system cp). /* Write trailing ZERO (1 byte for UTF-8, 2 bytes for the system cp) */
if ( fToUTF8 ) if (fToUTF8) {
{ if (cbDst < 1) {
if ( cbDst < 1 )
{
pcDst--; pcDst--;
fError = 1; // The destination buffer overflow. fError = 1; /* The destination buffer overflow */
} }
*pcDst = '\0'; *pcDst = '\0';
} } else {
else if (cbDst < 2) {
{ pcDst -= (cbDst == 0)? 2 : 1;
if ( cbDst < 2 ) fError = 1; /* The destination buffer overflow */
{
pcDst -= ( cbDst == 0 ) ? 2 : 1;
fError = 1; // The destination buffer overflow.
} }
*((short *)pcDst) = '\0'; *((short *)pcDst) = '\0';
} }
return fError ? -1 : ( pcDst - pcDstStart ); return (fError) ? -1 : (pcDst - pcDstStart);
} }
char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr) char *StrUTF8New(int fToUTF8, char *pcStr, int cbStr)
{ {
int cbNewStr = ( ( cbStr > 4 ? cbStr : 4 ) + 1 ) * 2; int cbNewStr = (((cbStr > 4)? cbStr : 4) + 1) * 2;
char *pszNewStr = malloc( cbNewStr ); char *pszNewStr = malloc(cbNewStr);
if ( pszNewStr == NULL ) if (pszNewStr == NULL)
return NULL; return NULL;
cbNewStr = StrUTF8( fToUTF8, pszNewStr, cbNewStr, pcStr, cbStr ); cbNewStr = StrUTF8(fToUTF8, pszNewStr, cbNewStr, pcStr, cbStr);
if ( cbNewStr != -1 ) if (cbNewStr != -1) {
{ pcStr = realloc(pszNewStr, cbNewStr + ((fToUTF8)? 1 : sizeof(short)));
pcStr = realloc( pszNewStr, cbNewStr + ( fToUTF8 ? 1 : sizeof(short) ) ); if (pcStr != NULL)
if ( pcStr != NULL )
return pcStr; return pcStr;
} }
free( pszNewStr ); free(pszNewStr);
return NULL; return NULL;
} }
void StrUTF8Free(char *pszStr) void StrUTF8Free(char *pszStr)
{ {
free( pszStr ); free(pszStr);
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -27,42 +27,43 @@
int main(void) int main(void)
{ {
char acBuf[128]; char acBuf[128];
char *inbuf = "ôÅÓÔ - ÐÒÏ×ÅÒËÁ"; // KOI8-R string. char *inbuf = "ôÅÓÔ - ÐÒÏ×ÅÒËÁ"; /* KOI8-R string */
size_t inbytesleft = strlen( inbuf ); size_t inbytesleft = strlen(inbuf);
char *outbuf = &acBuf; char *outbuf = acBuf;
size_t outbytesleft = sizeof( acBuf ); size_t outbytesleft = sizeof(acBuf);
iconv_t ic; iconv_t ic;
// KOI8 -> system cp. /* KOI8 -> system cp */
ic = iconv_open("", "KOI8-R");
ic = iconv_open( "", "KOI8-R" ); if (ic == (iconv_t)(-1)) {
if ( ic == (iconv_t)(-1) ) puts("iconv_open() fail");
{
puts( "iconv_open() fail" );
return 1; return 1;
} }
iconv( ic, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); iconv(ic, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
printf( "KOI8-R to system cp.: %s\n", &acBuf ); printf("KOI8-R to system cp: %s\n", acBuf);
iconv_close( ic ); iconv_close(ic);
// System cp. -> UTF-8 -> system cp. /* System cp -> UTF-8 -> system cp: */
// System cp. -> UTF-8 by StrUTF8New(). /* System cp -> UTF-8 by StrUTF8New() */
inbuf = StrUTF8New( 1, &acBuf, strlen( &acBuf ) ); inbuf = StrUTF8New(1, acBuf, strlen(acBuf));
// UTF-8 -> system cp. by StrUTF8(). /* UTF-8 -> system cp. by StrUTF8() */
if ( StrUTF8( 0, &acBuf, sizeof(acBuf), inbuf, strlen( inbuf ) ) == -1 ) if (StrUTF8(0, &acBuf, sizeof(acBuf), inbuf, strlen(inbuf)) == -1) {
puts( "StrUTF8() failed" ); puts("StrUTF8() failed");
else } else {
printf( "system cp. -> UTF-8 -> system cp.: %s\n", &acBuf ); printf("system cp. -> UTF-8 -> system cp.: %s\n", &acBuf);
}
free( inbuf ); free(inbuf);
// Unload used DLL. /* Unload used DLL */
iconv_clean(); iconv_clean();
puts( "Done." ); puts("Done.");
return 0; return 0;
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -46,7 +46,7 @@ SDL_GetBasePath(void)
CHAR acBuf[_MAX_PATH]; CHAR acBuf[_MAX_PATH];
if (ulRC != NO_ERROR) { if (ulRC != NO_ERROR) {
debug("DosGetInfoBlocks() failed, rc = %u", ulRC); debug_os2("DosGetInfoBlocks() failed, rc = %u", ulRC);
return NULL; return NULL;
} }
@ -82,9 +82,9 @@ SDL_GetPrefPath(const char *org, const char *app)
return NULL; return NULL;
} }
pszPath = SDL_getenv( "HOME" ); pszPath = SDL_getenv("HOME");
if (!pszPath) { if (!pszPath) {
pszPath = SDL_getenv( "ETC" ); pszPath = SDL_getenv("ETC");
if (!pszPath) { if (!pszPath) {
SDL_SetError("HOME or ETC environment not set"); SDL_SetError("HOME or ETC environment not set");
return NULL; return NULL;

View File

@ -37,13 +37,13 @@ SDL_LoadObject(const char *sofile)
{ {
ULONG ulRC; ULONG ulRC;
HMODULE hModule; HMODULE hModule;
PSZ pszModName = OS2_UTF8ToSys( sofile ); PSZ pszModName = OS2_UTF8ToSys(sofile);
CHAR acError[256]; CHAR acError[256];
ulRC = DosLoadModule(acError, sizeof(acError), pszModName, &hModule); ulRC = DosLoadModule(acError, sizeof(acError), pszModName, &hModule);
SDL_free(pszModName); SDL_free(pszModName);
if (ulRC != NO_ERROR) { if (ulRC != NO_ERROR) {
SDL_SetError( "Failed loading %s (E%u)", acError, ulRC ); SDL_SetError("Failed loading %s (E%u)", acError, ulRC);
return NULL; return NULL;
} }
@ -58,7 +58,7 @@ SDL_LoadFunction(void *handle, const char *name)
ulRC = DosQueryProcAddr((HMODULE)handle, 0, name, &pFN); ulRC = DosQueryProcAddr((HMODULE)handle, 0, name, &pFN);
if (ulRC != NO_ERROR) { if (ulRC != NO_ERROR) {
SDL_SetError( "Failed loading procedure %s (E%u)", name, ulRC ); SDL_SetError("Failed loading procedure %s (E%u)", name, ulRC);
return NULL; return NULL;
} }
@ -68,8 +68,9 @@ SDL_LoadFunction(void *handle, const char *name)
void void
SDL_UnloadObject(void *handle) SDL_UnloadObject(void *handle)
{ {
if (handle != NULL) if (handle != NULL) {
DosFreeModule( (HMODULE)handle ); DosFreeModule((HMODULE)handle);
}
} }
#endif /* SDL_LOADSO_OS2 */ #endif /* SDL_LOADSO_OS2 */

View File

@ -32,9 +32,8 @@
#define INCL_DOSERRORS #define INCL_DOSERRORS
#include <os2.h> #include <os2.h>
struct SDL_mutex struct SDL_mutex {
{ HMTX _handle;
ULONG ulHandle;
}; };
/* Create a mutex */ /* Create a mutex */
@ -44,10 +43,9 @@ SDL_CreateMutex(void)
ULONG ulRC; ULONG ulRC;
HMTX hMtx; HMTX hMtx;
ulRC = DosCreateMutexSem( NULL, &hMtx, 0, FALSE ); ulRC = DosCreateMutexSem(NULL, &hMtx, 0, FALSE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosCreateMutexSem(), rc = %u", ulRC);
debug( "DosCreateMutexSem(), rc = %u", ulRC );
return NULL; return NULL;
} }
@ -61,9 +59,10 @@ SDL_DestroyMutex(SDL_mutex * mutex)
ULONG ulRC; ULONG ulRC;
HMTX hMtx = (HMTX)mutex; HMTX hMtx = (HMTX)mutex;
ulRC = DosCloseMutexSem( hMtx ); ulRC = DosCloseMutexSem(hMtx);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
debug( "DosCloseMutexSem(), rc = %u", ulRC ); debug_os2("DosCloseMutexSem(), rc = %u", ulRC);
}
} }
/* Lock the mutex */ /* Lock the mutex */
@ -73,13 +72,12 @@ SDL_LockMutex(SDL_mutex * mutex)
ULONG ulRC; ULONG ulRC;
HMTX hMtx = (HMTX)mutex; HMTX hMtx = (HMTX)mutex;
if ( hMtx == NULLHANDLE ) if (hMtx == NULLHANDLE)
return SDL_SetError( "Passed a NULL mutex" ); return SDL_SetError("Passed a NULL mutex");
ulRC = DosRequestMutexSem( hMtx, SEM_INDEFINITE_WAIT ); ulRC = DosRequestMutexSem(hMtx, SEM_INDEFINITE_WAIT);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosRequestMutexSem(), rc = %u", ulRC);
debug( "DosRequestMutexSem(), rc = %u", ulRC );
return -1; return -1;
} }
@ -93,17 +91,16 @@ SDL_TryLockMutex(SDL_mutex * mutex)
ULONG ulRC; ULONG ulRC;
HMTX hMtx = (HMTX)mutex; HMTX hMtx = (HMTX)mutex;
if ( hMtx == NULLHANDLE ) if (hMtx == NULLHANDLE)
return SDL_SetError( "Passed a NULL mutex" ); return SDL_SetError("Passed a NULL mutex");
ulRC = DosRequestMutexSem( hMtx, SEM_IMMEDIATE_RETURN ); ulRC = DosRequestMutexSem(hMtx, SEM_IMMEDIATE_RETURN);
if ( ulRC == ERROR_TIMEOUT ) if (ulRC == ERROR_TIMEOUT)
return SDL_MUTEX_TIMEDOUT; return SDL_MUTEX_TIMEDOUT;
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosRequestMutexSem(), rc = %u", ulRC);
debug( "DosRequestMutexSem(), rc = %u", ulRC );
return -1; return -1;
} }
@ -117,12 +114,12 @@ SDL_UnlockMutex(SDL_mutex * mutex)
ULONG ulRC; ULONG ulRC;
HMTX hMtx = (HMTX)mutex; HMTX hMtx = (HMTX)mutex;
if ( hMtx == NULLHANDLE ) if (hMtx == NULLHANDLE)
return SDL_SetError( "Passed a NULL mutex" ); return SDL_SetError("Passed a NULL mutex");
ulRC = DosReleaseMutexSem( hMtx ); ulRC = DosReleaseMutexSem(hMtx);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
return SDL_SetError( "DosReleaseMutexSem(), rc = %u", ulRC ); return SDL_SetError("DosReleaseMutexSem(), rc = %u", ulRC);
return 0; return 0;
} }

View File

@ -43,28 +43,25 @@ SDL_sem *
SDL_CreateSemaphore(Uint32 initial_value) SDL_CreateSemaphore(Uint32 initial_value)
{ {
ULONG ulRC; ULONG ulRC;
SDL_sem *pSDLSem = SDL_malloc( sizeof(SDL_sem) ); SDL_sem *pSDLSem = SDL_malloc(sizeof(SDL_sem));
if ( pSDLSem == NULL ) if (pSDLSem == NULL) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
ulRC = DosCreateEventSem( NULL, &pSDLSem->hEv, DCE_AUTORESET, FALSE ); ulRC = DosCreateEventSem(NULL, &pSDLSem->hEv, DCE_AUTORESET, FALSE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosCreateEventSem(), rc = %u", ulRC);
debug( "DosCreateEventSem(), rc = %u", ulRC ); SDL_free(pSDLSem);
SDL_free( pSDLSem );
return NULL; return NULL;
} }
ulRC = DosCreateMutexSem( NULL, &pSDLSem->hMtx, 0, FALSE ); ulRC = DosCreateMutexSem(NULL, &pSDLSem->hMtx, 0, FALSE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosCreateMutexSem(), rc = %u", ulRC);
debug( "DosCreateMutexSem(), rc = %u", ulRC ); DosCloseEventSem(pSDLSem->hEv);
DosCloseEventSem( pSDLSem->hEv ); SDL_free(pSDLSem);
SDL_free( pSDLSem );
return NULL; return NULL;
} }
@ -76,12 +73,11 @@ SDL_CreateSemaphore(Uint32 initial_value)
void void
SDL_DestroySemaphore(SDL_sem * sem) SDL_DestroySemaphore(SDL_sem * sem)
{ {
if ( sem == NULL ) if (!sem) return;
return;
DosCloseMutexSem( sem->hMtx ); DosCloseMutexSem(sem->hMtx);
DosCloseEventSem( sem->hEv ); DosCloseEventSem(sem->hEv);
SDL_free( sem ); SDL_free(sem);
} }
int int
@ -92,44 +88,42 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
ULONG ulTimeout; ULONG ulTimeout;
ULONG cPost; ULONG cPost;
if ( sem == NULL ) if (sem == NULL)
return SDL_SetError( "Passed a NULL sem" ); return SDL_SetError("Passed a NULL sem");
if ( timeout != SEM_INDEFINITE_WAIT ) if (timeout != SEM_INDEFINITE_WAIT)
DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, &ulStartTime, sizeof(ULONG) ); DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &ulStartTime, sizeof(ULONG));
while( TRUE ) while (TRUE) {
{ ulRC = DosRequestMutexSem(sem->hMtx, SEM_INDEFINITE_WAIT);
ulRC = DosRequestMutexSem( sem->hMtx, SEM_INDEFINITE_WAIT ); if (ulRC != NO_ERROR)
if ( ulRC != NO_ERROR ) return SDL_SetError("DosRequestMutexSem() failed, rc = %u", ulRC);
return SDL_SetError( "DosRequestMutexSem() failed, rc = %u", ulRC );
cPost = sem->cPost; cPost = sem->cPost;
if ( sem->cPost != 0 ) if (sem->cPost != 0)
sem->cPost--; sem->cPost--;
DosReleaseMutexSem( sem->hMtx ); DosReleaseMutexSem(sem->hMtx);
if ( cPost != 0 ) if (cPost != 0)
break; break;
if ( timeout == SEM_INDEFINITE_WAIT ) if (timeout == SEM_INDEFINITE_WAIT)
ulTimeout = SEM_INDEFINITE_WAIT; ulTimeout = SEM_INDEFINITE_WAIT;
else else {
{ DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &ulCurTime, sizeof(ULONG));
DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, &ulCurTime, sizeof(ULONG) );
ulTimeout = ulCurTime - ulStartTime; ulTimeout = ulCurTime - ulStartTime;
if ( timeout < ulTimeout ) if (timeout < ulTimeout)
return SDL_MUTEX_TIMEDOUT; return SDL_MUTEX_TIMEDOUT;
ulTimeout = timeout - ulTimeout; ulTimeout = timeout - ulTimeout;
} }
ulRC = DosWaitEventSem( sem->hEv, ulTimeout ); ulRC = DosWaitEventSem(sem->hEv, ulTimeout);
if ( ulRC == ERROR_TIMEOUT ) if (ulRC == ERROR_TIMEOUT)
return SDL_MUTEX_TIMEDOUT; return SDL_MUTEX_TIMEDOUT;
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
return SDL_SetError( "DosWaitEventSem() failed, rc = %u", ulRC ); return SDL_SetError("DosWaitEventSem() failed, rc = %u", ulRC);
} }
return 0; return 0;
@ -138,13 +132,13 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
int int
SDL_SemTryWait(SDL_sem * sem) SDL_SemTryWait(SDL_sem * sem)
{ {
return SDL_SemWaitTimeout( sem, 0 ); return SDL_SemWaitTimeout(sem, 0);
} }
int int
SDL_SemWait(SDL_sem * sem) SDL_SemWait(SDL_sem * sem)
{ {
return SDL_SemWaitTimeout( sem, SDL_MUTEX_MAXWAIT ); return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
} }
Uint32 Uint32
@ -152,18 +146,17 @@ SDL_SemValue(SDL_sem * sem)
{ {
ULONG ulRC; ULONG ulRC;
if ( sem == NULL ) if (sem == NULL) {
{ SDL_SetError("Passed a NULL sem");
SDL_SetError( "Passed a NULL sem" );
return 0; return 0;
} }
ulRC = DosRequestMutexSem( sem->hMtx, SEM_INDEFINITE_WAIT ); ulRC = DosRequestMutexSem(sem->hMtx, SEM_INDEFINITE_WAIT);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
return SDL_SetError( "DosRequestMutexSem() failed, rc = %u", ulRC ); return SDL_SetError("DosRequestMutexSem() failed, rc = %u", ulRC);
ulRC = sem->cPost; ulRC = sem->cPost;
DosReleaseMutexSem( sem->hMtx ); DosReleaseMutexSem(sem->hMtx);
return ulRC; return ulRC;
} }
@ -173,20 +166,21 @@ SDL_SemPost(SDL_sem * sem)
{ {
ULONG ulRC; ULONG ulRC;
if ( sem == NULL ) if (sem == NULL)
return SDL_SetError( "Passed a NULL sem" ); return SDL_SetError("Passed a NULL sem");
ulRC = DosRequestMutexSem( sem->hMtx, SEM_INDEFINITE_WAIT ); ulRC = DosRequestMutexSem(sem->hMtx, SEM_INDEFINITE_WAIT);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
return SDL_SetError( "DosRequestMutexSem() failed, rc = %u", ulRC ); return SDL_SetError("DosRequestMutexSem() failed, rc = %u", ulRC);
sem->cPost++; sem->cPost++;
ulRC = DosPostEventSem( sem->hEv ); ulRC = DosPostEventSem(sem->hEv);
if ( ( ulRC != NO_ERROR ) && ( ulRC != ERROR_ALREADY_POSTED ) ) if (ulRC != NO_ERROR && ulRC != ERROR_ALREADY_POSTED) {
debug( "DosPostEventSem() failed, rc = %u", ulRC ); debug_os2("DosPostEventSem() failed, rc = %u", ulRC);
}
DosReleaseMutexSem( sem->hMtx ); DosReleaseMutexSem(sem->hMtx);
return 0; return 0;
} }

View File

@ -45,12 +45,12 @@ static void RunThread(void *data)
SDL_Thread *thread = (SDL_Thread *) data; SDL_Thread *thread = (SDL_Thread *) data;
pfnSDL_CurrentEndThread pfnEndThread = (pfnSDL_CurrentEndThread) thread->endfunc; pfnSDL_CurrentEndThread pfnEndThread = (pfnSDL_CurrentEndThread) thread->endfunc;
if ( ppSDLTLSData != NULL ) if (ppSDLTLSData != NULL)
*ppSDLTLSData = NULL; *ppSDLTLSData = NULL;
SDL_RunThread( thread ); SDL_RunThread(thread);
if ( pfnEndThread != NULL ) if (pfnEndThread != NULL)
pfnEndThread(); pfnEndThread();
} }
@ -63,20 +63,19 @@ SDL_SYS_CreateThread(SDL_Thread * thread,
thread->stacksize = 65536; thread->stacksize = 65536;
if (pfnBeginThread) { if (pfnBeginThread) {
// Save the function which we will have to call to clear the RTL of calling app! /* Save the function which we will have to call to clear the RTL of calling app! */
thread->endfunc = pfnEndThread; thread->endfunc = pfnEndThread;
// Start the thread using the runtime library of calling app! /* Start the thread using the runtime library of calling app! */
thread->handle = (SYS_ThreadHandle) thread->handle = (SYS_ThreadHandle)
pfnBeginThread( RunThread, NULL, thread->stacksize, thread ); pfnBeginThread(RunThread, NULL, thread->stacksize, thread);
} } else {
else {
thread->endfunc = _endthread; thread->endfunc = _endthread;
thread->handle = (SYS_ThreadHandle) thread->handle = (SYS_ThreadHandle)
_beginthread( RunThread, NULL, thread->stacksize, thread ); _beginthread(RunThread, NULL, thread->stacksize, thread);
} }
if ( thread->handle == -1 ) if (thread->handle == -1)
return SDL_SetError( "Not enough resources to create thread" ); return SDL_SetError("Not enough resources to create thread");
return 0; return 0;
} }
@ -84,7 +83,7 @@ SDL_SYS_CreateThread(SDL_Thread * thread,
void void
SDL_SYS_SetupThread(const char *name) SDL_SYS_SetupThread(const char *name)
{ {
return; /* nothing. */
} }
SDL_threadID SDL_threadID
@ -93,7 +92,7 @@ SDL_ThreadID(void)
PTIB tib; PTIB tib;
PPIB pib; PPIB pib;
DosGetInfoBlocks( &tib, &pib ); DosGetInfoBlocks(&tib, &pib);
return tib->tib_ptib2->tib2_ultid; return tib->tib_ptib2->tib2_ultid;
} }
@ -102,13 +101,13 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
{ {
ULONG ulRC; ULONG ulRC;
ulRC = DosSetPriority( PRTYS_THREAD, ulRC = DosSetPriority(PRTYS_THREAD,
(priority < SDL_THREAD_PRIORITY_NORMAL)? PRTYC_IDLETIME : (priority < SDL_THREAD_PRIORITY_NORMAL)? PRTYC_IDLETIME :
(priority > SDL_THREAD_PRIORITY_NORMAL)? PRTYC_TIMECRITICAL : (priority > SDL_THREAD_PRIORITY_NORMAL)? PRTYC_TIMECRITICAL :
PRTYC_REGULAR, PRTYC_REGULAR,
0, 0 ); 0, 0);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
return SDL_SetError( "DosSetPriority() failed, rc = %u", ulRC ); return SDL_SetError("DosSetPriority() failed, rc = %u", ulRC);
return 0; return 0;
} }
@ -116,10 +115,11 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
void void
SDL_SYS_WaitThread(SDL_Thread * thread) SDL_SYS_WaitThread(SDL_Thread * thread)
{ {
ULONG ulRC = DosWaitThread( (PTID)&thread->handle, DCWW_WAIT ); ULONG ulRC = DosWaitThread((PTID)&thread->handle, DCWW_WAIT);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
debug( "DosWaitThread() failed, rc = %u", ulRC ); debug_os2("DosWaitThread() failed, rc = %u", ulRC);
}
} }
void void

View File

@ -36,48 +36,48 @@ SDL_TLSData **ppSDLTLSData = NULL;
static ULONG cTLSAlloc = 0; static ULONG cTLSAlloc = 0;
// SDL_OS2TLSAlloc() called from SDL_InitSubSystem() /* SDL_OS2TLSAlloc() called from SDL_InitSubSystem() */
void SDL_OS2TLSAlloc() void SDL_OS2TLSAlloc(void)
{ {
ULONG ulRC; ULONG ulRC;
if ( ( cTLSAlloc == 0 ) || ( ppSDLTLSData == NULL ) ) if (cTLSAlloc == 0 || ppSDLTLSData == NULL) {
{ /* First call - allocate the thread local memory (1 DWORD) */
// First call - allocate the thread local memory (1 DWORD). ulRC = DosAllocThreadLocalMemory(1, (PULONG *)&ppSDLTLSData);
ulRC = DosAllocThreadLocalMemory( 1, (PULONG *)&ppSDLTLSData ); if (ulRC != NO_ERROR) {
if ( ulRC != NO_ERROR ) debug_os2("DosAllocThreadLocalMemory() failed, rc = %u", ulRC);
debug( "DosAllocThreadLocalMemory() failed, rc = %u", ulRC ); }
} }
cTLSAlloc++; cTLSAlloc++;
} }
// SDL_OS2TLSFree() called from SDL_QuitSubSystem() /* SDL_OS2TLSFree() called from SDL_QuitSubSystem() */
void SDL_OS2TLSFree() void SDL_OS2TLSFree(void)
{ {
ULONG ulRC; ULONG ulRC;
if ( cTLSAlloc != 0 ) if (cTLSAlloc != 0)
cTLSAlloc--; cTLSAlloc--;
if ( ( cTLSAlloc == 0 ) && ( ppSDLTLSData != NULL ) ) if (cTLSAlloc == 0 && ppSDLTLSData != NULL) {
{ /* Last call - free the thread local memory */
// Last call - free the thread local memory. ulRC = DosFreeThreadLocalMemory((PULONG)ppSDLTLSData);
ulRC = DosFreeThreadLocalMemory( (PULONG)ppSDLTLSData ); if (ulRC != NO_ERROR) {
if ( ulRC != NO_ERROR ) debug_os2("DosFreeThreadLocalMemory() failed, rc = %u", ulRC);
debug( "DosFreeThreadLocalMemory() failed, rc = %u", ulRC ); } else {
else
ppSDLTLSData = NULL; ppSDLTLSData = NULL;
} }
}
} }
SDL_TLSData *SDL_SYS_GetTLSData() SDL_TLSData *SDL_SYS_GetTLSData(void)
{ {
return ppSDLTLSData == NULL ? NULL : *ppSDLTLSData; return (ppSDLTLSData == NULL)? NULL : *ppSDLTLSData;
} }
int SDL_SYS_SetTLSData(SDL_TLSData *data) int SDL_SYS_SetTLSData(SDL_TLSData *data)
{ {
if ( ppSDLTLSData == NULL ) if (!ppSDLTLSData)
return -1; return -1;
*ppSDLTLSData = data; *ppSDLTLSData = data;

View File

@ -27,11 +27,11 @@
extern SDL_TLSData **ppSDLTLSData; extern SDL_TLSData **ppSDLTLSData;
// SDL_OS2TLSAlloc() called from SDL_InitSubSystem() /* SDL_OS2TLSAlloc() called from SDL_InitSubSystem() */
void SDL_OS2TLSAlloc(); void SDL_OS2TLSAlloc(void);
// SDL_OS2TLSFree() called from SDL_QuitSubSystem() /* SDL_OS2TLSFree() called from SDL_QuitSubSystem() */
void SDL_OS2TLSFree(); void SDL_OS2TLSFree(void);
#endif /* SDL_THREAD_OS2 */ #endif /* SDL_THREAD_OS2 */

View File

@ -34,8 +34,8 @@
#define INCL_DOSEXCEPTIONS #define INCL_DOSEXCEPTIONS
#include <os2.h> #include <os2.h>
// No need to switch priorities in SDL_Delay() for OS/2 versions > Warp3 fp 42. /* No need to switch priorities in SDL_Delay() for OS/2 versions > Warp3 fp 42, */
//#define _SWITCH_PRIORITY /*#define _SWITCH_PRIORITY*/
typedef unsigned long long ULLONG; typedef unsigned long long ULLONG;
@ -47,24 +47,18 @@ SDL_TicksInit(void)
{ {
ULONG ulRC; ULONG ulRC;
ulRC = DosTmrQueryFreq( &ulTmrFreq ); ulRC = DosTmrQueryFreq(&ulTmrFreq);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosTmrQueryFreq() failed, rc = %u", ulRC);
debug( "DosTmrQueryFreq() failed, rc = %u", ulRC ); } else {
} ulRC = DosTmrQueryTime((PQWORD)&ullTmrStart);
else if (ulRC == NO_ERROR)
{
ulRC = DosTmrQueryTime( (PQWORD)&ullTmrStart );
if ( ulRC == NO_ERROR )
return; return;
debug_os2("DosTmrQueryTime() failed, rc = %u", ulRC);
debug( "DosTmrQueryTime() failed, rc = %u", ulRC );
} }
ulTmrFreq = 0; // Error - use DosQuerySysInfo() for timer. ulTmrFreq = 0; /* Error - use DosQuerySysInfo() for timer. */
DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, (PULONG)&ullTmrStart, sizeof(ULONG));
DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, (PULONG)&ullTmrStart,
sizeof(ULONG) );
} }
void void
@ -78,19 +72,14 @@ SDL_GetTicks(void)
ULONG ulResult; ULONG ulResult;
ULLONG ullTmrNow; ULLONG ullTmrNow;
if ( ulTmrFreq == 0 ) if (ulTmrFreq == 0) /* Was not initialized. */
// Was not initialized.
SDL_TicksInit(); SDL_TicksInit();
if ( ulTmrFreq != 0 ) if (ulTmrFreq != 0) {
{ DosTmrQueryTime((PQWORD)&ullTmrNow);
DosTmrQueryTime( (PQWORD)&ullTmrNow ); ulResult = (ullTmrNow - ullTmrStart) * 1000 / ulTmrFreq;
ulResult = ( ullTmrNow - ullTmrStart ) * 1000 / ulTmrFreq; } else {
} DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, (PULONG)&ullTmrNow, sizeof(ULONG));
else
{
DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, (PULONG)&ullTmrNow,
sizeof(ULONG) );
ulResult = (ULONG)ullTmrNow - (ULONG)ullTmrStart; ulResult = (ULONG)ullTmrNow - (ULONG)ullTmrStart;
} }
@ -102,7 +91,7 @@ SDL_GetPerformanceCounter(void)
{ {
QWORD qwTmrNow; QWORD qwTmrNow;
if ( ( ulTmrFreq == 0 ) || ( DosTmrQueryTime( &qwTmrNow ) != NO_ERROR ) ) if (ulTmrFreq == 0 || (DosTmrQueryTime(&qwTmrNow) != NO_ERROR))
return SDL_GetTicks(); return SDL_GetTicks();
return *((Uint64 *)&qwTmrNow); return *((Uint64 *)&qwTmrNow);
@ -111,7 +100,7 @@ SDL_GetPerformanceCounter(void)
Uint64 Uint64
SDL_GetPerformanceFrequency(void) SDL_GetPerformanceFrequency(void)
{ {
return ulTmrFreq == 0 ? 1000 : (Uint64)ulTmrFreq; return (ulTmrFreq == 0)? 1000 : (Uint64)ulTmrFreq;
} }
void void
@ -128,60 +117,55 @@ SDL_Delay(Uint32 ms)
#endif #endif
HEV hevTimer; HEV hevTimer;
if ( ms == 0 ) if (ms == 0) {
{ DosSleep(0);
DosSleep( 0 );
return; return;
} }
ulRC = DosCreateEventSem( NULL, &hevTimer, DC_SEM_SHARED, FALSE ); ulRC = DosCreateEventSem(NULL, &hevTimer, DC_SEM_SHARED, FALSE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosAsyncTimer() failed, rc = %u", ulRC);
debug( "DosAsyncTimer() failed, rc = %u", ulRC ); DosSleep(ms);
DosSleep( ms );
return; return;
} }
#ifdef _SWITCH_PRIORITY #ifdef _SWITCH_PRIORITY
if ( fSetPriority ) if (fSetPriority) {
{ if (DosGetInfoBlocks(&tib, &pib) != NO_ERROR)
if ( DosGetInfoBlocks( &tib, &pib ) != NO_ERROR )
fSetPriority = FALSE; fSetPriority = FALSE;
else else {
{
ulSavePriority = tib->tib_ptib2->tib2_ulpri; ulSavePriority = tib->tib_ptib2->tib2_ulpri;
if ( ( (ulSavePriority & 0xFF00) == 0x0300 ) || // already have high pr. if (((ulSavePriority & 0xFF00) == 0x0300) || /* already have high pr. */
( DosEnterMustComplete( &ulNesting ) != NO_ERROR ) ) (DosEnterMustComplete( &ulNesting) != NO_ERROR))
fSetPriority = FALSE; fSetPriority = FALSE;
else else {
DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0 ); DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
}
} }
} }
#endif #endif
DosResetEventSem( hevTimer, &ulRC ); DosResetEventSem(hevTimer, &ulRC);
ulRC = DosAsyncTimer( ms, (HSEM)hevTimer, &hTimer ); ulRC = DosAsyncTimer(ms, (HSEM)hevTimer, &hTimer);
#ifdef _SWITCH_PRIORITY #ifdef _SWITCH_PRIORITY
if ( fSetPriority ) if (fSetPriority) {
{ if (DosSetPriority(PRTYS_THREAD, (ulSavePriority >> 8) & 0xFF, 0, 0) == NO_ERROR)
if ( DosSetPriority( PRTYS_THREAD, (ulSavePriority >> 8) & 0xFF, 0, 0 ) == DosSetPriority(PRTYS_THREAD, 0, ulSavePriority & 0xFF, 0);
NO_ERROR ) DosExitMustComplete(&ulNesting);
DosSetPriority( PRTYS_THREAD, 0, ulSavePriority & 0xFF, 0 );
DosExitMustComplete( &ulNesting );
} }
#endif #endif
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
debug( "DosAsyncTimer() failed, rc = %u", ulRC ); debug_os2("DosAsyncTimer() failed, rc = %u", ulRC);
else } else {
DosWaitEventSem( hevTimer, SEM_INDEFINITE_WAIT ); DosWaitEventSem(hevTimer, SEM_INDEFINITE_WAIT);
}
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR)
DosSleep( ms ); DosSleep(ms);
DosCloseEventSem( hevTimer ); DosCloseEventSem(hevTimer);
} }
#endif /* SDL_TIMER_OS2 */ #endif /* SDL_TIMER_OS2 */

View File

@ -41,8 +41,8 @@ typedef struct _VODATA {
BOOL fBlitterReady; BOOL fBlitterReady;
} VODATA; } VODATA;
static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo); static BOOL voQueryInfo(VIDEOOUTPUTINFO *pInfo);
static PVODATA voOpen(); static PVODATA voOpen(void);
static VOID voClose(PVODATA pVOData); static VOID voClose(PVODATA pVOData);
static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd, static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
SDL_DisplayMode *pSDLDisplayMode, SDL_DisplayMode *pSDLDisplayMode,
@ -65,27 +65,24 @@ OS2VIDEOOUTPUT voDive = {
}; };
static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo) static BOOL voQueryInfo(VIDEOOUTPUTINFO *pInfo)
{ {
DIVE_CAPS sDiveCaps = { 0 }; DIVE_CAPS sDiveCaps = { 0 };
FOURCC fccFormats[100] = { 0 }; FOURCC fccFormats[100] = { 0 };
// Query information about display hardware from DIVE. /* Query information about display hardware from DIVE. */
sDiveCaps.pFormatData = fccFormats; sDiveCaps.pFormatData = fccFormats;
sDiveCaps.ulFormatLength = 100; sDiveCaps.ulFormatLength = 100;
sDiveCaps.ulStructLen = sizeof(DIVE_CAPS); sDiveCaps.ulStructLen = sizeof(DIVE_CAPS);
if ( DiveQueryCaps( &sDiveCaps, DIVE_BUFFER_SCREEN ) ) if (DiveQueryCaps(&sDiveCaps, DIVE_BUFFER_SCREEN)) {
{ debug_os2("DiveQueryCaps() failed.");
debug( "DiveQueryCaps() failed." );
return FALSE; return FALSE;
} }
if ( sDiveCaps.ulDepth < 8 ) if (sDiveCaps.ulDepth < 8) {
{ debug_os2("Not enough screen colors to run DIVE. "
debug( "Not enough screen colors to run DIVE. " "Must be at least 256 colors.");
"Must be at least 256 colors." );
return FALSE; return FALSE;
} }
@ -98,20 +95,18 @@ static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo)
return TRUE; return TRUE;
} }
PVODATA voOpen() PVODATA voOpen(void)
{ {
PVODATA pVOData = SDL_calloc( 1, sizeof(VODATA) ); PVODATA pVOData = SDL_calloc(1, sizeof(VODATA));
if ( pVOData == NULL ) if (pVOData == NULL) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
if ( DiveOpen( &pVOData->hDive, FALSE, NULL ) != DIVE_SUCCESS ) if (DiveOpen(&pVOData->hDive, FALSE, NULL) != DIVE_SUCCESS) {
{ SDL_free(pVOData);
SDL_free( pVOData ); SDL_SetError("DIVE: A display engine instance open failed");
SDL_SetError( "DIVE: A display engine instance open failed" );
return NULL; return NULL;
} }
@ -120,9 +115,9 @@ PVODATA voOpen()
static VOID voClose(PVODATA pVOData) static VOID voClose(PVODATA pVOData)
{ {
voVideoBufFree( pVOData ); voVideoBufFree(pVOData);
DiveClose( pVOData->hDive ); DiveClose(pVOData->hDive);
SDL_free( pVOData ); SDL_free(pVOData);
} }
static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd, static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
@ -135,61 +130,52 @@ static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
PRECTL prectl = NULL; PRECTL prectl = NULL;
ULONG ulRC; ULONG ulRC;
if ( !fVisible ) if (!fVisible) {
{ if (pVOData->fBlitterReady) {
if ( pVOData->fBlitterReady )
{
pVOData->fBlitterReady = FALSE; pVOData->fBlitterReady = FALSE;
DiveSetupBlitter( pVOData->hDive, 0 ); DiveSetupBlitter(pVOData->hDive, 0);
debug( "DIVE blitter is tuned off" ); debug_os2("DIVE blitter is tuned off");
} }
return TRUE; return TRUE;
} }
// Query visible rectangles /* Query visible rectangles */
hps = WinGetPS(hwnd);
hps = WinGetPS( hwnd ); hrgn = GpiCreateRegion(hps, 0, NULL);
hrgn = GpiCreateRegion( hps, 0, NULL ); if (hrgn == NULLHANDLE) {
if ( hrgn == NULLHANDLE ) WinReleasePS(hps);
{ SDL_SetError("GpiCreateRegion() failed");
WinReleasePS( hps ); } else {
SDL_SetError( "GpiCreateRegion() failed" ); WinQueryVisibleRegion(hwnd, hrgn);
} if (hrgnShape != NULLHANDLE)
else GpiCombineRegion(hps, hrgn, hrgn, hrgnShape, CRGN_AND);
{
WinQueryVisibleRegion( hwnd, hrgn );
if ( hrgnShape != NULLHANDLE )
GpiCombineRegion( hps, hrgn, hrgn, hrgnShape, CRGN_AND );
rgnCtl.ircStart = 1; rgnCtl.ircStart = 1;
rgnCtl.crc = 0; rgnCtl.crc = 0;
rgnCtl.ulDirection = 1; rgnCtl.ulDirection = 1;
GpiQueryRegionRects( hps, hrgn, NULL, &rgnCtl, NULL ); GpiQueryRegionRects(hps, hrgn, NULL, &rgnCtl, NULL);
if ( rgnCtl.crcReturned != 0 ) if (rgnCtl.crcReturned != 0) {
{ prectl = SDL_malloc(rgnCtl.crcReturned * sizeof(RECTL));
prectl = SDL_malloc( rgnCtl.crcReturned * sizeof(RECTL) ); if (prectl != NULL) {
if ( prectl != NULL )
{
rgnCtl.ircStart = 1; rgnCtl.ircStart = 1;
rgnCtl.crc = rgnCtl.crcReturned; rgnCtl.crc = rgnCtl.crcReturned;
rgnCtl.ulDirection = 1; rgnCtl.ulDirection = 1;
GpiQueryRegionRects( hps, hrgn, NULL, &rgnCtl, prectl ); GpiQueryRegionRects(hps, hrgn, NULL, &rgnCtl, prectl);
} } else {
else
SDL_OutOfMemory(); SDL_OutOfMemory();
} }
GpiDestroyRegion( hps, hrgn ); }
WinReleasePS( hps ); GpiDestroyRegion(hps, hrgn);
WinReleasePS(hps);
if ( prectl != NULL ) if (prectl != NULL) {
{ /* Setup DIVE blitter. */
// Setup DIVE blitter.
SETUP_BLITTER sSetupBlitter; SETUP_BLITTER sSetupBlitter;
SWP swp; SWP swp;
POINTL pointl = { 0 }; POINTL pointl = { 0 };
WinQueryWindowPos( hwnd, &swp ); WinQueryWindowPos(hwnd, &swp);
WinMapWindowPoints( hwnd, HWND_DESKTOP, &pointl, 1 ); WinMapWindowPoints(hwnd, HWND_DESKTOP, &pointl, 1);
sSetupBlitter.ulStructLen = sizeof(SETUP_BLITTER); sSetupBlitter.ulStructLen = sizeof(SETUP_BLITTER);
sSetupBlitter.fccSrcColorFormat = pVOData->fccColorEncoding; sSetupBlitter.fccSrcColorFormat = pVOData->fccColorEncoding;
@ -210,23 +196,22 @@ static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
sSetupBlitter.ulNumDstRects = rgnCtl.crcReturned; sSetupBlitter.ulNumDstRects = rgnCtl.crcReturned;
sSetupBlitter.pVisDstRects = prectl; sSetupBlitter.pVisDstRects = prectl;
ulRC = DiveSetupBlitter( pVOData->hDive, &sSetupBlitter ); ulRC = DiveSetupBlitter(pVOData->hDive, &sSetupBlitter);
SDL_free( prectl ); SDL_free(prectl);
if ( ulRC == DIVE_SUCCESS ) if (ulRC == DIVE_SUCCESS) {
{
pVOData->fBlitterReady = TRUE; pVOData->fBlitterReady = TRUE;
WinInvalidateRect( hwnd, NULL, TRUE ); WinInvalidateRect(hwnd, NULL, TRUE);
debug( "DIVE blitter is ready now." ); debug_os2("DIVE blitter is ready now.");
return TRUE; return TRUE;
} }
SDL_SetError( "DiveSetupBlitter(), rc = 0x%X", ulRC ); SDL_SetError("DiveSetupBlitter(), rc = 0x%X", ulRC);
} // if ( prectl != NULL ) } /* if (prectl != NULL) */
} // if ( hrgn == NULLHANDLE ) else } /* if (hrgn == NULLHANDLE) else */
pVOData->fBlitterReady = FALSE; pVOData->fBlitterReady = FALSE;
DiveSetupBlitter( pVOData->hDive, 0 ); DiveSetupBlitter(pVOData->hDive, 0);
return FALSE; return FALSE;
} }
@ -237,32 +222,30 @@ static PVOID voVideoBufAlloc(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight,
ULONG ulRC; ULONG ulRC;
ULONG ulScanLineSize = ulWidth * (ulBPP >> 3); ULONG ulScanLineSize = ulWidth * (ulBPP >> 3);
// Destroy previous buffer. /* Destroy previous buffer. */
voVideoBufFree( pVOData ); voVideoBufFree(pVOData);
if ( ( ulWidth == 0 ) || ( ulHeight == 0 ) || ( ulBPP == 0 ) ) if (ulWidth == 0 || ulHeight == 0 || ulBPP == 0)
return NULL; return NULL;
// Bytes per line. /* Bytes per line. */
ulScanLineSize = ( ulScanLineSize + 3 ) & ~3; /* 4-byte aligning */ ulScanLineSize = (ulScanLineSize + 3) & ~3; /* 4-byte aligning */
*pulScanLineSize = ulScanLineSize; *pulScanLineSize = ulScanLineSize;
ulRC = DosAllocMem( &pVOData->pBuffer, ulRC = DosAllocMem(&pVOData->pBuffer,
(ulHeight * ulScanLineSize) + sizeof(ULONG), (ulHeight * ulScanLineSize) + sizeof(ULONG),
PAG_COMMIT | PAG_EXECUTE | PAG_READ | PAG_WRITE ); PAG_COMMIT | PAG_EXECUTE | PAG_READ | PAG_WRITE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosAllocMem(), rc = %u", ulRC);
debug( "DosAllocMem(), rc = %u", ulRC );
return NULL; return NULL;
} }
ulRC = DiveAllocImageBuffer( pVOData->hDive, &pVOData->ulDIVEBufNum, ulRC = DiveAllocImageBuffer(pVOData->hDive, &pVOData->ulDIVEBufNum,
fccColorEncoding, ulWidth, ulHeight, fccColorEncoding, ulWidth, ulHeight,
ulScanLineSize, pVOData->pBuffer ); ulScanLineSize, pVOData->pBuffer);
if ( ulRC != DIVE_SUCCESS ) if (ulRC != DIVE_SUCCESS) {
{ debug_os2("DiveAllocImageBuffer(), rc = 0x%X", ulRC);
debug( "DiveAllocImageBuffer(), rc = 0x%X", ulRC ); DosFreeMem(pVOData->pBuffer);
DosFreeMem( pVOData->pBuffer );
pVOData->pBuffer = NULL; pVOData->pBuffer = NULL;
pVOData->ulDIVEBufNum = 0; pVOData->ulDIVEBufNum = 0;
return NULL; return NULL;
@ -272,8 +255,8 @@ static PVOID voVideoBufAlloc(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight,
pVOData->ulWidth = ulWidth; pVOData->ulWidth = ulWidth;
pVOData->ulHeight = ulHeight; pVOData->ulHeight = ulHeight;
debug( "buffer: 0x%P, DIVE buffer number: %u", debug_os2("buffer: 0x%P, DIVE buffer number: %u",
pVOData->pBuffer, pVOData->ulDIVEBufNum ); pVOData->pBuffer, pVOData->ulDIVEBufNum);
return pVOData->pBuffer; return pVOData->pBuffer;
} }
@ -282,23 +265,21 @@ static VOID voVideoBufFree(PVODATA pVOData)
{ {
ULONG ulRC; ULONG ulRC;
if ( pVOData->ulDIVEBufNum != 0 ) if (pVOData->ulDIVEBufNum != 0) {
{ ulRC = DiveFreeImageBuffer(pVOData->hDive, pVOData->ulDIVEBufNum);
ulRC = DiveFreeImageBuffer( pVOData->hDive, pVOData->ulDIVEBufNum ); if (ulRC != DIVE_SUCCESS) {
if ( ulRC != DIVE_SUCCESS ) debug_os2("DiveFreeImageBuffer(,%u), rc = %u", pVOData->ulDIVEBufNum, ulRC);
debug( "DiveFreeImageBuffer(,%u), rc = %u", pVOData->ulDIVEBufNum, ulRC ); } else {
else debug_os2("DIVE buffer %u destroyed", pVOData->ulDIVEBufNum);
debug( "DIVE buffer %u destroyed", pVOData->ulDIVEBufNum ); }
pVOData->ulDIVEBufNum = 0; pVOData->ulDIVEBufNum = 0;
} }
if ( pVOData->pBuffer != NULL ) if (pVOData->pBuffer != NULL) {
{ ulRC = DosFreeMem(pVOData->pBuffer);
ulRC = DosFreeMem( pVOData->pBuffer ); if (ulRC != NO_ERROR) {
if ( ulRC != NO_ERROR ) debug_os2("DosFreeMem(), rc = %u", ulRC);
debug( "DosFreeMem(), rc = %u", ulRC ); }
pVOData->pBuffer = NULL; pVOData->pBuffer = NULL;
} }
} }
@ -308,41 +289,41 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
{ {
ULONG ulRC; ULONG ulRC;
if ( !pVOData->fBlitterReady || ( pVOData->ulDIVEBufNum == 0 ) ) if (!pVOData->fBlitterReady || (pVOData->ulDIVEBufNum == 0)) {
{ debug_os2("DIVE blitter is not ready");
debug( "DIVE blitter is not ready" );
return FALSE; return FALSE;
} }
if ( pSDLRects != 0 ) if (pSDLRects != 0) {
{
PBYTE pbLineMask; PBYTE pbLineMask;
pbLineMask = SDL_stack_alloc( BYTE, pVOData->ulHeight ); pbLineMask = SDL_stack_alloc(BYTE, pVOData->ulHeight);
if ( pbLineMask == NULL ) if (pbLineMask == NULL) {
{ debug_os2("Not enough stack size");
debug( "Not enough stack size" );
return FALSE; return FALSE;
} }
memset( pbLineMask, 0, pVOData->ulHeight ); memset(pbLineMask, 0, pVOData->ulHeight);
for( ; ((LONG)cSDLRects) > 0; cSDLRects--, pSDLRects++ ) for ( ; ((LONG)cSDLRects) > 0; cSDLRects--, pSDLRects++) {
memset( &pbLineMask[pSDLRects->y], 1, pSDLRects->h ); memset(&pbLineMask[pSDLRects->y], 1, pSDLRects->h);
}
ulRC = DiveBlitImageLines( pVOData->hDive, pVOData->ulDIVEBufNum,
DIVE_BUFFER_SCREEN, pbLineMask ); ulRC = DiveBlitImageLines(pVOData->hDive, pVOData->ulDIVEBufNum,
SDL_stack_free( pbLineMask ); DIVE_BUFFER_SCREEN, pbLineMask);
SDL_stack_free(pbLineMask);
if ( ulRC != DIVE_SUCCESS )
debug( "DiveBlitImageLines(), rc = 0x%X", ulRC ); if (ulRC != DIVE_SUCCESS) {
debug_os2("DiveBlitImageLines(), rc = 0x%X", ulRC);
}
} else {
ulRC = DiveBlitImage(pVOData->hDive, pVOData->ulDIVEBufNum,
DIVE_BUFFER_SCREEN);
if (ulRC != DIVE_SUCCESS) {
debug_os2("DiveBlitImage(), rc = 0x%X", ulRC);
} }
else
{
ulRC = DiveBlitImage( pVOData->hDive, pVOData->ulDIVEBufNum,
DIVE_BUFFER_SCREEN );
if ( ulRC != DIVE_SUCCESS )
debug( "DiveBlitImage(), rc = 0x%X", ulRC );
} }
return ulRC == DIVE_SUCCESS; return ulRC == DIVE_SUCCESS;
} }
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -37,11 +37,11 @@
typedef struct _MSGBOXDLGDATA { typedef struct _MSGBOXDLGDATA {
USHORT cb; USHORT cb;
HWND hwndUnder; HWND hwndUnder;
} MSGBOXDLGDATA, *PMSGBOXDLGDATA; } MSGBOXDLGDATA;
static VOID _wmInitDlg(HWND hwnd, PMSGBOXDLGDATA pDlgData) static VOID _wmInitDlg(HWND hwnd, MSGBOXDLGDATA *pDlgData)
{ {
HPS hps = WinGetPS( hwnd ); HPS hps = WinGetPS(hwnd);
POINTL aptText[TXTBOX_COUNT]; POINTL aptText[TXTBOX_COUNT];
HENUM hEnum; HENUM hEnum;
HWND hWndNext; HWND hWndNext;
@ -54,155 +54,146 @@ static VOID _wmInitDlg(HWND hwnd, PMSGBOXDLGDATA pDlgData)
ULONG ulX; ULONG ulX;
ULONG ulIdx; ULONG ulIdx;
struct _BUTTON { struct _BUTTON {
HWND hwnd; // Button window handle. HWND hwnd; /* Button window handle. */
ULONG ulCX; // Button width in dialog coordinates. ULONG ulCX; /* Button width in dialog coordinates. */
} aButtons[32]; } aButtons[32];
RECTL rectlItem; RECTL rectlItem;
HAB hab = WinQueryAnchorBlock( hwnd ); HAB hab = WinQueryAnchorBlock(hwnd);
/* --- Align the buttons to the right/bottom. --- */ /* --- Align the buttons to the right/bottom. --- */
// Collect window handles of all buttons in dialog. /* Collect window handles of all buttons in dialog. */
hEnum = WinBeginEnumWindows(hwnd);
hEnum = WinBeginEnumWindows( hwnd ); while ((hWndNext = WinGetNextWindow(hEnum)) != NULLHANDLE) {
if (WinQueryClassName(hWndNext, sizeof(acBuf), acBuf) == 0)
while( ( hWndNext = WinGetNextWindow( hEnum ) ) != NULLHANDLE )
{
if ( WinQueryClassName( hWndNext, sizeof(acBuf), acBuf ) == 0 )
continue; continue;
if ( strcmp( acBuf, "#3" ) == 0 ) // Class name of button. if (strcmp(acBuf, "#3") == 0) { /* Class name of button. */
{ if (cButtons < sizeof(aButtons) / sizeof(struct _BUTTON)) {
if ( cButtons < sizeof(aButtons) / sizeof(struct _BUTTON) )
{
aButtons[cButtons].hwnd = hWndNext; aButtons[cButtons].hwnd = hWndNext;
cButtons++; cButtons++;
} }
} }
} }
WinEndEnumWindows( hEnum ); WinEndEnumWindows(hEnum);
// Query size of text for each button, get width of each button, total /* Query size of text for each button, get width of each button, total
// buttons width (ulButtonsCX) and max. height (ulButtonsCX) in _dialog * buttons width (ulButtonsCX) and max. height (ulButtonsCX) in _dialog
// coordinates_. * coordinates_. */
hps = WinGetPS(hwnd);
hps = WinGetPS( hwnd ); for(ulIdx = 0; ulIdx < cButtons; ulIdx++) {
/* Query size of text in window coordinates. */
for( ulIdx = 0; ulIdx < cButtons; ulIdx++ ) cbBuf = WinQueryWindowText(aButtons[ulIdx].hwnd, sizeof(acBuf), acBuf);
{ GpiQueryTextBox(hps, cbBuf, acBuf, TXTBOX_COUNT, aptText);
// Query size of text in window coordinates.
cbBuf = WinQueryWindowText( aButtons[ulIdx].hwnd, sizeof(acBuf), acBuf );
GpiQueryTextBox( hps, cbBuf, acBuf, TXTBOX_COUNT, aptText );
aptText[TXTBOX_TOPRIGHT].x -= aptText[TXTBOX_BOTTOMLEFT].x; aptText[TXTBOX_TOPRIGHT].x -= aptText[TXTBOX_BOTTOMLEFT].x;
aptText[TXTBOX_TOPRIGHT].y -= aptText[TXTBOX_BOTTOMLEFT].y; aptText[TXTBOX_TOPRIGHT].y -= aptText[TXTBOX_BOTTOMLEFT].y;
// Convert text size to dialog coordinates. /* Convert text size to dialog coordinates. */
WinMapDlgPoints( hwnd, &aptText[TXTBOX_TOPRIGHT], 1, FALSE ); WinMapDlgPoints(hwnd, &aptText[TXTBOX_TOPRIGHT], 1, FALSE);
// Add vertical and horizontal space for button's frame (dialog coord.). /* Add vertical and horizontal space for button's frame (dialog coord.). */
if ( aptText[TXTBOX_TOPRIGHT].x < 30 ) // Minimal button width. if (aptText[TXTBOX_TOPRIGHT].x < 30) {/* Minimal button width. */
aptText[TXTBOX_TOPRIGHT].x = 30; aptText[TXTBOX_TOPRIGHT].x = 30;
else } else {
aptText[TXTBOX_TOPRIGHT].x += 4; aptText[TXTBOX_TOPRIGHT].x += 4;
}
aptText[TXTBOX_TOPRIGHT].y += 3; aptText[TXTBOX_TOPRIGHT].y += 3;
aButtons[ulIdx].ulCX = aptText[TXTBOX_TOPRIGHT].x; // Store button width. aButtons[ulIdx].ulCX = aptText[TXTBOX_TOPRIGHT].x; /* Store button width */
ulButtonsCX += aptText[TXTBOX_TOPRIGHT].x + 2; // Add total btn. width. ulButtonsCX += aptText[TXTBOX_TOPRIGHT].x + 2; /* Add total btn. width */
// Get max. height for buttons. /* Get max. height for buttons. */
if ( ulButtonsCY < aptText[TXTBOX_TOPRIGHT].y ) if (ulButtonsCY < aptText[TXTBOX_TOPRIGHT].y)
ulButtonsCY = aptText[TXTBOX_TOPRIGHT].y + 1; ulButtonsCY = aptText[TXTBOX_TOPRIGHT].y + 1;
} }
WinReleasePS( hps ); WinReleasePS(hps);
// Expand horizontal size of the window to fit all buttons and move window /* Expand horizontal size of the window to fit all buttons and move window
// to the center of parent window. * to the center of parent window. */
// Convert total width of buttons to window coordinates. /* Convert total width of buttons to window coordinates. */
aptText[0].x = ulButtonsCX + 4; aptText[0].x = ulButtonsCX + 4;
WinMapDlgPoints( hwnd, &aptText[0], 1, TRUE ); WinMapDlgPoints(hwnd, &aptText[0], 1, TRUE);
// Check width of the window and expand as needed. /* Check width of the window and expand as needed. */
WinQueryWindowRect( hwnd, &rectlItem ); WinQueryWindowRect(hwnd, &rectlItem);
if ( rectlItem.xRight <= aptText[0].x ) if (rectlItem.xRight <= aptText[0].x)
rectlItem.xRight = aptText[0].x; rectlItem.xRight = aptText[0].x;
// Move window rectangle to the center of owner window. /* Move window rectangle to the center of owner window. */
WinQueryWindowRect( pDlgData->hwndUnder, &rectl ); WinQueryWindowRect(pDlgData->hwndUnder, &rectl);
// Left-bottom point of centered dialog on owner window. /* Left-bottom point of centered dialog on owner window. */
rectl.xLeft = ( rectl.xRight - rectlItem.xRight ) / 2; rectl.xLeft = (rectl.xRight - rectlItem.xRight) / 2;
rectl.yBottom = ( rectl.yTop - rectlItem.yTop ) / 2; rectl.yBottom = (rectl.yTop - rectlItem.yTop) / 2;
// Map left-bottom point to desktop. /* Map left-bottom point to desktop. */
WinMapWindowPoints( pDlgData->hwndUnder, HWND_DESKTOP, (PPOINTL)&rectl, 1 ); WinMapWindowPoints(pDlgData->hwndUnder, HWND_DESKTOP, (PPOINTL)&rectl, 1);
WinOffsetRect( hab, &rectlItem, rectl.xLeft, rectl.yBottom ); WinOffsetRect(hab, &rectlItem, rectl.xLeft, rectl.yBottom);
// Set new rectangle for the window. /* Set new rectangle for the window. */
WinSetWindowPos( hwnd, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom, WinSetWindowPos(hwnd, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom,
rectlItem.xRight - rectlItem.xLeft, rectlItem.xRight - rectlItem.xLeft,
rectlItem.yTop - rectlItem.yBottom, rectlItem.yTop - rectlItem.yBottom,
SWP_SIZE | SWP_MOVE ); SWP_SIZE | SWP_MOVE);
// Set buttons positions. /* Set buttons positions. */
// Get horizontal position for the first button. /* Get horizontal position for the first button. */
WinMapDlgPoints( hwnd, (PPOINTL)&rectlItem, 2, FALSE ); // Win size to dlg coord. WinMapDlgPoints(hwnd, (PPOINTL)&rectlItem, 2, FALSE); /* Win size to dlg coord. */
ulX = rectlItem.xRight - rectlItem.xLeft - ulButtonsCX - 2; // First button position. ulX = rectlItem.xRight - rectlItem.xLeft - ulButtonsCX - 2; /* First button position. */
// Set positions and sizes for all buttons. /* Set positions and sizes for all buttons. */
for( ulIdx = 0; ulIdx < cButtons; ulIdx++ ) for (ulIdx = 0; ulIdx < cButtons; ulIdx++) {
{ /* Get poisition and size for the button in dialog coordinates. */
// Get poisition and size for the button in dialog coordinates.
aptText[0].x = ulX; aptText[0].x = ulX;
aptText[0].y = 2; aptText[0].y = 2;
aptText[1].x = aButtons[ulIdx].ulCX; aptText[1].x = aButtons[ulIdx].ulCX;
aptText[1].y = ulButtonsCY; aptText[1].y = ulButtonsCY;
// Convert to window coordinates. /* Convert to window coordinates. */
WinMapDlgPoints( hwnd, aptText, 2, TRUE ); WinMapDlgPoints(hwnd, aptText, 2, TRUE);
WinSetWindowPos( aButtons[ulIdx].hwnd, HWND_TOP, WinSetWindowPos(aButtons[ulIdx].hwnd, HWND_TOP,
aptText[0].x, aptText[0].y, aptText[1].x, aptText[1].y, aptText[0].x, aptText[0].y, aptText[1].x, aptText[1].y,
SWP_MOVE | SWP_SIZE ); SWP_MOVE | SWP_SIZE);
// Offset horizontal position for the next button. /* Offset horizontal position for the next button. */
ulX += aButtons[ulIdx].ulCX + 2; ulX += aButtons[ulIdx].ulCX + 2;
} }
// Set right bound of the text to right bound of the last button and /* Set right bound of the text to right bound of the last button and
// bottom bound of the text just above the buttons. * bottom bound of the text just above the buttons. */
aptText[2].x = 25; // Left bound of text in dlg coordinates. aptText[2].x = 25; /* Left bound of text in dlg coordinates. */
aptText[2].y = ulButtonsCY + 3; // Bottom bound of the text in dlg coords. aptText[2].y = ulButtonsCY + 3; /* Bottom bound of the text in dlg coords. */
WinMapDlgPoints( hwnd, &aptText[2], 1, TRUE ); // Convert ^^^ to win. coords. WinMapDlgPoints(hwnd, &aptText[2], 1, TRUE); /* Convert ^^^ to win. coords */
hWndNext = WinWindowFromID( hwnd, IDD_TEXT_MESSAGE ); hWndNext = WinWindowFromID(hwnd, IDD_TEXT_MESSAGE);
WinQueryWindowRect( hWndNext, &rectlItem ); WinQueryWindowRect(hWndNext, &rectlItem);
rectlItem.xLeft = aptText[2].x; rectlItem.xLeft = aptText[2].x;
rectlItem.yBottom = aptText[2].y; rectlItem.yBottom = aptText[2].y;
// Right bound of the text equals right bound of the last button. /* Right bound of the text equals right bound of the last button. */
rectlItem.xRight = aptText[0].x + aptText[1].x; rectlItem.xRight = aptText[0].x + aptText[1].x;
WinSetWindowPos( hWndNext, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom, WinSetWindowPos(hWndNext, HWND_TOP, rectlItem.xLeft, rectlItem.yBottom,
rectlItem.xRight - rectlItem.xLeft, rectlItem.xRight - rectlItem.xLeft,
rectlItem.yTop - rectlItem.yBottom, rectlItem.yTop - rectlItem.yBottom,
SWP_MOVE | SWP_SIZE ); SWP_MOVE | SWP_SIZE);
} }
MRESULT EXPENTRY DynDlgProc(HWND hwnd, USHORT message, MPARAM mp1, MPARAM mp2) MRESULT EXPENTRY DynDlgProc(HWND hwnd, USHORT message, MPARAM mp1, MPARAM mp2)
{ {
switch( message ) switch (message) {
{
case WM_INITDLG: case WM_INITDLG:
_wmInitDlg( hwnd, (PMSGBOXDLGDATA)mp2 ); _wmInitDlg(hwnd, (MSGBOXDLGDATA*)mp2);
break; break;
case WM_COMMAND: case WM_COMMAND:
switch( SHORT1FROMMP(mp1) ) switch (SHORT1FROMMP(mp1)) {
{
case DID_OK: case DID_OK:
WinDismissDlg( hwnd, FALSE ); WinDismissDlg(hwnd, FALSE);
break; break;
default: default:
break; break;
} }
default: default:
return( WinDefDlgProc( hwnd, message, mp1, mp2 ) ); return(WinDefDlgProc(hwnd, message, mp1, mp2));
} }
return FALSE; return FALSE;
@ -210,16 +201,14 @@ MRESULT EXPENTRY DynDlgProc(HWND hwnd, USHORT message, MPARAM mp1, MPARAM mp2)
static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata) static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
{ {
SDL_MessageBoxButtonData *pSDLBtnData = SDL_MessageBoxButtonData*
(SDL_MessageBoxButtonData *)messageboxdata->buttons; pSDLBtnData = (SDL_MessageBoxButtonData *)messageboxdata->buttons;
ULONG cSDLBtnData = messageboxdata->numbuttons; ULONG cSDLBtnData = messageboxdata->numbuttons;
PSZ pszTitle = OS2_UTF8ToSys( (PSZ)messageboxdata->title ); PSZ pszTitle = OS2_UTF8ToSys((PSZ) messageboxdata->title);
ULONG cbTitle = pszTitle == NULL ? ULONG cbTitle = (pszTitle == NULL)? 0 : strlen(pszTitle);
0 : strlen( pszTitle ); PSZ pszText = OS2_UTF8ToSys((PSZ) messageboxdata->message);
PSZ pszText = OS2_UTF8ToSys( (PSZ)messageboxdata->message ); ULONG cbText = (pszText == NULL)? 0 : strlen(pszText);
ULONG cbText = pszText == NULL ?
0 : strlen( pszText );
PDLGTEMPLATE pTemplate; PDLGTEMPLATE pTemplate;
ULONG cbTemplate; ULONG cbTemplate;
@ -229,38 +218,36 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
PSZ pszBtnText; PSZ pszBtnText;
ULONG cbBtnText; ULONG cbBtnText;
HWND hwnd; HWND hwnd;
const SDL_MessageBoxColor *pSDLColors = (messageboxdata->colorScheme == NULL)? NULL : messageboxdata->colorScheme->colors; const SDL_MessageBoxColor* pSDLColors = (messageboxdata->colorScheme == NULL)?
const SDL_MessageBoxColor *pSDLColor; NULL : messageboxdata->colorScheme->colors;
const SDL_MessageBoxColor* pSDLColor;
MSGBOXDLGDATA stDlgData; MSGBOXDLGDATA stDlgData;
/* Build a dialog tamplate in memory */ /* Build a dialog tamplate in memory */
// Size of template (cbTemplate). /* Size of template (cbTemplate). */
cbTemplate = sizeof(DLGTEMPLATE) + ((2 + cSDLBtnData) * sizeof(DLGTITEM)) +
cbTemplate = sizeof(DLGTEMPLATE) + ( (2 + cSDLBtnData) * sizeof(DLGTITEM) ) + sizeof(ULONG) + // First item data - frame control data. */
sizeof(ULONG) + // First item data - frame control data. cbTitle + 1 + // First item data - frame title + ZERO. */
cbTitle + 1 + // First item data - frame title + ZERO. cbText + 1 + // Second item data - ststic text + ZERO.*/
cbText + 1 + // Second item data - ststic text + ZERO. 3; /* Third item data - system icon Id. */
3; // Third item data - system icon Id. /* Button items datas - text for buttons. */
// Button items datas - text for buttons. for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++) {
for( ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++ )
{
pszBtnText = (PSZ)pSDLBtnData[ulIdx].text; pszBtnText = (PSZ)pSDLBtnData[ulIdx].text;
cbTemplate += pszBtnText == NULL ? 1 : ( strlen( pszBtnText ) + 1 ); cbTemplate += (pszBtnText == NULL)? 1 : (strlen(pszBtnText) + 1);
} }
// Presentation parameter space. /* Presentation parameter space. */
if ( pSDLColors != NULL ) if (pSDLColors != NULL)
cbTemplate += 26 /* PP for frame. */ + 26 /* PP for static text. */ + cbTemplate += 26 /* PP for frame. */ + 26 /* PP for static text. */ +
( 48 * cSDLBtnData ); /* PP for buttons. */ (48 * cSDLBtnData); /* PP for buttons. */
// Allocate memory for the dialog template. /* Allocate memory for the dialog template. */
pTemplate = (PDLGTEMPLATE) SDL_malloc( cbTemplate ); pTemplate = (PDLGTEMPLATE) SDL_malloc(cbTemplate);
// Pointer on data for dialog items in allocated memory. /* Pointer on data for dialog items in allocated memory. */
pcDlgData = &((PCHAR)pTemplate)[ sizeof(DLGTEMPLATE) + pcDlgData = &((PCHAR)pTemplate)[sizeof(DLGTEMPLATE) +
( (2 + cSDLBtnData) * sizeof(DLGTITEM) ) ]; ((2 + cSDLBtnData) * sizeof(DLGTITEM))];
/* Header info */ /* Header info */
pTemplate->cbTemplate = cbTemplate; /* size of dialog template to pass to WinCreateDlg() */ pTemplate->cbTemplate = cbTemplate; /* size of dialog template to pass to WinCreateDlg() */
pTemplate->type = 0; /* Currently always 0. */ pTemplate->type = 0; /* Currently always 0. */
pTemplate->codepage = 0; pTemplate->codepage = 0;
@ -273,7 +260,6 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pTemplate->coffPresParams = 0; pTemplate->coffPresParams = 0;
/* First item info - frame */ /* First item info - frame */
pDlgItem = pTemplate->adlgti; pDlgItem = pTemplate->adlgti;
pDlgItem->fsItemStatus = 0; /* Reserved? */ pDlgItem->fsItemStatus = 0; /* Reserved? */
/* Number of dialog item child windows owned by this item. */ /* Number of dialog item child windows owned by this item. */
@ -285,10 +271,11 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->cchText = cbTitle + 1; /* +1 - trailing ZERO. */ pDlgItem->cchText = cbTitle + 1; /* +1 - trailing ZERO. */
pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to title text. */ pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to title text. */
/* Copy text for the title into the dialog template. */ /* Copy text for the title into the dialog template. */
if ( pszTitle != NULL ) if (pszTitle != NULL) {
strcpy( pcDlgData, pszTitle ); strcpy(pcDlgData, pszTitle);
else } else {
*pcDlgData = '\0'; *pcDlgData = '\0';
}
pcDlgData += pDlgItem->cchText; pcDlgData += pDlgItem->cchText;
pDlgItem->flStyle = WS_GROUP | WS_VISIBLE | WS_CLIPSIBLINGS | pDlgItem->flStyle = WS_GROUP | WS_VISIBLE | WS_CLIPSIBLINGS |
@ -298,11 +285,10 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->cx = 175; pDlgItem->cx = 175;
pDlgItem->cy = 65; pDlgItem->cy = 65;
pDlgItem->id = DID_OK; /* An ID value? */ pDlgItem->id = DID_OK; /* An ID value? */
if ( pSDLColors == NULL ) if (pSDLColors == NULL)
pDlgItem->offPresParams = 0; pDlgItem->offPresParams = 0;
else else {
{ /* Presentation parameter for the frame - dialog colors. */
// Presentation parameter for the frame - dialog colors.
pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate; pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
((PPRESPARAMS)pcDlgData)->cb = 22; ((PPRESPARAMS)pcDlgData)->cb = 22;
pcDlgData += 4; pcDlgData += 4;
@ -327,7 +313,6 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pcDlgData += sizeof(ULONG); pcDlgData += sizeof(ULONG);
/* Second item info - static text (message). */ /* Second item info - static text (message). */
pDlgItem++; pDlgItem++;
pDlgItem->fsItemStatus = 0; pDlgItem->fsItemStatus = 0;
/* No children since its a control, it could have child control */ /* No children since its a control, it could have child control */
@ -340,25 +325,25 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->cchText = cbText + 1; pDlgItem->cchText = cbText + 1;
pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the text. */ pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the text. */
/* Copy message text into the dialog template. */ /* Copy message text into the dialog template. */
if ( pszText != NULL ) if (pszText != NULL) {
strcpy( pcDlgData, pszText ); strcpy(pcDlgData, pszText);
else } else {
*pcDlgData = '\0'; *pcDlgData = '\0';
}
pcDlgData += pDlgItem->cchText; pcDlgData += pDlgItem->cchText;
pDlgItem->flStyle = SS_TEXT | DT_TOP | DT_LEFT | DT_WORDBREAK | WS_VISIBLE; pDlgItem->flStyle = SS_TEXT | DT_TOP | DT_LEFT | DT_WORDBREAK | WS_VISIBLE;
// It will be really set in _wmInitDlg(). /* It will be really set in _wmInitDlg(). */
pDlgItem->x = 25; pDlgItem->x = 25;
pDlgItem->y = 13; pDlgItem->y = 13;
pDlgItem->cx = 147; pDlgItem->cx = 147;
pDlgItem->cy = 62; // It will be used. pDlgItem->cy = 62; /* It will be used. */
pDlgItem->id = IDD_TEXT_MESSAGE; /* an ID value */ pDlgItem->id = IDD_TEXT_MESSAGE; /* an ID value */
if ( pSDLColors == NULL ) if (pSDLColors == NULL)
pDlgItem->offPresParams = 0; pDlgItem->offPresParams = 0;
else else {
{ /* Presentation parameter for the static text - dialog colors. */
// Presentation parameter for the static text - dialog colors.
pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate; pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
((PPRESPARAMS)pcDlgData)->cb = 22; ((PPRESPARAMS)pcDlgData)->cb = 22;
pcDlgData += 4; pcDlgData += 4;
@ -378,29 +363,27 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->offCtlData = 0; pDlgItem->offCtlData = 0;
/* Third item info - static bitmap. */ /* Third item info - static bitmap. */
pDlgItem++; pDlgItem++;
pDlgItem->fsItemStatus = 0; pDlgItem->fsItemStatus = 0;
pDlgItem->cChildren = 0; pDlgItem->cChildren = 0;
pDlgItem->cchClassName = 0; pDlgItem->cchClassName = 0;
pDlgItem->offClassName = (USHORT)WC_STATIC; pDlgItem->offClassName = (USHORT)WC_STATIC;
pDlgItem->cchText = 3; // 0xFF, low byte of the icon Id, high byte of icon Id. pDlgItem->cchText = 3; /* 0xFF, low byte of the icon Id, high byte of icon Id. */
pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the Id. */ pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the Id. */
/* Write susyem icon ID into dialog template. */ /* Write susyem icon ID into dialog template. */
*pcDlgData = 0xFF; // First byte is 0xFF - next 2 bytes is system pointer Id. *pcDlgData = 0xFF; /* First byte is 0xFF - next 2 bytes is system pointer Id. */
pcDlgData++; pcDlgData++;
*((PUSHORT)pcDlgData) = *((PUSHORT)pcDlgData) = ((messageboxdata->flags & SDL_MESSAGEBOX_ERROR) != 0)?
(messageboxdata->flags & SDL_MESSAGEBOX_ERROR) != 0 SPTR_ICONERROR :
? SPTR_ICONERROR ((messageboxdata->flags & SDL_MESSAGEBOX_WARNING) != 0)?
: (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) != 0 SPTR_ICONWARNING : SPTR_ICONINFORMATION;
? SPTR_ICONWARNING : SPTR_ICONINFORMATION;
pcDlgData += 2; pcDlgData += 2;
pDlgItem->flStyle = SS_SYSICON | WS_VISIBLE; pDlgItem->flStyle = SS_SYSICON | WS_VISIBLE;
pDlgItem->x = 4; pDlgItem->x = 4;
pDlgItem->y = 45; // It will be really set in _wmInitDlg(). pDlgItem->y = 45; /* It will be really set in _wmInitDlg(). */
pDlgItem->cx = 0; pDlgItem->cx = 0;
pDlgItem->cy = 0; pDlgItem->cy = 0;
@ -409,9 +392,7 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->offCtlData = 0; pDlgItem->offCtlData = 0;
/* Next items - buttons. */ /* Next items - buttons. */
for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++) {
for( ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++ )
{
pDlgItem++; pDlgItem++;
pDlgItem->fsItemStatus = 0; pDlgItem->fsItemStatus = 0;
@ -419,41 +400,39 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
pDlgItem->cchClassName = 0; /* 0 - offClassname is WC_ constant. */ pDlgItem->cchClassName = 0; /* 0 - offClassname is WC_ constant. */
pDlgItem->offClassName = (USHORT)WC_BUTTON; pDlgItem->offClassName = (USHORT)WC_BUTTON;
pszBtnText = OS2_UTF8ToSys( (PSZ)pSDLBtnData[ulIdx].text ); pszBtnText = OS2_UTF8ToSys((PSZ)pSDLBtnData[ulIdx].text);
cbBtnText = ( pszBtnText == NULL ? cbBtnText = (pszBtnText == NULL)? 0 : strlen(pszBtnText);
0 : strlen( pszBtnText ) );
pDlgItem->cchText = cbBtnText + 1; pDlgItem->cchText = cbBtnText + 1;
pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the text. */ pDlgItem->offText = pcDlgData - (PCHAR)pTemplate; /* Offset to the text. */
/* Copy text for the button into the dialog template. */ /* Copy text for the button into the dialog template. */
if ( pszBtnText != NULL ) if (pszBtnText != NULL) {
strcpy( pcDlgData, pszBtnText ); strcpy(pcDlgData, pszBtnText);
else } else {
*pcDlgData = '\0'; *pcDlgData = '\0';
}
pcDlgData += pDlgItem->cchText; pcDlgData += pDlgItem->cchText;
SDL_free( pszBtnText ); SDL_free(pszBtnText);
pDlgItem->flStyle = BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE; pDlgItem->flStyle = BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE;
if ( pSDLBtnData[ulIdx].flags == SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT ) if (pSDLBtnData[ulIdx].flags == SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) {
{
pDlgItem->flStyle |= BS_DEFAULT; pDlgItem->flStyle |= BS_DEFAULT;
pTemplate->iItemFocus = ulIdx + 3; // +3 - frame, static text and icon. pTemplate->iItemFocus = ulIdx + 3; /* +3 - frame, static text and icon. */
pSDLColor = &pSDLColors[SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED]; pSDLColor = &pSDLColors[SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED];
} } else {
else
pSDLColor = &pSDLColors[SDL_MESSAGEBOX_COLOR_TEXT]; pSDLColor = &pSDLColors[SDL_MESSAGEBOX_COLOR_TEXT];
}
// It will be really set in _wmInitDlg() /* It will be really set in _wmInitDlg() */
pDlgItem->x = 10; pDlgItem->x = 10;
pDlgItem->y = 10; pDlgItem->y = 10;
pDlgItem->cx = 70; pDlgItem->cx = 70;
pDlgItem->cy = 15; pDlgItem->cy = 15;
pDlgItem->id = IDD_PB_FIRST + ulIdx; /* an ID value */ pDlgItem->id = IDD_PB_FIRST + ulIdx; /* an ID value */
if ( pSDLColors == NULL ) if (pSDLColors == NULL)
pDlgItem->offPresParams = 0; pDlgItem->offPresParams = 0;
else else {
{ /* Presentation parameter for the button - dialog colors. */
// Presentation parameter for the button - dialog colors.
pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate; pDlgItem->offPresParams = pcDlgData - (PCHAR)pTemplate;
((PPRESPARAMS)pcDlgData)->cb = 44; ((PPRESPARAMS)pcDlgData)->cb = 44;
pcDlgData += 4; pcDlgData += 4;
@ -484,22 +463,19 @@ static HWND _makeDlg(const SDL_MessageBoxData *messageboxdata)
} }
pDlgItem->offCtlData = 0; pDlgItem->offCtlData = 0;
} }
// Check, end of templ. data: &((PCHAR)pTemplate)[cbTemplate] == pcDlgData /* Check, end of templ. data: &((PCHAR)pTemplate)[cbTemplate] == pcDlgData */
// Create the dialog from template.
/* Create the dialog from template. */
stDlgData.cb = sizeof(MSGBOXDLGDATA); stDlgData.cb = sizeof(MSGBOXDLGDATA);
stDlgData.hwndUnder = ( messageboxdata->window != NULL ) && stDlgData.hwndUnder = (messageboxdata->window != NULL && messageboxdata->window->driverdata != NULL)?
( messageboxdata->window->driverdata != NULL ) ((WINDATA *)messageboxdata->window->driverdata)->hwnd : HWND_DESKTOP;
? ((PWINDATA)messageboxdata->window->driverdata)->hwnd
: HWND_DESKTOP;
hwnd = WinCreateDlg( HWND_DESKTOP, // Parent is desktop. hwnd = WinCreateDlg(HWND_DESKTOP, /* Parent is desktop. */
stDlgData.hwndUnder, stDlgData.hwndUnder,
(PFNWP)DynDlgProc, pTemplate, &stDlgData ); (PFNWP)DynDlgProc, pTemplate, &stDlgData);
SDL_free( pTemplate ); SDL_free(pTemplate);
SDL_free( pszTitle ); SDL_free(pszTitle);
SDL_free( pszText ); SDL_free(pszText);
return hwnd; return hwnd;
} }
@ -510,80 +486,68 @@ int OS2_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
HWND hwnd; HWND hwnd;
ULONG ulRC; ULONG ulRC;
SDL_MessageBoxButtonData SDL_MessageBoxButtonData
*pSDLBtnData = *pSDLBtnData = (SDL_MessageBoxButtonData *)messageboxdata->buttons;
(SDL_MessageBoxButtonData *)messageboxdata->buttons;
ULONG cSDLBtnData = messageboxdata->numbuttons; ULONG cSDLBtnData = messageboxdata->numbuttons;
BOOL fVideoInitialized = SDL_WasInit( SDL_INIT_VIDEO ); BOOL fVideoInitialized = SDL_WasInit(SDL_INIT_VIDEO);
HAB hab; HAB hab;
HMQ hmq; HMQ hmq;
BOOL fSuccess = FALSE; BOOL fSuccess = FALSE;
if ( !fVideoInitialized ) if (!fVideoInitialized) {
{
PTIB tib; PTIB tib;
PPIB pib; PPIB pib;
DosGetInfoBlocks( &tib, &pib ); DosGetInfoBlocks(&tib, &pib);
if ( pib->pib_ultype == 2 || pib->pib_ultype == 0 ) if (pib->pib_ultype == 2 || pib->pib_ultype == 0) {
{ /* VIO windowable or fullscreen protect-mode session */
// VIO windowable or fullscreen protect-mode session. pib->pib_ultype = 3; /* Presentation Manager protect-mode session */
pib->pib_ultype = 3; // Presentation Manager protect-mode session.
} }
hab = WinInitialize( 0 ); hab = WinInitialize(0);
if ( hab == NULLHANDLE ) if (hab == NULLHANDLE) {
{ debug_os2("WinInitialize() failed");
debug( "WinInitialize() failed" );
return -1; return -1;
} }
hmq = WinCreateMsgQueue( hab, 0 ); hmq = WinCreateMsgQueue(hab, 0);
if ( hmq == NULLHANDLE ) if (hmq == NULLHANDLE) {
{ debug_os2("WinCreateMsgQueue() failed");
debug( "WinCreateMsgQueue() failed" );
return -1; return -1;
} }
} }
// Create dynamic dialog. /* Create dynamic dialog. */
hwnd = _makeDlg( messageboxdata ); hwnd = _makeDlg(messageboxdata);
// Show dialog and obtain button Id. /* Show dialog and obtain button Id. */
ulRC = WinProcessDlg( hwnd ); ulRC = WinProcessDlg(hwnd);
// Destroy dialog, /* Destroy dialog, */
WinDestroyWindow( hwnd ); WinDestroyWindow(hwnd);
if ( ulRC == DID_CANCEL ) if (ulRC == DID_CANCEL) {
{ /* Window closed by ESC, Alt+F4 or system menu. */
// Window closed by ESC, Alt+F4 or system menu.
ULONG ulIdx; ULONG ulIdx;
for( ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++, pSDLBtnData++ ) for (ulIdx = 0; ulIdx < cSDLBtnData; ulIdx++, pSDLBtnData++) {
{ if (pSDLBtnData->flags == SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) {
if ( pSDLBtnData->flags == SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT )
{
*buttonid = pSDLBtnData->buttonid; *buttonid = pSDLBtnData->buttonid;
fSuccess = TRUE; fSuccess = TRUE;
break; break;
} }
} }
} } else {
else /* Button pressed. */
{
// Button pressed.
ulRC -= IDD_PB_FIRST; ulRC -= IDD_PB_FIRST;
if ( ulRC < cSDLBtnData ) if (ulRC < cSDLBtnData) {
{
*buttonid = pSDLBtnData[ulRC].buttonid; *buttonid = pSDLBtnData[ulRC].buttonid;
fSuccess = TRUE; fSuccess = TRUE;
} }
} }
if ( !fVideoInitialized ) if (!fVideoInitialized) {
{ WinDestroyMsgQueue(hmq);
WinDestroyMsgQueue( hmq ); WinTerminate(hab);
WinTerminate( hab );
} }
return fSuccess ? 0 : -1; return (fSuccess)? 0 : -1;
} }
#endif /* SDL_VIDEO_DRIVER_OS2 */ #endif /* SDL_VIDEO_DRIVER_OS2 */

View File

@ -30,26 +30,24 @@ HPOINTER hptrCursor = NULLHANDLE;
static SDL_Cursor* OS2_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y) static SDL_Cursor* OS2_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y)
{ {
ULONG ulMaxW = WinQuerySysValue( HWND_DESKTOP, SV_CXPOINTER ); ULONG ulMaxW = WinQuerySysValue(HWND_DESKTOP, SV_CXPOINTER);
ULONG ulMaxH = WinQuerySysValue( HWND_DESKTOP, SV_CYPOINTER ); ULONG ulMaxH = WinQuerySysValue(HWND_DESKTOP, SV_CYPOINTER);
HPOINTER hptr; HPOINTER hptr;
SDL_Cursor *pSDLCursor; SDL_Cursor* pSDLCursor;
if ( ( surface->w > ulMaxW ) || ( surface->h > ulMaxH ) ) if (surface->w > ulMaxW || surface->h > ulMaxH) {
{ debug_os2("Given image size is %u x %u, maximum allowed size is %u x %u",
debug( "Given image size is %u x %u, maximum allowed size is %u x %u", surface->w, surface->h, ulMaxW, ulMaxH);
surface->w, surface->h, ulMaxW, ulMaxH );
return NULL; return NULL;
} }
hptr = utilCreatePointer( surface, hot_x, ulMaxH - hot_y - 1 ); hptr = utilCreatePointer(surface, hot_x, ulMaxH - hot_y - 1);
if ( hptr == NULLHANDLE ) if (hptr == NULLHANDLE)
return NULL; return NULL;
pSDLCursor = SDL_calloc( 1, sizeof(SDL_Cursor) ); pSDLCursor = SDL_calloc(1, sizeof(SDL_Cursor));
if ( pSDLCursor == NULL ) if (pSDLCursor == NULL) {
{ WinDestroyPointer(hptr);
WinDestroyPointer( hptr );
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
@ -64,8 +62,7 @@ static SDL_Cursor* OS2_CreateSystemCursor(SDL_SystemCursor id)
LONG lSysId; LONG lSysId;
HPOINTER hptr; HPOINTER hptr;
switch( id ) switch (id) {
{
case SDL_SYSTEM_CURSOR_ARROW: lSysId = SPTR_ARROW; break; case SDL_SYSTEM_CURSOR_ARROW: lSysId = SPTR_ARROW; break;
case SDL_SYSTEM_CURSOR_IBEAM: lSysId = SPTR_TEXT; break; case SDL_SYSTEM_CURSOR_IBEAM: lSysId = SPTR_TEXT; break;
case SDL_SYSTEM_CURSOR_WAIT: lSysId = SPTR_WAIT; break; case SDL_SYSTEM_CURSOR_WAIT: lSysId = SPTR_WAIT; break;
@ -79,25 +76,23 @@ static SDL_Cursor* OS2_CreateSystemCursor(SDL_SystemCursor id)
case SDL_SYSTEM_CURSOR_NO: lSysId = SPTR_ILLEGAL; break; case SDL_SYSTEM_CURSOR_NO: lSysId = SPTR_ILLEGAL; break;
case SDL_SYSTEM_CURSOR_HAND: lSysId = SPTR_ARROW; break; case SDL_SYSTEM_CURSOR_HAND: lSysId = SPTR_ARROW; break;
default: default:
debug( "Unknown cursor id: %u", id ); debug_os2("Unknown cursor id: %u", id);
return NULL; return NULL;
} }
// On eCS SPTR_WAIT for last paramether fCopy=TRUE/FALSE gives different /* On eCS SPTR_WAIT for last paramether fCopy=TRUE/FALSE gives different
// "wait" icons. -=8( ) * "wait" icons. -=8( ) */
hptr = WinQuerySysPointer( HWND_DESKTOP, lSysId, hptr = WinQuerySysPointer(HWND_DESKTOP, lSysId,
id == SDL_SYSTEM_CURSOR_WAIT ); id == SDL_SYSTEM_CURSOR_WAIT);
if ( hptr == NULLHANDLE ) if (hptr == NULLHANDLE) {
{ debug_os2("Cannot load OS/2 system pointer %u for SDL cursor id %u",
debug( "Cannot load OS/2 system pointer %u for SDL cursor id %u", lSysId, id);
lSysId, id );
return NULL; return NULL;
} }
pSDLCursor = SDL_calloc( 1, sizeof(SDL_Cursor) ); pSDLCursor = SDL_calloc(1, sizeof(SDL_Cursor));
if ( pSDLCursor == NULL ) if (pSDLCursor == NULL) {
{ WinDestroyPointer(hptr);
WinDestroyPointer( hptr );
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
@ -110,43 +105,40 @@ static void OS2_FreeCursor(SDL_Cursor *cursor)
{ {
HPOINTER hptr = (HPOINTER)cursor->driverdata; HPOINTER hptr = (HPOINTER)cursor->driverdata;
WinDestroyPointer( hptr ); WinDestroyPointer(hptr);
SDL_free( cursor ); SDL_free(cursor);
} }
static int OS2_ShowCursor(SDL_Cursor *cursor) static int OS2_ShowCursor(SDL_Cursor *cursor)
{ {
hptrCursor = cursor != NULL ? (HPOINTER)cursor->driverdata : NULLHANDLE; hptrCursor = (cursor != NULL)? (HPOINTER)cursor->driverdata : NULLHANDLE;
return ((SDL_GetMouseFocus() == NULL) ||
return ( ( SDL_GetMouseFocus() == NULL ) || WinSetPointer(HWND_DESKTOP, hptrCursor))? 0 : -1;
WinSetPointer( HWND_DESKTOP, hptrCursor ) ) ? 0 : -1;
} }
static void OS2_WarpMouse(SDL_Window * window, int x, int y) static void OS2_WarpMouse(SDL_Window * window, int x, int y)
{ {
PWINDATA pWinData = (PWINDATA)window->driverdata; WINDATA *pWinData = (WINDATA *)window->driverdata;
POINTL pointl; POINTL pointl;
pointl.x = x; pointl.x = x;
pointl.y = window->h - y; pointl.y = window->h - y;
WinMapWindowPoints( pWinData->hwnd, HWND_DESKTOP, &pointl, 1 ); WinMapWindowPoints(pWinData->hwnd, HWND_DESKTOP, &pointl, 1);
// pWinData->lSkipWMMouseMove++; ??? /* pWinData->lSkipWMMouseMove++; ???*/
WinSetPointerPos( HWND_DESKTOP, pointl.x, pointl.y ); WinSetPointerPos(HWND_DESKTOP, pointl.x, pointl.y);
} }
static int OS2_WarpMouseGlobal(int x, int y) static int OS2_WarpMouseGlobal(int x, int y)
{ {
WinSetPointerPos( HWND_DESKTOP, x, WinSetPointerPos(HWND_DESKTOP, x,
WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) - y ); WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN) - y);
return 0; return 0;
} }
static int OS2_CaptureMouse(SDL_Window *window) static int OS2_CaptureMouse(SDL_Window *window)
{ {
return WinSetCapture( HWND_DESKTOP, return WinSetCapture(HWND_DESKTOP, (window == NULL)? NULLHANDLE :
window == NULL ? NULLHANDLE ((WINDATA *)window->driverdata)->hwnd)? 0 : -1;
: ((PWINDATA)window->driverdata)->hwnd )
? 0 : -1;
} }
static Uint32 OS2_GetGlobalMouseState(int *x, int *y) static Uint32 OS2_GetGlobalMouseState(int *x, int *y)
@ -154,15 +146,14 @@ static Uint32 OS2_GetGlobalMouseState(int *x, int *y)
POINTL pointl; POINTL pointl;
ULONG ulRes; ULONG ulRes;
WinQueryPointerPos( HWND_DESKTOP, &pointl ); WinQueryPointerPos(HWND_DESKTOP, &pointl);
*x = pointl.x; *x = pointl.x;
*y = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) - pointl.y - 1; *y = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN) - pointl.y - 1;
ulRes = WinGetKeyState( HWND_DESKTOP, VK_BUTTON1 ) & 0x8000 ulRes = (WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) & 0x8000)? SDL_BUTTON_LMASK : 0;
? SDL_BUTTON_LMASK : 0; if (WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) & 0x8000)
if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON2 ) & 0x8000 )
ulRes |= SDL_BUTTON_RMASK; ulRes |= SDL_BUTTON_RMASK;
if ( WinGetKeyState( HWND_DESKTOP, VK_BUTTON3 ) & 0x8000 ) if (WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) & 0x8000)
ulRes |= SDL_BUTTON_MMASK; ulRes |= SDL_BUTTON_MMASK;
return ulRes; return ulRes;
@ -182,21 +173,22 @@ void OS2_InitMouse(_THIS, ULONG hab)
pSDLMouse->CaptureMouse = OS2_CaptureMouse; pSDLMouse->CaptureMouse = OS2_CaptureMouse;
pSDLMouse->GetGlobalMouseState = OS2_GetGlobalMouseState; pSDLMouse->GetGlobalMouseState = OS2_GetGlobalMouseState;
SDL_SetDefaultCursor( OS2_CreateSystemCursor( SDL_SYSTEM_CURSOR_ARROW ) ); SDL_SetDefaultCursor(OS2_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW));
if ( hptrCursor == NULLHANDLE ) if (hptrCursor == NULLHANDLE)
hptrCursor = WinQuerySysPointer( HWND_DESKTOP, SPTR_ARROW, TRUE ); hptrCursor = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, TRUE);
} }
void OS2_QuitMouse(_THIS) void OS2_QuitMouse(_THIS)
{ {
SDL_Mouse *pSDLMouse = SDL_GetMouse(); SDL_Mouse *pSDLMouse = SDL_GetMouse();
if ( pSDLMouse->def_cursor != NULL ) if (pSDLMouse->def_cursor != NULL) {
{ SDL_free(pSDLMouse->def_cursor);
SDL_free( pSDLMouse->def_cursor );
pSDLMouse->def_cursor = NULL; pSDLMouse->def_cursor = NULL;
pSDLMouse->cur_cursor = NULL; pSDLMouse->cur_cursor = NULL;
} }
} }
#endif /* SDL_VIDEO_DRIVER_OS2 */ #endif /* SDL_VIDEO_DRIVER_OS2 */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -31,24 +31,29 @@ typedef struct _VIDEOOUTPUTINFO {
ULONG ulScanLineSize; ULONG ulScanLineSize;
ULONG ulHorizResolution; ULONG ulHorizResolution;
ULONG ulVertResolution; ULONG ulVertResolution;
} VIDEOOUTPUTINFO, *PVIDEOOUTPUTINFO; } VIDEOOUTPUTINFO;
typedef struct _OS2VIDEOOUTPUT { typedef struct _OS2VIDEOOUTPUT {
BOOL (*QueryInfo)(PVIDEOOUTPUTINFO pInfo); BOOL (*QueryInfo)(VIDEOOUTPUTINFO *pInfo);
PVODATA (*Open)(); PVODATA (*Open)();
VOID (*Close)(PVODATA pVOData); VOID (*Close)(PVODATA pVOData);
BOOL (*SetVisibleRegion)(PVODATA pVOData, HWND hwnd, BOOL (*SetVisibleRegion)(PVODATA pVOData, HWND hwnd,
SDL_DisplayMode *pSDLDisplayMode, HRGN hrgnShape, SDL_DisplayMode *pSDLDisplayMode, HRGN hrgnShape,
BOOL fVisible); BOOL fVisible);
PVOID (*VideoBufAlloc)(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight, PVOID (*VideoBufAlloc)(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight,
ULONG ulBPP, ULONG fccColorEncoding, ULONG ulBPP, ULONG fccColorEncoding,
PULONG pulScanLineSize); PULONG pulScanLineSize);
VOID (*VideoBufFree)(PVODATA pVOData); VOID (*VideoBufFree)(PVODATA pVOData);
BOOL (*Update)(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects, BOOL (*Update)(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
ULONG cSDLRects); ULONG cSDLRects);
} OS2VIDEOOUTPUT, *POS2VIDEOOUTPUT; } OS2VIDEOOUTPUT;
extern OS2VIDEOOUTPUT voDive; extern OS2VIDEOOUTPUT voDive;
extern OS2VIDEOOUTPUT voVMan; extern OS2VIDEOOUTPUT voVMan;
#endif /* SDL_os2output_ */ #endif /* SDL_os2output_ */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -24,7 +24,6 @@
#include "SDL_os2util.h" #include "SDL_os2util.h"
HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY) HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY)
{ {
HBITMAP hbm; HBITMAP hbm;
@ -36,51 +35,43 @@ HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY)
ULONG ulY, ulX; ULONG ulY, ulX;
HPOINTER hptr = NULLHANDLE; HPOINTER hptr = NULLHANDLE;
if ( surface->format->format != SDL_PIXELFORMAT_ARGB8888 ) if (surface->format->format != SDL_PIXELFORMAT_ARGB8888) {
{ debug_os2("Image format should be SDL_PIXELFORMAT_ARGB8888");
debug( "Image format should be SDL_PIXELFORMAT_ARGB8888" );
return NULLHANDLE; return NULLHANDLE;
} }
pulBitmap = SDL_malloc( surface->h * surface->w * 4 * 2 ); pulBitmap = SDL_malloc(surface->h * surface->w * 4 * 2);
if ( pulBitmap == NULL ) if (pulBitmap == NULL) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULLHANDLE; return NULLHANDLE;
} }
// pulDst - last line of surface (image) part of the result bitmap /* pulDst - last line of surface (image) part of the result bitmap */
pulDst = &pulBitmap[ (surface->h - 1) * surface->w ]; pulDst = &pulBitmap[ (surface->h - 1) * surface->w ];
// pulDstMask - last line of mask part of the result bitmap /* pulDstMask - last line of mask part of the result bitmap */
pulDstMask = &pulBitmap[ (2 * surface->h - 1) * surface->w ]; pulDstMask = &pulBitmap[ (2 * surface->h - 1) * surface->w ];
// pulSrc - first line of source image /* pulSrc - first line of source image */
pulSrc = (PULONG)surface->pixels; pulSrc = (PULONG)surface->pixels;
for( ulY = 0; ulY < surface->h; ulY++ ) for (ulY = 0; ulY < surface->h; ulY++) {
{ for (ulX = 0; ulX < surface->w; ulX++) {
for( ulX = 0; ulX < surface->w; ulX++ ) if ((pulSrc[ulX] & 0xFF000000) == 0) {
{
if ( (pulSrc[ulX] & 0xFF000000) == 0 )
{
pulDst[ulX] = 0; pulDst[ulX] = 0;
pulDstMask[ulX] = 0xFFFFFFFF; pulDstMask[ulX] = 0xFFFFFFFF;
} } else {
else
{
pulDst[ulX] = pulSrc[ulX] & 0xFFFFFF; pulDst[ulX] = pulSrc[ulX] & 0xFFFFFF;
pulDstMask[ulX] = 0; pulDstMask[ulX] = 0;
} }
} }
// Set image and mask pointers on one line up /* Set image and mask pointers on one line up */
pulDst -= surface->w; pulDst -= surface->w;
pulDstMask -= surface->w; pulDstMask -= surface->w;
// Set source image pointer to the next line /* Set source image pointer to the next line */
pulSrc = (PULONG)( ((PCHAR)pulSrc) + surface->pitch ); pulSrc = (PULONG) (((PCHAR)pulSrc) + surface->pitch);
} }
// Create system bitmap object. /* Create system bitmap object. */
bmih.cbFix = sizeof(BITMAPINFOHEADER2); bmih.cbFix = sizeof(BITMAPINFOHEADER2);
bmih.cx = surface->w; bmih.cx = surface->w;
bmih.cy = 2 * surface->h; bmih.cy = 2 * surface->h;
@ -95,24 +86,26 @@ HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY)
bmi.cPlanes = 1; bmi.cPlanes = 1;
bmi.cBitCount = 32; bmi.cBitCount = 32;
hps = WinGetPS( HWND_DESKTOP ); hps = WinGetPS(HWND_DESKTOP);
hbm = GpiCreateBitmap( hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT, hbm = GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)&bmih, CBM_INIT,
(PBYTE)pulBitmap, (PBITMAPINFO2)&bmi ); (PBYTE)pulBitmap, (PBITMAPINFO2)&bmi);
if ( hbm == GPI_ERROR ) if (hbm == GPI_ERROR) {
debug( "GpiCreateBitmap() failed" ); debug_os2("GpiCreateBitmap() failed");
else } else {
{ /* Create a system pointer object. */
// Create a system pointer object. hptr = WinCreatePointer(HWND_DESKTOP, hbm, TRUE, ulHotX, ulHotY);
hptr = WinCreatePointer( HWND_DESKTOP, hbm, TRUE, ulHotX, ulHotY ); if (hptr == NULLHANDLE) {
if ( hptr == NULLHANDLE ) debug_os2("WinCreatePointer() failed");
debug( "WinCreatePointer() failed" );
} }
GpiDeleteBitmap( hbm ); }
GpiDeleteBitmap(hbm);
WinReleasePS( hps ); WinReleasePS(hps);
SDL_free( pulBitmap ); SDL_free(pulBitmap);
return hptr; return hptr;
} }
#endif /* SDL_VIDEO_DRIVER_OS2 */ #endif /* SDL_VIDEO_DRIVER_OS2 */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -33,3 +33,6 @@
HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY); HPOINTER utilCreatePointer(SDL_Surface *surface, ULONG ulHotX, ULONG ulHotY);
#endif /* SDL_os2util_h_ */ #endif /* SDL_os2util_h_ */
/* vi: set ts=4 sw=4 expandtab: */

File diff suppressed because it is too large Load Diff

View File

@ -41,18 +41,18 @@
typedef struct SDL_VideoData { typedef struct SDL_VideoData {
HAB hab; HAB hab;
HMQ hmq; HMQ hmq;
POS2VIDEOOUTPUT pOutput; // Video output routines. OS2VIDEOOUTPUT *pOutput; /* Video output routines */
} SDL_VideoData, *PSDL_VideoData; } SDL_VideoData;
typedef struct _WINDATA { typedef struct _WINDATA {
SDL_Window *window; SDL_Window *window;
POS2VIDEOOUTPUT pOutput; // Video output routines. OS2VIDEOOUTPUT *pOutput; /* Video output routines */
HWND hwndFrame; HWND hwndFrame;
HWND hwnd; HWND hwnd;
PFNWP fnUserWndProc; PFNWP fnUserWndProc;
PFNWP fnWndFrameProc; PFNWP fnWndFrameProc;
PVODATA pVOData; // Video output data. PVODATA pVOData; /* Video output data */
HRGN hrgnShape; HRGN hrgnShape;
HPOINTER hptrIcon; HPOINTER hptrIcon;
@ -63,19 +63,20 @@ typedef struct _WINDATA {
LONG lSkipWMMouseMove; LONG lSkipWMMouseMove;
LONG lSkipWMVRNEnabled; LONG lSkipWMVRNEnabled;
LONG lSkipWMAdjustFramePos; LONG lSkipWMAdjustFramePos;
} WINDATA, *PWINDATA; } WINDATA;
typedef struct _DISPLAYDATA { typedef struct _DISPLAYDATA {
ULONG ulDPIHor; ULONG ulDPIHor;
ULONG ulDPIVer; ULONG ulDPIVer;
ULONG ulDPIDiag; ULONG ulDPIDiag;
} DISPLAYDATA, *PDISPLAYDATA; } DISPLAYDATA;
typedef struct _MODEDATA { typedef struct _MODEDATA {
ULONG ulDepth; ULONG ulDepth;
ULONG fccColorEncoding; ULONG fccColorEncoding;
ULONG ulScanLineBytes; ULONG ulScanLineBytes;
} MODEDATA, *PMODEDATA; } MODEDATA;
#endif /* SDL_os2video_h_ */ #endif /* SDL_os2video_h_ */
/* vi: set ts=4 sw=4 expandtab: */

View File

@ -50,7 +50,7 @@ typedef struct _VODATA {
ULONG cBltRect; ULONG cBltRect;
} VODATA; } VODATA;
static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo); static BOOL voQueryInfo(VIDEOOUTPUTINFO *pInfo);
static PVODATA voOpen(); static PVODATA voOpen();
static VOID voClose(PVODATA pVOData); static VOID voClose(PVODATA pVOData);
static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd, static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
@ -80,63 +80,58 @@ static ULONG ulVRAMAddress = 0;
VOID APIENTRY ExitVMan(VOID) VOID APIENTRY ExitVMan(VOID)
{ {
if ( ( ulVRAMAddress != 0 ) && ( hmodVMan != NULLHANDLE ) ) if (ulVRAMAddress != 0 && hmodVMan != NULLHANDLE) {
{ pfnVMIEntry(0, VMI_CMD_TERMPROC, NULL, NULL);
pfnVMIEntry( 0, VMI_CMD_TERMPROC, NULL, NULL ); DosFreeModule(hmodVMan);
DosFreeModule( hmodVMan );
} }
DosExitList( EXLST_EXIT, (PFNEXITLIST)NULL ); DosExitList(EXLST_EXIT, (PFNEXITLIST)NULL);
} }
static BOOL _vmanInit() static BOOL _vmanInit(void)
{ {
ULONG ulRC; ULONG ulRC;
CHAR acBuf[255]; CHAR acBuf[255];
INITPROCOUT stInitProcOut; INITPROCOUT stInitProcOut;
if ( hmodVMan != NULLHANDLE ) if (hmodVMan != NULLHANDLE) /* Already was initialized */
// Already was initialized.
return TRUE; return TRUE;
// Load vman.dll /* Load vman.dll */
ulRC = DosLoadModule( acBuf, sizeof(acBuf), "VMAN", &hmodVMan ); ulRC = DosLoadModule(acBuf, sizeof(acBuf), "VMAN", &hmodVMan);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("Could not load VMAN.DLL, rc = %u : %s", ulRC, acBuf);
debug( "Could not load VMAN.DLL, rc = %u : %s", ulRC, &acBuf );
hmodVMan = NULLHANDLE; hmodVMan = NULLHANDLE;
return FALSE; return FALSE;
} }
// Get VMIEntry. /* Get VMIEntry */
ulRC = DosQueryProcAddr( hmodVMan, 0L, "VMIEntry", (PFN *)&pfnVMIEntry ); ulRC = DosQueryProcAddr(hmodVMan, 0L, "VMIEntry", (PFN *)&pfnVMIEntry);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("Could not query address of pfnVMIEntry func. of VMAN.DLL, "
debug( "Could not query address of pfnVMIEntry func. of VMAN.DLL, " "rc = %u", ulRC);
"rc = %u", ulRC ); DosFreeModule(hmodVMan);
DosFreeModule( hmodVMan );
hmodVMan = NULLHANDLE; hmodVMan = NULLHANDLE;
return FALSE; return FALSE;
} }
// VMAN initialization. /* VMAN initialization */
stInitProcOut.ulLength = sizeof(stInitProcOut); stInitProcOut.ulLength = sizeof(stInitProcOut);
ulRC = pfnVMIEntry( 0, VMI_CMD_INITPROC, NULL, &stInitProcOut ); ulRC = pfnVMIEntry(0, VMI_CMD_INITPROC, NULL, &stInitProcOut);
if ( ulRC != RC_SUCCESS ) if (ulRC != RC_SUCCESS) {
{ debug_os2("Could not initialize VMAN for this process");
debug( "Could not initialize VMAN for this process" );
pfnVMIEntry = NULL; pfnVMIEntry = NULL;
DosFreeModule( hmodVMan ); DosFreeModule(hmodVMan);
hmodVMan = NULLHANDLE; hmodVMan = NULLHANDLE;
return FALSE; return FALSE;
} }
// Store video memory virtual address. /* Store video memory virtual address */
ulVRAMAddress = stInitProcOut.ulVRAMVirt; ulVRAMAddress = stInitProcOut.ulVRAMVirt;
// We use exit list for VMI_CMD_TERMPROC. /* We use exit list for VMI_CMD_TERMPROC */
if ( DosExitList( EXLST_ADD | 0x00001000, (PFNEXITLIST)ExitVMan ) if (DosExitList(EXLST_ADD | 0x00001000, (PFNEXITLIST)ExitVMan) != NO_ERROR) {
!= NO_ERROR ) debug_os2("DosExitList() failed");
debug( "DosExitList() failed" ); }
return TRUE; return TRUE;
} }
@ -145,11 +140,11 @@ static PRECTL _getRectlArray(PVODATA pVOData, ULONG cRects)
{ {
PRECTL pRectl; PRECTL pRectl;
if ( pVOData->cRectl >= cRects ) if (pVOData->cRectl >= cRects)
return pVOData->pRectl; return pVOData->pRectl;
pRectl = SDL_realloc( pVOData->pRectl, cRects * sizeof(RECTL) ); pRectl = SDL_realloc(pVOData->pRectl, cRects * sizeof(RECTL));
if ( pRectl == NULL ) if (pRectl == NULL)
return NULL; return NULL;
pVOData->pRectl = pRectl; pVOData->pRectl = pRectl;
@ -161,11 +156,11 @@ static PBLTRECT _getBltRectArray(PVODATA pVOData, ULONG cRects)
{ {
PBLTRECT pBltRect; PBLTRECT pBltRect;
if ( pVOData->cBltRect >= cRects ) if (pVOData->cBltRect >= cRects)
return pVOData->pBltRect; return pVOData->pBltRect;
pBltRect = SDL_realloc( pVOData->pBltRect, cRects * sizeof(BLTRECT) ); pBltRect = SDL_realloc(pVOData->pBltRect, cRects * sizeof(BLTRECT));
if ( pBltRect == NULL ) if (pBltRect == NULL)
return NULL; return NULL;
pVOData->pBltRect = pBltRect; pVOData->pBltRect = pBltRect;
@ -174,19 +169,18 @@ static PBLTRECT _getBltRectArray(PVODATA pVOData, ULONG cRects)
} }
static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo) static BOOL voQueryInfo(VIDEOOUTPUTINFO *pInfo)
{ {
ULONG ulRC; ULONG ulRC;
GDDMODEINFO sCurModeInfo; GDDMODEINFO sCurModeInfo;
if ( !_vmanInit() ) if (!_vmanInit())
return FALSE; return FALSE;
// Query current (desktop) mode. /* Query current (desktop) mode */
ulRC = pfnVMIEntry( 0, VMI_CMD_QUERYCURRENTMODE, NULL, &sCurModeInfo ); ulRC = pfnVMIEntry(0, VMI_CMD_QUERYCURRENTMODE, NULL, &sCurModeInfo);
if ( ulRC != RC_SUCCESS ) if (ulRC != RC_SUCCESS) {
{ debug_os2("Could not query desktop video mode.");
debug( "Could not query desktop video mode." );
return FALSE; return FALSE;
} }
@ -199,16 +193,15 @@ static BOOL voQueryInfo(PVIDEOOUTPUTINFO pInfo)
return TRUE; return TRUE;
} }
static PVODATA voOpen() static PVODATA voOpen(void)
{ {
PVODATA pVOData; PVODATA pVOData;
if ( !_vmanInit() ) if (!_vmanInit())
return NULL; return NULL;
pVOData = SDL_calloc( 1, sizeof(VODATA) ); pVOData = SDL_calloc(1, sizeof(VODATA));
if ( pVOData == NULL ) if (pVOData == NULL) {
{
SDL_OutOfMemory(); SDL_OutOfMemory();
return NULL; return NULL;
} }
@ -218,13 +211,13 @@ static PVODATA voOpen()
static VOID voClose(PVODATA pVOData) static VOID voClose(PVODATA pVOData)
{ {
if ( pVOData->pRectl != NULL ) if (pVOData->pRectl != NULL)
SDL_free( pVOData->pRectl ); SDL_free(pVOData->pRectl);
if ( pVOData->pBltRect != NULL ) if (pVOData->pBltRect != NULL)
SDL_free( pVOData->pBltRect ); SDL_free(pVOData->pBltRect);
voVideoBufFree( pVOData ); voVideoBufFree(pVOData);
} }
static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd, static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
@ -234,51 +227,41 @@ static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd,
HPS hps; HPS hps;
BOOL fSuccess = FALSE; BOOL fSuccess = FALSE;
hps = WinGetPS( hwnd ); hps = WinGetPS(hwnd);
if ( pVOData->hrgnVisible != NULLHANDLE ) if (pVOData->hrgnVisible != NULLHANDLE) {
{ GpiDestroyRegion(hps, pVOData->hrgnVisible);
GpiDestroyRegion( hps, pVOData->hrgnVisible );
pVOData->hrgnVisible = NULLHANDLE; pVOData->hrgnVisible = NULLHANDLE;
} }
if ( fVisible ) if (fVisible) {
{ /* Query visible rectangles */
// Query visible rectangles pVOData->hrgnVisible = GpiCreateRegion(hps, 0, NULL);
if (pVOData->hrgnVisible == NULLHANDLE) {
pVOData->hrgnVisible = GpiCreateRegion( hps, 0, NULL ); SDL_SetError("GpiCreateRegion() failed");
if ( pVOData->hrgnVisible == NULLHANDLE ) } else {
{ if (WinQueryVisibleRegion(hwnd, pVOData->hrgnVisible) == RGN_ERROR) {
SDL_SetError( "GpiCreateRegion() failed" ); GpiDestroyRegion(hps, pVOData->hrgnVisible);
}
else
{
if ( WinQueryVisibleRegion( hwnd, pVOData->hrgnVisible ) == RGN_ERROR )
{
GpiDestroyRegion( hps, pVOData->hrgnVisible );
pVOData->hrgnVisible = NULLHANDLE; pVOData->hrgnVisible = NULLHANDLE;
} } else {
else if (hrgnShape != NULLHANDLE)
{ GpiCombineRegion(hps, pVOData->hrgnVisible, pVOData->hrgnVisible,
if ( hrgnShape != NULLHANDLE ) hrgnShape, CRGN_AND);
GpiCombineRegion( hps, pVOData->hrgnVisible, pVOData->hrgnVisible,
hrgnShape, CRGN_AND );
fSuccess = TRUE; fSuccess = TRUE;
} }
} }
WinQueryWindowRect( hwnd, &pVOData->rectlWin ); WinQueryWindowRect(hwnd, &pVOData->rectlWin);
WinMapWindowPoints( hwnd, HWND_DESKTOP, (PPOINTL)&pVOData->rectlWin, 2 ); WinMapWindowPoints(hwnd, HWND_DESKTOP, (PPOINTL)&pVOData->rectlWin, 2);
if ( pSDLDisplayMode != NULL ) if (pSDLDisplayMode != NULL) {
{
pVOData->ulScreenHeight = pSDLDisplayMode->h; pVOData->ulScreenHeight = pSDLDisplayMode->h;
pVOData->ulScreenBytesPerLine = pVOData->ulScreenBytesPerLine =
((PMODEDATA)pSDLDisplayMode->driverdata)->ulScanLineBytes; ((MODEDATA *)pSDLDisplayMode->driverdata)->ulScanLineBytes;
} }
} }
WinReleasePS( hps ); WinReleasePS(hps);
return fSuccess; return fSuccess;
} }
@ -290,22 +273,21 @@ static PVOID voVideoBufAlloc(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight,
ULONG ulRC; ULONG ulRC;
ULONG ulScanLineSize = ulWidth * (ulBPP >> 3); ULONG ulScanLineSize = ulWidth * (ulBPP >> 3);
// Destroy previous buffer. /* Destroy previous buffer */
voVideoBufFree( pVOData ); voVideoBufFree(pVOData);
if ( ( ulWidth == 0 ) || ( ulHeight == 0 ) || ( ulBPP == 0 ) ) if (ulWidth == 0 || ulHeight == 0 || ulBPP == 0)
return NULL; return NULL;
// Bytes per line. /* Bytes per line */
ulScanLineSize = ( ulScanLineSize + 3 ) & ~3; /* 4-byte aligning */ ulScanLineSize = (ulScanLineSize + 3) & ~3; /* 4-byte aligning */
*pulScanLineSize = ulScanLineSize; *pulScanLineSize = ulScanLineSize;
ulRC = DosAllocMem( &pVOData->pBuffer, ulRC = DosAllocMem(&pVOData->pBuffer,
(ulHeight * ulScanLineSize) + sizeof(ULONG), (ulHeight * ulScanLineSize) + sizeof(ULONG),
PAG_COMMIT | PAG_EXECUTE | PAG_READ | PAG_WRITE ); PAG_COMMIT | PAG_EXECUTE | PAG_READ | PAG_WRITE);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
{ debug_os2("DosAllocMem(), rc = %u", ulRC);
debug( "DosAllocMem(), rc = %u", ulRC );
return NULL; return NULL;
} }
@ -321,14 +303,15 @@ static VOID voVideoBufFree(PVODATA pVOData)
{ {
ULONG ulRC; ULONG ulRC;
if ( pVOData->pBuffer == NULL ) if (pVOData->pBuffer == NULL)
return; return;
ulRC = DosFreeMem( pVOData->pBuffer ); ulRC = DosFreeMem(pVOData->pBuffer);
if ( ulRC != NO_ERROR ) if (ulRC != NO_ERROR) {
debug( "DosFreeMem(), rc = %u", ulRC ); debug_os2("DosFreeMem(), rc = %u", ulRC);
else } else {
pVOData->pBuffer = NULL; pVOData->pBuffer = NULL;
}
} }
static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects, static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
@ -346,12 +329,12 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
HWREQIN sHWReqIn; HWREQIN sHWReqIn;
BITBLTINFO sBitbltInfo = { 0 }; BITBLTINFO sBitbltInfo = { 0 };
ULONG ulIdx; ULONG ulIdx;
// RECTL rectlScreenUpdate; /* RECTL rectlScreenUpdate;*/
if ( pVOData->pBuffer == NULL ) if (pVOData->pBuffer == NULL)
return FALSE; return FALSE;
if ( pVOData->hrgnVisible == NULLHANDLE ) if (pVOData->hrgnVisible == NULLHANDLE)
return TRUE; return TRUE;
bmiSrc.ulLength = sizeof(BMAPINFO); bmiSrc.ulLength = sizeof(BMAPINFO);
@ -370,12 +353,10 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
bmiDst.ulBpp = bmiSrc.ulBpp; bmiDst.ulBpp = bmiSrc.ulBpp;
bmiDst.ulBytesPerLine = pVOData->ulScreenBytesPerLine; bmiDst.ulBytesPerLine = pVOData->ulScreenBytesPerLine;
// List of update rectangles. This is the intersection of requested /* List of update rectangles. This is the intersection of requested
// rectangles and visible rectangles. * rectangles and visible rectangles. */
if (cSDLRects == 0) {
if ( cSDLRects == 0 ) /* Full update requested */
{
// Full update requested.
stSDLRectDef.x = 0; stSDLRectDef.x = 0;
stSDLRectDef.y = 0; stSDLRectDef.y = 0;
stSDLRectDef.w = bmiSrc.ulWidth; stSDLRectDef.w = bmiSrc.ulWidth;
@ -384,79 +365,72 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
cSDLRects = 1; cSDLRects = 1;
} }
// Make list of destionation rectangles (prectlDst) list from the source /* Make list of destination rectangles (prectlDst) list from the source
// list (prectl). * list (prectl). */
prectlDst = _getRectlArray( pVOData, cSDLRects ); prectlDst = _getRectlArray(pVOData, cSDLRects);
if ( prectlDst == NULL ) if (prectlDst == NULL) {
{ debug_os2("Not enough memory");
debug( "Not enough memory" );
return FALSE; return FALSE;
} }
prectlScan = prectlDst; prectlScan = prectlDst;
for( ulIdx = 0; ulIdx < cSDLRects; ulIdx++, pSDLRects++, prectlScan++ ) for (ulIdx = 0; ulIdx < cSDLRects; ulIdx++, pSDLRects++, prectlScan++) {
{
prectlScan->xLeft = pSDLRects->x; prectlScan->xLeft = pSDLRects->x;
prectlScan->yTop = pVOData->ulHeight - pSDLRects->y; prectlScan->yTop = pVOData->ulHeight - pSDLRects->y;
prectlScan->xRight = prectlScan->xLeft + pSDLRects->w; prectlScan->xRight = prectlScan->xLeft + pSDLRects->w;
prectlScan->yBottom = prectlScan->yTop - pSDLRects->h; prectlScan->yBottom = prectlScan->yTop - pSDLRects->h;
} }
hps = WinGetPS( hwnd ); hps = WinGetPS(hwnd);
if ( hps == NULLHANDLE ) if (hps == NULLHANDLE)
return FALSE; return FALSE;
// Make destination region to update. /* Make destination region to update */
hrgnUpdate = GpiCreateRegion( hps, cSDLRects, prectlDst ); hrgnUpdate = GpiCreateRegion(hps, cSDLRects, prectlDst);
// "AND" on visible and destination regions, result is region to update. /* "AND" on visible and destination regions, result is region to update */
GpiCombineRegion( hps, hrgnUpdate, hrgnUpdate, pVOData->hrgnVisible, GpiCombineRegion(hps, hrgnUpdate, hrgnUpdate, pVOData->hrgnVisible, CRGN_AND);
CRGN_AND );
// Get rectangles of the region to update. /* Get rectangles of the region to update */
rgnCtl.ircStart = 1; rgnCtl.ircStart = 1;
rgnCtl.crc = 0; rgnCtl.crc = 0;
rgnCtl.ulDirection = 1; rgnCtl.ulDirection = 1;
rgnCtl.crcReturned = 0; rgnCtl.crcReturned = 0;
GpiQueryRegionRects( hps, hrgnUpdate, NULL, &rgnCtl, NULL ); GpiQueryRegionRects(hps, hrgnUpdate, NULL, &rgnCtl, NULL);
if ( rgnCtl.crcReturned == 0 ) if (rgnCtl.crcReturned == 0) {
{ GpiDestroyRegion(hps, hrgnUpdate);
GpiDestroyRegion( hps, hrgnUpdate ); WinReleasePS(hps);
WinReleasePS( hps );
return TRUE; return TRUE;
} }
// We don't need prectlDst, use it again to store update regions. /* We don't need prectlDst, use it again to store update regions */
prectlDst = _getRectlArray( pVOData, rgnCtl.crcReturned ); prectlDst = _getRectlArray(pVOData, rgnCtl.crcReturned);
if ( prectlDst == NULL ) if (prectlDst == NULL) {
{ debug_os2("Not enough memory");
debug( "Not enough memory" ); GpiDestroyRegion(hps, hrgnUpdate);
GpiDestroyRegion( hps, hrgnUpdate ); WinReleasePS(hps);
WinReleasePS( hps );
return FALSE; return FALSE;
} }
rgnCtl.ircStart = 1; rgnCtl.ircStart = 1;
rgnCtl.crc = rgnCtl.crcReturned; rgnCtl.crc = rgnCtl.crcReturned;
rgnCtl.ulDirection = 1; rgnCtl.ulDirection = 1;
GpiQueryRegionRects( hps, hrgnUpdate, NULL, &rgnCtl, prectlDst ); GpiQueryRegionRects(hps, hrgnUpdate, NULL, &rgnCtl, prectlDst);
GpiDestroyRegion( hps, hrgnUpdate ); GpiDestroyRegion(hps, hrgnUpdate);
WinReleasePS( hps ); WinReleasePS(hps);
cSDLRects = rgnCtl.crcReturned; cSDLRects = rgnCtl.crcReturned;
// Now cRect/prectlDst is a list of regions in window (update && visible).
// Make lists for blitting from update regions. /* Now cRect/prectlDst is a list of regions in window (update && visible) */
pbrDst = _getBltRectArray( pVOData, cSDLRects ); /* Make lists for blitting from update regions */
if ( pbrDst == NULL ) pbrDst = _getBltRectArray(pVOData, cSDLRects);
{ if (pbrDst == NULL) {
debug( "Not enough memory" ); debug_os2("Not enough memory");
return FALSE; return FALSE;
} }
prectlScan = prectlDst; prectlScan = prectlDst;
pptlSrcOrg = (PPOINTL)prectlDst; // Yes, this memory block will be used again. pptlSrcOrg = (PPOINTL)prectlDst; /* Yes, this memory block will be used again */
for( ulIdx = 0; ulIdx < cSDLRects; ulIdx++, prectlScan++, pptlSrcOrg++ ) for (ulIdx = 0; ulIdx < cSDLRects; ulIdx++, prectlScan++, pptlSrcOrg++) {
{
pbrDst[ulIdx].ulXOrg = pVOData->rectlWin.xLeft + prectlScan->xLeft; pbrDst[ulIdx].ulXOrg = pVOData->rectlWin.xLeft + prectlScan->xLeft;
pbrDst[ulIdx].ulYOrg = pVOData->ulScreenHeight - pbrDst[ulIdx].ulYOrg = pVOData->ulScreenHeight -
( pVOData->rectlWin.yBottom + prectlScan->yTop ); (pVOData->rectlWin.yBottom + prectlScan->yTop);
pbrDst[ulIdx].ulXExt = prectlScan->xRight - prectlScan->xLeft; pbrDst[ulIdx].ulXExt = prectlScan->xRight - prectlScan->xLeft;
pbrDst[ulIdx].ulYExt = prectlScan->yTop - prectlScan->yBottom; pbrDst[ulIdx].ulYExt = prectlScan->yTop - prectlScan->yBottom;
pptlSrcOrg->x = prectlScan->xLeft; pptlSrcOrg->x = prectlScan->xLeft;
@ -464,18 +438,15 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
} }
pptlSrcOrg = (PPOINTL)prectlDst; pptlSrcOrg = (PPOINTL)prectlDst;
// Request HW /* Request HW */
sHWReqIn.ulLength = sizeof(HWREQIN); sHWReqIn.ulLength = sizeof(HWREQIN);
sHWReqIn.ulFlags = REQUEST_HW; sHWReqIn.ulFlags = REQUEST_HW;
sHWReqIn.cScrChangeRects = 1; sHWReqIn.cScrChangeRects = 1;
sHWReqIn.arectlScreen = &pVOData->rectlWin; sHWReqIn.arectlScreen = &pVOData->rectlWin;
if ( pfnVMIEntry( 0, VMI_CMD_REQUESTHW, &sHWReqIn, NULL ) != RC_SUCCESS ) if (pfnVMIEntry(0, VMI_CMD_REQUESTHW, &sHWReqIn, NULL) != RC_SUCCESS) {
{ debug_os2("pfnVMIEntry(,VMI_CMD_REQUESTHW,,) failed");
debug( "pfnVMIEntry(,VMI_CMD_REQUESTHW,,) failed" ); sHWReqIn.cScrChangeRects = 0; /* for fail signal only */
sHWReqIn.cScrChangeRects = 0; // for fail signal only. } else {
}
else
{
RECTL rclSrcBounds; RECTL rclSrcBounds;
rclSrcBounds.xLeft = 0; rclSrcBounds.xLeft = 0;
@ -494,18 +465,20 @@ static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects,
sBitbltInfo.aptlSrcOrg = pptlSrcOrg; sBitbltInfo.aptlSrcOrg = pptlSrcOrg;
sBitbltInfo.abrDst = pbrDst; sBitbltInfo.abrDst = pbrDst;
// Screen update. /* Screen update */
if ( pfnVMIEntry( 0, VMI_CMD_BITBLT, &sBitbltInfo, NULL ) != RC_SUCCESS ) if (pfnVMIEntry(0, VMI_CMD_BITBLT, &sBitbltInfo, NULL) != RC_SUCCESS) {
{ debug_os2("pfnVMIEntry(,VMI_CMD_BITBLT,,) failed");
debug( "pfnVMIEntry(,VMI_CMD_BITBLT,,) failed" ); sHWReqIn.cScrChangeRects = 0; /* for fail signal only */
sHWReqIn.cScrChangeRects = 0; // for fail signal only.
} }
// Release HW. /* Release HW */
sHWReqIn.ulFlags = 0; sHWReqIn.ulFlags = 0;
if ( pfnVMIEntry( 0, VMI_CMD_REQUESTHW, &sHWReqIn, NULL ) != RC_SUCCESS ) if (pfnVMIEntry(0, VMI_CMD_REQUESTHW, &sHWReqIn, NULL) != RC_SUCCESS) {
debug( "pfnVMIEntry(,VMI_CMD_REQUESTHW,,) failed" ); debug_os2("pfnVMIEntry(,VMI_CMD_REQUESTHW,,) failed");
}
} }
return sHWReqIn.cScrChangeRects != 0; return sHWReqIn.cScrChangeRects != 0;
} }
/* vi: set ts=4 sw=4 expandtab: */