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

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

?? radeon_cursor.c

?? x.org上有關ati系列顯卡最新驅動
?? C
字號:
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_cursor.c,v 1.25 2003/08/29 21:07:57 tsi Exp $ *//* * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and *                VA Linux Systems Inc., Fremont, California. * * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation on the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#ifdef HAVE_CONFIG_H#include "config.h"#endif#define RADEONCTRACE(x)/* #define RADEONCTRACE(x) RADEONTRACE(x)  *//* * Authors: *   Kevin E. Martin <martin@xfree86.org> *   Rickard E. Faith <faith@valinux.com> * * References: * * !!!! FIXME !!!! *   RAGE 128 VR/ RAGE 128 GL Register Reference Manual (Technical *   Reference Manual P/N RRG-G04100-C Rev. 0.04), ATI Technologies: April *   1999. * *   RAGE 128 Software Development Manual (Technical Reference Manual P/N *   SDK-G04000 Rev. 0.01), ATI Technologies: June 1999. * */				/* Driver data structures */#include "radeon.h"#include "radeon_version.h"#include "radeon_reg.h"#include "radeon_macros.h"#include "radeon_mergedfb.h"				/* X and server generic header files */#include "xf86.h"/* Mono ARGB cursor colours (premultiplied). */static CARD32 mono_cursor_color[] = {	0x00000000, /* White, fully transparent. */	0x00000000, /* Black, fully transparent. */	0xffffffff, /* White, fully opaque. */	0xff000000, /* Black, fully opaque. */};#define CURSOR_WIDTH	64#define CURSOR_HEIGHT	64#define COMMON_CURSOR_SWAPPING_START()	 RADEON_SYNC(info, pScrn)/* * The cursor bits are always 32bpp.  On MSBFirst buses, * configure byte swapping to swap 32 bit units when writing * the cursor image.  Byte swapping must always be returned * to its previous value before returning. */#if X_BYTE_ORDER == X_BIG_ENDIAN#define CURSOR_SWAPPING_DECL_MMIO   unsigned char *RADEONMMIO = info->MMIO;#define CURSOR_SWAPPING_START() \  do { \    COMMON_CURSOR_SWAPPING_START(); \    OUTREG(RADEON_SURFACE_CNTL, \	   (info->ModeReg.surface_cntl | \	     RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP) & \	   ~(RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP)); \  } while (0)#define CURSOR_SWAPPING_END()	(OUTREG(RADEON_SURFACE_CNTL, \					info->ModeReg.surface_cntl))#else#define CURSOR_SWAPPING_DECL_MMIO#define CURSOR_SWAPPING_START() \  do { \    COMMON_CURSOR_SWAPPING_START(); \  } while (0)#define CURSOR_SWAPPING_END()#endif/* Set cursor foreground and background colors */static void RADEONSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    CARD32        *pixels     = (CARD32 *)(pointer)(info->FB + info->cursor_offset);    int            pixel, i;    CURSOR_SWAPPING_DECL_MMIO    RADEONCTRACE(("RADEONSetCursorColors\n"));#ifdef ARGB_CURSOR    /* Don't recolour cursors set with SetCursorARGB. */    if (info->cursor_argb)       return;#endif    fg |= 0xff000000;    bg |= 0xff000000;    /* Don't recolour the image if we don't have to. */    if (fg == info->cursor_fg && bg == info->cursor_bg)       return;    CURSOR_SWAPPING_START();    /* Note: We assume that the pixels are either fully opaque or fully     * transparent, so we won't premultiply them, and we can just     * check for non-zero pixel values; those are either fg or bg     */    for (i = 0; i < CURSOR_WIDTH * CURSOR_HEIGHT; i++, pixels++)       if ((pixel = *pixels))           *pixels = (pixel == info->cursor_fg) ? fg : bg;    CURSOR_SWAPPING_END();    info->cursor_fg = fg;    info->cursor_bg = bg;}/* Set cursor position to (x,y) with offset into cursor bitmap at * (xorigin,yorigin) */static void RADEONSetCursorPosition(ScrnInfoPtr pScrn, int x, int y){    RADEONInfoPtr      info       = RADEONPTR(pScrn);    unsigned char     *RADEONMMIO = info->MMIO;    xf86CursorInfoPtr  cursor     = info->cursor;    int                xorigin    = 0;    int                yorigin    = 0;    int                total_y    = pScrn->frameY1 - pScrn->frameY0;    int		       stride     = 256;    if(info->MergedFB) {       RADEONCTRACE(("RADEONSetCursorPositionMerged\n"));       RADEONSetCursorPositionMerged(pScrn, x, y);       return;    }    RADEONCTRACE(("RADEONSetCursorPosition\n"));    if (x < 0)                        xorigin = -x+1;    if (y < 0)                        yorigin = -y+1;    if (y > total_y)                  y       = total_y;    if (info->Flags & V_DBLSCAN)      y       *= 2;    if (xorigin >= cursor->MaxWidth)  xorigin = cursor->MaxWidth - 1;    if (yorigin >= cursor->MaxHeight) yorigin = cursor->MaxHeight - 1;    if (!info->IsSecondary) {	OUTREG(RADEON_CUR_HORZ_VERT_OFF,  (RADEON_CUR_LOCK					   | (xorigin << 16)					   | yorigin));	OUTREG(RADEON_CUR_HORZ_VERT_POSN, (RADEON_CUR_LOCK					   | ((xorigin ? 0 : x) << 16)					   | (yorigin ? 0 : y)));	RADEONCTRACE(("cursor_offset: 0x%x, yorigin: %d, stride: %d\n",		     info->cursor_offset, yorigin, stride));	OUTREG(RADEON_CUR_OFFSET, info->cursor_offset + yorigin * stride);    } else {	OUTREG(RADEON_CUR2_HORZ_VERT_OFF,  (RADEON_CUR2_LOCK					    | (xorigin << 16)					    | yorigin));	OUTREG(RADEON_CUR2_HORZ_VERT_POSN, (RADEON_CUR2_LOCK					    | ((xorigin ? 0 : x) << 16)					    | (yorigin ? 0 : y)));	OUTREG(RADEON_CUR2_OFFSET,	       info->cursor_offset + pScrn->fbOffset + yorigin * stride);    }}/* Copy cursor image from `image' to video memory.  RADEONSetCursorPosition * will be called after this, so we can ignore xorigin and yorigin. */static void RADEONLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *image){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    CARD8         *s          = (CARD8 *)(pointer)image;    CARD32        *d          = (CARD32 *)(pointer)(info->FB + info->cursor_offset);    CARD32         save1      = 0;    CARD32         save2      = 0;    CARD8	   chunk;    CARD32         i, j;    RADEONCTRACE(("RADEONLoadCursorImage (at %x)\n", info->cursor_offset));    if (!info->IsSecondary) {	save1 = INREG(RADEON_CRTC_GEN_CNTL) & ~(CARD32) (3 << 20);	save1 |= (CARD32) (2 << 20);	OUTREG(RADEON_CRTC_GEN_CNTL, save1 & (CARD32)~RADEON_CRTC_CUR_EN);    }    if (info->IsSecondary || info->MergedFB) {	save2 = INREG(RADEON_CRTC2_GEN_CNTL) & ~(CARD32) (3 << 20);	save2 |= (CARD32) (2 << 20);	OUTREG(RADEON_CRTC2_GEN_CNTL, save2 & (CARD32)~RADEON_CRTC2_CUR_EN);    }#ifdef ARGB_CURSOR    info->cursor_argb = FALSE;#endif    /*     * Convert the bitmap to ARGB32.     *     * HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 always places     * source in the low bit of the pair and mask in the high bit,     * and MSBFirst machines set HARDWARE_CURSOR_BIT_ORDER_MSBFIRST     * (which actually bit swaps the image) to make the bits LSBFirst     */    CURSOR_SWAPPING_START();#define ARGB_PER_CHUNK	(8 * sizeof (chunk) / 2)    for (i = 0; i < (CURSOR_WIDTH * CURSOR_HEIGHT / ARGB_PER_CHUNK); i++) {        chunk = *s++;	for (j = 0; j < ARGB_PER_CHUNK; j++, chunk >>= 2)	    *d++ = mono_cursor_color[chunk & 3];    }    CURSOR_SWAPPING_END();    info->cursor_bg = mono_cursor_color[2];    info->cursor_fg = mono_cursor_color[3];    if (!info->IsSecondary)	OUTREG(RADEON_CRTC_GEN_CNTL, save1);    if (info->IsSecondary || info->MergedFB)	OUTREG(RADEON_CRTC2_GEN_CNTL, save2);}/* Hide hardware cursor. */static void RADEONHideCursor(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    RADEONCTRACE(("RADEONHideCursor\n"));    if (info->IsSecondary || info->MergedFB)	OUTREGP(RADEON_CRTC2_GEN_CNTL, 0, ~RADEON_CRTC2_CUR_EN);    if (!info->IsSecondary)	OUTREGP(RADEON_CRTC_GEN_CNTL, 0, ~RADEON_CRTC_CUR_EN);}/* Show hardware cursor. */static void RADEONShowCursor(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    RADEONCTRACE(("RADEONShowCursor\n"));    if (info->IsSecondary || info->MergedFB)	OUTREGP(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_CUR_EN,		~RADEON_CRTC2_CUR_EN);    if (!info->IsSecondary)	OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_CUR_EN,		~RADEON_CRTC_CUR_EN);}/* Determine if hardware cursor is in use. */static Bool RADEONUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs){    ScrnInfoPtr    pScrn = xf86Screens[pScreen->myNum];    RADEONInfoPtr  info  = RADEONPTR(pScrn);    return info->cursor ? TRUE : FALSE;}#ifdef ARGB_CURSOR#include "cursorstr.h"static Bool RADEONUseHWCursorARGB (ScreenPtr pScreen, CursorPtr pCurs){    if (RADEONUseHWCursor(pScreen, pCurs) &&	pCurs->bits->height <= CURSOR_HEIGHT && pCurs->bits->width <= CURSOR_WIDTH)	return TRUE;    return FALSE;}static void RADEONLoadCursorARGB (ScrnInfoPtr pScrn, CursorPtr pCurs){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    CARD32        *d          = (CARD32 *)(pointer)(info->FB + info->cursor_offset);    int            x, y, w, h;    CARD32         save1      = 0;    CARD32         save2      = 0;    CARD32	  *image = pCurs->bits->argb;    CARD32	  *i;    RADEONCTRACE(("RADEONLoadCursorARGB\n"));    if (!info->IsSecondary) {	save1 = INREG(RADEON_CRTC_GEN_CNTL) & ~(CARD32) (3 << 20);	save1 |= (CARD32) (2 << 20);	OUTREG(RADEON_CRTC_GEN_CNTL, save1 & (CARD32)~RADEON_CRTC_CUR_EN);    }    if (info->IsSecondary || info->MergedFB) {	save2 = INREG(RADEON_CRTC2_GEN_CNTL) & ~(CARD32) (3 << 20);	save2 |= (CARD32) (2 << 20);	OUTREG(RADEON_CRTC2_GEN_CNTL, save2 & (CARD32)~RADEON_CRTC2_CUR_EN);    }#ifdef ARGB_CURSOR    info->cursor_argb = TRUE;#endif    CURSOR_SWAPPING_START();    w = pCurs->bits->width;    if (w > CURSOR_WIDTH)	w = CURSOR_WIDTH;    h = pCurs->bits->height;    if (h > CURSOR_HEIGHT)	h = CURSOR_HEIGHT;    for (y = 0; y < h; y++)    {	i = image;	image += pCurs->bits->width;	for (x = 0; x < w; x++)	    *d++ = *i++;	/* pad to the right with transparent */	for (; x < CURSOR_WIDTH; x++)	    *d++ = 0;    }    /* pad below with transparent */    for (; y < CURSOR_HEIGHT; y++)	for (x = 0; x < CURSOR_WIDTH; x++)	    *d++ = 0;    CURSOR_SWAPPING_END ();    if (!info->IsSecondary)	OUTREG(RADEON_CRTC_GEN_CNTL, save1);    if (info->IsSecondary || info->MergedFB)	OUTREG(RADEON_CRTC2_GEN_CNTL, save2);}#endif/* Initialize hardware cursor support. */Bool RADEONCursorInit(ScreenPtr pScreen){    ScrnInfoPtr        pScrn   = xf86Screens[pScreen->myNum];    RADEONInfoPtr      info    = RADEONPTR(pScrn);    xf86CursorInfoPtr  cursor;    int                width;    int		       width_bytes;    int                height;    int                size_bytes;    if (!(cursor = info->cursor = xf86CreateCursorInfoRec())) return FALSE;    cursor->MaxWidth          = CURSOR_WIDTH;    cursor->MaxHeight         = CURSOR_HEIGHT;    cursor->Flags             = (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP				 | HARDWARE_CURSOR_AND_SOURCE_WITH_MASK#if X_BYTE_ORDER == X_BIG_ENDIAN				 /* this is a lie --				  * HARDWARE_CURSOR_BIT_ORDER_MSBFIRST				  * actually inverts the bit order, so				  * this switches to LSBFIRST				  */				 | HARDWARE_CURSOR_BIT_ORDER_MSBFIRST#endif				 | HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1);    cursor->SetCursorColors   = RADEONSetCursorColors;    cursor->SetCursorPosition = RADEONSetCursorPosition;    cursor->LoadCursorImage   = RADEONLoadCursorImage;    cursor->HideCursor        = RADEONHideCursor;    cursor->ShowCursor        = RADEONShowCursor;    cursor->UseHWCursor       = RADEONUseHWCursor;#ifdef ARGB_CURSOR    cursor->UseHWCursorARGB   = RADEONUseHWCursorARGB;    cursor->LoadCursorARGB    = RADEONLoadCursorARGB;#endif    size_bytes                = CURSOR_WIDTH * 4 * CURSOR_HEIGHT;    width                     = pScrn->displayWidth;    width_bytes		      = width * (pScrn->bitsPerPixel / 8);    height                    = (size_bytes + width_bytes - 1) / width_bytes;#ifdef USE_XAA    if (!info->useEXA) {	FBAreaPtr          fbarea;	fbarea = xf86AllocateOffscreenArea(pScreen, width, height,					   256, NULL, NULL, NULL);	if (!fbarea) {	    info->cursor_offset    = 0;	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,		   "Hardware cursor disabled"		   " due to insufficient offscreen memory\n");	} else {	    info->cursor_offset  = RADEON_ALIGN((fbarea->box.x1 +						fbarea->box.y1 * width) *						info->CurrentLayout.pixel_bytes,						256);	    info->cursor_end = info->cursor_offset + size_bytes;	}	RADEONCTRACE(("RADEONCursorInit (0x%08x-0x%08x)\n",		    info->cursor_offset, info->cursor_end));    }#endif    return xf86InitCursor(pScreen, cursor);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丁香婷婷综合色啪| 精品国产亚洲在线| 日韩久久久精品| 国产精品白丝在线| 久久99精品国产麻豆不卡| 91在线视频播放地址| xfplay精品久久| 秋霞成人午夜伦在线观看| 91麻豆精品一区二区三区| 久久久久久麻豆| 老司机一区二区| 欧美日韩精品三区| 一区二区三区在线观看国产| 成人精品国产一区二区4080| 欧美电影精品一区二区| 日韩精品一二三| 在线观看视频91| 一区二区三区加勒比av| 色香蕉成人二区免费| 久久婷婷国产综合国色天香| 日韩高清在线观看| 欧美一区二区视频在线观看2020| 亚洲人精品一区| 99久久免费精品| 国产精品久久综合| 成年人国产精品| 国产精品白丝在线| 99国产一区二区三精品乱码| 亚洲欧洲成人自拍| jvid福利写真一区二区三区| 亚洲欧美中日韩| av一二三不卡影片| 亚洲精品国产成人久久av盗摄| 99精品久久久久久| 亚洲精品国产一区二区精华液 | 亚洲制服欧美中文字幕中文字幕| 丁香五精品蜜臀久久久久99网站| 国产精品天美传媒| 91小视频在线免费看| 亚洲免费在线视频一区 二区| 一本色道久久综合亚洲91| 一区二区三区**美女毛片| 欧美日韩精品一二三区| 美洲天堂一区二卡三卡四卡视频| 日韩欧美国产高清| 高清久久久久久| 亚洲毛片av在线| 4438x亚洲最大成人网| 精品一区二区久久久| 国产亚洲短视频| 91亚洲国产成人精品一区二区三| 亚洲一区在线观看视频| 精品视频在线视频| 精品一区二区三区的国产在线播放| 欧美大尺度电影在线| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品麻豆久久久| 欧美色手机在线观看| 久久精品国产澳门| 国产精品久久二区二区| 欧美三级日本三级少妇99| 精品午夜一区二区三区在线观看| 亚洲国产精品成人综合| 欧美日韩成人在线| 成人午夜私人影院| 亚洲国产乱码最新视频| 久久久99久久| 欧美精品成人一区二区三区四区| 国产高清精品久久久久| 亚洲影院理伦片| 久久久777精品电影网影网| 欧洲人成人精品| 国产精品18久久久久久久久| 一区二区三区产品免费精品久久75| 欧美成人艳星乳罩| 欧美视频日韩视频| 成人白浆超碰人人人人| 美女一区二区视频| 一区二区成人在线| 中文子幕无线码一区tr| 91精品国产综合久久精品性色| 99久久免费视频.com| 国产一区二区三区av电影| 亚洲福利视频一区| 国产精品久久久久久久久免费桃花| 欧美一区二区三区视频免费| 色婷婷综合中文久久一本| 国产一区二区三区观看| 日本成人在线网站| 亚洲电影欧美电影有声小说| 最新热久久免费视频| 精品不卡在线视频| 日韩亚洲电影在线| 欧美老肥妇做.爰bbww视频| 色av综合在线| av在线一区二区三区| 国产盗摄一区二区三区| 韩国精品久久久| 精品无人码麻豆乱码1区2区 | 日韩av午夜在线观看| 一区二区久久久久久| 国产精品入口麻豆九色| 国产欧美日韩综合精品一区二区| 日韩一区二区三区视频在线观看| 欧美亚洲国产一区二区三区 | 亚洲综合一区二区精品导航| 亚洲欧洲在线观看av| 中文字幕一区在线观看视频| 日本系列欧美系列| 爽爽淫人综合网网站| 天天综合网 天天综合色| 视频在线观看一区| 日日夜夜精品视频天天综合网| 亚洲成a人片综合在线| 午夜国产精品一区| 人人狠狠综合久久亚洲| 美女一区二区三区在线观看| 黑人巨大精品欧美黑白配亚洲| 国产麻豆欧美日韩一区| 国产91丝袜在线18| 91视视频在线观看入口直接观看www | 久久网站热最新地址| 久久久精品tv| 中文字幕欧美一| 亚洲一区二区三区四区五区黄| 亚洲国产日韩在线一区模特| 亚洲国产另类av| 久久机这里只有精品| 国产白丝精品91爽爽久久| av在线综合网| 精品视频全国免费看| 欧美电影免费观看高清完整版在| 国产亚洲成aⅴ人片在线观看| 国产精品久久久久久久久免费相片 | 在线观看成人免费视频| 欧美喷潮久久久xxxxx| 日韩欧美自拍偷拍| 中文字幕精品一区| 亚洲永久免费视频| 精品影视av免费| 99vv1com这只有精品| 欧美高清性hdvideosex| 国产欧美日韩激情| 亚洲综合成人在线| 国内精品写真在线观看| 91蜜桃视频在线| 精品动漫一区二区三区在线观看| 国产精品色哟哟网站| 午夜精品免费在线观看| 国产裸体歌舞团一区二区| 在线亚洲高清视频| 久久亚洲综合av| 亚洲18色成人| 成人黄色av电影| 欧美成人aa大片| 亚洲韩国一区二区三区| 成人免费毛片aaaaa**| 91精品国产欧美一区二区| 中文字幕佐山爱一区二区免费| 久久精品国产亚洲高清剧情介绍| 91免费在线看| 久久综合九色综合欧美就去吻 | 国产在线精品一区二区三区不卡| 色婷婷久久综合| 国产婷婷色一区二区三区四区| 亚洲福利视频三区| 成人精品国产免费网站| 精品欧美乱码久久久久久| 亚洲国产精品久久人人爱蜜臀| 成人晚上爱看视频| 欧美mv日韩mv| 青青草97国产精品免费观看无弹窗版| 99麻豆久久久国产精品免费| 久久久久久日产精品| 乱一区二区av| 欧美一区三区四区| 午夜激情久久久| 欧美性色欧美a在线播放| 国产精品对白交换视频 | 韩国v欧美v亚洲v日本v| 欧美一区二区高清| 三级亚洲高清视频| 欧美日韩在线三级| 亚洲精品国产精品乱码不99| 不卡电影免费在线播放一区| 久久久久国产精品麻豆ai换脸| 免费在线看一区| 日韩一区二区不卡| 日本成人在线不卡视频| 欧美精品日韩一本| 日本女优在线视频一区二区| 3atv一区二区三区| 三级久久三级久久| 日韩亚洲欧美综合| 老司机精品视频线观看86| 欧美一区二区三区婷婷月色| 日本一区中文字幕| 欧美一区二区在线观看| 久久99久久99精品免视看婷婷| www国产精品av|