Created
April 22, 2020 18:22
-
-
Save tomaka/3424fde130e603c08df6bfd0959981ec to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/linuxdoom-1.10/Makefile b/linuxdoom-1.10/Makefile | |
index 8c69794..e9b6459 100644 | |
--- a/linuxdoom-1.10/Makefile | |
+++ b/linuxdoom-1.10/Makefile | |
@@ -4,11 +4,11 @@ | |
# | |
# $Log:$ | |
# | |
-CC= gcc # gcc or g++ | |
+CC= /home/pierre/Projets/wasi-sdk-8.0/bin/clang # gcc or g++ | |
-CFLAGS=-g -Wall -DNORMALUNIX -DLINUX # -DUSEASM | |
-LDFLAGS=-L/usr/X11R6/lib | |
-LIBS=-lXext -lX11 -lnsl -lm | |
+CFLAGS=--target=wasm32-wasi --sysroot=/home/pierre/Projets/wasi-libc/sysroot -O3 -m32 -Wall -DNORMALUNIX -DLINUX # -DUSEASM | |
+LDFLAGS=-L/usr/X11R6/lib -Wl,--allow-undefined | |
+LIBS=-lm | |
# subdirectory for objects | |
O=linux | |
@@ -85,11 +85,11 @@ clean: | |
$(O)/linuxxdoom: $(OBJS) $(O)/i_main.o | |
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(O)/i_main.o \ | |
- -o $(O)/linuxxdoom $(LIBS) | |
+ -o $(O)/linuxxdoom.wasm $(LIBS) | |
$(O)/%.o: %.c | |
$(CC) $(CFLAGS) -c $< -o $@ | |
############################################################# | |
# | |
-############################################################# | |
\ No newline at end of file | |
+############################################################# | |
diff --git a/linuxdoom-1.10/i_net.c b/linuxdoom-1.10/i_net.c | |
index 557f417..a2fec74 100644 | |
--- a/linuxdoom-1.10/i_net.c | |
+++ b/linuxdoom-1.10/i_net.c | |
@@ -32,7 +32,6 @@ rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $"; | |
#include <arpa/inet.h> | |
#include <errno.h> | |
#include <unistd.h> | |
-#include <netdb.h> | |
#include <sys/ioctl.h> | |
#include "i_system.h" | |
@@ -47,33 +46,11 @@ rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $"; | |
#endif | |
#include "i_net.h" | |
- | |
- | |
- | |
- | |
-// For some odd reason... | |
-#define ntohl(x) \ | |
- ((unsigned long int)((((unsigned long int)(x) & 0x000000ffU) << 24) | \ | |
- (((unsigned long int)(x) & 0x0000ff00U) << 8) | \ | |
- (((unsigned long int)(x) & 0x00ff0000U) >> 8) | \ | |
- (((unsigned long int)(x) & 0xff000000U) >> 24))) | |
- | |
-#define ntohs(x) \ | |
- ((unsigned short int)((((unsigned short int)(x) & 0x00ff) << 8) | \ | |
- (((unsigned short int)(x) & 0xff00) >> 8))) \ | |
- | |
-#define htonl(x) ntohl(x) | |
-#define htons(x) ntohs(x) | |
- | |
-void NetSend (void); | |
-boolean NetListen (void); | |
- | |
- | |
// | |
// NETWORKING | |
// | |
-int DOOMPORT = (IPPORT_USERRESERVED +0x1d ); | |
+int DOOMPORT = 55222;//(IPPORT_USERRESERVED +0x1d ); | |
int sendsocket; | |
int insocket; | |
@@ -83,75 +60,11 @@ struct sockaddr_in sendaddress[MAXNETNODES]; | |
void (*netget) (void); | |
void (*netsend) (void); | |
- | |
-// | |
-// UDPsocket | |
-// | |
-int UDPsocket (void) | |
-{ | |
- int s; | |
- | |
- // allocate a socket | |
- s = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); | |
- if (s<0) | |
- I_Error ("can't create socket: %s",strerror(errno)); | |
- | |
- return s; | |
-} | |
- | |
-// | |
-// BindToLocalPort | |
-// | |
-void | |
-BindToLocalPort | |
-( int s, | |
- int port ) | |
-{ | |
- int v; | |
- struct sockaddr_in address; | |
- | |
- memset (&address, 0, sizeof(address)); | |
- address.sin_family = AF_INET; | |
- address.sin_addr.s_addr = INADDR_ANY; | |
- address.sin_port = port; | |
- | |
- v = bind (s, (void *)&address, sizeof(address)); | |
- if (v == -1) | |
- I_Error ("BindToPort: bind: %s", strerror(errno)); | |
-} | |
- | |
- | |
// | |
// PacketSend | |
// | |
void PacketSend (void) | |
{ | |
- int c; | |
- doomdata_t sw; | |
- | |
- // byte swap | |
- sw.checksum = htonl(netbuffer->checksum); | |
- sw.player = netbuffer->player; | |
- sw.retransmitfrom = netbuffer->retransmitfrom; | |
- sw.starttic = netbuffer->starttic; | |
- sw.numtics = netbuffer->numtics; | |
- for (c=0 ; c< netbuffer->numtics ; c++) | |
- { | |
- sw.cmds[c].forwardmove = netbuffer->cmds[c].forwardmove; | |
- sw.cmds[c].sidemove = netbuffer->cmds[c].sidemove; | |
- sw.cmds[c].angleturn = htons(netbuffer->cmds[c].angleturn); | |
- sw.cmds[c].consistancy = htons(netbuffer->cmds[c].consistancy); | |
- sw.cmds[c].chatchar = netbuffer->cmds[c].chatchar; | |
- sw.cmds[c].buttons = netbuffer->cmds[c].buttons; | |
- } | |
- | |
- //printf ("sending %i\n",gametic); | |
- c = sendto (sendsocket , &sw, doomcom->datalength | |
- ,0,(void *)&sendaddress[doomcom->remotenode] | |
- ,sizeof(sendaddress[doomcom->remotenode])); | |
- | |
- // if (c == -1) | |
- // I_Error ("SendPacket error: %s",strerror(errno)); | |
} | |
@@ -160,84 +73,8 @@ void PacketSend (void) | |
// | |
void PacketGet (void) | |
{ | |
- int i; | |
- int c; | |
- struct sockaddr_in fromaddress; | |
- int fromlen; | |
- doomdata_t sw; | |
- | |
- fromlen = sizeof(fromaddress); | |
- c = recvfrom (insocket, &sw, sizeof(sw), 0 | |
- , (struct sockaddr *)&fromaddress, &fromlen ); | |
- if (c == -1 ) | |
- { | |
- if (errno != EWOULDBLOCK) | |
- I_Error ("GetPacket: %s",strerror(errno)); | |
- doomcom->remotenode = -1; // no packet | |
- return; | |
- } | |
- | |
- { | |
- static int first=1; | |
- if (first) | |
- printf("len=%d:p=[0x%x 0x%x] \n", c, *(int*)&sw, *((int*)&sw+1)); | |
- first = 0; | |
- } | |
- | |
- // find remote node number | |
- for (i=0 ; i<doomcom->numnodes ; i++) | |
- if ( fromaddress.sin_addr.s_addr == sendaddress[i].sin_addr.s_addr ) | |
- break; | |
- | |
- if (i == doomcom->numnodes) | |
- { | |
- // packet is not from one of the players (new game broadcast) | |
- doomcom->remotenode = -1; // no packet | |
- return; | |
- } | |
- | |
- doomcom->remotenode = i; // good packet from a game player | |
- doomcom->datalength = c; | |
- | |
- // byte swap | |
- netbuffer->checksum = ntohl(sw.checksum); | |
- netbuffer->player = sw.player; | |
- netbuffer->retransmitfrom = sw.retransmitfrom; | |
- netbuffer->starttic = sw.starttic; | |
- netbuffer->numtics = sw.numtics; | |
- | |
- for (c=0 ; c< netbuffer->numtics ; c++) | |
- { | |
- netbuffer->cmds[c].forwardmove = sw.cmds[c].forwardmove; | |
- netbuffer->cmds[c].sidemove = sw.cmds[c].sidemove; | |
- netbuffer->cmds[c].angleturn = ntohs(sw.cmds[c].angleturn); | |
- netbuffer->cmds[c].consistancy = ntohs(sw.cmds[c].consistancy); | |
- netbuffer->cmds[c].chatchar = sw.cmds[c].chatchar; | |
- netbuffer->cmds[c].buttons = sw.cmds[c].buttons; | |
- } | |
-} | |
- | |
- | |
- | |
-int GetLocalAddress (void) | |
-{ | |
- char hostname[1024]; | |
- struct hostent* hostentry; // host information entry | |
- int v; | |
- | |
- // get local address | |
- v = gethostname (hostname, sizeof(hostname)); | |
- if (v == -1) | |
- I_Error ("GetLocalAddress : gethostname: errno %d",errno); | |
- | |
- hostentry = gethostbyname (hostname); | |
- if (!hostentry) | |
- I_Error ("GetLocalAddress : gethostbyname: couldn't get local host"); | |
- | |
- return *(int *)hostentry->h_addr_list[0]; | |
} | |
- | |
// | |
// I_InitNetwork | |
// | |
@@ -304,7 +141,7 @@ void I_InitNetwork (void) | |
{ | |
sendaddress[doomcom->numnodes].sin_family = AF_INET; | |
sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT); | |
- if (myargv[i][0] == '.') | |
+ /*if (myargv[i][0] == '.') | |
{ | |
sendaddress[doomcom->numnodes].sin_addr.s_addr | |
= inet_addr (myargv[i]+1); | |
@@ -316,7 +153,7 @@ void I_InitNetwork (void) | |
I_Error ("gethostbyname: couldn't find %s", myargv[i]); | |
sendaddress[doomcom->numnodes].sin_addr.s_addr | |
= *(int *)hostentry->h_addr_list[0]; | |
- } | |
+ }*/ | |
doomcom->numnodes++; | |
} | |
@@ -324,25 +161,15 @@ void I_InitNetwork (void) | |
doomcom->numplayers = doomcom->numnodes; | |
// build message to receive | |
- insocket = UDPsocket (); | |
+ /*insocket = UDPsocket (); | |
BindToLocalPort (insocket,htons(DOOMPORT)); | |
ioctl (insocket, FIONBIO, &trueval); | |
- sendsocket = UDPsocket (); | |
+ sendsocket = UDPsocket ();*/ | |
} | |
void I_NetCmd (void) | |
{ | |
- if (doomcom->command == CMD_SEND) | |
- { | |
- netsend (); | |
- } | |
- else if (doomcom->command == CMD_GET) | |
- { | |
- netget (); | |
- } | |
- else | |
- I_Error ("Bad net cmd: %i\n",doomcom->command); | |
} | |
diff --git a/linuxdoom-1.10/i_sound.c b/linuxdoom-1.10/i_sound.c | |
index a327bfa..e462c08 100644 | |
--- a/linuxdoom-1.10/i_sound.c | |
+++ b/linuxdoom-1.10/i_sound.c | |
@@ -37,13 +37,11 @@ rcsid[] = "$Id: i_unix.c,v 1.5 1997/02/03 22:45:10 b1 Exp $"; | |
#include <sys/filio.h> | |
#endif | |
+#include <errno.h> | |
#include <fcntl.h> | |
#include <unistd.h> | |
#include <sys/ioctl.h> | |
-// Linux voxware output. | |
-#include <linux/soundcard.h> | |
- | |
// Timer stuff. Experimental. | |
#include <time.h> | |
#include <signal.h> | |
@@ -78,11 +76,6 @@ void I_SoundDelTimer( void ); | |
#endif | |
-// A quick hack to establish a protocol between | |
-// synchronous mix buffer updates and asynchronous | |
-// audio writes. Probably redundant with gametic. | |
-static int flag = 0; | |
- | |
// The number of internal mixing channels, | |
// the samples calculated for each mixing step, | |
// the size of the 16bit, 2 hardware channel (stereo) | |
@@ -163,7 +156,7 @@ myioctl | |
int* arg ) | |
{ | |
int rc; | |
- extern int errno; | |
+ //extern int errno; | |
rc = ioctl(fd, command, arg); | |
if (rc < 0) | |
@@ -395,32 +388,6 @@ addsfx | |
// | |
void I_SetChannels() | |
{ | |
- // Init internal lookups (raw data, mixing buffer, channels). | |
- // This function sets up internal lookups used during | |
- // the mixing process. | |
- int i; | |
- int j; | |
- | |
- int* steptablemid = steptable + 128; | |
- | |
- // Okay, reset internal mixing channels to zero. | |
- /*for (i=0; i<NUM_CHANNELS; i++) | |
- { | |
- channels[i] = 0; | |
- }*/ | |
- | |
- // This table provides step widths for pitch parameters. | |
- // I fail to see that this is currently used. | |
- for (i=-128 ; i<128 ; i++) | |
- steptablemid[i] = (int)(pow(2.0, (i/64.0))*65536.0); | |
- | |
- | |
- // Generates volume lookup tables | |
- // which also turn the unsigned samples | |
- // into signed samples. | |
- for (i=0 ; i<128 ; i++) | |
- for (j=0 ; j<256 ; j++) | |
- vol_lookup[i*256+j] = (i*(j-128)*256)/127; | |
} | |
@@ -475,29 +442,7 @@ I_StartSound | |
int pitch, | |
int priority ) | |
{ | |
- | |
- // UNUSED | |
- priority = 0; | |
- | |
-#ifdef SNDSERV | |
- if (sndserver) | |
- { | |
- fprintf(sndserver, "p%2.2x%2.2x%2.2x%2.2x\n", id, pitch, vol, sep); | |
- fflush(sndserver); | |
- } | |
- // warning: control reaches end of non-void function. | |
- return id; | |
-#else | |
- // Debug. | |
- //fprintf( stderr, "starting sound %d", id ); | |
- | |
- // Returns a handle (not used). | |
- id = addsfx( id, vol, steptable[pitch], sep ); | |
- | |
- // fprintf( stderr, "/handle is %d\n", id ); | |
- | |
- return id; | |
-#endif | |
+ return 0; | |
} | |
@@ -538,119 +483,6 @@ int I_SoundIsPlaying(int handle) | |
// | |
void I_UpdateSound( void ) | |
{ | |
-#ifdef SNDINTR | |
- // Debug. Count buffer misses with interrupt. | |
- static int misses = 0; | |
-#endif | |
- | |
- | |
- // Mix current sound data. | |
- // Data, from raw sound, for right and left. | |
- register unsigned int sample; | |
- register int dl; | |
- register int dr; | |
- | |
- // Pointers in global mixbuffer, left, right, end. | |
- signed short* leftout; | |
- signed short* rightout; | |
- signed short* leftend; | |
- // Step in mixbuffer, left and right, thus two. | |
- int step; | |
- | |
- // Mixing channel index. | |
- int chan; | |
- | |
- // Left and right channel | |
- // are in global mixbuffer, alternating. | |
- leftout = mixbuffer; | |
- rightout = mixbuffer+1; | |
- step = 2; | |
- | |
- // Determine end, for left channel only | |
- // (right channel is implicit). | |
- leftend = mixbuffer + SAMPLECOUNT*step; | |
- | |
- // Mix sounds into the mixing buffer. | |
- // Loop over step*SAMPLECOUNT, | |
- // that is 512 values for two channels. | |
- while (leftout != leftend) | |
- { | |
- // Reset left/right value. | |
- dl = 0; | |
- dr = 0; | |
- | |
- // Love thy L2 chache - made this a loop. | |
- // Now more channels could be set at compile time | |
- // as well. Thus loop those channels. | |
- for ( chan = 0; chan < NUM_CHANNELS; chan++ ) | |
- { | |
- // Check channel, if active. | |
- if (channels[ chan ]) | |
- { | |
- // Get the raw data from the channel. | |
- sample = *channels[ chan ]; | |
- // Add left and right part | |
- // for this channel (sound) | |
- // to the current data. | |
- // Adjust volume accordingly. | |
- dl += channelleftvol_lookup[ chan ][sample]; | |
- dr += channelrightvol_lookup[ chan ][sample]; | |
- // Increment index ??? | |
- channelstepremainder[ chan ] += channelstep[ chan ]; | |
- // MSB is next sample??? | |
- channels[ chan ] += channelstepremainder[ chan ] >> 16; | |
- // Limit to LSB??? | |
- channelstepremainder[ chan ] &= 65536-1; | |
- | |
- // Check whether we are done. | |
- if (channels[ chan ] >= channelsend[ chan ]) | |
- channels[ chan ] = 0; | |
- } | |
- } | |
- | |
- // Clamp to range. Left hardware channel. | |
- // Has been char instead of short. | |
- // if (dl > 127) *leftout = 127; | |
- // else if (dl < -128) *leftout = -128; | |
- // else *leftout = dl; | |
- | |
- if (dl > 0x7fff) | |
- *leftout = 0x7fff; | |
- else if (dl < -0x8000) | |
- *leftout = -0x8000; | |
- else | |
- *leftout = dl; | |
- | |
- // Same for right hardware channel. | |
- if (dr > 0x7fff) | |
- *rightout = 0x7fff; | |
- else if (dr < -0x8000) | |
- *rightout = -0x8000; | |
- else | |
- *rightout = dr; | |
- | |
- // Increment current pointers in mixbuffer. | |
- leftout += step; | |
- rightout += step; | |
- } | |
- | |
-#ifdef SNDINTR | |
- // Debug check. | |
- if ( flag ) | |
- { | |
- misses += flag; | |
- flag = 0; | |
- } | |
- | |
- if ( misses > 10 ) | |
- { | |
- fprintf( stderr, "I_SoundUpdate: missed 10 buffer writes\n"); | |
- misses = 0; | |
- } | |
- | |
- // Increment flag for update. | |
- flag++; | |
-#endif | |
} | |
@@ -665,8 +497,6 @@ void I_UpdateSound( void ) | |
void | |
I_SubmitSound(void) | |
{ | |
- // Write it to DSP device. | |
- write(audio_fd, mixbuffer, SAMPLECOUNT*BUFMUL); | |
} | |
@@ -691,42 +521,7 @@ I_UpdateSoundParams | |
void I_ShutdownSound(void) | |
-{ | |
-#ifdef SNDSERV | |
- if (sndserver) | |
- { | |
- // Send a "quit" command. | |
- fprintf(sndserver, "q\n"); | |
- fflush(sndserver); | |
- } | |
-#else | |
- // Wait till all pending sounds are finished. | |
- int done = 0; | |
- int i; | |
- | |
- | |
- // FIXME (below). | |
- fprintf( stderr, "I_ShutdownSound: NOT finishing pending sounds\n"); | |
- fflush( stderr ); | |
- | |
- while ( !done ) | |
- { | |
- for( i=0 ; i<8 && !channels[i] ; i++); | |
- | |
- // FIXME. No proper channel output. | |
- //if (i==8) | |
- done=1; | |
- } | |
-#ifdef SNDINTR | |
- I_SoundDelTimer(); | |
-#endif | |
- | |
- // Cleaning up -releasing the DSP device. | |
- close ( audio_fd ); | |
-#endif | |
- | |
- // Done. | |
- return; | |
+{ | |
} | |
@@ -736,92 +531,7 @@ void I_ShutdownSound(void) | |
void | |
I_InitSound() | |
-{ | |
-#ifdef SNDSERV | |
- char buffer[256]; | |
- | |
- if (getenv("DOOMWADDIR")) | |
- sprintf(buffer, "%s/%s", | |
- getenv("DOOMWADDIR"), | |
- sndserver_filename); | |
- else | |
- sprintf(buffer, "%s", sndserver_filename); | |
- | |
- // start sound process | |
- if ( !access(buffer, X_OK) ) | |
- { | |
- strcat(buffer, " -quiet"); | |
- sndserver = popen(buffer, "w"); | |
- } | |
- else | |
- fprintf(stderr, "Could not start sound server [%s]\n", buffer); | |
-#else | |
- | |
- int i; | |
- | |
-#ifdef SNDINTR | |
- fprintf( stderr, "I_SoundSetTimer: %d microsecs\n", SOUND_INTERVAL ); | |
- I_SoundSetTimer( SOUND_INTERVAL ); | |
-#endif | |
- | |
- // Secure and configure sound device first. | |
- fprintf( stderr, "I_InitSound: "); | |
- | |
- audio_fd = open("/dev/dsp", O_WRONLY); | |
- if (audio_fd<0) | |
- fprintf(stderr, "Could not open /dev/dsp\n"); | |
- | |
- | |
- i = 11 | (2<<16); | |
- myioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &i); | |
- myioctl(audio_fd, SNDCTL_DSP_RESET, 0); | |
- | |
- i=SAMPLERATE; | |
- | |
- myioctl(audio_fd, SNDCTL_DSP_SPEED, &i); | |
- | |
- i=1; | |
- myioctl(audio_fd, SNDCTL_DSP_STEREO, &i); | |
- | |
- myioctl(audio_fd, SNDCTL_DSP_GETFMTS, &i); | |
- | |
- if (i&=AFMT_S16_LE) | |
- myioctl(audio_fd, SNDCTL_DSP_SETFMT, &i); | |
- else | |
- fprintf(stderr, "Could not play signed 16 data\n"); | |
- | |
- fprintf(stderr, " configured audio device\n" ); | |
- | |
- | |
- // Initialize external data (all sounds) at start, keep static. | |
- fprintf( stderr, "I_InitSound: "); | |
- | |
- for (i=1 ; i<NUMSFX ; i++) | |
- { | |
- // Alias? Example is the chaingun sound linked to pistol. | |
- if (!S_sfx[i].link) | |
- { | |
- // Load data from WAD file. | |
- S_sfx[i].data = getsfx( S_sfx[i].name, &lengths[i] ); | |
- } | |
- else | |
- { | |
- // Previously loaded already? | |
- S_sfx[i].data = S_sfx[i].link->data; | |
- lengths[i] = lengths[(S_sfx[i].link - S_sfx)/sizeof(sfxinfo_t)]; | |
- } | |
- } | |
- | |
- fprintf( stderr, " pre-cached all sound data\n"); | |
- | |
- // Now initialize mixbuffer with zero. | |
- for ( i = 0; i< MIXBUFFERSIZE; i++ ) | |
- mixbuffer[i] = 0; | |
- | |
- // Finished initialization. | |
- fprintf(stderr, "I_InitSound: sound module ready\n"); | |
- | |
-#endif | |
+{ | |
} | |
@@ -904,82 +614,19 @@ int I_QrySongPlaying(int handle) | |
typedef int tSigSet; | |
#endif | |
- | |
-// We might use SIGVTALRM and ITIMER_VIRTUAL, if the process | |
-// time independend timer happens to get lost due to heavy load. | |
-// SIGALRM and ITIMER_REAL doesn't really work well. | |
-// There are issues with profiling as well. | |
-static int /*__itimer_which*/ itimer = ITIMER_REAL; | |
- | |
-static int sig = SIGALRM; | |
- | |
// Interrupt handler. | |
void I_HandleSoundTimer( int ignore ) | |
{ | |
- // Debug. | |
- //fprintf( stderr, "%c", '+' ); fflush( stderr ); | |
- | |
- // Feed sound device if necesary. | |
- if ( flag ) | |
- { | |
- // See I_SubmitSound(). | |
- // Write it to DSP device. | |
- write(audio_fd, mixbuffer, SAMPLECOUNT*BUFMUL); | |
- | |
- // Reset flag counter. | |
- flag = 0; | |
- } | |
- else | |
- return; | |
- | |
- // UNUSED, but required. | |
- ignore = 0; | |
- return; | |
} | |
// Get the interrupt. Set duration in millisecs. | |
int I_SoundSetTimer( int duration_of_tick ) | |
{ | |
- // Needed for gametick clockwork. | |
- struct itimerval value; | |
- struct itimerval ovalue; | |
- struct sigaction act; | |
- struct sigaction oact; | |
- | |
- int res; | |
- | |
- // This sets to SA_ONESHOT and SA_NOMASK, thus we can not use it. | |
- // signal( _sig, handle_SIG_TICK ); | |
- | |
- // Now we have to change this attribute for repeated calls. | |
- act.sa_handler = I_HandleSoundTimer; | |
-#ifndef sun | |
- //ac t.sa_mask = _sig; | |
-#endif | |
- act.sa_flags = SA_RESTART; | |
- | |
- sigaction( sig, &act, &oact ); | |
- | |
- value.it_interval.tv_sec = 0; | |
- value.it_interval.tv_usec = duration_of_tick; | |
- value.it_value.tv_sec = 0; | |
- value.it_value.tv_usec = duration_of_tick; | |
- | |
- // Error is -1. | |
- res = setitimer( itimer, &value, &ovalue ); | |
- | |
- // Debug. | |
- if ( res == -1 ) | |
- fprintf( stderr, "I_SoundSetTimer: interrupt n.a.\n"); | |
- | |
- return res; | |
+ return 0; | |
} | |
// Remove the interrupt. Set duration to zero. | |
void I_SoundDelTimer() | |
{ | |
- // Debug. | |
- if ( I_SoundSetTimer( 0 ) == -1) | |
- fprintf( stderr, "I_SoundDelTimer: failed to remove interrupt. Doh!\n"); | |
} | |
diff --git a/linuxdoom-1.10/i_video.c b/linuxdoom-1.10/i_video.c | |
index 9b311b3..7949b78 100644 | |
--- a/linuxdoom-1.10/i_video.c | |
+++ b/linuxdoom-1.10/i_video.c | |
@@ -26,19 +26,6 @@ rcsid[] = "$Id: i_x.c,v 1.6 1997/02/03 22:45:10 b1 Exp $"; | |
#include <stdlib.h> | |
#include <unistd.h> | |
-#include <sys/ipc.h> | |
-#include <sys/shm.h> | |
- | |
-#include <X11/Xlib.h> | |
-#include <X11/Xutil.h> | |
-#include <X11/keysym.h> | |
- | |
-#include <X11/extensions/XShm.h> | |
-// Had to dig up XShm.c for this one. | |
-// It is in the libXext, but not in the XFree86 headers. | |
-#ifdef LINUX | |
-int XShmGetEventBase( Display* dpy ); // problems with g++? | |
-#endif | |
#include <stdarg.h> | |
#include <sys/time.h> | |
@@ -46,7 +33,7 @@ int XShmGetEventBase( Display* dpy ); // problems with g++? | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
-#include <errnos.h> | |
+#include <errno.h> | |
#include <signal.h> | |
#include "doomstat.h" | |
@@ -57,124 +44,33 @@ int XShmGetEventBase( Display* dpy ); // problems with g++? | |
#include "doomdef.h" | |
-#define POINTER_WARP_COUNTDOWN 1 | |
- | |
-Display* X_display=0; | |
-Window X_mainWindow; | |
-Colormap X_cmap; | |
-Visual* X_visual; | |
-GC X_gc; | |
-XEvent X_event; | |
-int X_screen; | |
-XVisualInfo X_visualinfo; | |
-XImage* image; | |
-int X_width; | |
-int X_height; | |
- | |
-// MIT SHared Memory extension. | |
-boolean doShm; | |
- | |
-XShmSegmentInfo X_shminfo; | |
-int X_shmeventtype; | |
- | |
-// Fake mouse handling. | |
-// This cannot work properly w/o DGA. | |
-// Needs an invisible mouse cursor at least. | |
-boolean grabMouse; | |
-int doPointerWarp = POINTER_WARP_COUNTDOWN; | |
- | |
-// Blocky mode, | |
-// replace each 320x200 pixel with multiply*multiply pixels. | |
-// According to Dave Taylor, it still is a bonehead thing | |
-// to use .... | |
-static int multiply=1; | |
- | |
- | |
-// | |
-// Translates the key currently in X_event | |
-// | |
- | |
-int xlatekey(void) | |
-{ | |
- | |
- int rc; | |
- | |
- switch(rc = XKeycodeToKeysym(X_display, X_event.xkey.keycode, 0)) | |
- { | |
- case XK_Left: rc = KEY_LEFTARROW; break; | |
- case XK_Right: rc = KEY_RIGHTARROW; break; | |
- case XK_Down: rc = KEY_DOWNARROW; break; | |
- case XK_Up: rc = KEY_UPARROW; break; | |
- case XK_Escape: rc = KEY_ESCAPE; break; | |
- case XK_Return: rc = KEY_ENTER; break; | |
- case XK_Tab: rc = KEY_TAB; break; | |
- case XK_F1: rc = KEY_F1; break; | |
- case XK_F2: rc = KEY_F2; break; | |
- case XK_F3: rc = KEY_F3; break; | |
- case XK_F4: rc = KEY_F4; break; | |
- case XK_F5: rc = KEY_F5; break; | |
- case XK_F6: rc = KEY_F6; break; | |
- case XK_F7: rc = KEY_F7; break; | |
- case XK_F8: rc = KEY_F8; break; | |
- case XK_F9: rc = KEY_F9; break; | |
- case XK_F10: rc = KEY_F10; break; | |
- case XK_F11: rc = KEY_F11; break; | |
- case XK_F12: rc = KEY_F12; break; | |
- | |
- case XK_BackSpace: | |
- case XK_Delete: rc = KEY_BACKSPACE; break; | |
- | |
- case XK_Pause: rc = KEY_PAUSE; break; | |
- | |
- case XK_KP_Equal: | |
- case XK_equal: rc = KEY_EQUALS; break; | |
- | |
- case XK_KP_Subtract: | |
- case XK_minus: rc = KEY_MINUS; break; | |
- case XK_Shift_L: | |
- case XK_Shift_R: | |
- rc = KEY_RSHIFT; | |
- break; | |
- | |
- case XK_Control_L: | |
- case XK_Control_R: | |
- rc = KEY_RCTRL; | |
- break; | |
- | |
- case XK_Alt_L: | |
- case XK_Meta_L: | |
- case XK_Alt_R: | |
- case XK_Meta_R: | |
- rc = KEY_RALT; | |
- break; | |
- | |
- default: | |
- if (rc >= XK_space && rc <= XK_asciitilde) | |
- rc = rc - XK_space + ' '; | |
- if (rc >= 'A' && rc <= 'Z') | |
- rc = rc - 'A' + 'a'; | |
- break; | |
- } | |
+extern uint32_t redshirt_emit_message( | |
+ const uint8_t* interface_hash, | |
+ const uint32_t* msg_bufs_ptrs, | |
+ uint32_t msg_bufs_num, | |
+ uint32_t needs_answer, | |
+ uint32_t allow_delay, | |
+ uint64_t* message_id_out | |
+) __attribute__(( | |
+ __import_module__("redshirt"), | |
+ __import_name__("emit_message") | |
+)); | |
- return rc; | |
+const unsigned char framebuffer_interface[] = { | |
+ 0xfc, 0x60, 0x2e, 0x6e, 0xf2, 0x43, 0x9c, 0xa0, 0x40, 0x88, 0x81, 0x7d, 0xe5, 0xaf, 0xb6, 0x90, | |
+ 0x9e, 0x57, 0xc6, 0xc2, 0x5e, 0xbf, 0x02, 0x5b, 0x87, 0x7f, 0xaa, 0xae, 0xbe, 0xd5, 0x19, 0x9c, | |
+}; | |
-} | |
void I_ShutdownGraphics(void) | |
{ | |
- // Detach from X server | |
- if (!XShmDetach(X_display, &X_shminfo)) | |
- I_Error("XShmDetach() failed in I_ShutdownGraphics()"); | |
- | |
- // Release shared memory. | |
- shmdt(X_shminfo.shmaddr); | |
- shmctl(X_shminfo.shmid, IPC_RMID, 0); | |
- | |
- // Paranoia. | |
- image->data = NULL; | |
+ const unsigned char msg[] = { 1, 1, 2, 3, 4 }; | |
+ const uint32_t msg_bufs[] = { (uint32_t)(const unsigned char*)msg, 5 }; | |
+ redshirt_emit_message(framebuffer_interface, msg_bufs, 1, 0, 1, 0); | |
} | |
+byte* current_palette = 0; | |
// | |
@@ -183,124 +79,6 @@ void I_ShutdownGraphics(void) | |
void I_StartFrame (void) | |
{ | |
// er? | |
- | |
-} | |
- | |
-static int lastmousex = 0; | |
-static int lastmousey = 0; | |
-boolean mousemoved = false; | |
-boolean shmFinished; | |
- | |
-void I_GetEvent(void) | |
-{ | |
- | |
- event_t event; | |
- | |
- // put event-grabbing stuff in here | |
- XNextEvent(X_display, &X_event); | |
- switch (X_event.type) | |
- { | |
- case KeyPress: | |
- event.type = ev_keydown; | |
- event.data1 = xlatekey(); | |
- D_PostEvent(&event); | |
- // fprintf(stderr, "k"); | |
- break; | |
- case KeyRelease: | |
- event.type = ev_keyup; | |
- event.data1 = xlatekey(); | |
- D_PostEvent(&event); | |
- // fprintf(stderr, "ku"); | |
- break; | |
- case ButtonPress: | |
- event.type = ev_mouse; | |
- event.data1 = | |
- (X_event.xbutton.state & Button1Mask) | |
- | (X_event.xbutton.state & Button2Mask ? 2 : 0) | |
- | (X_event.xbutton.state & Button3Mask ? 4 : 0) | |
- | (X_event.xbutton.button == Button1) | |
- | (X_event.xbutton.button == Button2 ? 2 : 0) | |
- | (X_event.xbutton.button == Button3 ? 4 : 0); | |
- event.data2 = event.data3 = 0; | |
- D_PostEvent(&event); | |
- // fprintf(stderr, "b"); | |
- break; | |
- case ButtonRelease: | |
- event.type = ev_mouse; | |
- event.data1 = | |
- (X_event.xbutton.state & Button1Mask) | |
- | (X_event.xbutton.state & Button2Mask ? 2 : 0) | |
- | (X_event.xbutton.state & Button3Mask ? 4 : 0); | |
- // suggest parentheses around arithmetic in operand of | | |
- event.data1 = | |
- event.data1 | |
- ^ (X_event.xbutton.button == Button1 ? 1 : 0) | |
- ^ (X_event.xbutton.button == Button2 ? 2 : 0) | |
- ^ (X_event.xbutton.button == Button3 ? 4 : 0); | |
- event.data2 = event.data3 = 0; | |
- D_PostEvent(&event); | |
- // fprintf(stderr, "bu"); | |
- break; | |
- case MotionNotify: | |
- event.type = ev_mouse; | |
- event.data1 = | |
- (X_event.xmotion.state & Button1Mask) | |
- | (X_event.xmotion.state & Button2Mask ? 2 : 0) | |
- | (X_event.xmotion.state & Button3Mask ? 4 : 0); | |
- event.data2 = (X_event.xmotion.x - lastmousex) << 2; | |
- event.data3 = (lastmousey - X_event.xmotion.y) << 2; | |
- | |
- if (event.data2 || event.data3) | |
- { | |
- lastmousex = X_event.xmotion.x; | |
- lastmousey = X_event.xmotion.y; | |
- if (X_event.xmotion.x != X_width/2 && | |
- X_event.xmotion.y != X_height/2) | |
- { | |
- D_PostEvent(&event); | |
- // fprintf(stderr, "m"); | |
- mousemoved = false; | |
- } else | |
- { | |
- mousemoved = true; | |
- } | |
- } | |
- break; | |
- | |
- case Expose: | |
- case ConfigureNotify: | |
- break; | |
- | |
- default: | |
- if (doShm && X_event.type == X_shmeventtype) shmFinished = true; | |
- break; | |
- } | |
- | |
-} | |
- | |
-Cursor | |
-createnullcursor | |
-( Display* display, | |
- Window root ) | |
-{ | |
- Pixmap cursormask; | |
- XGCValues xgc; | |
- GC gc; | |
- XColor dummycolour; | |
- Cursor cursor; | |
- | |
- cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/); | |
- xgc.function = GXclear; | |
- gc = XCreateGC(display, cursormask, GCFunction, &xgc); | |
- XFillRectangle(display, cursormask, gc, 0, 0, 1, 1); | |
- dummycolour.pixel = 0; | |
- dummycolour.red = 0; | |
- dummycolour.flags = 04; | |
- cursor = XCreatePixmapCursor(display, cursormask, cursormask, | |
- &dummycolour,&dummycolour, 0,0); | |
- XFreePixmap(display,cursormask); | |
- XFreeGC(display,gc); | |
- return cursor; | |
} | |
// | |
@@ -308,33 +86,7 @@ createnullcursor | |
// | |
void I_StartTic (void) | |
{ | |
- | |
- if (!X_display) | |
- return; | |
- | |
- while (XPending(X_display)) | |
- I_GetEvent(); | |
- | |
- // Warp the pointer back to the middle of the window | |
- // or it will wander off - that is, the game will | |
- // loose input focus within X11. | |
- if (grabMouse) | |
- { | |
- if (!--doPointerWarp) | |
- { | |
- XWarpPointer( X_display, | |
- None, | |
- X_mainWindow, | |
- 0, 0, | |
- 0, 0, | |
- X_width/2, X_height/2); | |
- | |
- doPointerWarp = POINTER_WARP_COUNTDOWN; | |
- } | |
- } | |
- | |
- mousemoved = false; | |
- | |
+ // TODO: call D_PostEvent for all incoming events | |
} | |
@@ -343,6 +95,7 @@ void I_StartTic (void) | |
// | |
void I_UpdateNoBlit (void) | |
{ | |
+ // [Note from redshirt port]: the comment below is original and the function is empty | |
// what is this? | |
} | |
@@ -351,173 +104,23 @@ void I_UpdateNoBlit (void) | |
// | |
void I_FinishUpdate (void) | |
{ | |
- | |
- static int lasttic; | |
- int tics; | |
- int i; | |
- // UNUSED static unsigned char *bigscreen=0; | |
- | |
- // draws little dots on the bottom of the screen | |
- if (devparm) | |
- { | |
- | |
- i = I_GetTime(); | |
- tics = i - lasttic; | |
- lasttic = i; | |
- if (tics > 20) tics = 20; | |
- | |
- for (i=0 ; i<tics*2 ; i+=2) | |
- screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff; | |
- for ( ; i<20*2 ; i+=2) | |
- screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0; | |
- | |
- } | |
- | |
- // scales the screen size before blitting it | |
- if (multiply == 2) | |
- { | |
- unsigned int *olineptrs[2]; | |
- unsigned int *ilineptr; | |
- int x, y, i; | |
- unsigned int twoopixels; | |
- unsigned int twomoreopixels; | |
- unsigned int fouripixels; | |
- | |
- ilineptr = (unsigned int *) (screens[0]); | |
- for (i=0 ; i<2 ; i++) | |
- olineptrs[i] = (unsigned int *) &image->data[i*X_width]; | |
- | |
- y = SCREENHEIGHT; | |
- while (y--) | |
- { | |
- x = SCREENWIDTH; | |
- do | |
- { | |
- fouripixels = *ilineptr++; | |
- twoopixels = (fouripixels & 0xff000000) | |
- | ((fouripixels>>8) & 0xffff00) | |
- | ((fouripixels>>16) & 0xff); | |
- twomoreopixels = ((fouripixels<<16) & 0xff000000) | |
- | ((fouripixels<<8) & 0xffff00) | |
- | (fouripixels & 0xff); | |
-#ifdef __BIG_ENDIAN__ | |
- *olineptrs[0]++ = twoopixels; | |
- *olineptrs[1]++ = twoopixels; | |
- *olineptrs[0]++ = twomoreopixels; | |
- *olineptrs[1]++ = twomoreopixels; | |
-#else | |
- *olineptrs[0]++ = twomoreopixels; | |
- *olineptrs[1]++ = twomoreopixels; | |
- *olineptrs[0]++ = twoopixels; | |
- *olineptrs[1]++ = twoopixels; | |
-#endif | |
- } while (x-=4); | |
- olineptrs[0] += X_width/4; | |
- olineptrs[1] += X_width/4; | |
+ if (current_palette == 0) | |
+ return; | |
+ | |
+ unsigned char* msg = (unsigned char*)malloc(5 + 3 * SCREENWIDTH * SCREENHEIGHT); | |
+ msg[0] = 2; | |
+ msg[1] = 1; | |
+ msg[2] = 2; | |
+ msg[3] = 3; | |
+ msg[4] = 4; | |
+ for (int i = 0; i < SCREENWIDTH * SCREENHEIGHT; ++i) { | |
+ byte* color = current_palette + screens[0][i] * 3; | |
+ msg[5 + i * 3 + 0] = color[0]; | |
+ msg[5 + i * 3 + 1] = color[1]; | |
+ msg[5 + i * 3 + 2] = color[2]; | |
} | |
- | |
- } | |
- else if (multiply == 3) | |
- { | |
- unsigned int *olineptrs[3]; | |
- unsigned int *ilineptr; | |
- int x, y, i; | |
- unsigned int fouropixels[3]; | |
- unsigned int fouripixels; | |
- | |
- ilineptr = (unsigned int *) (screens[0]); | |
- for (i=0 ; i<3 ; i++) | |
- olineptrs[i] = (unsigned int *) &image->data[i*X_width]; | |
- | |
- y = SCREENHEIGHT; | |
- while (y--) | |
- { | |
- x = SCREENWIDTH; | |
- do | |
- { | |
- fouripixels = *ilineptr++; | |
- fouropixels[0] = (fouripixels & 0xff000000) | |
- | ((fouripixels>>8) & 0xff0000) | |
- | ((fouripixels>>16) & 0xffff); | |
- fouropixels[1] = ((fouripixels<<8) & 0xff000000) | |
- | (fouripixels & 0xffff00) | |
- | ((fouripixels>>8) & 0xff); | |
- fouropixels[2] = ((fouripixels<<16) & 0xffff0000) | |
- | ((fouripixels<<8) & 0xff00) | |
- | (fouripixels & 0xff); | |
-#ifdef __BIG_ENDIAN__ | |
- *olineptrs[0]++ = fouropixels[0]; | |
- *olineptrs[1]++ = fouropixels[0]; | |
- *olineptrs[2]++ = fouropixels[0]; | |
- *olineptrs[0]++ = fouropixels[1]; | |
- *olineptrs[1]++ = fouropixels[1]; | |
- *olineptrs[2]++ = fouropixels[1]; | |
- *olineptrs[0]++ = fouropixels[2]; | |
- *olineptrs[1]++ = fouropixels[2]; | |
- *olineptrs[2]++ = fouropixels[2]; | |
-#else | |
- *olineptrs[0]++ = fouropixels[2]; | |
- *olineptrs[1]++ = fouropixels[2]; | |
- *olineptrs[2]++ = fouropixels[2]; | |
- *olineptrs[0]++ = fouropixels[1]; | |
- *olineptrs[1]++ = fouropixels[1]; | |
- *olineptrs[2]++ = fouropixels[1]; | |
- *olineptrs[0]++ = fouropixels[0]; | |
- *olineptrs[1]++ = fouropixels[0]; | |
- *olineptrs[2]++ = fouropixels[0]; | |
-#endif | |
- } while (x-=4); | |
- olineptrs[0] += 2*X_width/4; | |
- olineptrs[1] += 2*X_width/4; | |
- olineptrs[2] += 2*X_width/4; | |
- } | |
- | |
- } | |
- else if (multiply == 4) | |
- { | |
- // Broken. Gotta fix this some day. | |
- void Expand4(unsigned *, double *); | |
- Expand4 ((unsigned *)(screens[0]), (double *) (image->data)); | |
- } | |
- | |
- if (doShm) | |
- { | |
- | |
- if (!XShmPutImage( X_display, | |
- X_mainWindow, | |
- X_gc, | |
- image, | |
- 0, 0, | |
- 0, 0, | |
- X_width, X_height, | |
- True )) | |
- I_Error("XShmPutImage() failed\n"); | |
- | |
- // wait for it to finish and processes all input events | |
- shmFinished = false; | |
- do | |
- { | |
- I_GetEvent(); | |
- } while (!shmFinished); | |
- | |
- } | |
- else | |
- { | |
- | |
- // draw the image | |
- XPutImage( X_display, | |
- X_mainWindow, | |
- X_gc, | |
- image, | |
- 0, 0, | |
- 0, 0, | |
- X_width, X_height ); | |
- | |
- // sync up with server | |
- XSync(X_display, False); | |
- | |
- } | |
- | |
+ const uint32_t msg_bufs[] = { (uint32_t)(const unsigned char*)msg, 5 + 3 * SCREENWIDTH * SCREENHEIGHT }; | |
+ redshirt_emit_message(framebuffer_interface, msg_bufs, 1, 0, 1, 0); | |
} | |
@@ -526,525 +129,24 @@ void I_FinishUpdate (void) | |
// | |
void I_ReadScreen (byte* scr) | |
{ | |
- memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT); | |
+ memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT); | |
} | |
-// | |
-// Palette stuff. | |
-// | |
-static XColor colors[256]; | |
- | |
-void UploadNewPalette(Colormap cmap, byte *palette) | |
-{ | |
- | |
- register int i; | |
- register int c; | |
- static boolean firstcall = true; | |
- | |
-#ifdef __cplusplus | |
- if (X_visualinfo.c_class == PseudoColor && X_visualinfo.depth == 8) | |
-#else | |
- if (X_visualinfo.class == PseudoColor && X_visualinfo.depth == 8) | |
-#endif | |
- { | |
- // initialize the colormap | |
- if (firstcall) | |
- { | |
- firstcall = false; | |
- for (i=0 ; i<256 ; i++) | |
- { | |
- colors[i].pixel = i; | |
- colors[i].flags = DoRed|DoGreen|DoBlue; | |
- } | |
- } | |
- | |
- // set the X colormap entries | |
- for (i=0 ; i<256 ; i++) | |
- { | |
- c = gammatable[usegamma][*palette++]; | |
- colors[i].red = (c<<8) + c; | |
- c = gammatable[usegamma][*palette++]; | |
- colors[i].green = (c<<8) + c; | |
- c = gammatable[usegamma][*palette++]; | |
- colors[i].blue = (c<<8) + c; | |
- } | |
- | |
- // store the colors to the current colormap | |
- XStoreColors(X_display, cmap, colors, 256); | |
- | |
- } | |
-} | |
- | |
// | |
// I_SetPalette | |
// | |
void I_SetPalette (byte* palette) | |
{ | |
- UploadNewPalette(X_cmap, palette); | |
-} | |
- | |
- | |
-// | |
-// This function is probably redundant, | |
-// if XShmDetach works properly. | |
-// ddt never detached the XShm memory, | |
-// thus there might have been stale | |
-// handles accumulating. | |
-// | |
-void grabsharedmemory(int size) | |
-{ | |
- | |
- int key = ('d'<<24) | ('o'<<16) | ('o'<<8) | 'm'; | |
- struct shmid_ds shminfo; | |
- int minsize = 320*200; | |
- int id; | |
- int rc; | |
- // UNUSED int done=0; | |
- int pollution=5; | |
- | |
- // try to use what was here before | |
- do | |
- { | |
- id = shmget((key_t) key, minsize, 0777); // just get the id | |
- if (id != -1) | |
- { | |
- rc=shmctl(id, IPC_STAT, &shminfo); // get stats on it | |
- if (!rc) | |
- { | |
- if (shminfo.shm_nattch) | |
- { | |
- fprintf(stderr, "User %d appears to be running " | |
- "DOOM. Is that wise?\n", shminfo.shm_cpid); | |
- key++; | |
- } | |
- else | |
- { | |
- if (getuid() == shminfo.shm_perm.cuid) | |
- { | |
- rc = shmctl(id, IPC_RMID, 0); | |
- if (!rc) | |
- fprintf(stderr, | |
- "Was able to kill my old shared memory\n"); | |
- else | |
- I_Error("Was NOT able to kill my old shared memory"); | |
- | |
- id = shmget((key_t)key, size, IPC_CREAT|0777); | |
- if (id==-1) | |
- I_Error("Could not get shared memory"); | |
- | |
- rc=shmctl(id, IPC_STAT, &shminfo); | |
- | |
- break; | |
- | |
- } | |
- if (size >= shminfo.shm_segsz) | |
- { | |
- fprintf(stderr, | |
- "will use %d's stale shared memory\n", | |
- shminfo.shm_cpid); | |
- break; | |
- } | |
- else | |
- { | |
- fprintf(stderr, | |
- "warning: can't use stale " | |
- "shared memory belonging to id %d, " | |
- "key=0x%x\n", | |
- shminfo.shm_cpid, key); | |
- key++; | |
- } | |
- } | |
- } | |
- else | |
- { | |
- I_Error("could not get stats on key=%d", key); | |
- } | |
- } | |
- else | |
- { | |
- id = shmget((key_t)key, size, IPC_CREAT|0777); | |
- if (id==-1) | |
- { | |
- extern int errno; | |
- fprintf(stderr, "errno=%d\n", errno); | |
- I_Error("Could not get any shared memory"); | |
- } | |
- break; | |
- } | |
- } while (--pollution); | |
- | |
- if (!pollution) | |
- { | |
- I_Error("Sorry, system too polluted with stale " | |
- "shared memory segments.\n"); | |
- } | |
- | |
- X_shminfo.shmid = id; | |
- | |
- // attach to the shared memory segment | |
- image->data = X_shminfo.shmaddr = shmat(id, 0, 0); | |
- | |
- fprintf(stderr, "shared memory id=%d, addr=0x%x\n", id, | |
- (int) (image->data)); | |
+ memcpy(current_palette, palette, 3 * 256); | |
} | |
void I_InitGraphics(void) | |
{ | |
- | |
- char* displayname; | |
- char* d; | |
- int n; | |
- int pnum; | |
- int x=0; | |
- int y=0; | |
- | |
- // warning: char format, different type arg | |
- char xsign=' '; | |
- char ysign=' '; | |
- | |
- int oktodraw; | |
- unsigned long attribmask; | |
- XSetWindowAttributes attribs; | |
- XGCValues xgcvalues; | |
- int valuemask; | |
- static int firsttime=1; | |
- | |
- if (!firsttime) | |
- return; | |
- firsttime = 0; | |
- | |
- signal(SIGINT, (void (*)(int)) I_Quit); | |
- | |
- if (M_CheckParm("-2")) | |
- multiply = 2; | |
- | |
- if (M_CheckParm("-3")) | |
- multiply = 3; | |
- | |
- if (M_CheckParm("-4")) | |
- multiply = 4; | |
- | |
- X_width = SCREENWIDTH * multiply; | |
- X_height = SCREENHEIGHT * multiply; | |
- | |
- // check for command-line display name | |
- if ( (pnum=M_CheckParm("-disp")) ) // suggest parentheses around assignment | |
- displayname = myargv[pnum+1]; | |
- else | |
- displayname = 0; | |
- | |
- // check if the user wants to grab the mouse (quite unnice) | |
- grabMouse = !!M_CheckParm("-grabmouse"); | |
- | |
- // check for command-line geometry | |
- if ( (pnum=M_CheckParm("-geom")) ) // suggest parentheses around assignment | |
- { | |
- // warning: char format, different type arg 3,5 | |
- n = sscanf(myargv[pnum+1], "%c%d%c%d", &xsign, &x, &ysign, &y); | |
- | |
- if (n==2) | |
- x = y = 0; | |
- else if (n==6) | |
- { | |
- if (xsign == '-') | |
- x = -x; | |
- if (ysign == '-') | |
- y = -y; | |
- } | |
- else | |
- I_Error("bad -geom parameter"); | |
- } | |
- | |
- // open the display | |
- X_display = XOpenDisplay(displayname); | |
- if (!X_display) | |
- { | |
- if (displayname) | |
- I_Error("Could not open display [%s]", displayname); | |
- else | |
- I_Error("Could not open display (DISPLAY=[%s])", getenv("DISPLAY")); | |
- } | |
- | |
- // use the default visual | |
- X_screen = DefaultScreen(X_display); | |
- if (!XMatchVisualInfo(X_display, X_screen, 8, PseudoColor, &X_visualinfo)) | |
- I_Error("xdoom currently only supports 256-color PseudoColor screens"); | |
- X_visual = X_visualinfo.visual; | |
- | |
- // check for the MITSHM extension | |
- doShm = XShmQueryExtension(X_display); | |
- | |
- // even if it's available, make sure it's a local connection | |
- if (doShm) | |
- { | |
- if (!displayname) displayname = (char *) getenv("DISPLAY"); | |
- if (displayname) | |
- { | |
- d = displayname; | |
- while (*d && (*d != ':')) d++; | |
- if (*d) *d = 0; | |
- if (!(!strcasecmp(displayname, "unix") || !*displayname)) doShm = false; | |
- } | |
- } | |
- | |
- fprintf(stderr, "Using MITSHM extension\n"); | |
- | |
- // create the colormap | |
- X_cmap = XCreateColormap(X_display, RootWindow(X_display, | |
- X_screen), X_visual, AllocAll); | |
- | |
- // setup attributes for main window | |
- attribmask = CWEventMask | CWColormap | CWBorderPixel; | |
- attribs.event_mask = | |
- KeyPressMask | |
- | KeyReleaseMask | |
- // | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | |
- | ExposureMask; | |
- | |
- attribs.colormap = X_cmap; | |
- attribs.border_pixel = 0; | |
- | |
- // create the main window | |
- X_mainWindow = XCreateWindow( X_display, | |
- RootWindow(X_display, X_screen), | |
- x, y, | |
- X_width, X_height, | |
- 0, // borderwidth | |
- 8, // depth | |
- InputOutput, | |
- X_visual, | |
- attribmask, | |
- &attribs ); | |
- | |
- XDefineCursor(X_display, X_mainWindow, | |
- createnullcursor( X_display, X_mainWindow ) ); | |
- | |
- // create the GC | |
- valuemask = GCGraphicsExposures; | |
- xgcvalues.graphics_exposures = False; | |
- X_gc = XCreateGC( X_display, | |
- X_mainWindow, | |
- valuemask, | |
- &xgcvalues ); | |
- | |
- // map the window | |
- XMapWindow(X_display, X_mainWindow); | |
- | |
- // wait until it is OK to draw | |
- oktodraw = 0; | |
- while (!oktodraw) | |
- { | |
- XNextEvent(X_display, &X_event); | |
- if (X_event.type == Expose | |
- && !X_event.xexpose.count) | |
- { | |
- oktodraw = 1; | |
- } | |
- } | |
- | |
- // grabs the pointer so it is restricted to this window | |
- if (grabMouse) | |
- XGrabPointer(X_display, X_mainWindow, True, | |
- ButtonPressMask|ButtonReleaseMask|PointerMotionMask, | |
- GrabModeAsync, GrabModeAsync, | |
- X_mainWindow, None, CurrentTime); | |
- | |
- if (doShm) | |
- { | |
- | |
- X_shmeventtype = XShmGetEventBase(X_display) + ShmCompletion; | |
- | |
- // create the image | |
- image = XShmCreateImage( X_display, | |
- X_visual, | |
- 8, | |
- ZPixmap, | |
- 0, | |
- &X_shminfo, | |
- X_width, | |
- X_height ); | |
- | |
- grabsharedmemory(image->bytes_per_line * image->height); | |
- | |
- | |
- // UNUSED | |
- // create the shared memory segment | |
- // X_shminfo.shmid = shmget (IPC_PRIVATE, | |
- // image->bytes_per_line * image->height, IPC_CREAT | 0777); | |
- // if (X_shminfo.shmid < 0) | |
- // { | |
- // perror(""); | |
- // I_Error("shmget() failed in InitGraphics()"); | |
- // } | |
- // fprintf(stderr, "shared memory id=%d\n", X_shminfo.shmid); | |
- // attach to the shared memory segment | |
- // image->data = X_shminfo.shmaddr = shmat(X_shminfo.shmid, 0, 0); | |
- | |
- | |
- if (!image->data) | |
- { | |
- perror(""); | |
- I_Error("shmat() failed in InitGraphics()"); | |
- } | |
- | |
- // get the X server to attach to it | |
- if (!XShmAttach(X_display, &X_shminfo)) | |
- I_Error("XShmAttach() failed in InitGraphics()"); | |
- | |
- } | |
- else | |
- { | |
- image = XCreateImage( X_display, | |
- X_visual, | |
- 8, | |
- ZPixmap, | |
- 0, | |
- (char*)malloc(X_width * X_height), | |
- X_width, X_height, | |
- 8, | |
- X_width ); | |
- | |
- } | |
- | |
- if (multiply == 1) | |
- screens[0] = (unsigned char *) (image->data); | |
- else | |
screens[0] = (unsigned char *) malloc (SCREENWIDTH * SCREENHEIGHT); | |
+ current_palette = (byte*)malloc(3 * 256); | |
+ const unsigned char msg[] = { 0, 1, 2, 3, 4, (SCREENWIDTH & 0xff), (SCREENWIDTH >> 8), 0, 0, (SCREENHEIGHT & 0xff), (SCREENHEIGHT >> 8), 0, 0 }; | |
+ const uint32_t msg_bufs[] = { (uint32_t)(const unsigned char*)msg, 13 }; | |
+ redshirt_emit_message(framebuffer_interface, msg_bufs, 1, 0, 1, 0); | |
} | |
- | |
- | |
-unsigned exptable[256]; | |
- | |
-void InitExpand (void) | |
-{ | |
- int i; | |
- | |
- for (i=0 ; i<256 ; i++) | |
- exptable[i] = i | (i<<8) | (i<<16) | (i<<24); | |
-} | |
- | |
-double exptable2[256*256]; | |
- | |
-void InitExpand2 (void) | |
-{ | |
- int i; | |
- int j; | |
- // UNUSED unsigned iexp, jexp; | |
- double* exp; | |
- union | |
- { | |
- double d; | |
- unsigned u[2]; | |
- } pixel; | |
- | |
- printf ("building exptable2...\n"); | |
- exp = exptable2; | |
- for (i=0 ; i<256 ; i++) | |
- { | |
- pixel.u[0] = i | (i<<8) | (i<<16) | (i<<24); | |
- for (j=0 ; j<256 ; j++) | |
- { | |
- pixel.u[1] = j | (j<<8) | (j<<16) | (j<<24); | |
- *exp++ = pixel.d; | |
- } | |
- } | |
- printf ("done.\n"); | |
-} | |
- | |
-int inited; | |
- | |
-void | |
-Expand4 | |
-( unsigned* lineptr, | |
- double* xline ) | |
-{ | |
- double dpixel; | |
- unsigned x; | |
- unsigned y; | |
- unsigned fourpixels; | |
- unsigned step; | |
- double* exp; | |
- | |
- exp = exptable2; | |
- if (!inited) | |
- { | |
- inited = 1; | |
- InitExpand2 (); | |
- } | |
- | |
- | |
- step = 3*SCREENWIDTH/2; | |
- | |
- y = SCREENHEIGHT-1; | |
- do | |
- { | |
- x = SCREENWIDTH; | |
- | |
- do | |
- { | |
- fourpixels = lineptr[0]; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); | |
- xline[0] = dpixel; | |
- xline[160] = dpixel; | |
- xline[320] = dpixel; | |
- xline[480] = dpixel; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); | |
- xline[1] = dpixel; | |
- xline[161] = dpixel; | |
- xline[321] = dpixel; | |
- xline[481] = dpixel; | |
- | |
- fourpixels = lineptr[1]; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); | |
- xline[2] = dpixel; | |
- xline[162] = dpixel; | |
- xline[322] = dpixel; | |
- xline[482] = dpixel; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); | |
- xline[3] = dpixel; | |
- xline[163] = dpixel; | |
- xline[323] = dpixel; | |
- xline[483] = dpixel; | |
- | |
- fourpixels = lineptr[2]; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); | |
- xline[4] = dpixel; | |
- xline[164] = dpixel; | |
- xline[324] = dpixel; | |
- xline[484] = dpixel; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); | |
- xline[5] = dpixel; | |
- xline[165] = dpixel; | |
- xline[325] = dpixel; | |
- xline[485] = dpixel; | |
- | |
- fourpixels = lineptr[3]; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) ); | |
- xline[6] = dpixel; | |
- xline[166] = dpixel; | |
- xline[326] = dpixel; | |
- xline[486] = dpixel; | |
- | |
- dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) ); | |
- xline[7] = dpixel; | |
- xline[167] = dpixel; | |
- xline[327] = dpixel; | |
- xline[487] = dpixel; | |
- | |
- lineptr+=4; | |
- xline+=8; | |
- } while (x-=16); | |
- xline += step; | |
- } while (y--); | |
-} | |
- | |
- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment