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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cursor.cpp

?? SM501基于ARMV4/ARMV4I平臺
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995, 1996, 1997, 1998  Microsoft Corporation
Copyright (c) 1999-2000  Silicon Motion, Inc.

Module Name:	cursor.cpp

Abstract:		SMI hardware accelerated cursor

Functions:

Notes:

--*/

#include "precomp.h"


//convert to vgx cursor mask
unsigned char mask_table[]= 
{0, 128, 32, 160, 8, 136, 40, 168, 2, 130, 34, 162, 10, 138, 42, 170};
// 00 - 0x00                             08 - 0x02
// 01 - 0x80							 09 - 0x82
// 02 - 0x20							 0A - 0x22
// 03 -	0xA0 							 0B - 0xA2
// 04 - 0x08 							 0C - 0x0A
// 05 - 0x88 							 0D - 0x8A
// 06 - 0x28 							 0E - 0x2A
// 07 - 0xA8 							 0F - 0xAA

SCODE SMI::SetPointerShape(GPESurf *pMask, GPESurf *pColorSurf, int xHot, int yHot,
					 int cx, int cy)
{
	PUCHAR pByte;
	PUCHAR pBuf;
	int i, row, col_byte, stride;
	UCHAR and_mask, xor_mask;

	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMI::SetPointerShape()\r\n")));

	SetCursorColors(0x00ffffff, 0x00000000);	// Set colors to black & white

	pByte = m_pLAW + m_nCursorMemory;
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("pByte = %08X, m_nCursorMemory = %08X\r\n"),
			pByte, m_nCursorMemory));

	// Not sure if this hide cursor is necessary, please verify
	DisableCursor();

	if (!pMask)
	{
		DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+Turning off cursor\r\n")));

		for (i = 0; i < 64*64/8*2; i++)	// Turn off cursor by setting mask to clear
			pByte[i] = 0;
	}
	else
	{
		// A cursor shape has been entered, draw it.
		DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+Setting pointer shape\r\n")));

		// Setup freq addressed information into local variables.
		stride = pMask->Stride();
		pBuf = (PUCHAR) pMask->Buffer();

		// initialize entire 32 x 32 shape to be ANDs=0xFF and XORs = 0x00
		// (i.e. transparent)
		m_nXHot = xHot;
		m_nYHot = yHot;	// we rely on MovePointer being called after this
		
		// Clear Cursor Mem to transparent.
		// 1/2/2003. Clear additional 1KB to 0 to patch Hw RevA cursor bottom garbage 
		// when cursor at bottom of screen.
		memset((PUCHAR) m_pLAW+m_nCursorMemory, 0, CURSUR_IMAGE_SIZE);

		for (row = 0, i=0; row < cy; row++)
		{
			i = row * 64/8 * 2;
			for (col_byte = 0; col_byte < cx/8; col_byte++)
			{
				and_mask = mask_table[(~pBuf[row * stride+col_byte ] & 0xF0)>>4];
				xor_mask = mask_table[(pBuf[(cy + row) * stride + col_byte] & 0xF0)>>4]/2;
				pByte[i++] = and_mask | xor_mask;

				and_mask = mask_table[(~pBuf[row * stride+col_byte] & 0x0F)];
				xor_mask = mask_table[(pBuf[(cy + row) * stride + col_byte] & 0x0F)]/2;
				pByte[i++] = and_mask | xor_mask;
			}
		}
	}

	RotateCursorShape(m_iRotate);

	AdjustCursorShape(); // For Zoom-In, Zoom-Out Feature

	SetCursorAddress(m_nCursorMemory);
	
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("+Cursor shape set done\r\n")));

	return (S_OK);
}

SCODE SMI::MovePointer(int x, int y)
{
	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMI::MovePointer(%d, %d)\r\n"), x, y));

	int newX,newY;

#ifdef ROTATION_ENABLE
	int nHideCursor = -33;
#else // ! ROTATION_ENABLE
	int nHideCursor = -1;
#endif // ROTATION_ENABLE

	switch (m_iRotate)
	{
#ifdef ROTATION_ENABLE
		case DMDO_270:
			newX = m_nScreenHeight - y - m_nXHot - 1;	// Hot spot is currently 32,32
			newY = x - m_nYHot;
			break;
		case DMDO_180:
			newX = m_nScreenWidth - x - m_nXHot - 1;
			newY = m_nScreenHeight - y - m_nYHot - 1;
			break;
		case DMDO_90:
			newX = y - m_nXHot;
			newY = m_nScreenWidth - x - m_nYHot - 1;
			break;
#endif 
		case 0:
		default:
			newX = x - m_nXHot;
			newY = y - m_nYHot;
			break;
	}

	//Fix hw cursor X,Y out of screen range. 11/01/02
	if (newX >= m_nScreenWidthSave)
		newX = m_nScreenWidthSave-1;

	if (newY >= m_nScreenHeightSave)
		newY = m_nScreenHeightSave-1;

	if (x == nHideCursor)
		DisableCursor();

	// Check for Virtual Panning
	if ( ((DWORD)m_SMISettings.m_dwCxPanel != m_dwCxZoom) ||
		 ((DWORD)m_SMISettings.m_dwCyPanel != m_dwCyZoom) )
	{
//		if (newX >= 0)
		{
			if ((newX+m_nXHot) < m_nPanningX)
			{
				// Pan left.
				m_nPanningX = newX + m_nXHot;
				if (m_nPanningX < 0) m_nPanningX = 0;
			}
			else if ((newX+m_nXHot) >= (m_nPanningX + (int)m_dwCxZoom))
			{
				// Pan right.
				m_nPanningX = (newX + m_nXHot + 1 - (int)m_dwCxZoom);
				if (m_nPanningX > m_nScreenWidthSave - (int)m_dwCxZoom)
					m_nPanningX = m_nScreenWidthSave - (int)m_dwCxZoom;
			}
		}
//		if (newY >= 0)
		{
			if ((newY+m_nYHot) < m_nPanningY)
			{
				// Pan up.
				m_nPanningY = newY + m_nYHot;
				if (m_nPanningY < 0) m_nPanningY = 0;
			}
			else if ((newY+m_nYHot) >= (m_nPanningY + (int)m_dwCyZoom))
			{
				// Pan down.
				m_nPanningY = (newY + m_nYHot + 1 - (int)m_dwCyZoom);
				if (m_nPanningY > m_nScreenHeightSave - (int)m_dwCyZoom)
					m_nPanningY = m_nScreenHeightSave - (int)m_dwCyZoom;
			}
		}

		newX -= m_nPanningX;
		newY -= m_nPanningY;

		// Adjust newX/newY ratio
		newX = (newX * m_SMISettings.m_dwCxPanel)/m_dwCxZoom;
		newY = (newY * m_SMISettings.m_dwCyPanel)/m_dwCyZoom;

		POKE_32(VIDEO_DISPLAY_CTRL, 
			FIELD_VALUE(PEEK_32(VIDEO_DISPLAY_CTRL), VIDEO_DISPLAY_CTRL, PIXEL, 
				((m_nPanningX * (m_nScreenBpp/8)) % 16)/(m_nScreenBpp/8))
			);

		POKE_32(VIDEO_FB_0_ADDRESS, 
			FIELD_SET(0, VIDEO_FB_0_ADDRESS, STATUS, PENDING) |
			FIELD_VALUE(0, VIDEO_FB_0_ADDRESS, EXT, m_SMISettings.m_bUMA) |
			FIELD_VALUE(0, VIDEO_FB_0_ADDRESS, ADDRESS, 
				VgxSurfAddr(m_pPrimarySurface->OffsetInVideoMemory())
				+m_nPanningY*m_nScreenStride+m_nPanningX*m_nScreenBpp/8) | 
			0);

	}
	// Check for Virtual Panning
	else if ( ((DWORD)m_nScreenWidthSave > m_SMISettings.m_dwCxPanel) ||
		 ((DWORD)m_nScreenHeightSave > m_SMISettings.m_dwCyPanel) )
	{
//		if (newX >= 0)
		{
			if ((newX+m_nXHot) < m_nPanningX)
			{
				// Pan left.
				m_nPanningX = newX + m_nXHot;
				if (m_nPanningX < 0) m_nPanningX = 0;
			}
			else if ((newX+m_nXHot) >= (m_nPanningX + (int)m_SMISettings.m_dwCxPanel))
			{
				// Pan right.
				m_nPanningX = (newX + m_nXHot + 1 - (int)m_SMISettings.m_dwCxPanel);
				if (m_nPanningX > m_nScreenWidthSave - (int)m_SMISettings.m_dwCxPanel)
					m_nPanningX = m_nScreenWidthSave - (int)m_SMISettings.m_dwCxPanel;
			}
		}
//		if (newY >= 0)
		{
			if ((newY+m_nYHot) < m_nPanningY)
			{
				// Pan up.
				m_nPanningY = newY + m_nYHot;
				if (m_nPanningY < 0) m_nPanningY = 0;
			}
			else if ((newY+m_nYHot) >= (m_nPanningY + (int)m_SMISettings.m_dwCyPanel))
			{
				// Pan down.
				m_nPanningY = (newY + m_nYHot + 1 - (int)m_SMISettings.m_dwCyPanel);
				if (m_nPanningY > m_nScreenHeightSave - (int)m_SMISettings.m_dwCyPanel)
					m_nPanningY = m_nScreenHeightSave - (int)m_SMISettings.m_dwCyPanel;
			}
		}

		newX -= m_nPanningX;
		newY -= m_nPanningY;
/*
		POKE_32(CRT_WINDOW_WIDTH,
	  	  	FIELD_VALUE(0, CRT_WINDOW_WIDTH, WIDTH, m_nScreenWidthSave-1) |
			FIELD_VALUE(0, CRT_WINDOW_WIDTH, X, m_nPanningX) );

		POKE_32(CRT_WINDOW_HEIGHT,
		  	FIELD_VALUE(0, CRT_WINDOW_HEIGHT, HEIGHT, m_nScreenHeightSave-1) |
		  	FIELD_VALUE(0, CRT_WINDOW_HEIGHT, Y, m_nPanningY) );
*/
	}

    ULONG dwVal = PEEK_32(CRT_HWC_LOCATION);

    if (newX >= 0)
    {
        dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, X, newX); 
        dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, LEFT, INSIDE);
    }
    else
    {
        dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, X, -newX); 
        dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, LEFT, OUTSIDE); 
    }

    if (newY >= 0)
    {
        dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, Y, newY); 
        dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, TOP, INSIDE); 
    }
    else
    {
        dwVal = FIELD_VALUE(dwVal, CRT_HWC_LOCATION, Y, -newY); 
        dwVal = FIELD_SET(dwVal, CRT_HWC_LOCATION, TOP, OUTSIDE); 
    }

    // 1/2/2003. Clear additional 1KB to 0 to patch hw cursor bottom garbage. do not need to WaitForVBlank() now.
    // Hardware bugs - Had to wait for VBlank before change position
    // WaitForVBlank();
    POKE_32(CRT_HWC_LOCATION, dwVal);

	if (x != nHideCursor)
		EnableCursor();

 	return (S_OK);
}

void SMI::SetCursorColors(ULONG foreground, ULONG background)
{
	ULONG color3=0x0000; //for invert color, assume it is Black at this time.

	DEBUGMSG(GPE_ZONE_CURSOR, (TEXT("SMI::SetCursorColors(0x%x, 0x%x)\r\n"),
		foreground, background));

    POKE_32(CRT_HWC_COLOR_01, background<<16 | color3);
    POKE_32(CRT_HWC_COLOR_2, foreground);
}

void SMI::SetCursorAddress(ULONG dwAddress)
{
        ULONG dwAdd = PEEK_32(CRT_HWC_ADDRESS);
        dwAdd = FIELD_VALUE(dwAdd, CRT_HWC_ADDRESS, EXT, m_SMISettings.m_bUMA);
        dwAdd = FIELD_VALUE(dwAdd, CRT_HWC_ADDRESS, ADDRESS, VgxSurfAddr(dwAddress));
        dwAdd = FIELD_VALUE(dwAdd, CRT_HWC_ADDRESS, ENABLE, m_nPanelHwcOnOff);
        POKE_32(CRT_HWC_ADDRESS, dwAdd);
}

void SMI::DisableCursor(void)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩毛片在线免费观看| 国产喂奶挤奶一区二区三区| 国产精品亚洲成人| 亚洲一区二区三区美女| 国产日韩欧美电影| 欧美一区二区三区在线视频| 91免费看`日韩一区二区| 经典三级在线一区| 性久久久久久久| 亚洲欧美日韩久久| 亚洲国产精品av| 久久天堂av综合合色蜜桃网| 在线不卡免费欧美| 欧美色偷偷大香| 91免费看片在线观看| 成人精品鲁一区一区二区| 麻豆国产欧美一区二区三区| 亚洲成人资源在线| 亚洲精品你懂的| 亚洲同性gay激情无套| 国产精品网友自拍| 久久精品人人做人人爽97| 91精品国产91综合久久蜜臀| 欧美色图天堂网| 在线视频国产一区| 在线一区二区观看| 色域天天综合网| 91高清视频在线| 91久久久免费一区二区| 91丨porny丨中文| 91蜜桃免费观看视频| 99这里都是精品| 色先锋资源久久综合| 色欲综合视频天天天| 色av一区二区| 欧美视频在线一区二区三区 | 在线精品视频免费观看| 成a人片亚洲日本久久| 成人免费视频视频| 92国产精品观看| 色综合欧美在线| 91福利小视频| 在线电影国产精品| 日韩免费视频一区| xvideos.蜜桃一区二区| 久久人人97超碰com| 国产视频一区在线观看| 国产女人18毛片水真多成人如厕| 久久久久久久久久电影| 亚洲国产精品黑人久久久| 中文字幕一区二区在线观看| 亚洲欧美日韩中文播放 | 日韩av中文在线观看| 日韩综合在线视频| 极品少妇xxxx偷拍精品少妇| 国产成人无遮挡在线视频| 成人av免费在线播放| 在线观看亚洲一区| 欧美一级夜夜爽| 久久精品一二三| 一区二区三区四区五区视频在线观看| 亚洲综合无码一区二区| 热久久久久久久| 国产91综合网| 欧美中文一区二区三区| 日韩三级伦理片妻子的秘密按摩| 国产婷婷色一区二区三区四区| 亚洲欧洲国产日本综合| 亚洲成人av电影| 国产精品亚洲人在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 国产精品美女久久久久av爽李琼| 自拍视频在线观看一区二区| 首页国产欧美日韩丝袜| 国产成人av资源| 欧美色图第一页| 久久精品一区二区三区av| 夜夜亚洲天天久久| 国内久久精品视频| 色噜噜久久综合| 日韩免费一区二区| 伊人婷婷欧美激情| 国产精品一区二区三区四区| 欧美丝袜丝交足nylons图片| 国产午夜精品一区二区三区嫩草| 亚洲一区二区高清| 国产麻豆视频一区二区| 欧美日韩一区精品| 亚洲国产精华液网站w| 全部av―极品视觉盛宴亚洲| av不卡免费在线观看| 欧美videossexotv100| 亚洲国产综合人成综合网站| 国产激情一区二区三区四区| 3atv在线一区二区三区| 1区2区3区精品视频| 精品在线播放免费| 91久久人澡人人添人人爽欧美| 久久久www成人免费毛片麻豆| 亚洲国产毛片aaaaa无费看| 国产成人丝袜美腿| 精品久久久久99| 三级欧美在线一区| 91成人在线免费观看| 亚洲国产成人自拍| 国产一区二区三区四| 欧美一区二视频| 亚洲国产视频直播| 一本色道久久综合精品竹菊| 国产精品网站在线| 国产精品91xxx| 精品福利视频一区二区三区| 天使萌一区二区三区免费观看| 色婷婷激情一区二区三区| 欧美激情一区三区| 美女免费视频一区| 欧美高清性hdvideosex| 一区二区三区四区亚洲| 色偷偷久久一区二区三区| 中文字幕国产一区二区| 国产在线播精品第三| 日韩区在线观看| 免费观看30秒视频久久| 91精品国产欧美日韩| 亚洲成人福利片| 欧美日本韩国一区二区三区视频 | 在线观看一区日韩| 亚洲色图在线看| 色综合色综合色综合 | 国产精品的网站| 成人精品视频一区二区三区尤物| 久久久精品综合| 国产精品一区专区| 国产欧美1区2区3区| 国产suv精品一区二区6| 欧美韩国一区二区| 成人晚上爱看视频| 亚洲三级电影全部在线观看高清| 北条麻妃一区二区三区| 亚洲三级在线播放| 在线免费亚洲电影| 亚洲mv在线观看| 日韩视频不卡中文| 国产主播一区二区| 国产精品理论片| 色婷婷av一区| 日韩国产精品大片| 精品免费日韩av| 粉嫩av一区二区三区在线播放| 中文字幕高清不卡| 在线精品视频免费观看| 三级一区在线视频先锋| 亚洲精品在线网站| 成人黄动漫网站免费app| 亚洲乱码日产精品bd| 欧美日韩美少妇| 韩国欧美国产1区| 国产精品久久久久久久久动漫 | 91蜜桃免费观看视频| 亚洲国产精品久久不卡毛片| 911精品国产一区二区在线| 精彩视频一区二区三区| 亚洲欧美在线高清| 欧美日韩aaaaaa| 国产精品一区免费在线观看| 国产精品国产三级国产aⅴ中文 | 精品国偷自产国产一区| 国产老女人精品毛片久久| 中文字幕视频一区二区三区久| 欧美中文字幕一区二区三区 | 欧美性大战久久| 久热成人在线视频| 亚洲欧洲99久久| 7878成人国产在线观看| 丰满白嫩尤物一区二区| 亚洲h在线观看| 中文字幕中文乱码欧美一区二区 | 91社区在线播放| 奇米色777欧美一区二区| 中文字幕不卡一区| 91麻豆精品国产自产在线观看一区 | 亚洲日本一区二区三区| 欧美大片在线观看| 色爱区综合激月婷婷| 国产剧情一区二区| 婷婷一区二区三区| 欧美极品aⅴ影院| 日韩欧美中文字幕制服| 色婷婷激情综合| 懂色av一区二区三区免费观看| 日韩国产一区二| 亚洲精品乱码久久久久久黑人| 精品国产3级a| 欧美高清dvd| 日本高清不卡视频| 成人精品国产免费网站| 精品一区二区三区免费播放| 一区二区三区精品视频在线| 欧美激情在线看| 日韩欧美一区二区三区在线|