Annotation of quake1/vid_xf86.c, revision 1.1.1.1

1.1       root        1: // vid_x.c -- general x video driver
                      2: 
                      3: #include <sys/time.h>
                      4: #include <sys/types.h>
                      5: #include <unistd.h>
                      6: #include <fcntl.h>
                      7: #include <signal.h>
                      8: #include <stdlib.h>
                      9: #include <stdio.h>
                     10: #include <string.h>
                     11: #include <sys/ipc.h>
                     12: #include <sys/shm.h>
                     13: #include <X11/Xlib.h>
                     14: #include <X11/Xutil.h>
                     15: #include <X11/keysym.h>
                     16: #include <X11/Intrinsic.h>
                     17: #include <X11/Shell.h>
                     18: #include <X11/StringDefs.h>
                     19: #include <X11/Xatom.h>
                     20: #include <X11/Xmd.h>
                     21: #include <X11/extensions/xf86vmode.h>
                     22: #include <X11/extensions/xf86dga.h>
                     23: 
                     24: #include "quakedef.h"
                     25: #include "d_local.h"
                     26: 
                     27: cvar_t m_filter = {"m_filter","1"};
                     28: 
                     29: qboolean       mouse_avail;
                     30: int            mouse_buttons=3;
                     31: int            mouse_oldbuttonstate;
                     32: int            mouse_buttonstate;
                     33: float  mouse_x, mouse_y;
                     34: float  old_mouse_x, old_mouse_y;
                     35: 
                     36: typedef struct
                     37: {
                     38:        int input;
                     39:        int output;
                     40: } keymap_t;
                     41: 
                     42: viddef_t vid; // global video state
                     43: unsigned short       d_8to16table[256];
                     44: 
                     45: int            num_shades=32;
                     46: int    d_con_indirect = 0;
                     47: int            vid_buffersize;
                     48: int            pixbytes;
                     49: 
                     50: static Display                 *x_disp;
                     51: static Colormap                        x_cmap;
                     52: static Window                  x_win;
                     53: static GC                              x_gc;
                     54: static Visual                  *x_vis;
                     55: static XVisualInfo             *x_visinfo;
                     56: //static XImage                        *x_image;
                     57: 
                     58: static int vid_inited;
                     59: static int direct_video_inited;
                     60: 
                     61: int work_buffer;
                     62: static int verbose=0;
                     63: 
                     64: char *hw_fb_addr;
                     65: int hw_fb_width;
                     66: int hw_fb_banksize;
                     67: int hw_fb_ram;
                     68: int hw_fb_dotclock;
                     69: XF86VidModeModeLine hw_fb_modeline;
                     70: 
                     71: static long X11_highhunkmark;
                     72: static long X11_buffersize;
                     73: int vid_surfcachesize;
                     74: void *vid_surfcache;
                     75: 
                     76: static int flipy;
                     77: static char *flipaddr;
                     78: 
                     79: void (*vid_menudrawfn)(void);
                     80: void (*vid_menukeyfn)(int key);
                     81: 
                     82: 
                     83: // ========================================================================
                     84: // Tragic death handler
                     85: // ========================================================================
                     86: 
                     87: void TragicDeath(int signal_num)
                     88: {
                     89:        VID_Shutdown();
                     90:        Sys_Error("This death brought to you by the number %d\n", signal_num);
                     91: }
                     92: 
                     93: // Called at startup to set up translation tables, takes 256 8 bit RGB values
                     94: // the palette data will go away after the call, so it must be copied off if
                     95: // the video driver will need it again
                     96: 
                     97: void   VID_Init (unsigned char *palette)
                     98: {
                     99: 
                    100:        int devmem;
                    101:        int i;
                    102:        XVisualInfo template;
                    103:        XSetWindowAttributes xswa;
                    104:        int MajorVersion, MinorVersion;
                    105:        int EventBase, ErrorBase;
                    106:        int MINMINOR=4;
                    107:        int MINMAJOR=0;
                    108:        struct sigaction sa;
                    109:        XGCValues xgcvalues;
                    110:        int valuemask = GCGraphicsExposures;
                    111:        char *dispname;
                    112:        Status xrc;
                    113:        XSizeHints *x_hints;
                    114: 
                    115:        vid_inited = 0;
                    116:        direct_video_inited = 0;
                    117: 
                    118:        devmem=open("/dev/mem", O_RDWR);
                    119:        if (devmem<0)
                    120:                fprintf(stderr, "You must run this as root or \"chmod 666 /dev/mem\"\n");
                    121:        else
                    122:                close(devmem);
                    123: 
                    124:        srandom(getpid());
                    125: 
                    126:        verbose=COM_CheckParm("-verbose");
                    127: 
                    128: // open the display
                    129:        dispname = getenv("DISPLAY");
                    130:        if (!dispname) dispname = ":0.0";
                    131:        x_disp = XOpenDisplay(dispname);
                    132:        if (!x_disp)
                    133:        {
                    134:                if (getenv("DISPLAY"))
                    135:                        Sys_Error("VID: Could not open display [%s]\n",
                    136:                                getenv("DISPLAY"));
                    137:                else
                    138:                        Sys_Error("VID: Could not open local display\n");
                    139:        }
                    140:        XSynchronize(x_disp, True);
                    141: 
                    142: // use the root window for everything
                    143: 
                    144: //     x_win = RootWindow(x_disp, DefaultScreen(x_disp));
                    145:        xswa.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
                    146:                PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
                    147: 
                    148:        x_win = XCreateWindow(x_disp, DefaultRootWindow(x_disp), 0, 0,
                    149:                WidthOfScreen(ScreenOfDisplay(x_disp, 0)),
                    150:                HeightOfScreen(ScreenOfDisplay(x_disp, 0)), 0,
                    151:                CopyFromParent, InputOutput, CopyFromParent,
                    152:                CWEventMask, &xswa);
                    153:        XSetTransientForHint(x_disp, x_win, x_win);
                    154:        x_hints = XAllocSizeHints();
                    155:        x_hints->flags = USPosition;
                    156:        XSetWMNormalHints(x_disp, x_win, x_hints);
                    157: //     X_Free(x_hints);
                    158:        XMapWindow(x_disp, x_win);
                    159:        XRaiseWindow(x_disp, x_win);
                    160: 
                    161: // check that vidmode extension is avail
                    162: 
                    163:        if (!XF86VidModeQueryVersion(x_disp, &MajorVersion, &MinorVersion))
                    164:                Sys_Error("Unable to query VidMode version");
                    165:        if (!XF86VidModeQueryExtension(x_disp, &EventBase, &ErrorBase))
                    166:                Sys_Error("Unable to query VidMode extension");
                    167:        if (MajorVersion < MINMAJOR || MinorVersion < MINMINOR)
                    168:                Sys_Error("Minimum required VidMode extension version is %d.%d\n",
                    169:                        MINMAJOR, MINMINOR);
                    170: 
                    171: // catch signals so i can die well
                    172: 
                    173:        sigaction(SIGINT, 0, &sa);
                    174:        sa.sa_handler = TragicDeath;
                    175:        sigaction(SIGINT, &sa, 0);
                    176:        sigaction(SIGTERM, &sa, 0);
                    177: 
                    178: // set up the mode and get info on the fb
                    179: 
                    180:        xrc = XF86DGAGetVideo(x_disp, DefaultScreen(x_disp), &hw_fb_addr,
                    181:                &hw_fb_width, &hw_fb_banksize, &hw_fb_ram);
                    182:        xrc = XF86DGADirectVideo(x_disp, DefaultScreen(x_disp),
                    183:                XF86DGADirectGraphics|XF86DGADirectMouse|XF86DGADirectKeyb);
                    184:        if (xrc != True)
                    185:                Sys_Error("DirectVideo could not be setup\n");
                    186:        direct_video_inited = 1;
                    187:        setuid(getuid());
                    188:        xrc = XF86DGASetViewPort(x_disp, DefaultScreen(x_disp), 0, 0);
                    189:        xrc = XF86DGASetVidPage(x_disp, DefaultScreen(x_disp), 0);
                    190:        xrc = XF86VidModeGetModeLine(x_disp, DefaultScreen(x_disp),
                    191:                &hw_fb_dotclock, &hw_fb_modeline);
                    192: 
                    193:        vid.width = hw_fb_modeline.hdisplay;
                    194:        vid.height = hw_fb_modeline.vdisplay;
                    195:        vid.maxwarpwidth = WARP_WIDTH;
                    196:        vid.maxwarpheight = WARP_HEIGHT;
                    197:        vid.aspect = 1.0;
                    198:        vid.numpages = 2;
                    199:        vid.colormap = host_colormap;
                    200:        vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
                    201: 
                    202: // ritual for getting x_visinfo which basically just has the depth in it
                    203: 
                    204:        x_vis = DefaultVisual(x_disp, DefaultScreen(x_disp));
                    205:        template.visualid = XVisualIDFromVisual(x_vis);
                    206:        x_visinfo = XGetVisualInfo(x_disp, VisualIDMask, &template, &i);
                    207:        pixbytes = x_visinfo->depth/8;
                    208: 
                    209: // now know everything we need to know about the buffer
                    210: 
                    211:        work_buffer = 1;
                    212:        vid.rowbytes = hw_fb_width * pixbytes;
                    213:        flipaddr = hw_fb_addr + vid.rowbytes * vid.height;
                    214:        flipy = vid.height;
                    215:        vid.buffer = flipaddr;
                    216:        vid.direct = hw_fb_addr;
                    217:        vid.conbuffer = flipaddr;
                    218:        vid.conrowbytes = vid.rowbytes;
                    219:        vid.conwidth = vid.width;
                    220:        vid.conheight = vid.height;
                    221: 
                    222:        Sys_Printf("VID: bank size = %d bytes\n", hw_fb_banksize);
                    223:        Sys_Printf("VID: ram = %dkb\n", hw_fb_ram);
                    224: 
                    225:        if (hw_fb_banksize < vid.rowbytes * vid.height * 2)
                    226:                Sys_Error("Video card bank size (%d bytes) too small for this res.", hw_fb_banksize);
                    227: 
                    228:        if (vid.rowbytes * vid.height * 2 > hw_fb_ram * 1024)
                    229:                Sys_Error("Not enough video memory for this res");
                    230: 
                    231: // create the GC
                    232: 
                    233:        xgcvalues.graphics_exposures = False;
                    234:        x_gc = XCreateGC(x_disp, x_win, valuemask, &xgcvalues );
                    235: 
                    236: // make input rawer
                    237: 
                    238:        XAutoRepeatOff(x_disp);
                    239:        XGrabKeyboard(x_disp, x_win, True, GrabModeAsync,
                    240:                GrabModeAsync, CurrentTime);
                    241:        XGrabPointer(x_disp, x_win, True, 
                    242:                ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
                    243:                None, None, CurrentTime);
                    244: 
                    245: // setup colormap if necessary
                    246: 
                    247:        if (x_visinfo->depth == 8)
                    248:        {
                    249: 
                    250:                if (x_visinfo->class == PseudoColor)
                    251:                {
                    252:                        x_cmap = XCreateColormap(x_disp, x_win, x_vis, AllocAll);
                    253:                        VID_SetPalette(palette);
                    254:                        XInstallColormap(x_disp, x_cmap);
                    255:                        XSetWindowColormap(x_disp, x_win, x_cmap);
                    256:                        XSetWMColormapWindows(x_disp, x_win, &x_win, 1);
                    257:                }
                    258: 
                    259:        }
                    260: 
                    261:        X11_highhunkmark = Hunk_HighMark ();
                    262:        X11_buffersize = vid.width * vid.height * sizeof (*d_pzbuffer);
                    263:        vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height);
                    264:        X11_buffersize += vid_surfcachesize;
                    265:        d_pzbuffer = Hunk_HighAllocName (X11_buffersize, "video");
                    266:        if (d_pzbuffer == NULL)
                    267:         Sys_Error ("Not enough memory for video mode\n");
                    268:        vid_surfcache = (byte *) d_pzbuffer
                    269:                + vid.width * vid.height * sizeof (*d_pzbuffer);
                    270:        D_InitCaches(vid_surfcache, vid_surfcachesize);
                    271: 
                    272:        signal(SIGFPE, SIG_IGN);
                    273: 
                    274:        vid_inited = 1;
                    275: 
                    276: }
                    277: 
                    278: void VID_ShiftPalette(unsigned char *p)
                    279: {
                    280:        if (!vid_inited) return;
                    281:        VID_SetPalette(p);
                    282: }
                    283: 
                    284: void VID_SetPalette(unsigned char *palette)
                    285: {
                    286: 
                    287:        int i;
                    288:        XColor colors[256];
                    289: 
                    290:        if (!vid_inited) return;
                    291:        if (x_visinfo->class == PseudoColor && x_visinfo->depth == 8)
                    292:        {
                    293:                for (i=0 ; i<256 ; i++)
                    294:                {
                    295:                        colors[i].pixel = i;
                    296:                        colors[i].flags = DoRed|DoGreen|DoBlue;
                    297:                        colors[i].red = palette[i*3] * 257;
                    298:                        colors[i].green = palette[i*3+1] * 257;
                    299:                        colors[i].blue = palette[i*3+2] * 257;
                    300:                }
                    301:                XStoreColors(x_disp, x_cmap, colors, 256);
                    302:        }
                    303: 
                    304: }
                    305: 
                    306: // Called at shutdown
                    307: 
                    308: void   VID_Shutdown (void)
                    309: {
                    310:        Con_Printf("VID_Shutdown\n");
                    311:        if (x_disp)
                    312:        {
                    313:                XUngrabPointer(x_disp, CurrentTime);
                    314:                XUngrabKeyboard(x_disp, CurrentTime);
                    315:                XAutoRepeatOn(x_disp);
                    316:                if (direct_video_inited)
                    317:                        XF86DGADirectVideo(x_disp, DefaultScreen(x_disp), 0);
                    318:                direct_video_inited = 0;
                    319:                XCloseDisplay(x_disp);
                    320:                x_disp = 0;
                    321:        }
                    322:        vid_inited = 0;
                    323: }
                    324: 
                    325: int XLateKey(XKeyEvent *ev)
                    326: {
                    327: 
                    328:        int key;
                    329:        char buf[64];
                    330:        KeySym keysym;
                    331: 
                    332:        key = 0;
                    333: 
                    334:        XLookupString(ev, buf, sizeof buf, &keysym, 0);
                    335: 
                    336:        switch(keysym)
                    337:        {
                    338:                case XK_Page_Up:         key = K_PGUP; break;
                    339:                case XK_Page_Down:       key = K_PGDN; break;
                    340:                case XK_Home:    key = K_HOME; break;
                    341:                case XK_End:     key = K_END; break;
                    342:                case XK_Left:    key = K_LEFTARROW; break;
                    343:                case XK_Right:  key = K_RIGHTARROW;             break;
                    344:                case XK_Down:    key = K_DOWNARROW; break;
                    345:                case XK_Up:              key = K_UPARROW;        break;
                    346:                case XK_Escape: key = K_ESCAPE;         break;
                    347:                case XK_Return: key = K_ENTER;           break;
                    348:                case XK_Tab:            key = K_TAB;                     break;
                    349:                case XK_F1:              key = K_F1;                            break;
                    350:                case XK_F2:              key = K_F2;                            break;
                    351:                case XK_F3:              key = K_F3;                            break;
                    352:                case XK_F4:              key = K_F4;                            break;
                    353:                case XK_F5:              key = K_F5;                            break;
                    354:                case XK_F6:              key = K_F6;                            break;
                    355:                case XK_F7:              key = K_F7;                            break;
                    356:                case XK_F8:              key = K_F8;                            break;
                    357:                case XK_F9:              key = K_F9;                            break;
                    358:                case XK_F10:            key = K_F10;                     break;
                    359:                case XK_F11:            key = K_F11;                     break;
                    360:                case XK_F12:            key = K_F12;                     break;
                    361:                case XK_BackSpace:
                    362:                case XK_Delete: key = K_BACKSPACE; break;
                    363:                case XK_Pause:  key = K_PAUSE;           break;
                    364:                case XK_Shift_L:
                    365:                case XK_Shift_R:                key = K_SHIFT;          break;
                    366:                case XK_Execute: 
                    367:                case XK_Control_L: 
                    368:                case XK_Control_R:      key = K_CTRL;            break;
                    369:                case XK_Alt_L:  
                    370:                case XK_Meta_L: 
                    371:                case XK_Alt_R:  
                    372:                case XK_Meta_R: key = K_ALT;                    break;
                    373: 
                    374:                case 0x07e: key = '`';break;/* [~] */
                    375:                case 0x021: key = '1';break;/* [!] */
                    376:                case 0x040: key = '2';break;/* [@] */
                    377:                case 0x023: key = '3';break;/* [#] */
                    378:                case 0x024: key = '4';break;/* [$] */
                    379:                case 0x025: key = '5';break;/* [%] */
                    380:                case 0x05e: key = '6';break;/* [^] */
                    381:                case 0x026: key = '7';break;/* [&] */
                    382:                case 0x02a: key = '8';break;/* [*] */
                    383:                case 0x028: key = '9';;break;/* [(] */
                    384:                case 0x029: key = '0';break;/* [)] */
                    385:                case 0x05f: key = '-';break;/* [_] */
                    386:                case 0x02b: key = '=';break;/* [+] */
                    387:                case 0x07c: key = '\'';break;/* [|] */
                    388:                case 0x07d: key = '[';break;/* [}] */
                    389:                case 0x07b: key = ']';break;/* [{] */
                    390:                case 0x022: key = '\'';break;/* ["] */
                    391:                case 0x03a: key = ';';break;/* [:] */
                    392:                case 0x03f: key = '/';break;/* [?] */
                    393:                case 0x03e: key = '.';break;/* [>] */
                    394:                case 0x03c: key = ',';break;/* [<] */
                    395: 
                    396:                default:
                    397:                        key = *(unsigned char*)buf;
                    398:                        if (key >= 'A' && key <= 'Z')
                    399:                                key = key - 'A' + 'a';
                    400: //                     fprintf(stderr, "case 0x0%x: key = ___;break;/* [%c] */\n", keysym);
                    401:                        break;
                    402:        } 
                    403: 
                    404:        return key;
                    405: 
                    406: }
                    407: 
                    408: struct
                    409: {
                    410:     int key;
                    411:     int down;
                    412: } keyq[64];
                    413: int keyq_head=0;
                    414: int keyq_tail=0;
                    415: 
                    416: void GetEvent(void)
                    417: {
                    418: 
                    419:        XEvent x_event;
                    420:        int b;
                    421: 
                    422:        XNextEvent(x_disp, &x_event);
                    423:        switch(x_event.type)
                    424:        {
                    425:                case KeyPress:
                    426:             keyq[keyq_head].key = XLateKey(&x_event.xkey);
                    427:             keyq[keyq_head].down = true;
                    428:             keyq_head = (keyq_head + 1) & 63;
                    429:                        break;
                    430:                case KeyRelease:
                    431:             keyq[keyq_head].key = XLateKey(&x_event.xkey);
                    432:             keyq[keyq_head].down = false;
                    433:             keyq_head = (keyq_head + 1) & 63;
                    434:                        break;
                    435:                case MotionNotify:
                    436:                        mouse_x += (float) x_event.xmotion.x;
                    437:                        mouse_y += (float) x_event.xmotion.y;
                    438:                        break;
                    439:                case ButtonPress:
                    440:                        b=-1;
                    441:                        if (x_event.xbutton.button == Button1)
                    442:                                b = 0;
                    443:                        else if (x_event.xbutton.button == Button2)
                    444:                                b = 2;
                    445:                        else if (x_event.xbutton.button == Button3)
                    446:                                b = 1;
                    447:                        if (b>=0)
                    448:                                mouse_buttonstate |= 1<<b;
                    449:                        break;
                    450:                case ButtonRelease:
                    451:                        b=-1;
                    452:                        if (x_event.xbutton.button == Button1)
                    453:                                b = 0;
                    454:                        else if (x_event.xbutton.button == Button2)
                    455:                                b = 2;
                    456:                        else if (x_event.xbutton.button == Button3)
                    457:                                b = 1;
                    458:                        if (b>=0)
                    459:                                mouse_buttonstate &= ~(1<<b);
                    460:                        break;
                    461:        }
                    462: 
                    463: }
                    464: 
                    465: // flushes the given rectangles from the view buffer to the screen
                    466: 
                    467: void   VID_Update (vrect_t *rects)
                    468: {
                    469: 
                    470:        if (!vid_inited) return;
                    471: 
                    472: // flip pages
                    473: 
                    474:        XF86DGASetViewPort(x_disp, DefaultScreen(x_disp), 0,
                    475:                flipy * work_buffer);
                    476: 
                    477:        work_buffer = !work_buffer;
                    478:        if (work_buffer)
                    479:        {
                    480:                vid.buffer = flipaddr;
                    481:                vid.conbuffer = flipaddr;
                    482:                vid.direct = hw_fb_addr;
                    483:        }
                    484:        else
                    485:        {
                    486:                vid.buffer = hw_fb_addr;
                    487:                vid.conbuffer = hw_fb_addr;
                    488:                vid.direct = flipaddr;
                    489:        }
                    490: 
                    491:        XSync(x_disp, False);
                    492: 
                    493: }
                    494: 
                    495: static int dither;
                    496: 
                    497: void VID_DitherOn(void)
                    498: {
                    499:     if (dither == 0)
                    500:     {
                    501:                vid.recalc_refdef = 1;
                    502:         dither = 1;
                    503:     }
                    504: }
                    505: 
                    506: void VID_DitherOff(void)
                    507: {
                    508:     if (dither)
                    509:     {
                    510:                vid.recalc_refdef = 1;
                    511:         dither = 0;
                    512:     }
                    513: }
                    514: 
                    515: int Sys_OpenWindow(void)
                    516: {
                    517:        return 0;
                    518: }
                    519: 
                    520: void Sys_EraseWindow(int window)
                    521: {
                    522: }
                    523: 
                    524: void Sys_DrawCircle(int window, int x, int y, int r)
                    525: {
                    526: }
                    527: 
                    528: void Sys_DisplayWindow(int window)
                    529: {
                    530: }
                    531: 
                    532: void Sys_SendKeyEvents(void)
                    533: {
                    534:        if (!vid_inited) return;
                    535: // get events from x server
                    536:     if (x_disp)
                    537:     {
                    538:         while (XPending(x_disp)) GetEvent();
                    539:         while (keyq_head != keyq_tail)
                    540:         {
                    541:             Key_Event(keyq[keyq_tail].key, keyq[keyq_tail].down);
                    542:             keyq_tail = (keyq_tail + 1) & 63;
                    543:         }
                    544:     }
                    545: }
                    546: 
                    547: char *Sys_ConsoleInput (void)
                    548: {
                    549: 
                    550:        static char     text[256];
                    551:        int             len;
                    552:        fd_set  readfds;
                    553:        int             ready;
                    554:        struct timeval timeout;
                    555: 
                    556:        timeout.tv_sec = 0;
                    557:        timeout.tv_usec = 0;
                    558:        FD_ZERO(&readfds);
                    559:        FD_SET(0, &readfds);
                    560:        ready = select(1, &readfds, 0, 0, &timeout);
                    561: 
                    562:        if (ready>0)
                    563:        {
                    564:                len = read (0, text, sizeof(text));
                    565:                if (len >= 1)
                    566:                {
                    567:                        text[len-1] = 0;        // rip off the /n and terminate
                    568:                        return text;
                    569:                }
                    570:        }
                    571: 
                    572:        return 0;
                    573:        
                    574: }
                    575: 
                    576: 
                    577: static byte    backingbuf[48*24];
                    578: 
                    579: void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
                    580: {
                    581:        int             i, j, reps, repshift;
                    582: 
                    583:        if (!vid_inited) return;
                    584: 
                    585:        if (vid.aspect > 1.5)
                    586:        {
                    587:                reps = 2;
                    588:                repshift = 1;
                    589:        }
                    590:        else
                    591:        {
                    592:                reps = 1;
                    593:                repshift = 0;
                    594:        }
                    595: 
                    596:        for (i=0 ; i<(height << repshift) ; i += reps)
                    597:        {
                    598:                for (j=0 ; j<reps ; j++)
                    599:                {
                    600:                        memcpy (&backingbuf[(i + j) * 24],
                    601:                                        vid.direct + x + ((y << repshift) + i + j) *
                    602:                                         vid.rowbytes, width);
                    603:                        memcpy (vid.direct + x + ((y << repshift) + i + j) *
                    604:                                         vid.rowbytes, &pbitmap[(i >> repshift) * width], width);
                    605:                }
                    606:        }
                    607: 
                    608: }
                    609: 
                    610: void D_EndDirectRect (int x, int y, int width, int height)
                    611: {
                    612:        int             i, j, reps, repshift;
                    613: 
                    614:        if (!vid_inited) return;
                    615: 
                    616:        if (vid.aspect > 1.5)
                    617:        {
                    618:                reps = 2;
                    619:                repshift = 1;
                    620:        }
                    621:        else
                    622:        {
                    623:                reps = 1;
                    624:                repshift = 0;
                    625:        }
                    626: 
                    627:        for (i=0 ; i<(height << repshift) ; i += reps)
                    628:        {
                    629:                for (j=0 ; j<reps ; j++)
                    630:                {
                    631:                        memcpy (vid.direct + x + ((y << repshift) + i + j) *
                    632:                                         vid.rowbytes, &backingbuf[(i + j) * 24], width);
                    633:                }
                    634:        }
                    635: 
                    636: }
                    637: 
                    638: /*
                    639: ===========
                    640: IN_Init
                    641: ===========
                    642: */
                    643: void IN_Init (void)
                    644: {
                    645:        Cvar_RegisterVariable (&m_filter);
                    646:        if ( COM_CheckParm ("-nomouse") ) 
                    647:                return; 
                    648:        mouse_x = mouse_y = 0.0;
                    649:        mouse_avail = 1;
                    650: }
                    651: 
                    652: /*
                    653: ===========
                    654: IN_Shutdown
                    655: ===========
                    656: */
                    657: void IN_Shutdown (void)
                    658: {
                    659:        mouse_avail = 0;
                    660: }
                    661: 
                    662: 
                    663: /*
                    664: ===========
                    665: IN_Commands
                    666: ===========
                    667: */
                    668: void IN_Commands (void)
                    669: {
                    670:        int             i;
                    671: 
                    672:        if (!vid_inited || !mouse_avail) return;
                    673: 
                    674: // perform button actions
                    675:        for (i=0 ; i<mouse_buttons ; i++)
                    676:        {
                    677:                if ( (mouse_buttonstate & (1<<i)) &&
                    678:                !(mouse_oldbuttonstate & (1<<i)) )
                    679:                {
                    680:                        Key_Event (K_MOUSE1 + i, true);
                    681:                }
                    682:                if ( !(mouse_buttonstate & (1<<i)) &&
                    683:                (mouse_oldbuttonstate & (1<<i)) )
                    684:                {
                    685:                        Key_Event (K_MOUSE1 + i, false);
                    686:                }
                    687:        }       
                    688:        
                    689:        mouse_oldbuttonstate = mouse_buttonstate;
                    690: 
                    691: }
                    692: 
                    693: /*
                    694: ===========
                    695: IN_Move
                    696: ===========
                    697: */
                    698: void IN_Move (usercmd_t *cmd)
                    699: {
                    700: 
                    701:        if (!vid_inited || !mouse_avail)
                    702:                return;
                    703:        
                    704:        if (m_filter.value)
                    705:        {
                    706:                mouse_x = (mouse_x + old_mouse_x) * 0.5;
                    707:                mouse_y = (mouse_y + old_mouse_y) * 0.5;
                    708:        }
                    709:        old_mouse_x = mouse_x;
                    710:        old_mouse_y = mouse_y;
                    711: 
                    712:        mouse_x *= sensitivity.value;
                    713:        mouse_y *= sensitivity.value;
                    714: 
                    715: // add mouse X/Y movement to cmd
                    716:        if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) ))
                    717:                cmd->sidemove += m_side.value * mouse_x;
                    718:        else
                    719:                cl.viewangles[YAW] -= m_yaw.value * mouse_x;
                    720:        
                    721:        if (in_mlook.state & 1)
                    722:                V_StopPitchDrift ();
                    723:                
                    724:        if ( (in_mlook.state & 1) && !(in_strafe.state & 1))
                    725:        {
                    726:                cl.viewangles[PITCH] += m_pitch.value * mouse_y;
                    727:                if (cl.viewangles[PITCH] > 80)
                    728:                        cl.viewangles[PITCH] = 80;
                    729:                if (cl.viewangles[PITCH] < -70)
                    730:                        cl.viewangles[PITCH] = -70;
                    731:        }
                    732:        else
                    733:        {
                    734:                if ((in_strafe.state & 1) && noclip_anglehack)
                    735:                        cmd->upmove -= m_forward.value * mouse_y;
                    736:                else
                    737:                        cmd->forwardmove -= m_forward.value * mouse_y;
                    738:        }
                    739: 
                    740:        mouse_x = mouse_y = 0.0;
                    741: 
                    742: }
                    743: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.