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

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

?? scrcntl.cpp

?? Demo Source for a doom like engine using raycasting and voxel
?? CPP
字號:
/****************************************
scrcntl.cpp- a module to provide a layer of abstraction
between the OS graphics architecture and the application
It provides you the programmer with the ability to create offscreen
buffers, whose drawing surfaces you have direct access to, which 
blit to the screen across operating systems. To change the
destination operating system, simply change the file os.h
Also requires the file palcntl.cpp to load palettes in the bitmaps
A routine called App_Make_New_Screen must be in another source file. It
should perform any work that must be done for the app to run in the
new screen size
*****************************************/

#include "os.h"
#include "scrcntl.h"
#include "buffnode.h"
#include "memutil.h"
#include "scconint.h"
#include "palette.h"
#include <mem.h>

#ifdef OS_WINDOWS
#include "wingdll.h"
#endif

pbuffer_node buffer_list=NULL;
screen_ptr cur_screen_ptr;
void App_Make_New_Screen();

#ifdef OS_DOS

#define VGA_WIDTH 320
#define VGA_HEIGHT 200
#define SVGA_WIDTH 640
#define SVGA_HEIGHT 480

#include "vesa.h"
#include "screen.h"

void Screen_Copy(long offset, void * src, long ncopy);

BOOL super_vga;
void Attempt_Screen_Open(short & width, short & height)
{
	if ( (width>VGA_WIDTH) || (height>VGA_HEIGHT) ) {
		// must load a super vga screen to get requested dimensions
		VBE_detect();
		if (VESA_InitGraphics(width, height)) {
			// no svga so load vga dimensions
			setgmode(0x13);
			super_vga=FALSE;
			width=VGA_WIDTH;
			height=VGA_HEIGHT;
		} else {
			super_vga=TRUE;
		}
	} else {
		super_vga=FALSE;
		setgmode(0x13);
		width=VGA_WIDTH;
		height=VGA_HEIGHT;
	}
}

void Screen_Copy(long offset, void * src, long ncopy) {

if (cur_screen_ptr==NULL) {
	if (super_vga) {
		VESA_ScreenCopy(offset, src, ncopy);
	} else {
		memcpy(screen+offset, src, ncopy);
	} /* endif */
} else {
	memcpy(cur_screen_ptr+offset, src, ncopy);
}

}

#endif

#ifdef OS_WINDOWS
HBITMAP cur_hbitmap=NULL;
short stretch_factor=1;

typedef struct MY_BITMAP_HEADER
{
	BITMAPINFOHEADER Header;
	RGBQUAD aColors[256];
} my_bitmap_header;

my_bitmap_header os_header;

HBITMAP old_mono_bitmap;
HDC off_screen_DC;
WinGdll WinG;
#endif

void Allocate_Offscreen_Buffer(poff_screen_buff new_buff) {

#ifdef OS_DOS
	// allocate the off screen buffer manually
	(*(new_buff->buff_ptr_address))=(video_data_ptr)NewPtr(
		  Get_Phys_Screen_Width() * Get_Phys_Screen_Height());
#endif

#ifdef OS_WINDOWS
	// copy palette to buffer header
	// this is done now in case you want to load different palettes for each buffer
	// the currently loaded is made the buffer's palette. You don't have to do this
	// in dos because dos bitmaps have no palettes. To keep the bitmap's palette equal to
	// the loaded palette, you must call Change_Screen.

	for (short color_index=0; color_index< PALETTE_COLORS; color_index++) {
		os_header.aColors[color_index].rgbRed=Get_Palette_Red_Val(color_index);
		os_header.aColors[color_index].rgbGreen=Get_Palette_Green_Val(color_index);
		os_header.aColors[color_index].rgbBlue=Get_Palette_Blue_Val(color_index);
		os_header.aColors[color_index].rgbReserved=0;
	}

	// create the bitmap handle in the WinGDC
	new_buff->hbitmap=WinG.pCreateBitmap(off_screen_DC, (BITMAPINFO *)&os_header, 
		  (PVOID *)new_buff->buff_ptr_address);    
#endif

}

void Delete_Offscreen_Buffer(poff_screen_buff delete_buff) {

#ifdef OS_DOS
  DelPtr( (*(delete_buff->buff_ptr_address)));
#endif

#ifdef OS_WINDOWS
	if (cur_hbitmap==delete_buff->hbitmap) {
		SelectObject(off_screen_DC, old_mono_bitmap);
		cur_hbitmap=old_mono_bitmap;
	}
	DeleteObject(delete_buff->hbitmap);
#endif

}

poff_screen_buff Create_Offscreen_Buffer(video_data_ptr * buff_ptr_address)
{
	// make a new off_screen_buff structure
	poff_screen_buff new_buff=(poff_screen_buff)NewPtr(sizeof(off_screen_buff));
	new_buff->buff_ptr_address=buff_ptr_address;

	// just what is says
	Allocate_Offscreen_Buffer(new_buff);

// put the new buffer in the list of buffers
pbuffer_node new_buff_node=BN_Create_Node();
BN_Set_Data(new_buff_node, new_buff);
BN_Set_Next_Node(new_buff_node, buffer_list);
BN_Set_Node(buffer_list, new_buff_node);

return new_buff;
}

void Dispose_Buffer(poff_screen_buff os_buffer) {
	pbuffer_node cur_node, next_node;
	BOOL found;

	// are we dealing with and empty list, if so the node does not exist
	if (BN_Empty_Node(buffer_list)) {
		return;
	}

	// if node is the start of list, update list and delete node
	if (BN_Get_Data(buffer_list)==os_buffer) {
		BN_Set_Node(next_node, BN_Get_Next_Node(buffer_list));
		Delete_Offscreen_Buffer(BN_Get_Data(buffer_list));
		BN_Delete_Node(buffer_list);
		BN_Set_Node(buffer_list, next_node);
		return;
	}

	// find the node to be deleted
	BN_Set_Node(cur_node, buffer_list);
	found=FALSE;
	while (!BN_Empty_Node(BN_Get_Next_Node(cur_node))) {
		if (BN_Get_Data(BN_Get_Next_Node(cur_node))==os_buffer) {
			found=TRUE;
			break;
		}
		BN_Set_Node(cur_node, BN_Get_Next_Node(cur_node));
	} /* endwhile */

	// Remove the node from list and delete it
	if (found) {
		BN_Set_Node(next_node, BN_Get_Next_Node(BN_Get_Next_Node(cur_node)));
		Delete_Offscreen_Buffer(BN_Get_Data(BN_Get_Next_Node(cur_node)));
		BN_Delete_Node(BN_Get_Next_Node(cur_node));
		BN_Set_Next_Node(cur_node, next_node);
	}
}

extern "C" short LOGICAL_SCREEN_HEIGHT; // stores without screen orientation
extern "C" short LOGICAL_SCREEN_WIDTH; // same for width

void Activate_Graphics() {
#ifdef OS_DOS
	Attempt_Screen_Open(LOGICAL_SCREEN_WIDTH,  LOGICAL_SCREEN_HEIGHT);    
#endif
}

void Init_Screen(short width, short height) {

	short valid_width=((width+3)/4)*4; // bitmap should be 32 bits wide, so width must
	  // be a multiple of 4
	short valid_height=height;

#ifdef OS_DOS
	Init_Phys_Screen(valid_width, valid_height);
#endif

#ifdef OS_WINDOWS
if (!WinG.Load()) { //link to WinG DLL.
	MessageBox(0,"Can't find WING32.DLL","WTWIN Error!",MB_OK);
	return;
}
Init_Phys_Screen(valid_width, valid_height);
if(WinG.pRecommendDIBFormat((BITMAPINFO *)&os_header)) {
	//  make sure it's 8bpp and remember the orientation

	os_header.Header.biBitCount = 8;
	os_header.Header.biCompression = BI_RGB;
	Set_Phys_Orientation(os_header.Header.biHeight*(-1));
} else {
	//  set it up ourselves

	os_header.Header.biSize = sizeof(BITMAPINFOHEADER);
	os_header.Header.biPlanes = 1;
	os_header.Header.biBitCount = 8;
	os_header.Header.biCompression = BI_RGB;
	os_header.Header.biSizeImage = 0;
	os_header.Header.biClrUsed = 0;
	os_header.Header.biClrImportant = 0;
}

os_header.Header.biWidth=Get_Phys_Screen_Width();
os_header.Header.biHeight=Get_Phys_Screen_Height()*Get_Phys_Orientation() * (-1);

off_screen_DC=WinG.pCreateDC();

old_mono_bitmap=(HBITMAP)GetCurrentObject(off_screen_DC, OBJ_BITMAP);
cur_hbitmap=old_mono_bitmap;

stretch_factor=1;
#endif

Set_Screen_Window(NULL);
}

void Change_Screen(short width, short height) {
	short valid_width=((width+3)/4)*4; // bitmap should be 32 bits wide, so width must
	  // be a multiple of 4
	short valid_height=height;

#ifdef OS_DOS
  Attempt_Screen_Open(valid_width, valid_height);
  Set_Phys_Screen(valid_width, valid_height);
#endif

#ifdef OS_WINDOWS
	valid_width/=stretch_factor;
	valid_height/=stretch_factor;
	Set_Phys_Screen(valid_width, valid_height);
	// set buffer dimensions
	os_header.Header.biWidth=Get_Phys_Screen_Width();
	os_header.Header.biHeight=Get_Phys_Screen_Height() * Get_Phys_Orientation() * (-1);

#endif

// clear all buffers
pbuffer_node cur_node;
BN_Set_Node(cur_node, buffer_list);
while (!BN_Empty_Node(cur_node)) {
	Delete_Offscreen_Buffer(BN_Get_Data(cur_node));
	Allocate_Offscreen_Buffer(BN_Get_Data(cur_node));
	BN_Set_Node(cur_node, BN_Get_Next_Node(cur_node));
} /* endwhile */

// let application adjust to the change in size
App_Make_New_Screen();
}

void End_Graphics() {

// clear all buffers
pbuffer_node cur_node, next_node;
BN_Set_Node(cur_node, buffer_list);
while (!BN_Empty_Node(cur_node)) {
	Delete_Offscreen_Buffer(BN_Get_Data(cur_node));
	BN_Set_Node(next_node, BN_Get_Next_Node(cur_node));
	BN_Delete_Node(cur_node);
	BN_Set_Node(cur_node, next_node);
} /* endwhile */

// perform OS dependent graphics shutdowns
#ifdef OS_DOS
if (super_vga) {
	VESA_EndGraphics();
} else {
	setgmode(0x3);
} /* endif */
#endif

#ifdef OS_WINDOWS
DeleteDC(off_screen_DC);
WinG.Free(); //terminate WinG DLL link.
#endif

}

void Blt_Buffer(poff_screen_buff os_buffer) {
#ifdef OS_DOS
	Screen_Copy(0, (*os_buffer->buff_ptr_address), Get_Phys_Screen_Width() * Get_Phys_Screen_Height());
#endif

#ifdef OS_WINDOWS
if (cur_hbitmap!=os_buffer->hbitmap) {
	SelectObject(off_screen_DC, os_buffer->hbitmap);
	cur_hbitmap=os_buffer->hbitmap;
} /* endif */

// do a wing blit, calling a liner blit only is stretch factor is 1
	if (stretch_factor != 1)
		WinG.pStretchBlt(cur_screen_ptr,0,0,
					 stretch_factor*Get_Phys_Screen_Width(),
					 stretch_factor*Get_Phys_Screen_Height(),
		off_screen_DC,0,0,
					 Get_Phys_Screen_Width(),
					 Get_Phys_Screen_Height());
	else
		WinG.pBitBlt(cur_screen_ptr,0,0,
					 Get_Phys_Screen_Width(),
					 Get_Phys_Screen_Height(),
					 off_screen_DC,0,0);
#endif

}

#ifdef OS_WINDOWS
void Set_Stretch_Factor(short new_factor) {
	stretch_factor=new_factor;
}

short Get_Stretch_Factor() {
	return stretch_factor;
}
#endif

void Set_Screen_Window(screen_ptr new_screen_ptr) {

cur_screen_ptr=new_screen_ptr;

#ifdef OS_WINDOWS
if (cur_screen_ptr==NULL)
	cur_screen_ptr=GetDC(NULL);
#endif
}

void Release_Screen_Window() {
	Set_Screen_Window(NULL);
}

screen_ptr Get_Screen_Window() {
	return cur_screen_ptr;
}

void Clear_Buffer(poff_screen_buff os_buffer) {
#ifdef OS_DOS
memset(*(os_buffer->buff_ptr_address),BLACK_COLOR,
				Get_Phys_Screen_Width() * Get_Phys_Screen_Height() * sizeof(unsigned char));
#endif

#ifdef OS_WINDOWS
if (cur_hbitmap!=os_buffer->hbitmap) {
	SelectObject(off_screen_DC, os_buffer->hbitmap);
	cur_hbitmap=os_buffer->hbitmap;
} /* endif */

PatBlt(off_screen_DC, 0, 0, Get_Phys_Screen_Width(), Get_Phys_Screen_Height(), BLACK_COLOR);
#endif

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩日日骚| 国产成人精品免费在线| 久久无码av三级| 一本久久a久久免费精品不卡| 男女男精品视频| 国产精品免费视频一区| 日韩一区二区在线观看| 99精品视频在线免费观看| 久久不见久久见免费视频7| 亚洲三级在线免费观看| 久久久精品蜜桃| 日韩三级av在线播放| 在线观看不卡视频| 国产69精品久久久久毛片| 日韩国产欧美在线播放| 一区二区三区视频在线观看| 国产清纯在线一区二区www| 日韩一区二区在线免费观看| 欧美日韩亚洲另类| 色欧美日韩亚洲| 成人av影院在线| 欧美日韩精品一区二区三区 | 日韩欧美一区二区视频| 欧美午夜一区二区三区免费大片| 9i在线看片成人免费| 国产一区二区三区电影在线观看| 丝瓜av网站精品一区二区| 亚洲另类一区二区| 亚洲男女毛片无遮挡| 国产精品视频一二三区| 久久免费美女视频| 久久这里只有精品6| 欧美α欧美αv大片| 欧美成人三级电影在线| 日韩亚洲国产中文字幕欧美| 制服丝袜国产精品| 欧美一级二级三级蜜桃| 日韩丝袜美女视频| 日韩美女视频一区二区在线观看| 日韩一区二区免费视频| 日韩视频一区在线观看| 日韩美女一区二区三区| 精品国产乱码久久久久久1区2区| 日韩一区二区三区免费看| 欧美刺激脚交jootjob| 欧美v亚洲v综合ⅴ国产v| 久久老女人爱爱| 久久免费午夜影院| 国产蜜臀97一区二区三区| 国产精品女同互慰在线看| 中文字幕一区二区三区四区不卡 | 成人午夜碰碰视频| 国产aⅴ综合色| 99久久久精品免费观看国产蜜| 99久久99久久精品国产片果冻| 日本韩国欧美一区| 欧美日韩精品久久久| 欧美日韩高清不卡| 精品国产乱码久久久久久浪潮 | www国产亚洲精品久久麻豆| 久久久国际精品| 亚洲欧美国产三级| 香港成人在线视频| 久久99精品久久久久久国产越南| 国产精品亚洲а∨天堂免在线| 不卡影院免费观看| 欧美日韩成人综合| 久久午夜免费电影| 伊人婷婷欧美激情| 久久99久久精品欧美| 成人深夜在线观看| 欧美视频中文字幕| 久久久国际精品| 一区二区三区国产精华| 麻豆久久久久久| 成人91在线观看| 欧美高清激情brazzers| 久久综合狠狠综合久久激情| 日本一区二区不卡视频| 亚洲国产精品久久一线不卡| 国产一区二区日韩精品| 欧美在线免费视屏| 久久久久久久综合色一本| 亚洲少妇最新在线视频| 免费在线观看精品| 91免费观看在线| 欧美大黄免费观看| 亚洲精品国产无天堂网2021| 国产一区二区三区久久久| 在线观看中文字幕不卡| 久久久99久久| 日本中文字幕一区二区视频| 99久久精品国产导航| 日韩精品影音先锋| 亚洲在线观看免费视频| 成人激情午夜影院| 日韩欧美中文字幕制服| 亚洲综合一区二区三区| 成人av在线资源网| 精品国产一区二区亚洲人成毛片| 一区二区三区鲁丝不卡| 福利一区二区在线| 日韩精品一区在线观看| 亚洲v日本v欧美v久久精品| www.欧美色图| 精品国产成人系列| 天天综合色天天| 欧美午夜精品理论片a级按摩| 亚洲国产精品传媒在线观看| 日韩av二区在线播放| 色网综合在线观看| 国产精品久久久久久久午夜片 | 国产乱码精品一区二区三区av | 久久久精品影视| 蜜臀av一级做a爰片久久| 欧美特级限制片免费在线观看| 日本一区二区三区四区在线视频| 麻豆91在线看| 91精品啪在线观看国产60岁| 依依成人综合视频| 91网站在线播放| 中文字幕在线免费不卡| 高清beeg欧美| 国产精品久久久久久久浪潮网站| 国内久久精品视频| 日韩你懂的在线观看| 视频一区中文字幕| 欧美日韩视频在线一区二区| 亚洲综合色丁香婷婷六月图片| 成人午夜免费视频| 国产精品高潮久久久久无| 成人免费视频app| 中文字幕一区三区| 91亚洲国产成人精品一区二三| 国产精品嫩草久久久久| 99视频一区二区| 一区二区三区成人| 欧美在线观看视频在线| 亚洲chinese男男1069| 欧美日韩国产美| 日本va欧美va瓶| 精品国产a毛片| 国产馆精品极品| 国产精品区一区二区三区| 99久久99久久免费精品蜜臀| 日韩美女啊v在线免费观看| 日本福利一区二区| 亚洲午夜在线观看视频在线| 欧美人妇做爰xxxⅹ性高电影| 视频一区二区欧美| 日韩一级大片在线观看| 国产一区二区三区| 国产精品久久久久毛片软件| 在线观看日韩国产| 日韩精品国产精品| 久久你懂得1024| 99久久国产综合精品女不卡| 亚洲午夜久久久久久久久电影院| 欧美区一区二区三区| 国模一区二区三区白浆| 国产精品污www在线观看| 99国产精品国产精品久久| 午夜精品一区二区三区电影天堂| 日韩精品一区二区三区视频在线观看| 国产一区二区三区高清播放| 中文字幕在线播放不卡一区| 欧美蜜桃一区二区三区| 国产精品888| 亚洲一区二区三区四区的| 精品国产乱码久久久久久久久| 成人h版在线观看| 天天av天天翘天天综合网| 欧美本精品男人aⅴ天堂| aa级大片欧美| 日产国产欧美视频一区精品| 中文子幕无线码一区tr| 欧美视频在线观看一区二区| 国产在线精品不卡| 一区二区三区免费网站| 久久老女人爱爱| 欧美视频一区二区三区在线观看| 国内精品伊人久久久久av影院 | 国产成人av一区| 亚洲国产三级在线| 欧美videofree性高清杂交| 99久久精品国产导航| 精品在线视频一区| 亚洲一区二区偷拍精品| 欧美国产精品一区| 日韩欧美区一区二| 日本高清视频一区二区| 国产成人精品www牛牛影视| 日本少妇一区二区| 亚洲欧美激情一区二区| www成人在线观看| 欧美日韩一区国产| av一区二区不卡| 国产精品一区二区免费不卡 | 国产精品99久| 免费不卡在线视频|