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

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

?? 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)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天综合色天天综合| 99re热这里只有精品视频| 精品在线观看视频| 91美女精品福利| 精品国产三级a在线观看| 亚洲最新在线观看| 国产69精品一区二区亚洲孕妇 | 日韩午夜在线观看| 亚洲欧美色一区| 国产91精品一区二区麻豆网站| 欧美精品丝袜中出| 亚洲免费观看视频| 99久久精品国产精品久久| 久久综合狠狠综合久久综合88 | 欧美电影在哪看比较好| 亚洲精品中文在线影院| 大白屁股一区二区视频| 久久夜色精品一区| 精品一区二区三区免费毛片爱| 欧美日本精品一区二区三区| 亚洲人吸女人奶水| 91婷婷韩国欧美一区二区| 国产精品国产精品国产专区不蜜| 国产成人精品亚洲午夜麻豆| 久久精品日韩一区二区三区| 精品午夜一区二区三区在线观看| 欧美一级午夜免费电影| 日韩电影免费在线| 欧美一区二区三区视频在线 | 成人国产精品免费网站| 久久久久久久久久电影| 国产一区啦啦啦在线观看| 久久亚洲综合av| 国产精品自产自拍| 亚洲国产经典视频| 不卡电影一区二区三区| 中文字幕亚洲一区二区av在线| 成人午夜激情片| 亚洲欧美色综合| 欧美欧美午夜aⅴ在线观看| 视频一区二区三区在线| 欧美一区中文字幕| 国产一区二区精品久久91| 国产日韩欧美不卡在线| av不卡免费电影| 亚洲韩国精品一区| 日韩精品一区二区三区视频在线观看| 精品一区二区三区蜜桃| 国产偷国产偷亚洲高清人白洁 | 亚洲免费在线看| 欧美日韩国产影片| 久久精品久久综合| 国产欧美日韩视频一区二区| 日本韩国欧美在线| 日本欧美一区二区| 国产精品视频一区二区三区不卡| 色综合天天做天天爱| 日韩国产精品91| 国产情人综合久久777777| 色婷婷久久久久swag精品| 日一区二区三区| 国产亚洲视频系列| 欧美在线观看一二区| 韩国v欧美v日本v亚洲v| 亚洲精品免费看| 精品久久99ma| 99精品视频在线播放观看| 日韩精品每日更新| 亚洲国产激情av| 日韩一级视频免费观看在线| 不卡在线视频中文字幕| 麻豆精品精品国产自在97香蕉| 国产精品初高中害羞小美女文| 欧美酷刑日本凌虐凌虐| 成人sese在线| 国内精品国产成人| 午夜视频在线观看一区二区三区 | 欧美一级日韩免费不卡| av在线不卡网| 久久激情五月婷婷| 亚洲精品国产高清久久伦理二区| 日韩精品一区二区三区在线观看 | 国产欧美日韩综合精品一区二区| 欧美日韩亚洲国产综合| 国产超碰在线一区| 蜜臀91精品一区二区三区| 一区二区三区免费| 国产精品婷婷午夜在线观看| 欧美一级片在线观看| 欧美午夜免费电影| 99re这里都是精品| 高清不卡一二三区| 久久99在线观看| 麻豆免费看一区二区三区| 亚洲午夜国产一区99re久久| 成人免费小视频| 国产清纯在线一区二区www| 日韩精品中文字幕一区| 91精品国产综合久久小美女| 91久久精品一区二区三区| 91美女在线视频| 91性感美女视频| 99免费精品在线观看| 成人福利在线看| 成人国产精品免费观看视频| 国产精品1区2区3区| 国产一区二区在线观看视频| 日韩国产在线一| 日本不卡视频在线观看| 日韩av一区二区三区四区| 图片区小说区区亚洲影院| 亚洲成人av资源| 日韩电影免费在线| 久久精品噜噜噜成人av农村| 狠狠v欧美v日韩v亚洲ⅴ| 国内精品视频666| 国产成人综合亚洲网站| 国产激情视频一区二区在线观看| 国产成人av网站| 91农村精品一区二区在线| 色婷婷综合久久久久中文一区二区| 色噜噜狠狠一区二区三区果冻| 色婷婷精品久久二区二区蜜臂av | 亚洲女人小视频在线观看| 尤物视频一区二区| 亚洲图片有声小说| 九九国产精品视频| 国产91精品一区二区麻豆亚洲| av成人老司机| 欧美日韩在线电影| 欧美一级午夜免费电影| 2020国产精品| 亚洲免费观看高清完整| 青青草国产成人99久久| 国产河南妇女毛片精品久久久| 国产.欧美.日韩| 色88888久久久久久影院按摩| 欧美三级在线看| 久久久久国色av免费看影院| 亚洲欧美日韩国产综合| 日韩精品电影在线| 成人爱爱电影网址| 91精品欧美福利在线观看| 国产视频911| 亚洲国产精品久久不卡毛片| 激情综合一区二区三区| 91尤物视频在线观看| 日韩亚洲欧美在线| 亚洲欧美偷拍卡通变态| 经典三级在线一区| 色屁屁一区二区| 精品成人一区二区| 亚洲精品免费视频| 国产成人午夜电影网| 欧美亚洲动漫精品| 久久精品亚洲精品国产欧美kt∨| 一区二区久久久久| 国产美女视频一区| 欧美色综合网站| 国产精品久久二区二区| 老司机精品视频导航| 色婷婷久久综合| 国产欧美日韩在线看| 另类小说图片综合网| 欧洲在线/亚洲| 国产精品短视频| 国产另类ts人妖一区二区| 欧美久久久久久蜜桃| 亚洲日本在线天堂| 丰满少妇久久久久久久| 精品美女被调教视频大全网站| 亚洲国产一区二区在线播放| 99久久精品免费| 国产精品欧美综合在线| 精久久久久久久久久久| 欧美一级专区免费大片| 亚洲成a人在线观看| 91久久国产综合久久| 国产精品少妇自拍| 国产91精品精华液一区二区三区| 日韩免费一区二区| 青椒成人免费视频| 91精品国产黑色紧身裤美女| 午夜亚洲福利老司机| 欧美主播一区二区三区美女| 亚洲三级电影网站| 91视频.com| 最新高清无码专区| eeuss鲁片一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋| 国产盗摄精品一区二区三区在线 | 成人av中文字幕| 亚洲国产成人在线| 国产不卡免费视频| 久久久精品黄色| 成人爽a毛片一区二区免费| 国产精品久久久久精k8| 99re8在线精品视频免费播放| 亚洲欧美日韩一区二区 | 久久久久久久久久电影|