亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? swimp_rhap.m

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? M
字號:
#import <AppKit/AppKit.h>
#import <Interceptor/NSDirectScreen.h>
#import <AppKit/NSColor.h>
#include "../ref_soft/r_local.h"

@interface QuakeView : NSView
@end

NSWindow	*vid_window_i;
QuakeView	*vid_view_i;
NSDirectScreen *vid_screen;
byte		*vid_buffer;		// real framebuffer
int			vid_rowbytes;		// framebuffer rowbytes

unsigned	*buffernative;		// 24 bit off-screen back buffer for window
unsigned	swimp_palette[256];

typedef enum {
    rhap_shutdown,
    rhap_windowed,
    rhap_fullscreen
} rhapMode_t;

rhapMode_t	rhap_mode;

/*
=======================================================================

FULLSCREEN

=======================================================================
*/

/*
** InitFullscreen
*/
rserr_t InitFullscreen (int width, int height)
{
    NSDictionary *mode, *bestMode;
    int			modeWidth, bestWidth;
    int			modeHeight, bestHeight;
	NSArray		*modes;
    int			i;
	NSString	*string;

    
    vid_screen = [[NSDirectScreen alloc] initWithScreen:[NSScreen mainScreen]];

    // search for an apropriate mode
    modes = [vid_screen availableDisplayModes];
    bestMode = NULL;
    bestWidth = 99999;
    bestHeight = 99999;
   	for (i=0 ; i<[modes count] ; i++) {
        mode = [modes objectAtIndex: i];
        string = [mode objectForKey: @"NSDirectScreenPixelEncoding"];
        if ( ![string isEqualToString: @"PPPPPPPP"] )
            continue;	// only look at paletted modes
        modeWidth = [[mode objectForKey: @"NSDirectScreenWidth"] intValue];
        modeHeight = [[mode objectForKey: @"NSDirectScreenHeight"] intValue];
        if (modeWidth < width || modeHeight < height)
            continue;
        if (modeWidth < bestWidth) {
            bestWidth = modeWidth;
            bestHeight = modeHeight;
            bestMode = mode;
        }
    } 

    // if there wasn't any paletted mode of that res or greater, fail
    if (!bestMode)
        return rserr_invalid_fullscreen;

	ri.Con_Printf (PRINT_ALL, "SheildDisplay\n");
    [vid_screen shieldDisplay];

    // hide the cursor in all fullscreen modes
    [NSCursor hide];
    
    vid_window_i = [vid_screen shieldingWindow];

    ri.Con_Printf (PRINT_ALL, "switchToDisplayMode\n");
    [vid_screen switchToDisplayMode:bestMode];
//    [vid_screen fadeDisplayOutToColor:[NSColor blackColor]];
//    [vid_screen fadeDisplayInFromColor:[NSColor blackColor]];

	vid_buffer = [vid_screen data];
	vid_rowbytes = [vid_screen bytesPerRow];

    return rserr_ok;
}

void ShutdownFullscreen (void)
{
	[vid_screen dealloc];
	[NSCursor unhide];
}

void SetPaletteFullscreen (const unsigned char *palette) {
#if 0
    byte	*p;
    int		i;
	NSDirectPalette		*pal;

    pal = [NSDirectPalette init];
    for (i=0 ; i<256 ; i++)
        [pal setRed: palette[0]*(1.0/255)
              green:  palette[1]*(1.0/255)
               blue:  palette[2]*(1.0/255)
            atIndex: i];
	[vid_screen setPalette: pal];
    [pal release];
#endif
}



void BlitFullscreen (void)
{
	int		i, j;
	int		w;
	int		*dest, *source;

	w = vid.width>>2;

    source = (int *)vid.buffer;		// off-screen buffer
    dest = (int *)vid_buffer;		// directly on screen
    for (j=0 ; j<vid.height ; j++
         , source += (vid.rowbytes>>2), dest += (vid_rowbytes>>2)  ) {
        for (i=0 ; i<w ; i++ ) {
            dest[i] = source[i];            
        }
 	}
}

/*
=======================================================================

WINDOWED

=======================================================================
*/

/*
** InitWindowed
*/
rserr_t InitWindowed (int width, int height)
{
    rserr_t retval = rserr_ok;
    NSRect	content;
    cvar_t	*vid_xpos;
    cvar_t	*vid_ypos;

    //
    // open a window
    //
    vid_xpos = ri.Cvar_Get ("vid_xpos", "0", 0);
    vid_ypos = ri.Cvar_Get ("vid_ypos", "0", 0);

    content = NSMakeRect (vid_xpos->value,vid_ypos->value, width, height);
    vid_window_i = [[NSWindow alloc]
                initWithContentRect:	content
                            styleMask:	NSTitledWindowMask
                            backing:	NSBackingStoreRetained
                            defer:	NO
    ];

//    [vid_window_i addToEventMask: NS_FLAGSCHANGEDMASK];
    [vid_window_i setTitle: @"Quake2"];

    buffernative = malloc(width * height * 4);

    return retval;
}

void ShutdownWindowed (void)
{
    if (vid_window_i)
    {
        [vid_window_i release];
        vid_window_i = NULL;
    }
    if (buffernative)
    {
        free (buffernative);
        buffernative = NULL;
    }
}

void SetPaletteWindowed (const unsigned char *palette) {
    byte	*p;
    int		i;

    p = (byte *)swimp_palette;
    for (i=0 ; i<256 ; i++, p+=4, palette+=4)
    {
        p[0] = palette[0];
       	p[1] = palette[1];
        p[2] = palette[2];
        p[3] = 0xff;
    }
}


void BlitWindowed (void)
{
    int		i, c;
    int		bps, spp, bpp, bpr;
    unsigned char	*planes[5];
    NSRect			bounds;

    if (!vid_view_i)
        return;

    // translate to 24 bit color
    c = vid.width*vid.height;
    for (i=0 ; i<c ; i++)
        buffernative[i] = swimp_palette[vid.buffer[i]];

     bps = 8;
     spp = 3;
     bpp = 32;
     bpr = vid.width * 4;
     planes[0] = (unsigned char *)buffernative;

    bounds = [vid_view_i bounds];

    [vid_view_i lockFocus];

    NSDrawBitmap(
                bounds,
                vid.width,
                vid.height,
                bps,
                spp,
                bpp,
                bpr,
                NO,
                NO,
                 @"NSDeviceRGBColorSpace",
                planes
                );

    [vid_view_i unlockFocus];
	PSWait ();
}


//======================================================================

/*
** RW_IMP.C
**
** This file contains ALL Win32 specific stuff having to do with the
** software refresh.  When a port is being made the following functions
** must be implemented by the port:
**
** SWimp_EndFrame
** SWimp_Init
** SWimp_SetPalette
** SWimp_Shutdown
*/


/*
** SWimp_Init
**
** This routine is responsible for initializing the implementation
** specific stuff in a software rendering subsystem.
*/
int SWimp_Init( void *hInstance, void *wndProc )
{
    if (!NSApp)
    {
        [NSApplication sharedApplication];
        [NSApp finishLaunching];
    }

    return true;
}


/*
** SWimp_SetMode
*/
rserr_t SWimp_SetMode( int *pwidth, int *pheight, int mode, qboolean fullscreen)
{
    const char 	*win_fs[] = { "W", "FS" };
    NSRect		content;
	rserr_t		ret;
    
    // free resources in use
    SWimp_Shutdown ();

    ri.Con_Printf (PRINT_ALL, "setting mode %d:", mode );

    if ( !ri.Vid_GetModeInfo( pwidth, pheight, mode ) )
    {
        ri.Con_Printf( PRINT_ALL, " invalid mode\n" );
        return rserr_invalid_mode;
    }

    ri.Con_Printf( PRINT_ALL, " %d %d %s\n", *pwidth, *pheight, win_fs[fullscreen] );

    vid.buffer = malloc(*pwidth * *pheight);
	vid.rowbytes = *pwidth;

    if (fullscreen) {
        rhap_mode = rhap_fullscreen;
        ret = InitFullscreen (*pwidth, *pheight);        
    } else {
        rhap_mode = rhap_windowed;
        ret = InitWindowed (*pwidth, *pheight);
    }

    if (ret != rserr_ok) {
        SWimp_Shutdown ();
        return ret;       
    }
    
    /*
     ** the view is identical in windowed and fullscreen modes
     */
    content.origin.x = content.origin.y = 0;
    content.size.width = *pwidth;
    content.size.height = *pheight;
    vid_view_i = [[QuakeView alloc] initWithFrame: content];
    [vid_window_i setContentView: vid_view_i];
    [vid_window_i makeFirstResponder: vid_view_i];
    [vid_window_i setDelegate: vid_view_i];

    [NSApp activateIgnoringOtherApps: YES];
    [vid_window_i makeKeyAndOrderFront: nil];
    [vid_window_i display];

	return ret;
}

/*
** SWimp_Shutdown
**
** System specific graphics subsystem shutdown routine
*/
void SWimp_Shutdown( void )
{
    if (rhap_mode == rhap_windowed)
        ShutdownWindowed ();
    else if (rhap_mode == rhap_fullscreen)
        ShutdownFullscreen ();

    rhap_mode = rhap_shutdown;

    if (vid.buffer)
    {
        free (vid.buffer);
        vid.buffer = NULL;
    }
}


/*
** SWimp_SetPalette
**
** System specific palette setting routine.  A NULL palette means
** to use the existing palette.  The palette is expected to be in
** a padded 4-byte xRGB format.
*/
void SWimp_SetPalette( const unsigned char *palette )
{
    if (rhap_mode == rhap_windowed)
        SetPaletteWindowed (palette);
    else if (rhap_mode == rhap_fullscreen)
        SetPaletteFullscreen (palette);
}


/*
** SWimp_EndFrame
**
** This does an implementation specific copy from the backbuffer to the
** front buffer.  In the Win32 case it uses BitBlt or BltFast depending
** on whether we're using DIB sections/GDI or DDRAW.
*/
void SWimp_EndFrame (void)
{
    if (rhap_mode == rhap_windowed)
        BlitWindowed ();
    else if (rhap_mode == rhap_fullscreen)
        BlitFullscreen ();
}


/*
** SWimp_AppActivate
*/
void SWimp_AppActivate( qboolean active )
{
}


/*
 ==========================================================================

 NEXTSTEP VIEW CLASS

 ==========================================================================
 */
#include "../client/keys.h"

void IN_ActivateMouse (void);
void IN_DeactivateMouse (void);

@implementation QuakeView

-(BOOL) acceptsFirstResponder
{
    return YES;
}

- (void)windowDidMove: (NSNotification *)note
{
    NSRect	r;

    r = [vid_window_i frame];
    ri.Cmd_ExecuteText (EXEC_NOW, va("vid_xpos %i", (int)r.origin.x+1));
    ri.Cmd_ExecuteText (EXEC_NOW, va("vid_ypos %i", (int)r.origin.y+1));
}

- (void)becomeKeyWindow
{
    IN_ActivateMouse ();
}

- (void)resignKeyWindow
{
    IN_DeactivateMouse ();
}


typedef struct
{
    int		source, dest;
} keymap_t;

keymap_t keymaps[] =
{
    {0xf703, K_RIGHTARROW},
	{0xf702, K_LEFTARROW},
	{0xf700, K_UPARROW},
	{0xf701, K_DOWNARROW},

	{0xf704, K_F1},
	{0xf705, K_F2},
	{0xf706, K_F3},
	{0xf707, K_F4},
	{0xf708, K_F5},
	{0xf709, K_F6},
	{0xf70a, K_F7},
	{0xf70b, K_F8},
	{0xf70c, K_F9},
	{0xf70d, K_F10},
	{0xf70e, K_F11},
	{0xf70f, K_F12},

    {-1,-1}
};

keymap_t flagmaps[] =
{
    {NSShiftKeyMask, K_SHIFT},
    {NSControlKeyMask, K_CTRL},
    {NSAlternateKeyMask, K_ALT},
    {NSCommandKeyMask, K_ALT},

    {-1,-1}
};

- (void)mouseDown:(NSEvent *)theEvent
{
    Key_Event (K_MOUSE1, true, 0);
}
- (void)mouseUp:(NSEvent *)theEvent
{
    Key_Event (K_MOUSE1, false, 0);
}
- (void)rightMouseDown:(NSEvent *)theEvent
{
    Key_Event (K_MOUSE2, true, 0);
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
    Key_Event (K_MOUSE2, false, 0);
}


/*
 ===================
 keyboard methods
 ===================
 */
- (void)keyDown:(NSEvent *)theEvent
{
    int	ch;
    keymap_t	*km;

//    PSobscurecursor ();

    ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
// check for non-ascii first
   for (km=keymaps;km->source!=-1;km++)
       if (ch == km->source)
       {
           Key_Event (km->dest, true, 0);
           return;
       }

    if (ch >= 'A' && ch <= 'Z')
        ch += 'a' - 'A';
    if (ch>=256)
        return;

    Key_Event (ch, true, 0);
}

- (void)flagsChanged:(NSEvent *)theEvent
{
    static int	oldflags;
    int		newflags;
    int		delta;
    keymap_t	*km;
    int		i;

//    PSobscurecursor ();
    newflags = [theEvent modifierFlags];
    delta = newflags ^ oldflags;
    for (i=0 ; i<32 ; i++)
    {
        if ( !(delta & (1<<i)))
            continue;
        // changed
        for (km=flagmaps;km->source!=-1;km++)
            if ( (1<<i) == km->source)
            {
                if (newflags & (1<<i))
                    Key_Event (km->dest, true, 0);
                else
                    Key_Event (km->dest, false, 0);
            }

    }

        oldflags = newflags;
}


- (void)keyUp:(NSEvent *)theEvent
{
    int	ch;
    keymap_t	*km;

    ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];

	// check for non-ascii first
   for (km=keymaps;km->source!=-1;km++)
      if (ch == km->source)
      {
          Key_Event (km->dest, false, 0);
          return;
      }

    if (ch >= 'A' && ch <= 'Z')
        ch += 'a' - 'A';
    if (ch>=256)
        return;
    Key_Event (ch, false, 0);
}

@end


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线电影欧美成精品| 一区二区三区久久久| 亚洲欧美国产三级| 秋霞电影网一区二区| 99精品桃花视频在线观看| 欧美一级国产精品| 一区二区三区日韩精品| 国产在线国偷精品产拍免费yy| 色综合久久天天| 国产女人18毛片水真多成人如厕 | 国产亚洲精品免费| 亚洲一区二区三区四区的| 成人亚洲精品久久久久软件| 欧美成人官网二区| 亚洲aaa精品| 欧美亚洲国产bt| 亚洲欧美影音先锋| 国产成人精品一区二区三区四区| 欧美一区二区二区| 亚洲一区二区在线视频| 不卡一区二区在线| 国产精品青草久久| 白白色亚洲国产精品| 久久久91精品国产一区二区精品 | 欧美高清你懂得| 亚洲黄色片在线观看| 色综合中文字幕国产| 337p日本欧洲亚洲大胆精品| 日本成人在线一区| 7777精品伊人久久久大香线蕉经典版下载| 亚洲精品亚洲人成人网| 91视频国产资源| 亚洲精品国产成人久久av盗摄| 9色porny自拍视频一区二区| 国产精品毛片久久久久久| 国产麻豆视频一区| 久久久99精品免费观看不卡| 国产不卡免费视频| 国产精品国产三级国产有无不卡 | 色婷婷综合五月| 亚洲免费在线播放| 欧美在线观看视频在线| 亚洲丶国产丶欧美一区二区三区| 欧美美女一区二区在线观看| 五月天中文字幕一区二区| 欧美精品乱码久久久久久| 天天av天天翘天天综合网 | 亚洲h动漫在线| 日韩欧美一区二区久久婷婷| 久草热8精品视频在线观看| 久久免费看少妇高潮| a美女胸又www黄视频久久| 亚洲线精品一区二区三区八戒| 在线观看91av| 国产成人av资源| 一区二区激情视频| 日韩欧美成人一区| 成人黄色电影在线| 亚洲国产欧美在线人成| 日韩午夜精品视频| 成人av在线一区二区| 亚洲国产视频一区| 久久青草欧美一区二区三区| 色视频一区二区| 精品一区二区三区久久久| 成人免费在线视频| 日韩天堂在线观看| 91麻豆国产在线观看| 免费av网站大全久久| 国产欧美精品一区二区色综合| 在线看国产一区二区| 韩国精品在线观看| 亚洲制服丝袜在线| 中文字幕第一区综合| 777精品伊人久久久久大香线蕉| 成人污污视频在线观看| 亚洲一区二区成人在线观看| 久久―日本道色综合久久| 欧美图区在线视频| 懂色av一区二区夜夜嗨| 天天影视色香欲综合网老头| **网站欧美大片在线观看| 日韩精品中文字幕在线不卡尤物| 91蜜桃免费观看视频| 国模娜娜一区二区三区| 亚洲国产美女搞黄色| 国产蜜臀av在线一区二区三区| 4438亚洲最大| 欧美伊人久久久久久久久影院| 国产一区不卡在线| 日韩和欧美一区二区三区| 亚洲欧美日韩国产综合| 国产无遮挡一区二区三区毛片日本| 欧美日产国产精品| 91婷婷韩国欧美一区二区| 国产精品99久久久久久宅男| 久久99国内精品| 日韩在线观看一区二区| 亚洲精品午夜久久久| 国产精品久久夜| 国产精品欧美经典| 久久久久久久国产精品影院| 欧美成人一区二区三区| 欧美人牲a欧美精品| 欧美日韩一区二区在线视频| 色88888久久久久久影院野外| 成人免费的视频| 福利一区二区在线观看| 国产最新精品免费| 精品中文字幕一区二区| 久久se这里有精品| 老司机精品视频导航| 麻豆成人综合网| 日韩国产精品久久| 日韩激情一区二区| 日日骚欧美日韩| 日本伊人午夜精品| 免费xxxx性欧美18vr| 精品一区二区三区免费播放 | av激情亚洲男人天堂| 成人午夜电影久久影院| www.亚洲免费av| 一本色道久久综合精品竹菊| 日本久久电影网| 欧美日韩成人激情| 欧美电影免费观看高清完整版在| 亚洲精品一区二区三区99| 2020国产精品久久精品美国| 久久精品一区二区三区不卡牛牛| 久久综合视频网| 中文字幕 久热精品 视频在线| 亚洲欧洲日韩综合一区二区| 一区二区三区四区国产精品| 视频一区中文字幕| 精品一区在线看| 成人福利视频在线| 欧美三级中文字幕| 精品国产污污免费网站入口| 国产精品午夜春色av| 亚洲精品国产一区二区三区四区在线 | 国产乱妇无码大片在线观看| 国产91精品在线观看| 91精品1区2区| 欧美一区二区三区的| 2023国产精华国产精品| 亚洲素人一区二区| 日韩不卡一区二区三区| 成人中文字幕电影| 欧美老年两性高潮| 国产亚洲精品bt天堂精选| 夜夜精品视频一区二区| 精品中文字幕一区二区小辣椒| av电影在线观看完整版一区二区| 欧美日韩精品二区第二页| 欧美mv日韩mv亚洲| 亚洲欧美激情插| 国产综合久久久久久鬼色| 99久久亚洲一区二区三区青草| 精品视频一区二区不卡| 久久久不卡网国产精品二区| 亚洲综合视频在线观看| 国产最新精品免费| 欧美日韩高清一区二区三区| 国产精品久久一级| 久久成人久久爱| 欧美伊人久久大香线蕉综合69| 久久综合久久久久88| 亚洲风情在线资源站| 成人av动漫在线| 久久影院视频免费| 天天av天天翘天天综合网 | 欧美一区二区在线视频| 日韩美女视频一区二区 | 麻豆精品一区二区三区| 91视频一区二区| 国产精品理伦片| 国产乱人伦精品一区二区在线观看 | 成人中文字幕电影| 日韩情涩欧美日韩视频| 一级特黄大欧美久久久| 成人av动漫在线| 中文字幕不卡在线播放| 久久se精品一区二区| 91麻豆精品国产91久久久久久 | 欧美午夜片在线观看| 国产精品视频看| 国产一区二区免费在线| 91精品国产一区二区三区香蕉| 亚洲在线视频免费观看| 91美女视频网站| 1区2区3区精品视频| 成人午夜免费电影| 欧美国产亚洲另类动漫| 国内精品免费**视频| 欧美精品一区二区三区蜜桃| 激情五月婷婷综合| 精品国产sm最大网站免费看| 另类小说视频一区二区| 日韩欧美国产一区在线观看| 蜜桃免费网站一区二区三区|