Skip to content

Instantly share code, notes, and snippets.

@tomaka
Last active March 21, 2020 13:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomaka/f6b496a1ef59b1489f808e8b5bc38bcd to your computer and use it in GitHub Desktop.
Save tomaka/f6b496a1ef59b1489f808e8b5bc38bcd to your computer and use it in GitHub Desktop.
diff --git a/linuxdoom-1.10/Makefile b/linuxdoom-1.10/Makefile
index 8c69794..38a1617 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
+CFLAGS=--target=wasm32-wasi --sysroot=/home/pierre/Projets/wasi-libc/sysroot -O3 -m32 -Wall -DNORMALUNIX -DLINUX # -DUSEASM
LDFLAGS=-L/usr/X11R6/lib
-LIBS=-lXext -lX11 -lnsl -lm
+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_system.c b/linuxdoom-1.10/i_system.c
index 1b67d51..1349830 100644
--- a/linuxdoom-1.10/i_system.c
+++ b/linuxdoom-1.10/i_system.c
@@ -170,6 +170,7 @@ void I_Error (char *error, ...)
fprintf (stderr, "\n");
va_end (argptr);
+ fflush( stdout );
fflush( stderr );
// Shutdown. Here might be other errors.
diff --git a/linuxdoom-1.10/i_video.c b/linuxdoom-1.10/i_video.c
index 9b311b3..1d21434 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,122 +44,9 @@ 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;
- }
-
- return rc;
-
-}
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;
}
@@ -183,124 +57,10 @@ 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 +68,6 @@ 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;
-
}
@@ -351,173 +84,6 @@ 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;
- }
-
- }
- 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);
-
- }
-
}
@@ -526,525 +92,18 @@ void I_FinishUpdate (void)
//
void I_ReadScreen (byte* scr)
{
- 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));
-}
-
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);
-
-}
-
-
-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