Annotation of quake1/vid_sv~1.c, revision 1.1.1.1

1.1       root        1: #include <termios.h>
                      2: #include <sys/ioctl.h>
                      3: #include <sys/stat.h>
                      4: #include <sys/vt.h>
                      5: #include <stdarg.h>
                      6: #include <stdio.h>
                      7: #include <signal.h>
                      8: #include "/usr/local/include/vga.h"
                      9: #include "/usr/local/include/vgakeyboard.h"
                     10: #include "/usr/local/include/vgamouse.h"
                     11: 
                     12: #include "quakedef.h"
                     13: #include "vid_256.h"
                     14: 
                     15: #define stringify(m) { #m, m }
                     16: 
                     17: viddef_t vid;
                     18: 
                     19: int num_modes;
                     20: vga_modeinfo *modes;
                     21: int current_mode;
                     22: 
                     23: int num_shades=32;
                     24: 
                     25: struct
                     26: {
                     27:        char *name;
                     28:        int num;
                     29: } mice[] =
                     30: {
                     31:        stringify(MOUSE_MICROSOFT),
                     32:        stringify(MOUSE_MOUSESYSTEMS),
                     33:        stringify(MOUSE_MMSERIES),
                     34:        stringify(MOUSE_LOGITECH),
                     35:        stringify(MOUSE_BUSMOUSE),
                     36:        stringify(MOUSE_PS2),
                     37: };
                     38: 
                     39: static unsigned char scantokey[128];
                     40: 
                     41: int num_mice = sizeof (mice) / sizeof(mice[0]);
                     42: 
                     43: int    d_con_indirect = 0;
                     44: 
                     45: int            svgalib_inited=0;
                     46: int            UseMouse = 1;
                     47: int            UseDisplay = 1;
                     48: int            UseKeyboard = 1;
                     49: 
                     50: int            mouserate = MOUSE_DEFAULTSAMPLERATE;
                     51: 
                     52: char   *framebuffer_ptr;
                     53: 
                     54: cvar_t  mouse_button_commands[3] =
                     55: {
                     56:     {"mouse1","+attack"},
                     57:     {"mouse2","+strafe"},
                     58:     {"mouse3","+forward"},
                     59: };
                     60: cvar_t  mouse_sensitivity = {"sensitivity","5"};
                     61: 
                     62: int     mouse_buttons;
                     63: int     mouse_oldbuttonstate;
                     64: int     mouse_x, mouse_y;
                     65: 
                     66: /*
                     67: =================
                     68: VID_Gamma_f
                     69: 
                     70: Keybinding command
                     71: =================
                     72: */
                     73: void VID_Gamma_f (void)
                     74: {
                     75:        float   gamma, f, inf;
                     76:        unsigned char   palette[768];
                     77:        int             i;
                     78: 
                     79:        if (Cmd_Argc () == 2)
                     80:        {
                     81:                gamma = Q_atof (Cmd_Argv(1));
                     82: 
                     83:                for (i=0 ; i<768 ; i++)
                     84:                {
                     85:                        f = pow ( (host_basepal[i]+1)/256.0 , gamma );
                     86:                        inf = f*255 + 0.5;
                     87:                        if (inf < 0)
                     88:                                inf = 0;
                     89:                        if (inf > 255)
                     90:                                inf = 255;
                     91:                        palette[i] = inf;
                     92:                }
                     93: 
                     94:                VID_SetPalette (palette);
                     95: 
                     96:                vid.recalc_refdef = 1;                          // force a surface cache flush
                     97:        }
                     98: }
                     99: 
                    100: 
                    101: void VID_InitModes(void)
                    102: {
                    103: 
                    104:        int i;
                    105: 
                    106: // get complete information on all modes
                    107: 
                    108:        num_modes = vga_lastmodenumber()+1;
                    109:        I_Printf("num_modes = %d\n", num_modes);
                    110:        modes = Z_Malloc(num_modes * sizeof(vga_modeinfo));
                    111:        for (i=0 ; i<num_modes ; i++)
                    112:        {
                    113:                if (vga_hasmode(i))
                    114:                        Q_memcpy(&modes[i], vga_getmodeinfo(i), sizeof (vga_modeinfo));
                    115:                else
                    116:                        modes[i].width = 0; // means not available
                    117:        }
                    118: 
                    119: // filter for modes i don't support
                    120: 
                    121:        for (i=0 ; i<num_modes ; i++)
                    122:        {
                    123:                if (modes[i].bytesperpixel != 1) modes[i].width = 0;
                    124:        }
                    125: 
                    126: }
                    127: 
                    128: int get_mode(char *name, int width, int height, int depth)
                    129: {
                    130: 
                    131:        int i;
                    132:        int ok, match;
                    133: 
                    134:        match = (!!width) + (!!height)*2 + (!!depth)*4;
                    135: 
                    136:        if (name)
                    137:        {
                    138:                i = vga_getmodenumber(name);
                    139:                if (!modes[i].width)
                    140:                {
                    141:                        I_Printf("Mode [%s] not supported\n", name);
                    142:                        i = G320x200x256;
                    143:                }
                    144:        }
                    145:        else
                    146:        {
                    147:                for (i=0 ; i<num_modes ; i++)
                    148:                        if (modes[i].width)
                    149:                        {
                    150:                                ok = (modes[i].width == width)
                    151:                                        + (modes[i].height == height)*2
                    152:                                        + (modes[i].bytesperpixel == depth/8)*4;
                    153:                                if ((ok & match) == ok)
                    154:                                        break;
                    155:                        }
                    156:                if (i==num_modes)
                    157:                {
                    158:                        I_Printf("Mode %dx%d (%d bits) not supported\n",
                    159:                                width, height, depth);
                    160:                        i = G320x200x256;
                    161:                }
                    162:        }
                    163: 
                    164:        return i;
                    165: 
                    166: }
                    167: 
                    168: int matchmouse(int mouse, char *name)
                    169: {
                    170:        int i;
                    171:        for (i=0 ; i<num_mice ; i++)
                    172:                if (!strcmp(mice[i].name, name))
                    173:                        return i;
                    174:        return mouse;
                    175: }
                    176: 
                    177: #if 0
                    178: 
                    179: void vtswitch(int newconsole)
                    180: {
                    181: 
                    182:        int fd;
                    183:        struct vt_stat x;
                    184: 
                    185: // switch consoles and wait until reactivated
                    186:        fd = open("/dev/console", O_RDONLY);
                    187:        ioctl(fd, VT_GETSTATE, &x);
                    188:        ioctl(fd, VT_ACTIVATE, newconsole);
                    189:        ioctl(fd, VT_WAITACTIVE, x.v_active);
                    190:        close(fd);
                    191: 
                    192: }
                    193: 
                    194: #endif
                    195: 
                    196: void keyhandler(int scancode, int state)
                    197: {
                    198:        
                    199:        int sc;
                    200: 
                    201:        sc = scancode & 0x7f;
                    202: //     Con_Printf("scancode=%x (%d%s)\n", scancode, sc, scancode&0x80?"+128":"");
                    203:        Key_Event(scantokey[sc], state == KEY_EVENTPRESS);
                    204: 
                    205: }
                    206: 
                    207: void VID_Shutdown(void)
                    208: {
                    209: 
                    210:        if (!svgalib_inited) return;
                    211: 
                    212: //     printf("shutdown graphics called\n");
                    213:        if (UseKeyboard)
                    214:                keyboard_close();
                    215:        if (UseDisplay)
                    216:                vga_setmode(TEXT);
                    217: //     printf("shutdown graphics finished\n");
                    218: 
                    219:        svgalib_inited = 0;
                    220: 
                    221: }
                    222: 
                    223: void VID_SetPalette(byte *palette)
                    224: {
                    225: 
                    226:        static int tmppal[256*3];
                    227:        int *tp;
                    228:        int i;
                    229: 
                    230:        if (!svgalib_inited)
                    231:                return;
                    232: 
                    233:        if (vga_getcolors() == 256)
                    234:        {
                    235: 
                    236:                tp = tmppal;
                    237:                for (i=256*3 ; i ; i--)
                    238:                        *(tp++) = *(palette++) >> 2;
                    239: 
                    240:                if (UseDisplay)
                    241:                        vga_setpalvec(0, 256, tmppal);
                    242: 
                    243:        }
                    244: 
                    245: }
                    246: 
                    247: void VID_Init(unsigned char *palette)
                    248: {
                    249: 
                    250:        int i;
                    251:        int w, h, d;
                    252: 
                    253:        if (svgalib_inited)
                    254:                return;
                    255: 
                    256:        Cmd_AddCommand ("gamma", VID_Gamma_f);
                    257: 
                    258: /*
                    259:     signal(SIGHUP, (void (*)(int)) I_Quit);
                    260:     signal(SIGINT, (void (*)(int)) I_Quit);
                    261:     signal(SIGKILL, (void (*)(int)) I_Quit);
                    262:     signal(SIGTERM, (void (*)(int)) I_Quit);
                    263:     signal(SIGSTOP, (void (*)(int)) I_Quit);
                    264:     signal(SIGQUIT, (void (*)(int)) I_Quit);
                    265: */
                    266: 
                    267:        if (UseDisplay)
                    268:        {
                    269:                vga_init();
                    270: 
                    271:                VID_InitModes();
                    272: 
                    273:        // interpret command-line params
                    274: 
                    275:                w = h = d = 0;
                    276:                if (getenv("GSVGAMODE"))
                    277:                        current_mode = get_mode(getenv("GSVGAMODE"), w, h, d);
                    278:                else if (COM_CheckParm("-mode"))
                    279:                        current_mode = get_mode(com_argv[COM_CheckParm("-mode")+1], w, h, d);
                    280:                else if (COM_CheckParm("-w") || COM_CheckParm("-h")
                    281:                        || COM_CheckParm("-d"))
                    282:                {
                    283:                        if (COM_CheckParm("-w"))
                    284:                                w = Q_atoi(com_argv[COM_CheckParm("-w")+1]);
                    285:                        if (COM_CheckParm("-h"))
                    286:                                h = Q_atoi(com_argv[COM_CheckParm("-h")+1]);
                    287:                        if (COM_CheckParm("-d"))
                    288:                                d = Q_atoi(com_argv[COM_CheckParm("-d")+1]);
                    289:                        current_mode = get_mode(0, w, h, d);
                    290:                }
                    291:                else
                    292:                        current_mode = G320x200x256;
                    293: 
                    294:        // set vid parameters
                    295: 
                    296:                vid.width = modes[current_mode].width;
                    297:                vid.rowbytes = modes[current_mode].linewidth;
                    298:                vid.height = modes[current_mode].height;
                    299:                vid.aspect = 1.0;
                    300:                vid.colormap = (pixel_t *) colormap256;
                    301:                vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
                    302:                vid.buffer = (pixel_t *) Hunk_HighAlloc(vid.rowbytes * vid.height);
                    303: 
                    304:        // get goin'
                    305: 
                    306:                vga_setmode(current_mode);
                    307:                framebuffer_ptr = (char *) vga_getgraphmem();
                    308: //             if (vga_setlinearaddressing()>0)
                    309: //                     framebuffer_ptr = (char *) vga_getgraphmem();
                    310:                if (!framebuffer_ptr)
                    311:                        I_Error("This mode isn't hapnin'\n");
                    312: 
                    313:                vga_setpage(0);
                    314: 
                    315:                svgalib_inited=1;
                    316: 
                    317:                VID_SetPalette(palette);
                    318: 
                    319:        }
                    320: 
                    321:        if (COM_CheckParm("-nokybd")) UseKeyboard = 0;
                    322: 
                    323:        if (UseKeyboard)
                    324:        {
                    325:                for (i=0 ; i<128 ; i++)
                    326:                        scantokey[i] = ' ';
                    327: 
                    328:                scantokey[42] = K_SHIFT;
                    329:                scantokey[54] = K_SHIFT;
                    330:                scantokey[72] = K_UPARROW;
                    331:                scantokey[103] = K_UPARROW;
                    332:                scantokey[80] = K_DOWNARROW;
                    333:                scantokey[108] = K_DOWNARROW;
                    334:                scantokey[75] = K_LEFTARROW;
                    335:                scantokey[105] = K_LEFTARROW;
                    336:                scantokey[77] = K_RIGHTARROW;
                    337:                scantokey[106] = K_RIGHTARROW;
                    338:                scantokey[29] = K_CTRL;
                    339:                scantokey[97] = K_CTRL;
                    340:                scantokey[56] = K_ALT;
                    341:                scantokey[100] = K_ALT;
                    342: //             scantokey[58] = JK_CAPS;
                    343: //             scantokey[69] = JK_NUM_LOCK;
                    344: //             scantokey[71] = JK_HOME;
                    345: //             scantokey[79] = JK_END;
                    346: //             scantokey[83] = JK_DEL;
                    347:                scantokey[1 ] = K_ESCAPE;
                    348:                scantokey[28] = K_ENTER;
                    349:                scantokey[15] = K_TAB;
                    350:                scantokey[14] = K_BACKSPACE;
                    351:                scantokey[119] = K_PAUSE;
                    352:        scantokey[57] = ' ';
                    353: 
                    354:                scantokey[2] = '1';
                    355:                scantokey[3] = '2';
                    356:                scantokey[4] = '3';
                    357:                scantokey[5] = '4';
                    358:                scantokey[6] = '5';
                    359:                scantokey[7] = '6';
                    360:                scantokey[8] = '7';
                    361:                scantokey[9] = '8';
                    362:                scantokey[10] = '9';
                    363:                scantokey[11] = '0';
                    364:                scantokey[12] = '-';
                    365:                scantokey[13] = '=';
                    366:                scantokey[41] = '`';
                    367:                scantokey[26] = '[';
                    368:                scantokey[27] = ']';
                    369:                scantokey[39] = ';';
                    370:                scantokey[40] = '\'';
                    371:                scantokey[51] = ',';
                    372:                scantokey[52] = '.';
                    373:                scantokey[53] = '/';
                    374:                scantokey[43] = '\\';
                    375: 
                    376:                scantokey[59] = K_F1;
                    377:                scantokey[60] = K_F2;
                    378:                scantokey[61] = K_F3;
                    379:                scantokey[62] = K_F4;
                    380:                scantokey[63] = K_F5;
                    381:                scantokey[64] = K_F6;
                    382:                scantokey[65] = K_F7;
                    383:                scantokey[66] = K_F8;
                    384:                scantokey[67] = K_F9;
                    385:                scantokey[68] = K_F10;
                    386:                scantokey[87] = K_F11;
                    387:                scantokey[88] = K_F12;
                    388:                scantokey[30] = 'a';
                    389:                scantokey[48] = 'b';
                    390:                scantokey[46] = 'c';
                    391:         scantokey[32] = 'd';       
                    392:         scantokey[18] = 'e';       
                    393:         scantokey[33] = 'f';       
                    394:         scantokey[34] = 'g';       
                    395:         scantokey[35] = 'h';       
                    396:         scantokey[23] = 'i';       
                    397:         scantokey[36] = 'j';       
                    398:         scantokey[37] = 'k';       
                    399:         scantokey[38] = 'l';       
                    400:         scantokey[50] = 'm';       
                    401:         scantokey[49] = 'n';       
                    402:         scantokey[24] = 'o';       
                    403:         scantokey[25] = 'p';       
                    404:         scantokey[16] = 'q';       
                    405:         scantokey[19] = 'r';       
                    406:         scantokey[31] = 's';       
                    407:         scantokey[20] = 't';       
                    408:         scantokey[22] = 'u';       
                    409:         scantokey[47] = 'v';       
                    410:         scantokey[17] = 'w';       
                    411:         scantokey[45] = 'x';       
                    412:         scantokey[21] = 'y';       
                    413:         scantokey[44] = 'z';       
                    414: 
                    415:                if (keyboard_init())
                    416:                        I_Error("keyboard_init() failed");
                    417:                keyboard_seteventhandler(keyhandler);
                    418:        }
                    419: 
                    420: }
                    421: 
                    422: void VID_Update(vrect_t *rects)
                    423: {
                    424: 
                    425:        int ycount;
                    426:        int offset;
                    427: 
                    428:        if (!svgalib_inited)
                    429:                return;
                    430: 
                    431:        while (rects)
                    432:        {
                    433:                ycount = rects->height;
                    434:                offset = rects->y * vid.rowbytes + rects->x;
                    435:                while (ycount--)
                    436:                {
                    437:                        memcpy(framebuffer_ptr + offset, vid.buffer + offset, rects->width);
                    438:                        offset += vid.rowbytes;
                    439:                }
                    440: 
                    441:                rects = rects->pnext;
                    442:        }
                    443: 
                    444: }
                    445: 
                    446: static int dither;
                    447: 
                    448: void VID_DitherOn(void)
                    449: {
                    450:     if (dither == 0)
                    451:     {
                    452:         R_ViewChanged ();
                    453:         dither = 1;
                    454:     }
                    455: }
                    456: 
                    457: void VID_DitherOff(void)
                    458: {
                    459:     if (dither)
                    460:     {
                    461:         R_ViewChanged ();
                    462:         dither = 0;
                    463:     }
                    464: }
                    465: 
                    466: int I_OpenWindow(void)
                    467: {
                    468:        return 0;
                    469: }
                    470: 
                    471: void I_EraseWindow(int window)
                    472: {
                    473: }
                    474: 
                    475: void I_DrawCircle(int window, int x, int y, int r)
                    476: {
                    477: }
                    478: 
                    479: void I_DisplayWindow(int window)
                    480: {
                    481: }
                    482: 
                    483: void Sys_SendKeyEvents(void)
                    484: {
                    485:        if (!svgalib_inited)
                    486:                return;
                    487: 
                    488:        if (UseKeyboard)
                    489:                while (keyboard_update());
                    490: }
                    491: 
                    492: char *Sys_ConsoleInput (void)
                    493: {
                    494:        return 0;
                    495: }
                    496: 
                    497: void mousehandler(int mouse_buttonstate, int dx, int dy)
                    498: {
                    499: 
                    500:        int i;
                    501: 
                    502:     for (i=0 ; i<mouse_buttons ; i++)
                    503:     {
                    504:         if ( (mouse_buttonstate & (1<<i)) && !(mouse_oldbuttonstate & (1<<i)) )
                    505:             Cbuf_AddText (mouse_button_commands[i].string);
                    506: 
                    507:         if ( !(mouse_buttonstate & (1<<i)) && (mouse_oldbuttonstate & (1<<i)) )
                    508:         {
                    509:             if (mouse_button_commands[i].string[0] == '+')
                    510:             {
                    511:                 mouse_button_commands[i].string[0] = '-';
                    512:                 Cbuf_AddText (mouse_button_commands[i].string);
                    513:                 mouse_button_commands[i].string[0] = '+';
                    514:             }
                    515:         }
                    516:     }
                    517: 
                    518:        mouse_oldbuttonstate = mouse_buttonstate;
                    519: 
                    520:        mouse_x = dx*3;
                    521:        mouse_y = dy*3;
                    522: 
                    523: }
                    524: 
                    525: void IN_Init(void)
                    526: {
                    527: 
                    528:        int mtype;
                    529:        char *mousedev;
                    530:        int mouserate;
                    531: 
                    532:        if (UseMouse)
                    533:        {
                    534: 
                    535:                Cvar_RegisterVariable (&mouse_button_commands[0]);
                    536:                Cvar_RegisterVariable (&mouse_button_commands[1]);
                    537:                Cvar_RegisterVariable (&mouse_button_commands[2]);
                    538: 
                    539:                Cvar_RegisterVariable (&mouse_sensitivity);
                    540: 
                    541:                mouse_buttons = 3;
                    542: 
                    543:                mtype = vga_getmousetype();
                    544: 
                    545:                mousedev = "/dev/mouse";
                    546:                if (getenv("MOUSEDEV")) mousedev = getenv("MOUSEDEV");
                    547:                if (COM_CheckParm("-mdev"))
                    548:                        mousedev = com_argv[COM_CheckParm("-mdev")+1];
                    549: 
                    550:                mouserate = 1200;
                    551:                if (getenv("MOUSERATE")) mouserate = atoi(getenv("MOUSERATE"));
                    552:                if (COM_CheckParm("-mrate"))
                    553:                        mouserate = atoi(com_argv[COM_CheckParm("-mrate")+1]);
                    554: 
                    555:                printf("Mouse: dev=%s,type=%s,speed=%d\n",
                    556:                        mousedev, mice[mtype].name, mouserate);
                    557:                if (mouse_init(mousedev, mtype, mouserate))
                    558:                {
                    559:                        Con_Printf("No mouse found\n");
                    560:                        UseMouse = 0;
                    561:                }
                    562:                else
                    563:                        mouse_seteventhandler(mousehandler);
                    564: 
                    565:        }
                    566: 
                    567: }
                    568: 
                    569: void IN_Shutdown(void)
                    570: {
                    571:        if (UseMouse)
                    572:                mouse_close();
                    573: }
                    574: 
                    575: void IN_Commands (void)
                    576: {
                    577:        if (UseMouse)
                    578:                while (mouse_update());
                    579: }
                    580: 
                    581: int CL_KeyState (int *key);
                    582: extern int in_strafe;
                    583: void IN_Move (usercmd_t *cmd)
                    584: {
                    585: 
                    586:        if (!UseMouse)
                    587:                return;
                    588: 
                    589: // add mouse X/Y movement to cmd
                    590:        if (in_strafe)
                    591:        {
                    592:                cmd->sidemove += 0.8*mouse_sensitivity.value * mouse_x;
                    593:                cmd->forwardmove -= 1.0*mouse_sensitivity.value * mouse_y;
                    594:        }
                    595:        else
                    596:        {
                    597:                cl_viewangles[YAW] -= 4.0/180*mouse_sensitivity.value * mouse_x;
                    598:                cl_viewangles[PITCH] -= 4.0/180*mouse_sensitivity.value * mouse_y;
                    599:        }
                    600: 
                    601:        if (cl_viewangles[PITCH] > 80)
                    602:                cl_viewangles[PITCH] = 80;
                    603:        if (cl_viewangles[PITCH] < -70)
                    604:                cl_viewangles[PITCH] = -70;
                    605: 
                    606:        if (cl_viewangles[ROLL] > 50)
                    607:                cl_viewangles[ROLL] = 50;
                    608:        if (cl_viewangles[ROLL] < -50)
                    609:                cl_viewangles[ROLL] = -50;
                    610: 
                    611: /*
                    612:     if (!UseMouse)
                    613:         return;
                    614: 
                    615: // add mouse X/Y movement to cmd
                    616:     if (CL_KeyState (&in_strafe))
                    617:     {
                    618:         cmd->sidemove += 0.8*mouse_sensitivity.value * mouse_x;
                    619:         cmd->forwardmove -= 1.0*mouse_sensitivity.value * mouse_y;
                    620:     }
                    621:     else
                    622:     {
                    623:         cmd->rightturn += 4.0/180*mouse_sensitivity.value * mouse_x;
                    624:         cmd->upturn -= 4.0/180*mouse_sensitivity.value * mouse_y;
                    625:     }
                    626: 
                    627: */
                    628: 
                    629: }
                    630: 
                    631: 
                    632: 
                    633: /*
                    634: ================
                    635: VID_NumModes
                    636: ================
                    637: */
                    638: int VID_NumModes ()
                    639: {
                    640:        return (1);
                    641: }
                    642: 
                    643: 
                    644: /*
                    645: ================
                    646: VID_ModeInfo
                    647: ================
                    648: */
                    649: char *VID_ModeInfo (int modenum)
                    650: {
                    651:        static char     *badmodestr = "Bad mode number";
                    652:        static char modestr[40];
                    653: 
                    654:        if (modenum == 0)
                    655:        {
                    656:                sprintf (modestr, "%d x %d, %d bpp",
                    657:                                 vid.width, vid.height, modes[current_mode].bytesperpixel*8);
                    658:                return (modestr);
                    659:        }
                    660:        else
                    661:        {
                    662:                return (badmodestr);
                    663:        }
                    664: }

unix.superglobalmegacorp.com

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