Annotation of quake2/rhapsody/vid_next.m, revision 1.1

1.1     ! root        1: // vid_next.m -- NEXTSTEP video driver
        !             2: 
        !             3: #define        INTERCEPTOR
        !             4: 
        !             5: #import <appkit/appkit.h>
        !             6: #import <string.h>
        !             7: #import "intercep.h"
        !             8: #include "quakedef.h"
        !             9: #include "d_local.h"
        !            10: 
        !            11: int    BASEWIDTH = 320;
        !            12: int BASEHEIGHT = 200;
        !            13: 
        !            14: void SetupBitmap (void);
        !            15: void SetupFramebuffer (void);
        !            16: void UpdateBitmap (void);
        !            17: void UpdateFramebuffer (vrect_t *vrect);
        !            18: void SetVideoEncoding (char *encoding);
        !            19: void Update8_1 (pixel_t *src, byte *dest, int width,
        !            20:                int height, int destrowbytes);
        !            21: void Update16_1 (pixel_t *src, unsigned short *dest, int width,
        !            22:                int height, int destrowbytes);
        !            23: void Update32_1 (pixel_t *src, unsigned *dest, int width,
        !            24:                int height, int destrowbytes);
        !            25: 
        !            26: 
        !            27: @interface QuakeView : View
        !            28: @end
        !            29: 
        !            30: @interface FrameWindow:Window
        !            31: @end
        !            32: 
        !            33: unsigned short d_8to16table[256];      // not used in 8 bpp mode
        !            34: unsigned       d_8to24table[256];      // not used in 8 bpp mode
        !            35: 
        !            36: 
        !            37: /*
        !            38: ==========================================================================
        !            39: 
        !            40:                                                API FUNCTIONS
        !            41: 
        !            42: ==========================================================================
        !            43: */
        !            44: 
        !            45: typedef enum {disp_bitmap, disp_framebuffer}   display_t;
        !            46: 
        !            47: pixel_t                *vid_buffer;
        !            48: pixel_t                *buffernative;
        !            49: unsigned       pcolormap[4][256];      // map from quake pixels to native pixels
        !            50: unsigned       pixbytesnative;
        !            51: unsigned       rowbytesnative;
        !            52: int                    dither;
        !            53: 
        !            54: int                    drawdirect = 0;
        !            55: 
        !            56: int                    d_con_indirect = 0;
        !            57: 
        !            58: display_t              vid_display;
        !            59: 
        !            60: byte                   vid_palette[768];       // saved for restarting vid system
        !            61: 
        !            62: id                             vid_window_i;
        !            63: id                             vid_view_i;
        !            64: #ifdef INTERCEPTOR
        !            65: NXDirectBitmap *vid_dbitmap_i;
        !            66: NXFramebuffer  *vid_framebuffer_i;
        !            67: #endif
        !            68: 
        !            69: NXRect                 screenBounds;           // only valid in framebuffer mode
        !            70: 
        !            71: int                            vid_scale;
        !            72: 
        !            73: char                   *vid_encodingstring;
        !            74: 
        !            75: int                            vid_fullscreen;
        !            76: int                            vid_screen;
        !            77: 
        !            78: int                            vid_high_hunk_mark;
        !            79: 
        !            80: typedef enum
        !            81: {
        !            82:        enc_24_rgba,
        !            83:        enc_24_0rgb,
        !            84:        enc_24_rgb0,
        !            85:        enc_12_rgba,
        !            86:        enc_12_rgb0,
        !            87:        enc_15_0rgb,
        !            88:        enc_564,
        !            89:        enc_8_gray,
        !            90:        enc_8_rgb
        !            91: } vid_encoding_t;
        !            92: 
        !            93: typedef struct
        !            94: {
        !            95:        char                    *string;
        !            96:        int                             pixelbytes;
        !            97:        void                    (*colormap) (void);
        !            98:        vid_encoding_t  name;
        !            99: } vidtype_t;
        !           100: 
        !           101: vid_encoding_t vid_encoding;
        !           102:  
        !           103: void   Table8 (void);
        !           104: void   Table15 (void);
        !           105: void   Table12 (void);
        !           106: void   Table12Swap (void);
        !           107: void   Table24 (void);
        !           108: void   Table24Swap (void);
        !           109: 
        !           110: vidtype_t vid_encodingtable[]=
        !           111: {
        !           112: {"RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA",4, Table24Swap, enc_24_rgba},
        !           113: {"--------RRRRRRRRGGGGGGGGBBBBBBBB",4, Table24, enc_24_0rgb},
        !           114: {"RRRRRRRRGGGGGGGGBBBBBBBB--------",4, Table24Swap, enc_24_rgb0},
        !           115: {"RRRRGGGGBBBBAAAA",2, Table12Swap, enc_12_rgba},
        !           116: {"RRRRGGGGBBBB----",2, Table12, enc_12_rgb0},
        !           117: {"-RRRRRGGGGGBBBBB",2, Table15, enc_15_0rgb},
        !           118: {"WWWWWWWW",1, Table8, enc_8_gray},
        !           119: {"PPPPPPPP",1, Table8, enc_8_rgb},
        !           120: {NULL,0, 0, 0}
        !           121: };
        !           122: 
        !           123: vidtype_t      *vid_type;
        !           124: void   InitNS8Bit (void);
        !           125: 
        !           126: /*
        !           127: ================
        !           128: D_BeginDirectRect
        !           129: ================
        !           130: */
        !           131: void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
        !           132: {
        !           133: // direct drawing of the "accessing disk" icon isn't supported under Nextstep
        !           134: }
        !           135: 
        !           136: 
        !           137: /*
        !           138: ================
        !           139: D_EndDirectRect
        !           140: ================
        !           141: */
        !           142: void D_EndDirectRect (int x, int y, int width, int height)
        !           143: {
        !           144: // direct drawing of the "accessing disk" icon isn't supported under Nextstep
        !           145: }
        !           146: 
        !           147: 
        !           148: /*
        !           149: ==============
        !           150: VID_Restart
        !           151: 
        !           152: internal call only
        !           153: ===============
        !           154: */
        !           155: void VID_Restart (display_t mode, int scale)
        !           156: {
        !           157:        vid_display = mode;
        !           158:        vid_scale = scale;
        !           159: 
        !           160:        [NXApp activateSelf:YES];
        !           161: 
        !           162:        if (vid_display == disp_framebuffer)
        !           163:                SetupFramebuffer ();
        !           164:        else
        !           165:                SetupBitmap ();
        !           166: 
        !           167:        vid.recalc_refdef = 1;
        !           168: }
        !           169: 
        !           170: 
        !           171: /*
        !           172: =================
        !           173: VID_Scale_f
        !           174: 
        !           175: Keybinding command
        !           176: =================
        !           177: */
        !           178: void VID_Scale_f (void)
        !           179: {
        !           180:        int             scale;
        !           181:        
        !           182:        if (Cmd_Argc () != 2)
        !           183:                return;
        !           184:                
        !           185:        scale = atoi (Cmd_Argv(1));
        !           186:        if (scale != 1 && scale != 2)
        !           187:        {
        !           188:                Con_Printf ("scale must be 1 or 2\n");
        !           189:                return;
        !           190:        }
        !           191:        VID_Shutdown ();
        !           192:        VID_Restart (vid_display, scale);
        !           193: }
        !           194: 
        !           195: /*
        !           196: =================
        !           197: VID_Mode_f
        !           198: 
        !           199: Keybinding command
        !           200: =================
        !           201: */
        !           202: void VID_Mode_f (void)
        !           203: {
        !           204:        int             mode;
        !           205: 
        !           206:        if (Cmd_Argc () != 2)
        !           207:                return;
        !           208: 
        !           209:        mode = atoi (Cmd_Argv(1));
        !           210: 
        !           211:        VID_Shutdown ();
        !           212:        if (mode == 0)
        !           213:        {
        !           214:                drawdirect = 0;
        !           215:                VID_Restart (disp_bitmap, vid_scale);
        !           216:        }
        !           217:        else if (mode == 1)
        !           218:        {
        !           219:                drawdirect = 0;
        !           220:                VID_Restart (disp_framebuffer, vid_scale);
        !           221:        }
        !           222:        else
        !           223:        {
        !           224:                drawdirect = 1;
        !           225:                VID_Restart (disp_framebuffer, vid_scale);
        !           226:        }
        !           227: }
        !           228: 
        !           229: /*
        !           230: =================
        !           231: VID_Size_f
        !           232: 
        !           233: Keybinding command
        !           234: =================
        !           235: */
        !           236: void VID_Size_f (void)
        !           237: {      
        !           238:        if (Cmd_Argc () != 3)
        !           239:                return;
        !           240: 
        !           241:        VID_Shutdown ();
        !           242: 
        !           243:        BASEWIDTH = atoi (Cmd_Argv(1));
        !           244:        BASEHEIGHT = atoi (Cmd_Argv(2));
        !           245: 
        !           246:        VID_Restart (vid_display, vid_scale);
        !           247: }
        !           248: 
        !           249: /*
        !           250: ================
        !           251: VID_Init
        !           252: ================
        !           253: */
        !           254: void   VID_Init (unsigned char *palette)
        !           255: {
        !           256:        InitNS8Bit ();                  // fixed palette lookups
        !           257:        
        !           258:        Q_memcpy (vid_palette, palette, sizeof(vid_palette));
        !           259: 
        !           260:        if (COM_CheckParm ("-bitmap"))
        !           261:                vid_display = disp_bitmap;
        !           262:        else
        !           263:                vid_display = disp_framebuffer;
        !           264: 
        !           265:        if (COM_CheckParm ("-screen2"))
        !           266:                vid_screen = 1;
        !           267:        else
        !           268:                vid_screen = 0;
        !           269: 
        !           270:        if (COM_CheckParm ("-direct"))
        !           271:                drawdirect = 1;
        !           272:        
        !           273:        Cmd_AddCommand ("vid_scale", VID_Scale_f);
        !           274:        Cmd_AddCommand ("vid_mode", VID_Mode_f);
        !           275:        Cmd_AddCommand ("vid_size", VID_Size_f);
        !           276: 
        !           277:        vid.width = BASEWIDTH;
        !           278:        vid.height = BASEHEIGHT;
        !           279:        vid.aspect = 1.0;
        !           280:        vid.numpages = 1;
        !           281:        vid.colormap = host_colormap;
        !           282:        vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
        !           283:        vid.maxwarpwidth = WARP_WIDTH;
        !           284:        vid.maxwarpheight = WARP_HEIGHT;
        !           285: 
        !           286:        if (COM_CheckParm ("-scale2"))
        !           287:                vid_scale = 2;
        !           288:        else
        !           289:                vid_scale = 1;
        !           290:                
        !           291:     [Application new];
        !           292: 
        !           293:        VID_Restart (vid_display, vid_scale);
        !           294: }
        !           295: 
        !           296: 
        !           297: /*
        !           298: ================
        !           299: VID_Shutdown
        !           300: ================
        !           301: */
        !           302: void VID_Shutdown (void)
        !           303: {
        !           304: #ifdef INTERCEPTOR
        !           305:        if (vid_dbitmap_i)
        !           306:        {
        !           307:                [vid_dbitmap_i free];
        !           308:                vid_dbitmap_i = 0;
        !           309:        }
        !           310:        if (vid_framebuffer_i)
        !           311:        {
        !           312:                [vid_framebuffer_i free];
        !           313:                vid_framebuffer_i = 0;
        !           314:        }
        !           315: #endif
        !           316:        [vid_window_i close];
        !           317:        [vid_window_i free];
        !           318: }
        !           319: 
        !           320: 
        !           321: /*
        !           322: ================
        !           323: VID_Update
        !           324: ================
        !           325: */
        !           326: void   VID_Update (vrect_t *rects)
        !           327: {
        !           328:        if (drawdirect)
        !           329:                return;
        !           330: 
        !           331:        while (rects)
        !           332:        {
        !           333:                UpdateFramebuffer (rects);
        !           334:                rects = rects->pnext;
        !           335:        }
        !           336: 
        !           337:        if (vid_display == disp_bitmap)
        !           338:                UpdateBitmap ();
        !           339: }
        !           340: 
        !           341: 
        !           342: /*
        !           343: ================
        !           344: VID_SetPalette
        !           345: ================
        !           346: */
        !           347: void   VID_SetPalette (unsigned char *palette)
        !           348: {
        !           349:        Q_memcpy (vid_palette, palette, sizeof(vid_palette));
        !           350:        vid_type->colormap ();
        !           351: }
        !           352: 
        !           353: 
        !           354: /*
        !           355: ================
        !           356: VID_ShiftPalette
        !           357: ================
        !           358: */
        !           359: void    VID_ShiftPalette (unsigned char *palette)
        !           360: {
        !           361: 
        !           362:        VID_SetPalette (palette);
        !           363: }
        !           364: 
        !           365: 
        !           366: /*
        !           367: ==========================================================================
        !           368: 
        !           369:                                                NS STUFF
        !           370: 
        !           371: ==========================================================================
        !           372: */
        !           373: 
        !           374: 
        !           375: /*
        !           376: =================
        !           377: SetVideoEncoding
        !           378: =================
        !           379: */
        !           380: void SetVideoEncoding (char *encoding)
        !           381: {
        !           382:        vidtype_t                       *type;
        !           383: 
        !           384:        Sys_Printf ("SetVideoEncoding: %s\n",encoding);
        !           385:        vid_encodingstring = encoding;
        !           386:        
        !           387:        for (type = vid_encodingtable ; type->string ; type++)
        !           388:        {
        !           389:                if (strcmp(type->string, encoding) == 0)
        !           390:                {
        !           391:                        pixbytesnative = type->pixelbytes;
        !           392:                        vid_encoding = type->name;
        !           393:                        type->colormap ();
        !           394:                        vid_type = type;
        !           395:                        return;
        !           396:                }
        !           397:        }
        !           398:        
        !           399:        Sys_Error ("Unsupported video encoding: %s\n",encoding);
        !           400: }
        !           401: 
        !           402: /*
        !           403: =================
        !           404: AllocBuffers
        !           405: =================
        !           406: */
        !           407: void AllocBuffers (qboolean withnative)
        !           408: {
        !           409:        int             surfcachesize;
        !           410:        void    *surfcache;
        !           411:        int             pixels;
        !           412:        int             pixbytes;
        !           413:        int             vid_buffersize;
        !           414: 
        !           415:        if (vid_buffer)
        !           416:        {
        !           417:                D_FlushCaches ();
        !           418:                Hunk_FreeToHighMark (vid_high_hunk_mark);
        !           419:                vid_high_hunk_mark = 0;
        !           420:                vid_buffer = NULL;
        !           421:        }
        !           422: 
        !           423:        pixels = vid.width * vid.height;
        !           424: 
        !           425:        pixbytes = 1 +sizeof (*d_pzbuffer);
        !           426:        if (withnative)
        !           427:                pixbytes += pixbytesnative;
        !           428:                
        !           429:        surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height);
        !           430:        vid_buffersize = pixels * pixbytes + surfcachesize;
        !           431: 
        !           432:        vid_high_hunk_mark = Hunk_HighMark ();
        !           433:        vid_buffer = Hunk_HighAllocName (vid_buffersize, "video");
        !           434:        if (!vid_buffer)
        !           435:                Sys_Error ("Couldn't alloc video buffers");
        !           436: 
        !           437:        vid.buffer = vid_buffer;
        !           438: 
        !           439:        d_pzbuffer = (unsigned short *)((byte *)vid_buffer + pixels);
        !           440:        surfcache = (byte *)d_pzbuffer + pixels * sizeof (*d_pzbuffer);
        !           441:        if (withnative)
        !           442:                buffernative = (byte *)surfcache + surfcachesize;
        !           443: 
        !           444:        D_InitCaches (surfcache, surfcachesize);
        !           445: }
        !           446: 
        !           447: /*
        !           448: =================
        !           449: SetupFramebuffer
        !           450: =================
        !           451: */
        !           452: void SetupFramebuffer (void)
        !           453: {
        !           454: #ifdef INTERCEPTOR
        !           455:     int                        windowNum;
        !           456:        NXRect          cont;
        !           457:        NXScreen        const *screens;
        !           458:        int                     screencount;
        !           459: 
        !           460: //
        !           461: // get the screen list
        !           462: //
        !           463:        [NXApp getScreens:&screens count:&screencount];
        !           464: 
        !           465: //
        !           466: // create vid_framebuffer_i
        !           467: //
        !           468:     vid_framebuffer_i = [[NXFramebuffer alloc]
        !           469:                   initFromScreen:screens[vid_screen].screenNumber andMapIfPossible:YES];
        !           470:     [vid_framebuffer_i screenBounds:&screenBounds];
        !           471: 
        !           472:        SetVideoEncoding ([vid_framebuffer_i pixelEncoding]);
        !           473: 
        !           474:        buffernative = [vid_framebuffer_i data];
        !           475:        rowbytesnative = [vid_framebuffer_i bytesPerRow];
        !           476: 
        !           477: //
        !           478: // create window
        !           479: //
        !           480:        if (vid_fullscreen)
        !           481:        {
        !           482:                vid.height = screenBounds.size.height / vid_scale;
        !           483:                vid.width = screenBounds.size.width / vid_scale;
        !           484:                cont.origin.x = 0;
        !           485:                cont.origin.y = 0;
        !           486:                cont.size.width = screenBounds.size.width;
        !           487:                cont.size.height = screenBounds.size.height;
        !           488:        }
        !           489:        else
        !           490:        {
        !           491:                buffernative = (unsigned char *)buffernative + 8 * rowbytesnative +
        !           492:                                8 * pixbytesnative;
        !           493:                vid.width = BASEWIDTH;
        !           494:                vid.height = BASEHEIGHT;
        !           495:                cont.origin.x = 8;
        !           496:                cont.origin.y = screenBounds.size.height - (vid.height*vid_scale) - 8;
        !           497:                cont.size.width = vid.width * vid_scale;
        !           498:                cont.size.height = vid.height * vid_scale;
        !           499:        }
        !           500: 
        !           501:     vid_window_i = [[FrameWindow alloc]
        !           502:                 initContent:           &cont
        !           503:                 style:                         NX_PLAINSTYLE
        !           504:                 backing:                       NX_NONRETAINED
        !           505:                 buttonMask:            0
        !           506:                 defer:                         NO
        !           507:                 screen:                        screens+vid_screen];
        !           508:     windowNum = [vid_window_i windowNum];
        !           509:     PSsetwindowlevel(40, windowNum);
        !           510:     PSsetautofill(YES, windowNum);
        !           511:     PSgsave();
        !           512:     PSwindowdeviceround(windowNum);
        !           513:     PSsetgray(NX_BLACK);
        !           514:     PSsetexposurecolor();
        !           515:     PSgrestore();
        !           516: 
        !           517: //
        !           518: // create view
        !           519: //
        !           520:        vid_view_i = [[QuakeView alloc] initFrame: &screenBounds];
        !           521:        [[vid_window_i setContentView: vid_view_i] free];
        !           522:        [vid_window_i makeFirstResponder: vid_view_i];
        !           523:        [vid_window_i setDelegate: vid_view_i]; 
        !           524:        [vid_window_i display];
        !           525:        [vid_window_i makeKeyAndOrderFront: nil];
        !           526:        NXPing ();
        !           527: 
        !           528:        AllocBuffers (false);   // no native buffer
        !           529: 
        !           530:        if (drawdirect)
        !           531:        {       // the direct drawing mode to NeXT colorspace
        !           532:                vid.buffer = buffernative;
        !           533:                vid.rowbytes = rowbytesnative;
        !           534:        }
        !           535:        else
        !           536:                vid.rowbytes = vid.width;
        !           537: 
        !           538:        vid.conbuffer = vid.buffer;
        !           539:        vid.conrowbytes = vid.rowbytes;
        !           540:        vid.conwidth = vid.width;
        !           541:        vid.conheight = vid.height;
        !           542: #endif
        !           543: }
        !           544: 
        !           545: /*
        !           546: =================
        !           547: SetupBitmap
        !           548: =================
        !           549: */
        !           550: void SetupBitmap (void)
        !           551: {
        !           552:        int             depth;
        !           553:        NXRect  content;
        !           554: 
        !           555: //
        !           556: // open a window
        !           557: //
        !           558:        NXSetRect (&content, 8,136, vid.width*vid_scale, vid.height*vid_scale);
        !           559:        vid_window_i = [[Window alloc]
        !           560:                        initContent:    &content
        !           561:                        style:                  NX_RESIZEBARSTYLE
        !           562:                        backing:                NX_RETAINED
        !           563:                        buttonMask:             0
        !           564:                        defer:                  NO
        !           565:                ];
        !           566:        [vid_window_i display];
        !           567:        [vid_window_i makeKeyAndOrderFront: nil];
        !           568: 
        !           569:        NXPing ();
        !           570: 
        !           571:        content.origin.x = content.origin.y = 0;
        !           572:        vid_view_i = [[QuakeView alloc] initFrame: &content];
        !           573:        [[vid_window_i setContentView: vid_view_i] free];
        !           574:        [vid_window_i makeFirstResponder: vid_view_i];
        !           575:        [vid_window_i setDelegate: vid_view_i];
        !           576: 
        !           577:        [vid_window_i addToEventMask: NX_FLAGSCHANGEDMASK];
        !           578: 
        !           579: //
        !           580: // find video info
        !           581: //
        !           582:     depth = [Window defaultDepthLimit];
        !           583:     switch (depth) {
        !           584:        case NX_EightBitGrayDepth:
        !           585:                SetVideoEncoding ("WWWWWWWW");
        !           586:            break;
        !           587:        case NX_TwelveBitRGBDepth:
        !           588:                SetVideoEncoding ("RRRRGGGGBBBBAAAA");
        !           589:            break;
        !           590:        default:
        !           591:        case NX_TwentyFourBitRGBDepth:
        !           592:                SetVideoEncoding ("RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA");
        !           593:            break;
        !           594: //     default:        // 8 bit color shows up as an unknown...
        !           595:                Sys_Error ("Unsupported window depth");
        !           596:     }
        !           597: 
        !           598:        [vid_window_i setTitle: "Bitmap Quake Console"];
        !           599: 
        !           600: //
        !           601: // allocate memory for the back and translation buffers
        !           602: //
        !           603:        vid.rowbytes = vid.width;
        !           604:        rowbytesnative = vid.width * pixbytesnative;
        !           605:        
        !           606:        AllocBuffers (true);
        !           607:        
        !           608:        vid.conbuffer = vid.buffer;
        !           609:        vid.conrowbytes = vid.rowbytes;
        !           610:        vid.conwidth = vid.width;
        !           611:        vid.conheight = vid.height;
        !           612: }
        !           613: 
        !           614: 
        !           615: /*
        !           616: =================
        !           617: UpdateFramebuffer
        !           618: =================
        !           619: */
        !           620: void UpdateFramebuffer (vrect_t *vrect)
        !           621: {
        !           622:        byte            *psourcebase;
        !           623:        byte            *pdestbase;
        !           624:        int                     scale;
        !           625:        
        !           626:        psourcebase = vid.buffer + vrect->x + vrect->y * vid.rowbytes;
        !           627: 
        !           628:        if (vid_display == disp_bitmap)
        !           629:                scale = 1;              // let NS do the scaling
        !           630:        else
        !           631:                scale = vid_scale;
        !           632:                
        !           633:        pdestbase = buffernative + scale *
        !           634:                        (vrect->x * pixbytesnative + vrect->y * rowbytesnative);
        !           635: 
        !           636: //
        !           637: // translate from ideal to native (except 8 bpp direct) and copy to screen
        !           638: //
        !           639: 
        !           640:        if (pixbytesnative == 1)
        !           641:                Update8_1 (psourcebase, pdestbase, vrect->width, vrect->height,
        !           642:                                rowbytesnative);
        !           643:        else if (pixbytesnative == 2)
        !           644:                Update16_1 (psourcebase, (unsigned short *)pdestbase, vrect->width, vrect->height,
        !           645:                                rowbytesnative);
        !           646:        else
        !           647:                Update32_1 (psourcebase, (unsigned *)pdestbase, vrect->width, vrect->height,
        !           648:                                rowbytesnative);
        !           649: }
        !           650: 
        !           651: 
        !           652: /*
        !           653: =================
        !           654: UpdateBitmap
        !           655: =================
        !           656: */
        !           657: void UpdateBitmap (void)
        !           658: {
        !           659:        unsigned char   *planes[5];
        !           660:        NXRect                  bounds;
        !           661:        int                             bpp, spp, bps, bpr, colorspace;
        !           662: 
        !           663: //
        !           664: // flush the screen with an image call
        !           665: // 
        !           666:        if (pixbytesnative == 1)
        !           667:        {
        !           668:                bps = 8;
        !           669:                spp = 1;
        !           670:                bpp = 8;
        !           671:                bpr = vid.width;
        !           672:                colorspace = NX_OneIsWhiteColorSpace;
        !           673:                planes[0] = vid.buffer;
        !           674:        }
        !           675:        else if (pixbytesnative == 2)
        !           676:        {
        !           677:                bps = 4;
        !           678:                spp = 3;
        !           679:                bpp = 16;
        !           680:                bpr = vid.width * 2;
        !           681:                colorspace = NX_RGBColorSpace;
        !           682:                planes[0] = buffernative;
        !           683:        }
        !           684:        else
        !           685:        {
        !           686:                bps = 8;
        !           687:                spp = 3;
        !           688:                bpp = 32;
        !           689:                bpr = vid.width * 4;
        !           690:                colorspace = NX_RGBColorSpace;
        !           691:                planes[0] = buffernative;
        !           692:        }
        !           693: 
        !           694:        [vid_view_i getBounds: &bounds];
        !           695:        [vid_view_i lockFocus];
        !           696: 
        !           697:        NXDrawBitmap(
        !           698:                &bounds,  
        !           699:                vid.width, 
        !           700:                vid.height,
        !           701:                bps,
        !           702:                spp,
        !           703:                bpp,
        !           704:                bpr,
        !           705:                NO,
        !           706:                NO,
        !           707:                colorspace,
        !           708:                planes
        !           709:        );
        !           710:        
        !           711:        [vid_view_i unlockFocus];
        !           712:     NXPing (); 
        !           713: }
        !           714: 
        !           715: 
        !           716: 
        !           717: /*
        !           718: ==========================================================================
        !           719: 
        !           720:                                        TRANSLATION TABLE BUILDING
        !           721: 
        !           722: ==========================================================================
        !           723: */
        !           724: 
        !           725: int    redramp[] = {0, 19, 59, 113, 178, 255, 300};
        !           726: int greenramp[] = {0, 11, 34,  66, 104, 149, 199, 255, 300};
        !           727: int blueramp[] = {0, 28, 84, 161, 255, 300};
        !           728: int greyramp[] = { 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204,
        !           729:                                   221, 238, 255, 300};
        !           730: 
        !           731: byte   greytable[256];
        !           732: byte   redtable[256];
        !           733: byte   greentable[256];
        !           734: byte   bluetable[256];
        !           735: 
        !           736: void FillTable (byte *table, int *ramp, int base)
        !           737: {
        !           738:        int             i, j, o;
        !           739:        
        !           740:        o = 0;
        !           741:        for (i=0 ; i<16 && o < 256; i++)
        !           742:        {
        !           743:                j = ramp[i];
        !           744:                for ( ; o<=j ; o++)
        !           745:                        table[o] = base + i;
        !           746:        }
        !           747: }
        !           748: 
        !           749: void   InitNS8Bit (void)
        !           750: {
        !           751:        FillTable (greytable, greyramp, 240);
        !           752:        FillTable (redtable, redramp, 0);
        !           753:        FillTable (greentable, greenramp, 0);
        !           754:        FillTable (bluetable, blueramp, 0);
        !           755: }
        !           756: 
        !           757: 
        !           758: byte ns8trans[256] =   // FIXME: dynamically calc this so palettes work
        !           759: {
        !           760: 0,241,242,243,244,244,245,246,247,248,249,250,251,252,253,254,
        !           761: 45,241,241,242,91,91,91,96,96,136,136,136,141,141,141,141,
        !           762: 241,46,242,243,243,97,97,97,245,246,143,143,143,143,148,148,
        !           763: 0,5,45,45,50,50,90,90,95,95,95,95,95,140,140,141,
        !           764: 0,40,40,40,40,80,80,80,80,80,120,120,120,120,120,120,
        !           765: 45,50,50,90,90,95,95,135,135,135,136,141,141,181,181,181,
        !           766: 45,90,91,91,131,131,136,136,136,176,181,181,186,226,231,236,
        !           767: 45,45,91,91,96,96,136,136,137,142,182,182,187,188,188,233,
        !           768: 188,249,248,247,246,137,137,137,244,243,243,91,242,241,241,45,
        !           769: 183,183,183,247,137,137,137,137,137,244,91,91,91,241,241,45,
        !           770: 252,251,188,188,248,248,142,142,142,244,244,243,91,242,241,45,
        !           771: 247,247,246,246,245,245,244,244,243,243,242,242,51,241,241,5,
        !           772: 236,231,231,191,186,185,185,140,140,135,135,95,90,90,45,45,
        !           773: 4,49,49,53,53,93,93,93,93,92,92,92,243,242,46,241,
        !           774: 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,
        !           775: 239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,182
        !           776: };
        !           777: 
        !           778: /*
        !           779: ===================
        !           780: Table8
        !           781: ===================
        !           782: */
        !           783: void   Table8 (void)
        !           784: {
        !           785:        byte    *pal;
        !           786:        int             r,g,b,v;
        !           787:        int             i;
        !           788:        byte    *table;
        !           789:        
        !           790:        pal = vid_palette;
        !           791:        table = (byte *)pcolormap[0];
        !           792:        
        !           793:        for (i=0 ; i<256 ; i++)
        !           794:        {
        !           795:                r = pal[0];
        !           796:                g = pal[1];
        !           797:                b = pal[2];
        !           798:                pal += 3;
        !           799:                
        !           800: // use the grey ramp if all indexes are close
        !           801: 
        !           802:                if (r-g < 16 && r-g > -16 && r-b < 16 && r-b > -16)
        !           803:                {
        !           804:                        v = (r+g+b)/3;
        !           805:                        *table++ = greytable[v];
        !           806:                        continue;
        !           807:                }
        !           808:                
        !           809:                r = redtable[r];
        !           810:                g = greentable[g];
        !           811:                b = bluetable[b];
        !           812:                
        !           813: // otherwise use the color cube
        !           814:                *table++ = r*(8*5) + g*5 + b;
        !           815:        }
        !           816: }
        !           817: 
        !           818: /*
        !           819: ===================
        !           820: Table24
        !           821: ===================
        !           822: */
        !           823: void   Table24 (void)
        !           824: {
        !           825:        byte    *pal;
        !           826:        int             r,g,b,v;
        !           827:        int             i;
        !           828:        unsigned        *table;
        !           829:        
        !           830:        
        !           831: //
        !           832: // 8 8 8 encoding
        !           833: //
        !           834:        pal = vid_palette;
        !           835:        table = (unsigned *)pcolormap[0];
        !           836:        
        !           837:        for (i=0 ; i<256 ; i++)
        !           838:        {
        !           839:                r = pal[0];
        !           840:                g = pal[1];
        !           841:                b = pal[2];
        !           842:                pal += 3;
        !           843:                
        !           844:                v = (r<<16) + (g<<8) + b;
        !           845:                *table++ = v;
        !           846:        }
        !           847: }
        !           848: 
        !           849: /*
        !           850: ===================
        !           851: Table24Swap
        !           852: ===================
        !           853: */
        !           854: void   Table24Swap (void)
        !           855: {
        !           856:        byte    *pal;
        !           857:        int             r,g,b,v;
        !           858:        int             i;
        !           859:        unsigned        *table;
        !           860: 
        !           861: //
        !           862: // 8 8 8 encoding
        !           863: //
        !           864:        pal = vid_palette;
        !           865:        table = (unsigned *)pcolormap[0];
        !           866:        
        !           867:        for (i=0 ; i<256 ; i++)
        !           868:        {
        !           869:                r = pal[0];
        !           870:                g = pal[1];
        !           871:                b = pal[2];
        !           872:                pal += 3;
        !           873:                
        !           874:                v = (r<<24) + (g<<16) + (b<<8) /*+ 255*/;
        !           875:                v = NXSwapBigLongToHost (v);
        !           876:                *table++ = v;
        !           877:        }
        !           878: }
        !           879: 
        !           880: 
        !           881: /*
        !           882: ===================
        !           883: Table15
        !           884: ===================
        !           885: */
        !           886: void   Table15 (void)
        !           887: {
        !           888:        byte                    *pal;
        !           889:        int                             r,g,b,v;
        !           890:        int                             i, k;
        !           891:        unsigned char   *palette;
        !           892:        unsigned short  *table;
        !           893:        int                             dadj;
        !           894:        int             ditheradjust[4] = {(1 << 9) * 3 / 8,
        !           895:                                                                        (1 << 9) * 5 / 8,
        !           896:                                                                        (1 << 9) * 7 / 8,
        !           897:                                                                        (1 << 9) * 1 / 8};
        !           898:        
        !           899:        palette = vid_palette;
        !           900:        table = (unsigned short *)pcolormap;
        !           901:        
        !           902: //
        !           903: // 5 5 5 encoding
        !           904: //
        !           905:        for (k=0 ; k<4 ; k++)
        !           906:        {
        !           907:                dadj = ditheradjust[k];
        !           908: 
        !           909:                pal = vid_palette;
        !           910: 
        !           911:                for (i=0 ; i<256 ; i++)
        !           912:                {
        !           913:                // shift 6 bits to get back to 0-255, & 3 more for 5 bit color
        !           914:                // FIXME: scale intensity levels properly
        !           915:                        r = (pal[0] + dadj) >> 3;
        !           916:                        g = (pal[1] + dadj) >> 3;
        !           917:                        b = (pal[2] + dadj) >> 3;
        !           918:                        pal += 3;
        !           919: 
        !           920:                        v = (r<<10) + (g<<5) + b;
        !           921: 
        !           922:                        *table++ = v;
        !           923:                }
        !           924:        }
        !           925: }
        !           926: 
        !           927: /*
        !           928: ===================
        !           929: Table12
        !           930: ===================
        !           931: */
        !           932: void   Table12 (void)
        !           933: {
        !           934:        byte                    *pal;
        !           935:        int                             r,g,b,v;
        !           936:        int                             i, k;
        !           937:        unsigned short  *table;
        !           938:        int                             dadj;
        !           939:        static int              ditheradjust[4] = {(1 << 9) * 3 / 8,
        !           940:                                                                           (1 << 9) * 5 / 8,
        !           941:                                                                           (1 << 9) * 7 / 8,
        !           942:                                                                           (1 << 9) * 1 / 8};
        !           943: 
        !           944:        table = (unsigned short *)pcolormap;
        !           945:                
        !           946: //
        !           947: // 4 4 4 encoding
        !           948: //
        !           949:        for (k=0 ; k<4 ; k++)
        !           950:        {
        !           951:                dadj = ditheradjust[k];
        !           952: 
        !           953:                pal = vid_palette;
        !           954: 
        !           955:                for (i=0 ; i<256 ; i++)
        !           956:                {
        !           957:                // shift 5 bits to get back to 0-255, & 4 more for 4 bit color
        !           958:                // FIXME: scale intensity levels properly
        !           959:                        r = (pal[0] + dadj) >> 4;
        !           960:                        g = (pal[1] + dadj) >> 4;
        !           961:                        b = (pal[2] + dadj) >> 4;
        !           962:                        pal += 3;
        !           963: 
        !           964:                        v = ((r<<12) + (g<<8) + (b<<4) /*+ 15*/);
        !           965: 
        !           966:                        *table++ = v;
        !           967:                }
        !           968:        }
        !           969: }
        !           970: 
        !           971: /*
        !           972: ===================
        !           973: Table12Swap
        !           974: ===================
        !           975: */
        !           976: void   Table12Swap (void)
        !           977: {
        !           978:        byte                    *pal;
        !           979:        int                             r,g,b,v;
        !           980:        int                             i, k;
        !           981:        unsigned short  *table;
        !           982:        int                             dadj;
        !           983:        static int              ditheradjust[4] = {(1 << 9) * 3 / 8,
        !           984:                                                                           (1 << 9) * 5 / 8,
        !           985:                                                                           (1 << 9) * 7 / 8,
        !           986:                                                                           (1 << 9) * 1 / 8};
        !           987: 
        !           988:        table = (unsigned short *)pcolormap;
        !           989:                
        !           990: //
        !           991: // 4 4 4 encoding
        !           992: //
        !           993:        for (k=0 ; k<4 ; k++)
        !           994:        {
        !           995:                dadj = ditheradjust[k];
        !           996: 
        !           997:                pal = vid_palette;
        !           998: 
        !           999:                for (i=0 ; i<256 ; i++)
        !          1000:                {
        !          1001:                // shift 5 bits to get back to 0-255, & 4 more for 4 bit color
        !          1002:                // FIXME: scale intensity levels properly
        !          1003:                        r = (pal[0] + dadj) >> 4;
        !          1004:                        g = (pal[1] + dadj) >> 4;
        !          1005:                        b = (pal[2] + dadj) >> 4;
        !          1006:                        pal += 3;
        !          1007: 
        !          1008:                        v = ((r<<12) + (g<<8) + (b<<4) /*+ 15*/);
        !          1009:                        v = NXSwapBigShortToHost (v);
        !          1010: 
        !          1011:                        *table++ = v;
        !          1012:                }
        !          1013:        }
        !          1014: }
        !          1015: 
        !          1016: 
        !          1017: /*
        !          1018: ==========================================================================
        !          1019: 
        !          1020:                                        GENERIC IMAGING FUNCTIONS
        !          1021: 
        !          1022: ==========================================================================
        !          1023: */
        !          1024: 
        !          1025: /*
        !          1026: ===================
        !          1027: Update8_1
        !          1028: ===================
        !          1029: */
        !          1030: void Update8_1 (pixel_t *src, byte *dest, int width, int height,
        !          1031:                int destrowbytes)
        !          1032: {
        !          1033:        int                             x,y;
        !          1034:        unsigned                rowdelta, srcdelta;
        !          1035:        unsigned                xcount;
        !          1036:        byte                    *pdest;
        !          1037:        int                             xwidth;
        !          1038: 
        !          1039:        pdest = dest;
        !          1040:        
        !          1041:        xcount = width >> 3;
        !          1042:        srcdelta = vid.width - width;
        !          1043: 
        !          1044:        xwidth = width - (xcount << 3);
        !          1045:        if (xwidth)
        !          1046:                Sys_Error ("Width not multiple of 8");
        !          1047: 
        !          1048:        if ((vid_display == disp_framebuffer) && (vid_scale == 2))
        !          1049:        {
        !          1050:                int             nextrow = destrowbytes;
        !          1051: 
        !          1052:            rowdelta = destrowbytes - (width << 1)  + destrowbytes;
        !          1053: 
        !          1054:                if (dither)
        !          1055:                {
        !          1056:                        unsigned short  *psrc;
        !          1057: 
        !          1058:                        psrc = (unsigned short *)src;
        !          1059: 
        !          1060:                        for (y = height ; y ; y--)
        !          1061:                        {
        !          1062:                        for (x = xcount ; x ;x--)
        !          1063:                            {
        !          1064:                                        unsigned        temp;
        !          1065: 
        !          1066:                                        temp = psrc[0];
        !          1067:                                        pdest[0] = ((byte *)pcolormap[0])[temp];
        !          1068:                                        pdest[1] = ((byte *)pcolormap[1])[temp];
        !          1069:                                        pdest[nextrow] = ((byte *)pcolormap[2])[temp];
        !          1070:                                        pdest[nextrow + 1] = ((byte *)pcolormap[3])[temp];
        !          1071:                                        temp = psrc[1];
        !          1072:                                        pdest[2] = ((byte *)pcolormap[0])[temp];
        !          1073:                                        pdest[3] = ((byte *)pcolormap[1])[temp];
        !          1074:                                        pdest[nextrow + 2] = ((byte *)pcolormap[2])[temp];
        !          1075:                                        pdest[nextrow + 3] = ((byte *)pcolormap[3])[temp];
        !          1076:                                        temp = psrc[2];
        !          1077:                                        pdest[4] = ((byte *)pcolormap[0])[temp];
        !          1078:                                        pdest[5] = ((byte *)pcolormap[1])[temp];
        !          1079:                                        pdest[nextrow + 4] = ((byte *)pcolormap[2])[temp];
        !          1080:                                        pdest[nextrow + 5] = ((byte *)pcolormap[3])[temp];
        !          1081:                                        temp = psrc[3];
        !          1082:                                        pdest[6] = ((byte *)pcolormap[0])[temp];
        !          1083:                                        pdest[7] = ((byte *)pcolormap[1])[temp];
        !          1084:                                        pdest[nextrow + 6] = ((byte *)pcolormap[2])[temp];
        !          1085:                                        pdest[nextrow + 7] = ((byte *)pcolormap[3])[temp];
        !          1086:                                        temp = psrc[4];
        !          1087:                                        pdest[8] = ((byte *)pcolormap[0])[temp];
        !          1088:                                        pdest[9] = ((byte *)pcolormap[1])[temp];
        !          1089:                                        pdest[nextrow + 8] = ((byte *)pcolormap[2])[temp];
        !          1090:                                        pdest[nextrow + 9] = ((byte *)pcolormap[3])[temp];
        !          1091:                                        temp = psrc[5];
        !          1092:                                        pdest[10] = ((byte *)pcolormap[0])[temp];
        !          1093:                                        pdest[11] = ((byte *)pcolormap[1])[temp];
        !          1094:                                        pdest[nextrow + 10] = ((byte *)pcolormap[2])[temp];
        !          1095:                                        pdest[nextrow + 11] = ((byte *)pcolormap[3])[temp];
        !          1096:                                        temp = psrc[6];
        !          1097:                                        pdest[12] = ((byte *)pcolormap[0])[temp];
        !          1098:                                        pdest[13] = ((byte *)pcolormap[1])[temp];
        !          1099:                                        pdest[nextrow + 12] = ((byte *)pcolormap[2])[temp];
        !          1100:                                        pdest[nextrow + 13] = ((byte *)pcolormap[3])[temp];
        !          1101:                                        temp = psrc[7];
        !          1102:                                        pdest[14] = ((byte *)pcolormap[0])[temp];
        !          1103:                                        pdest[15] = ((byte *)pcolormap[1])[temp];
        !          1104:                                        pdest[nextrow + 14] = ((byte *)pcolormap[2])[temp];
        !          1105:                                        pdest[nextrow + 15] = ((byte *)pcolormap[3])[temp];
        !          1106:                                        pdest += 16; psrc += 8;
        !          1107:                            }
        !          1108: 
        !          1109:                                psrc += srcdelta;
        !          1110:                            pdest += rowdelta;
        !          1111:                        }
        !          1112:                }
        !          1113:                else
        !          1114:                {
        !          1115:                        byte    *psrc;
        !          1116: 
        !          1117:                        psrc = (byte *)src;
        !          1118: 
        !          1119:                        for (y = height ; y ; y--)
        !          1120:                        {
        !          1121:                                for (x = xcount ; x ;x--)
        !          1122:                        {
        !          1123:                                        pdest[0] = pdest[1] = pdest[nextrow] =
        !          1124:                                                pdest[nextrow + 1] = ((byte *)pcolormap[0])[psrc[0]];
        !          1125:                                        pdest[2] = pdest[3] = pdest[nextrow + 2] =
        !          1126:                                                pdest[nextrow + 3] = ((byte *)pcolormap[0])[psrc[1]];
        !          1127:                                        pdest[4] = pdest[5] = pdest[nextrow + 4] =
        !          1128:                                                pdest[nextrow + 5] = ((byte *)pcolormap[0])[psrc[2]];
        !          1129:                                        pdest[6] = pdest[7] = pdest[nextrow + 6] =
        !          1130:                                                pdest[nextrow + 7] = ((byte *)pcolormap[0])[psrc[3]];
        !          1131:                                        pdest[8] = pdest[9] = pdest[nextrow + 8] =
        !          1132:                                                pdest[nextrow + 9] = ((byte *)pcolormap[0])[psrc[4]];
        !          1133:                                        pdest[10] = pdest[11] = pdest[nextrow + 10] =
        !          1134:                                                pdest[nextrow + 11] = ((byte *)pcolormap[0])[psrc[5]];
        !          1135:                                        pdest[12] = pdest[13] = pdest[nextrow + 12] =
        !          1136:                                                pdest[nextrow + 13] = ((byte *)pcolormap[0])[psrc[6]];
        !          1137:                                        pdest[14] = pdest[15] = pdest[nextrow + 14] =
        !          1138:                                                pdest[nextrow + 15] = ((byte *)pcolormap[0])[psrc[7]];
        !          1139:                                        pdest += 16; psrc += 8;
        !          1140:                        }
        !          1141: 
        !          1142:                                psrc += srcdelta;
        !          1143:                            pdest += rowdelta;
        !          1144:                        }
        !          1145:                }
        !          1146:     }
        !          1147:        else
        !          1148:        {
        !          1149:            rowdelta = destrowbytes - width;
        !          1150: 
        !          1151:                if (dither)
        !          1152:                {
        !          1153:                        unsigned short  *psrc;
        !          1154: 
        !          1155:                        psrc = (unsigned short *)src;
        !          1156: 
        !          1157:                        for (y = height ; y>0 ; y -= 2)
        !          1158:                        {
        !          1159:                        for (x = xcount ; x ;x--)
        !          1160:                            {
        !          1161:                                        pdest[0] = ((byte *)pcolormap[0])[psrc[0]];
        !          1162:                                        pdest[1] = ((byte *)pcolormap[1])[psrc[1]];
        !          1163:                                        pdest[2] = ((byte *)pcolormap[0])[psrc[2]];
        !          1164:                                        pdest[3] = ((byte *)pcolormap[1])[psrc[3]];
        !          1165:                                        pdest[4] = ((byte *)pcolormap[0])[psrc[4]];
        !          1166:                                        pdest[5] = ((byte *)pcolormap[1])[psrc[5]];
        !          1167:                                        pdest[6] = ((byte *)pcolormap[0])[psrc[6]];
        !          1168:                                        pdest[7] = ((byte *)pcolormap[1])[psrc[7]];
        !          1169:                                        pdest += 8; psrc += 8;
        !          1170:                            }
        !          1171: 
        !          1172:                                psrc += srcdelta;
        !          1173:                            pdest += rowdelta;
        !          1174: 
        !          1175:                        for (x = xcount ; x ;x--)
        !          1176:                            {
        !          1177:                                        pdest[0] = ((byte *)pcolormap[2])[psrc[0]];
        !          1178:                                        pdest[1] = ((byte *)pcolormap[3])[psrc[1]];
        !          1179:                                        pdest[2] = ((byte *)pcolormap[2])[psrc[2]];
        !          1180:                                        pdest[3] = ((byte *)pcolormap[3])[psrc[3]];
        !          1181:                                        pdest[4] = ((byte *)pcolormap[2])[psrc[4]];
        !          1182:                                        pdest[5] = ((byte *)pcolormap[3])[psrc[5]];
        !          1183:                                        pdest[6] = ((byte *)pcolormap[2])[psrc[6]];
        !          1184:                                        pdest[7] = ((byte *)pcolormap[3])[psrc[7]];
        !          1185:                                        pdest += 8; psrc += 8;
        !          1186:                            }
        !          1187: 
        !          1188:                                psrc += srcdelta;
        !          1189:                            pdest += rowdelta;
        !          1190:                        }
        !          1191:                }
        !          1192:                else
        !          1193:                {
        !          1194:                        byte    *psrc;
        !          1195: 
        !          1196:                        psrc = (byte *)src;
        !          1197: //                     srcdelta += width;
        !          1198: //                     rowdelta += width;
        !          1199: 
        !          1200:                        for (y = height ; y ; y--)
        !          1201:                        {
        !          1202:                        for (x = xcount ; x ;x--)
        !          1203:                            {
        !          1204:                                        pdest[0] = ((byte *)pcolormap[0])[psrc[0]];
        !          1205:                                        pdest[1] = ((byte *)pcolormap[0])[psrc[1]];
        !          1206:                                        pdest[2] = ((byte *)pcolormap[0])[psrc[2]];
        !          1207:                                        pdest[3] = ((byte *)pcolormap[0])[psrc[3]];
        !          1208:                                        pdest[4] = ((byte *)pcolormap[0])[psrc[4]];
        !          1209:                                        pdest[5] = ((byte *)pcolormap[0])[psrc[5]];
        !          1210:                                        pdest[6] = ((byte *)pcolormap[0])[psrc[6]];
        !          1211:                                        pdest[7] = ((byte *)pcolormap[0])[psrc[7]];
        !          1212:                                        pdest += 8; psrc += 8;
        !          1213:                            }
        !          1214: 
        !          1215:                                psrc += srcdelta;
        !          1216:                            pdest += rowdelta;
        !          1217:                    }
        !          1218:                }
        !          1219:     }
        !          1220: }
        !          1221: 
        !          1222: 
        !          1223: /*
        !          1224: ===================
        !          1225: Update16_1
        !          1226: ===================
        !          1227: */
        !          1228: void Update16_1 (pixel_t *src, unsigned short *dest, int width,
        !          1229:                int height, int destrowbytes)
        !          1230: {
        !          1231:        int                             x,y;
        !          1232:        unsigned                rowdelta, srcdelta;
        !          1233:        unsigned                xcount;
        !          1234:        pixel_t                 *psrc;
        !          1235:        unsigned short  *pdest;
        !          1236:        int                             xwidth;
        !          1237: 
        !          1238: 
        !          1239:        psrc = src;
        !          1240:        pdest = dest;
        !          1241:        
        !          1242:        xcount = width >> 3;
        !          1243:        srcdelta = vid.width - width;
        !          1244: 
        !          1245:        xwidth = width - (xcount << 3);
        !          1246:        if (xwidth)
        !          1247:                Sys_Error ("Width not multiple of 8");
        !          1248: 
        !          1249:        if ((vid_display == disp_framebuffer) && (vid_scale == 2))
        !          1250:        {
        !          1251:                int             nextrow = destrowbytes >> 1;
        !          1252: 
        !          1253:            rowdelta = (destrowbytes - ((width << 1) << 1) + destrowbytes) >> 1;
        !          1254: 
        !          1255:                if (dither)
        !          1256:                {
        !          1257:                        for (y = height ; y ; y--)
        !          1258:                        {
        !          1259:                        for (x = xcount ; x ;x--)
        !          1260:                            {
        !          1261:                                        unsigned        temp;
        !          1262: 
        !          1263:                                        temp = psrc[0];
        !          1264:                                        pdest[0] = ((unsigned short *)pcolormap[0])[temp];
        !          1265:                                        pdest[1] = ((unsigned short *)pcolormap[1])[temp];
        !          1266:                                        pdest[nextrow] = ((unsigned short *)pcolormap[2])[temp];
        !          1267:                                        pdest[nextrow + 1] = ((unsigned short *)pcolormap[3])[temp];
        !          1268:                                        temp = psrc[1];
        !          1269:                                        pdest[2] = ((unsigned short *)pcolormap[0])[temp];
        !          1270:                                        pdest[3] = ((unsigned short *)pcolormap[1])[temp];
        !          1271:                                        pdest[nextrow + 2] = ((unsigned short *)pcolormap[2])[temp];
        !          1272:                                        pdest[nextrow + 3] = ((unsigned short *)pcolormap[3])[temp];
        !          1273:                                        temp = psrc[2];
        !          1274:                                        pdest[4] = ((unsigned short *)pcolormap[0])[temp];
        !          1275:                                        pdest[5] = ((unsigned short *)pcolormap[1])[temp];
        !          1276:                                        pdest[nextrow + 4] = ((unsigned short *)pcolormap[2])[temp];
        !          1277:                                        pdest[nextrow + 5] = ((unsigned short *)pcolormap[3])[temp];
        !          1278:                                        temp = psrc[3];
        !          1279:                                        pdest[6] = ((unsigned short *)pcolormap[0])[temp];
        !          1280:                                        pdest[7] = ((unsigned short *)pcolormap[1])[temp];
        !          1281:                                        pdest[nextrow + 6] = ((unsigned short *)pcolormap[2])[temp];
        !          1282:                                        pdest[nextrow + 7] = ((unsigned short *)pcolormap[3])[temp];
        !          1283:                                        temp = psrc[4];
        !          1284:                                        pdest[8] = ((unsigned short *)pcolormap[0])[temp];
        !          1285:                                        pdest[9] = ((unsigned short *)pcolormap[1])[temp];
        !          1286:                                        pdest[nextrow + 8] = ((unsigned short *)pcolormap[2])[temp];
        !          1287:                                        pdest[nextrow + 9] = ((unsigned short *)pcolormap[3])[temp];
        !          1288:                                        temp = psrc[5];
        !          1289:                                        pdest[10] = ((unsigned short *)pcolormap[0])[temp];
        !          1290:                                        pdest[11] = ((unsigned short *)pcolormap[1])[temp];
        !          1291:                                        pdest[nextrow + 10] = ((unsigned short *)pcolormap[2])[temp];
        !          1292:                                        pdest[nextrow + 11] = ((unsigned short *)pcolormap[3])[temp];
        !          1293:                                        temp = psrc[6];
        !          1294:                                        pdest[12] = ((unsigned short *)pcolormap[0])[temp];
        !          1295:                                        pdest[13] = ((unsigned short *)pcolormap[1])[temp];
        !          1296:                                        pdest[nextrow + 12] = ((unsigned short *)pcolormap[2])[temp];
        !          1297:                                        pdest[nextrow + 13] = ((unsigned short *)pcolormap[3])[temp];
        !          1298:                                        temp = psrc[7];
        !          1299:                                        pdest[14] = ((unsigned short *)pcolormap[0])[temp];
        !          1300:                                        pdest[15] = ((unsigned short *)pcolormap[1])[temp];
        !          1301:                                        pdest[nextrow + 14] = ((unsigned short *)pcolormap[2])[temp];
        !          1302:                                        pdest[nextrow + 15] = ((unsigned short *)pcolormap[3])[temp];
        !          1303:                                        pdest += 16; psrc += 8;
        !          1304:                            }
        !          1305: 
        !          1306:                                psrc += srcdelta;
        !          1307:                            pdest += rowdelta;
        !          1308:                        }
        !          1309:                }
        !          1310:                else
        !          1311:                {
        !          1312:                        for (y = height ; y ; y--)
        !          1313:                        {
        !          1314:                        for (x = xcount ; x ;x--)
        !          1315:                            {
        !          1316:                                        pdest[0] = pdest[1] = pdest[nextrow] =
        !          1317:                                                        pdest[nextrow + 1] = pcolormap[0][psrc[0]];
        !          1318:                                        pdest[2] = pdest[3] = pdest[nextrow + 2] =
        !          1319:                                                        pdest[nextrow + 3] = pcolormap[0][psrc[1]];
        !          1320:                                        pdest[4] = pdest[5] = pdest[nextrow + 4] =
        !          1321:                                                        pdest[nextrow + 5] = pcolormap[0][psrc[2]];
        !          1322:                                        pdest[6] = pdest[7] = pdest[nextrow + 6] =
        !          1323:                                                        pdest[nextrow + 7] = pcolormap[0][psrc[3]];
        !          1324:                                        pdest[8] = pdest[9] = pdest[nextrow + 8] =
        !          1325:                                                        pdest[nextrow + 9] = pcolormap[0][psrc[4]];
        !          1326:                                        pdest[10] = pdest[11] = pdest[nextrow + 10] =
        !          1327:                                                        pdest[nextrow + 11] = pcolormap[0][psrc[5]];
        !          1328:                                        pdest[12] = pdest[13] = pdest[nextrow + 12] =
        !          1329:                                                        pdest[nextrow + 13] = pcolormap[0][psrc[6]];
        !          1330:                                        pdest[14] = pdest[15] = pdest[nextrow + 14] =
        !          1331:                                                        pdest[nextrow + 15] = pcolormap[0][psrc[7]];
        !          1332:                                        pdest += 16; psrc += 8;
        !          1333:                            }
        !          1334: 
        !          1335:                                psrc += srcdelta;
        !          1336:                            pdest += rowdelta;
        !          1337:                        }
        !          1338:        }
        !          1339:        }
        !          1340:        else
        !          1341:        {
        !          1342:            rowdelta = (destrowbytes - (width<<1))>>1;
        !          1343: 
        !          1344:                if (dither)
        !          1345:                {
        !          1346:                        for (y = height ; y>0 ; y -= 2)
        !          1347:                        {
        !          1348:                        for (x = xcount ; x ;x--)
        !          1349:                            {
        !          1350:                                        pdest[0] = ((unsigned short *)pcolormap[0])[psrc[0]];
        !          1351:                                        pdest[1] = ((unsigned short *)pcolormap[1])[psrc[1]];
        !          1352:                                        pdest[2] = ((unsigned short *)pcolormap[0])[psrc[2]];
        !          1353:                                        pdest[3] = ((unsigned short *)pcolormap[1])[psrc[3]];
        !          1354:                                        pdest[4] = ((unsigned short *)pcolormap[0])[psrc[4]];
        !          1355:                                        pdest[5] = ((unsigned short *)pcolormap[1])[psrc[5]];
        !          1356:                                        pdest[6] = ((unsigned short *)pcolormap[0])[psrc[6]];
        !          1357:                                        pdest[7] = ((unsigned short *)pcolormap[1])[psrc[7]];
        !          1358:                                        pdest += 8; psrc += 8;
        !          1359:                            }
        !          1360: 
        !          1361:                                psrc += srcdelta;
        !          1362:                            pdest += rowdelta;
        !          1363: 
        !          1364:                        for (x = xcount ; x ;x--)
        !          1365:                            {
        !          1366:                                        pdest[0] = ((unsigned short *)pcolormap[2])[psrc[0]];
        !          1367:                                        pdest[1] = ((unsigned short *)pcolormap[3])[psrc[1]];
        !          1368:                                        pdest[2] = ((unsigned short *)pcolormap[2])[psrc[2]];
        !          1369:                                        pdest[3] = ((unsigned short *)pcolormap[3])[psrc[3]];
        !          1370:                                        pdest[4] = ((unsigned short *)pcolormap[2])[psrc[4]];
        !          1371:                                        pdest[5] = ((unsigned short *)pcolormap[3])[psrc[5]];
        !          1372:                                        pdest[6] = ((unsigned short *)pcolormap[2])[psrc[6]];
        !          1373:                                        pdest[7] = ((unsigned short *)pcolormap[3])[psrc[7]];
        !          1374:                                        pdest += 8; psrc += 8;
        !          1375:                            }
        !          1376: 
        !          1377:                                psrc += srcdelta;
        !          1378:                            pdest += rowdelta;
        !          1379:                        }
        !          1380:                }
        !          1381:                else
        !          1382:                {
        !          1383:                        for (y = height ; y ; y--)
        !          1384:                        {
        !          1385:                        for (x = xcount ; x ;x--)
        !          1386:                            {
        !          1387:                                        pdest[0] = pcolormap[0][psrc[0]];
        !          1388:                                        pdest[1] = pcolormap[0][psrc[1]];
        !          1389:                                        pdest[2] = pcolormap[0][psrc[2]];
        !          1390:                                        pdest[3] = pcolormap[0][psrc[3]];
        !          1391:                                        pdest[4] = pcolormap[0][psrc[4]];
        !          1392:                                        pdest[5] = pcolormap[0][psrc[5]];
        !          1393:                                        pdest[6] = pcolormap[0][psrc[6]];
        !          1394:                                        pdest[7] = pcolormap[0][psrc[7]];
        !          1395:                                        pdest += 8; psrc += 8;
        !          1396:                            }
        !          1397: 
        !          1398:                                psrc += srcdelta;
        !          1399:                            pdest += rowdelta;
        !          1400:                        }
        !          1401:        }
        !          1402:        }
        !          1403: }
        !          1404: 
        !          1405: 
        !          1406: /*
        !          1407: ===================
        !          1408: Update32_1
        !          1409: ===================
        !          1410: */
        !          1411: void Update32_1 (pixel_t *src, unsigned *dest, int width, int height,
        !          1412:                int destrowbytes)
        !          1413: {
        !          1414:        int                             x,y;
        !          1415:        unsigned                rowdelta, srcdelta;
        !          1416:        unsigned                xcount;
        !          1417:        pixel_t                 *psrc;
        !          1418:        unsigned                *pdest;
        !          1419:        int                             xwidth;
        !          1420: 
        !          1421:        psrc = src;
        !          1422:        pdest = dest;
        !          1423: 
        !          1424:        xcount = width >> 3;
        !          1425:        srcdelta = vid.width - width;
        !          1426: 
        !          1427:        xwidth = width - (xcount << 3);
        !          1428:        if (xwidth)
        !          1429:                Sys_Error ("Width not multiple of 8");
        !          1430: 
        !          1431:        if ((vid_display == disp_framebuffer) && (vid_scale == 2))
        !          1432:        {
        !          1433:                int             nextrow = destrowbytes >> 2;
        !          1434: 
        !          1435:            rowdelta = ((destrowbytes - ((width << 1) << 2)) >> 2)  +
        !          1436:                                (destrowbytes >> 2);
        !          1437: 
        !          1438:                for (y = height ; y ; y--)
        !          1439:                {
        !          1440:                        for (x = xcount ; x ;x--)
        !          1441:                    {
        !          1442:                                pdest[0] = pdest[1] = pdest[nextrow] =
        !          1443:                                                pdest[nextrow + 1] = pcolormap[0][psrc[0]];
        !          1444:                                pdest[2] = pdest[3] = pdest[nextrow + 2] =
        !          1445:                                                pdest[nextrow + 3] = pcolormap[0][psrc[1]];
        !          1446:                                pdest[4] = pdest[5] = pdest[nextrow + 4] =
        !          1447:                                                pdest[nextrow + 5] = pcolormap[0][psrc[2]];
        !          1448:                                pdest[6] = pdest[7] = pdest[nextrow + 6] =
        !          1449:                                                pdest[nextrow + 7] = pcolormap[0][psrc[3]];
        !          1450:                                pdest[8] = pdest[9] = pdest[nextrow + 8] =
        !          1451:                                                pdest[nextrow + 9] = pcolormap[0][psrc[4]];
        !          1452:                                pdest[10] = pdest[11] = pdest[nextrow + 10] =
        !          1453:                                                pdest[nextrow + 11] = pcolormap[0][psrc[5]];
        !          1454:                                pdest[12] = pdest[13] = pdest[nextrow + 12] =
        !          1455:                                                pdest[nextrow + 13] = pcolormap[0][psrc[6]];
        !          1456:                                pdest[14] = pdest[15] = pdest[nextrow + 14] =
        !          1457:                                                pdest[nextrow + 15] = pcolormap[0][psrc[7]];
        !          1458:                                pdest += 16; psrc += 8;
        !          1459:                    }
        !          1460: 
        !          1461:                        psrc += srcdelta;
        !          1462:                    pdest += rowdelta;
        !          1463:                }
        !          1464:     }
        !          1465:        else
        !          1466:        {
        !          1467:            rowdelta = (destrowbytes - (width<<2))>>2;
        !          1468: 
        !          1469:                for (y = height ; y ; y--)
        !          1470:                {
        !          1471:                        for (x = xcount ; x ;x--)
        !          1472:                    {
        !          1473:                                pdest[0] = pcolormap[0][psrc[0]];
        !          1474:                                pdest[1] = pcolormap[0][psrc[1]];
        !          1475:                                pdest[2] = pcolormap[0][psrc[2]];
        !          1476:                                pdest[3] = pcolormap[0][psrc[3]];
        !          1477:                                pdest[4] = pcolormap[0][psrc[4]];
        !          1478:                                pdest[5] = pcolormap[0][psrc[5]];
        !          1479:                                pdest[6] = pcolormap[0][psrc[6]];
        !          1480:                                pdest[7] = pcolormap[0][psrc[7]];
        !          1481:                                pdest += 8; psrc += 8;
        !          1482:                    }
        !          1483: 
        !          1484:                        psrc += srcdelta;
        !          1485:                    pdest += rowdelta;
        !          1486:                }
        !          1487:        }
        !          1488: }
        !          1489: 
        !          1490: 
        !          1491: /*
        !          1492: ==========================================================================
        !          1493: 
        !          1494:                                                NEXTSTEP VIEW CLASS
        !          1495: 
        !          1496: ==========================================================================
        !          1497: */
        !          1498: 
        !          1499: 
        !          1500: @implementation QuakeView
        !          1501: 
        !          1502: /*
        !          1503: =================
        !          1504: windowDidMove
        !          1505: 
        !          1506: =================
        !          1507: */
        !          1508: - windowDidMove:sender
        !          1509: {
        !          1510:     NXPoint    aPoint;
        !          1511:     NXRect     winframe;
        !          1512: 
        !          1513:     aPoint.x = aPoint.y = 0;
        !          1514:     [self convertPoint:&aPoint toView:nil];
        !          1515:     [window convertBaseToScreen: &aPoint];
        !          1516:     [window getFrame: &winframe];
        !          1517: 
        !          1518:     if ((int)aPoint.x & 7)
        !          1519:     {
        !          1520:        [window moveTo:winframe.origin.x - ((int)aPoint.x&7) 
        !          1521:                        :winframe.origin.y];
        !          1522:        [window getFrame: &winframe];
        !          1523:     }
        !          1524:     return self;
        !          1525: }
        !          1526: 
        !          1527: - windowWillResize:sender toSize:(NXSize *)frameSize
        !          1528: {
        !          1529:        NXRect          fr, cont;
        !          1530:        
        !          1531:        fr.origin.x = fr.origin.y = 0;
        !          1532:        fr.size = *frameSize;
        !          1533:        
        !          1534:        [Window getContentRect:&cont forFrameRect: &fr style:[window style]];
        !          1535: 
        !          1536:        cont.size.width = (int)cont.size.width & ~15;
        !          1537:        if (cont.size.width < 128)
        !          1538:                cont.size.width = 128;
        !          1539:        cont.size.height = (int)cont.size.height & ~3;
        !          1540:        if (cont.size.height < 32)
        !          1541:                cont.size.height = 32;
        !          1542: 
        !          1543:        [Window getFrameRect:&fr forContentRect: &cont style:[window style]];
        !          1544: 
        !          1545:        *frameSize = fr.size;
        !          1546:        
        !          1547:        return self;
        !          1548: }
        !          1549: 
        !          1550: - windowDidResize:sender
        !          1551: {
        !          1552:        if (vid_display == disp_framebuffer)
        !          1553:                Sys_Error ("How the heck are you resizing a framebuffer window?!?");
        !          1554: 
        !          1555:        vid.width = bounds.size.width/vid_scale;
        !          1556:        vid.height = bounds.size.height/vid_scale;
        !          1557: 
        !          1558: //
        !          1559: // allocate memory for the back and translation buffers
        !          1560: //
        !          1561:        vid.rowbytes = vid.width;
        !          1562:        rowbytesnative = vid.width * pixbytesnative;
        !          1563:        
        !          1564:        AllocBuffers (true);
        !          1565: 
        !          1566:        vid.conbuffer = vid.buffer;
        !          1567:        vid.conrowbytes = vid.rowbytes;
        !          1568:        vid.conwidth = vid.width;
        !          1569:        vid.conheight = vid.height;
        !          1570: 
        !          1571:        vid.recalc_refdef = 1;
        !          1572: 
        !          1573:        return self;
        !          1574: }
        !          1575: 
        !          1576: -(BOOL) acceptsFirstResponder
        !          1577: {
        !          1578:     return YES;
        !          1579: }
        !          1580: 
        !          1581: 
        !          1582: typedef struct
        !          1583: {
        !          1584:        int             source, dest;
        !          1585: } keymap_t;
        !          1586: 
        !          1587: keymap_t keymaps[] =
        !          1588: {
        !          1589:        {103, K_RIGHTARROW},
        !          1590:        {102, K_LEFTARROW},
        !          1591:        {100, K_UPARROW},
        !          1592:        {101, K_DOWNARROW},
        !          1593:        {111, K_PAUSE},
        !          1594: 
        !          1595:        {59, K_F1},
        !          1596:        {60, K_F2},
        !          1597:        {61, K_F3},
        !          1598:        {62, K_F4},
        !          1599:        {63, K_F5},
        !          1600:        {64, K_F6},
        !          1601:        {65, K_F7},
        !          1602:        {66, K_F8},
        !          1603:        {67, K_F9},
        !          1604:        {68, K_F10},
        !          1605:        {87, K_F11},
        !          1606:        {88, K_F12},
        !          1607:        
        !          1608:        {-1,-1}
        !          1609: };
        !          1610: 
        !          1611: keymap_t flagmaps[] =
        !          1612: {
        !          1613:        {NX_SHIFTMASK, K_SHIFT},
        !          1614:        {NX_CONTROLMASK, K_CTRL},
        !          1615:        {NX_ALTERNATEMASK, K_ALT},
        !          1616:        {NX_COMMANDMASK, K_ALT},
        !          1617:        
        !          1618:        {-1,-1}
        !          1619: };
        !          1620: 
        !          1621: /*
        !          1622: ===================
        !          1623: keyboard methods
        !          1624: ===================
        !          1625: */
        !          1626: - keyDown:(NXEvent *)theEvent
        !          1627: {
        !          1628:     int        ch;
        !          1629:        keymap_t        *km;
        !          1630:        
        !          1631:        PSobscurecursor ();
        !          1632: 
        !          1633: // check for non-ascii first
        !          1634:        ch = theEvent->data.key.keyCode;
        !          1635:        for (km=keymaps;km->source!=-1;km++)
        !          1636:                if (ch == km->source)
        !          1637:                {
        !          1638:                        Key_Event (km->dest, true);
        !          1639:                        return self;
        !          1640:                }
        !          1641: 
        !          1642:     ch = theEvent->data.key.charCode;
        !          1643:        if (ch >= 'A' && ch <= 'Z')
        !          1644:                ch += 'a' - 'A';
        !          1645:     if (ch>=256)
        !          1646:                return self;
        !          1647:                
        !          1648:        Key_Event (ch, true);
        !          1649:     return self;
        !          1650: }
        !          1651: 
        !          1652: - flagsChanged:(NXEvent *)theEvent
        !          1653: {
        !          1654:        static int      oldflags;
        !          1655:     int                newflags;
        !          1656:        int             delta;
        !          1657:        keymap_t        *km;
        !          1658:        int             i;
        !          1659:        
        !          1660:        PSobscurecursor ();
        !          1661:     newflags = theEvent->flags;
        !          1662:        delta = newflags ^ oldflags;
        !          1663:        for (i=0 ; i<32 ; i++)
        !          1664:        {
        !          1665:                if ( !(delta & (1<<i)))
        !          1666:                        continue;
        !          1667:        // changed
        !          1668:                for (km=flagmaps;km->source!=-1;km++)
        !          1669:                        if ( (1<<i) == km->source)
        !          1670:                        {
        !          1671:                                if (newflags & (1<<i))
        !          1672:                                        Key_Event (km->dest, true);
        !          1673:                                else
        !          1674:                                        Key_Event (km->dest, false);
        !          1675:                        }
        !          1676: 
        !          1677:        }
        !          1678:        
        !          1679:        oldflags = newflags;
        !          1680:                
        !          1681:     return self;
        !          1682: }
        !          1683: 
        !          1684: 
        !          1685: - keyUp:(NXEvent *)theEvent
        !          1686: {
        !          1687:     int        ch;
        !          1688:        keymap_t        *km;
        !          1689:   
        !          1690:  // check for non-ascii first
        !          1691:        ch = theEvent->data.key.keyCode;
        !          1692:        for (km=keymaps;km->source!=-1;km++)
        !          1693:                if (ch == km->source)
        !          1694:                {
        !          1695:                        Key_Event (km->dest, false);
        !          1696:                        return self;
        !          1697:                }
        !          1698: 
        !          1699:    ch = theEvent->data.key.charCode;
        !          1700:        if (ch >= 'A' && ch <= 'Z')
        !          1701:                ch += 'a' - 'A';
        !          1702:     if (ch>=256)
        !          1703:                return self;
        !          1704:        Key_Event (ch, false);
        !          1705:     return self;
        !          1706: }
        !          1707: 
        !          1708: 
        !          1709: - tiffShot
        !          1710: {
        !          1711:        id                      imagerep, image;
        !          1712:        NXRect          r;
        !          1713:        NXStream        *stream;
        !          1714:        int                     fd;
        !          1715:        int             i; 
        !          1716:        char            tiffname[80]; 
        !          1717:        
        !          1718:        [vid_window_i getFrame: &r];
        !          1719:        r.origin.x = r.origin.y = 0;
        !          1720:        image = [[NXImage alloc] initSize: &r.size];
        !          1721:        imagerep = [[NXCachedImageRep alloc] initFromWindow:vid_window_i rect:&r];
        !          1722:        
        !          1723:        [image lockFocus];
        !          1724:        [imagerep draw];
        !          1725:        [image unlockFocus];
        !          1726:        
        !          1727: // 
        !          1728: // find a file name to save it to 
        !          1729: // 
        !          1730:        strcpy(tiffname,"quake00.tif");
        !          1731:                
        !          1732:        for (i=0 ; i<=99 ; i++) 
        !          1733:        { 
        !          1734:                tiffname[5] = i/10 + '0'; 
        !          1735:                tiffname[6] = i%10 + '0'; 
        !          1736:                if (Sys_FileTime(tiffname) == -1)
        !          1737:                        break;  // file doesn't exist
        !          1738:        } 
        !          1739:        if (i==100) 
        !          1740:                Sys_Error ("SCR_ScreenShot_f: Couldn't create a tiff"); 
        !          1741: 
        !          1742:        fd = open (tiffname, O_RDWR|O_CREAT|O_TRUNC, 0666);
        !          1743:        stream = NXOpenFile (fd, NX_READWRITE);
        !          1744:        [image writeTIFF: stream];
        !          1745:        NXClose (stream);
        !          1746:        close (fd);
        !          1747:        printf ("wrote %s\n", tiffname);
        !          1748: 
        !          1749:        [image free];
        !          1750:        [imagerep free];
        !          1751:        return self;
        !          1752:        
        !          1753: }
        !          1754: 
        !          1755: - screenShot: sender
        !          1756: {
        !          1757:        return [self tiffShot];
        !          1758: }
        !          1759: 
        !          1760: - setScaleFullScreen: sender
        !          1761: {
        !          1762:        VID_Shutdown ();
        !          1763:        if (vid_fullscreen)
        !          1764:        {
        !          1765:                vid_fullscreen = 0;
        !          1766:                VID_Restart (vid_display, vid_scale);
        !          1767:        }
        !          1768:        else
        !          1769:        {
        !          1770:                vid_fullscreen = 1;
        !          1771:                VID_Restart (vid_display, vid_scale);
        !          1772:        }
        !          1773:        return self;
        !          1774: }
        !          1775: 
        !          1776: @end
        !          1777: 
        !          1778: //============================================================================
        !          1779: 
        !          1780: @implementation FrameWindow
        !          1781: 
        !          1782: - windowExposed:(NXEvent *)theEvent
        !          1783: {
        !          1784:        return self;
        !          1785: }
        !          1786: 
        !          1787: @end
        !          1788: 
        !          1789: 

unix.superglobalmegacorp.com

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