⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preview.c

📁 超级解霸源代码。纯c语言写的。适合有一定编程基础的开发人员用来学习提高
💻 C
字号:
////////////////////////////////////////////////////////
//		PreView picture handle
//	      Decode a stamp just 64 X 56
//	   And Display it in Preview position
//		    Southern.Liang
//		       1996.5.25
////////////////////////////////////////////////////////
#pragma	option	-zCOTHER_TEXT
#include <windows.h>
#include "DOS.H"
#include "VCDAPI.H"

typedef	struct	VIDEODATAtag
	{
	DWORD	SelfFlags;	//'STH!'
	DWORD	YPlane;		//Video offset
	DWORD	UPlane;
	DWORD	VPlane;
	DWORD	Selector;	//Video Selector
	DWORD	DataStride;
	DWORD	LineWidth;	//352
	DWORD	LineNumber;	//240 or 288
	}VIDEODATA,FAR *LPVIDEODATA;

extern	int	Pixels;
extern	int	Line;
extern	HGLOBAL	OffScrSel;
extern	int	DeleteLine;
extern	int	Start;
BITMAPINFO	BitmapInfo=
{
	{
	sizeof(BITMAPINFOHEADER),
	64,
	56,
	1,
	24,
	BI_RGB,
	0,
	0,//	biXPelsPerMeter;
	0,//	biYPelsPerMeter;
	0,
	0
	},
	0
};
BYTE	far	PreViewBuffer[56][64][3];	//64*56*4 RGB 24
static	DWORD	PASCAL	PreviewComputRGB(void)
{
	int	Y,Cb,Cr,Cg;
	int	R,G,B;
	DWORD	RGB;
	__emit__(0x65,0x67,0x8A,0x07);//mov al,gs:[edi] Y
	__emit__(0x65,0x67,0x8A,0x1E);//mov bl,gs:[esi] U
	__emit__(0x65,0x67,0x8A,0x96,0x40,0x02,0x00,0x00);//mov dl,gs:[esi+0x240] V
	Y=_AL;
	Cb=_BL;
	Cr=_DL;
	Cb-=128;
	Cr-=128;
	Cg=Cr/2;
	R=Y+Cr;
	G=Y-Cg;
	B=Y+Cb;
	if(R>255) R=255;
	if(G>255) G=255;
	if(B>255) B=255;
	if(R<0) R=0;
	if(G<0) G=0;
	if(B<0) B=0;
	*((BYTE *)&RGB)=R;
	*((BYTE *)&RGB+1)=G;
	*((BYTE *)&RGB+2)=B;
	*((BYTE *)&RGB+3)=0;
	return	RGB;
}
extern	HWND	MainWindow;	//Main Windows
static	void	PASCAL	PreView24BitPicture(void)
{	//Preview little picture
	int	i,line,Count;
	int	UVLine;
	HDC	hdc;
	LPVIDEODATA	VideoDataPtr;
	BYTE 	far *	Ptr;

	if(Start)	return;	//Had off screen not draw the preview picture
	if(OffScrSel==NULL) return;
	VideoDataPtr=MK_FP(OffScrSel,0);
	if(VideoDataPtr->SelfFlags!=0x21485453) return;
	_AX=VideoDataPtr->Selector;
	__emit__(0x8E,0xE8);//mov gs,ax
	if(DeleteLine==5)
		{
		/////////////352x240/////////////
		UVLine=Count=0;
		for(line=0;line<56;line++)
			{
			Count++;
			for(i=0;i<16;i++)
				{
				Ptr=&PreViewBuffer[55-line][i*4][0];
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=6;
				VideoDataPtr->UPlane+=3;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=5;
				VideoDataPtr->UPlane+=2;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=6;
				VideoDataPtr->UPlane+=3;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=5;
				VideoDataPtr->UPlane+=3;
				}
			VideoDataPtr->YPlane+=800;
			if(Count<3)
				{
				VideoDataPtr->YPlane+=4*0x480;
				UVLine+=4;
				}
			else	{
				VideoDataPtr->YPlane+=3*0x480;
				UVLine+=3;
				if(Count>=7) Count=0;
				}
			UVLine++;
			VideoDataPtr->UPlane=VideoDataPtr->VPlane+(UVLine/2)*0x480L;
			}
		}
	else	{
		/////////////352x288/////////////
		UVLine=Count=0;
		for(line=0;line<56;line++)
			{
			Count++;
			for(i=0;i<16;i++)
				{
				Ptr=&PreViewBuffer[55-line][i*4][0];
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=6;
				VideoDataPtr->UPlane+=3;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=5;
				VideoDataPtr->UPlane+=2;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=6;
				VideoDataPtr->UPlane+=3;
				_EDI=VideoDataPtr->YPlane;
				_ESI=VideoDataPtr->UPlane;
				PreviewComputRGB();
				*(short far *)Ptr=_AX;Ptr+=2;
				*Ptr++=_DL;
				VideoDataPtr->YPlane+=5;
				VideoDataPtr->UPlane+=3;
				}
			VideoDataPtr->YPlane+=800;
			if(Count<7)
				{
				VideoDataPtr->YPlane+=4*0x480;
				UVLine+=4;
				}
			else	{
				VideoDataPtr->YPlane+=5*0x480;
				UVLine+=5;
				Count=0;
				}
			UVLine++;
			VideoDataPtr->UPlane=VideoDataPtr->VPlane+(UVLine/2)*0x480L;
			}
		}
	///////////// Display this sample ///////////
	hdc=GetDC(MainWindow);
	SetDIBitsToDevice(hdc,47,24,64,56,0,0,0,56,&PreViewBuffer[0][0][0],&BitmapInfo,DIB_RGB_COLORS);
	ReleaseDC(MainWindow,hdc);
}
static	void	PASCAL	PreView24BitReDraw(void)
{
	HDC	hdc;
	LPVIDEODATA	VideoDataPtr;

	if(Start)	return;	//Had off screen not draw the preview picture
	if(OffScrSel==NULL) return;
	VideoDataPtr=MK_FP(OffScrSel,0);
	if(VideoDataPtr->SelfFlags!=0x21485453) return;
	hdc=GetDC(MainWindow);
	SetDIBitsToDevice(hdc,47,24,64,56,0,0,0,56,&PreViewBuffer[0][0][0],&BitmapInfo,DIB_RGB_COLORS);
	ReleaseDC(MainWindow,hdc);
}
///////////////////// Gray Preview picture /////////////////
typedef struct BMPINFOtag
	{
	BITMAPINFOHEADER    BmpInfoHeader;
	RGBQUAD             DAC[256];
	} BMPINFO;
BMPINFO	far *	BmpInfoPtr=NULL;
/*
BMPINFO	BmpInfo=
{
	{
	sizeof(BITMAPINFOHEADER),
	64,
	56,
	1,
	8,
	BI_RGB,
	64*56,
	0,//	biXPelsPerMeter;
	0,//	biYPelsPerMeter;
	256,
	256
	},
	0
};
*/
HPALETTE	PreviewhPal=0;
static	void	Build256CBmpInfo(void)
{
	BYTE far *	Ptr;
	int		i;

	Ptr=&PreViewBuffer[0][0][0];
	(BYTE far *)BmpInfoPtr=(Ptr+0xF00);
	///////////// Build Bmp header ////////////////
	BmpInfoPtr->BmpInfoHeader.biSize	=sizeof(BITMAPINFOHEADER);
	BmpInfoPtr->BmpInfoHeader.biWidth	=64;
	BmpInfoPtr->BmpInfoHeader.biHeight	=56;
	BmpInfoPtr->BmpInfoHeader.biPlanes	=1;
	BmpInfoPtr->BmpInfoHeader.biBitCount	=8;
	BmpInfoPtr->BmpInfoHeader.biCompression=BI_RGB;
	BmpInfoPtr->BmpInfoHeader.biSizeImage	=64*56;
	BmpInfoPtr->BmpInfoHeader.biXPelsPerMeter=0;
	BmpInfoPtr->BmpInfoHeader.biYPelsPerMeter=0;
	BmpInfoPtr->BmpInfoHeader.biClrUsed	=256;
	BmpInfoPtr->BmpInfoHeader.biClrImportant=256;
	///////////////// DAC Palette ////////////
	for(i=0;i<256;i++)
		{
		BmpInfoPtr->DAC[i].rgbRed	=i;
		BmpInfoPtr->DAC[i].rgbGreen	=i;
		BmpInfoPtr->DAC[i].rgbBlue	=i;
		BmpInfoPtr->DAC[i].rgbReserved	=0;
		}
}

static	void	CreatePreviewPalette(void)
{
	HGLOBAL		PalMem;
	LOGPALETTE FAR* lpPal;
	int		i;
	HDC		hdc;

	PalMem=GlobalAlloc(GMEM_MOVEABLE,sizeof(LOGPALETTE)+
		BmpInfoPtr->BmpInfoHeader.biClrUsed*sizeof(PALETTEENTRY));
	if(PalMem==NULL) return;
	lpPal=(LOGPALETTE FAR*)GlobalLock(PalMem);
	lpPal->palNumEntries 	= 256;
	lpPal->palVersion 	= 0x300;
	for(i=0;i<256;i++)
		{
		lpPal->palPalEntry[i].peRed	=i;
		lpPal->palPalEntry[i].peGreen	=i;
		lpPal->palPalEntry[i].peBlue	=i;
		lpPal->palPalEntry[i].peFlags	=0;
		}
	PreviewhPal=CreatePalette(lpPal);
	GlobalUnlock(PalMem);
	GlobalFree(PalMem);
}
/************************************\
void	PASCAL	PreviewGetYData(void)
{
	__emit__(0x65,0x67,0x8A,0x07);//mov al,gs:[edi]
}
\************************************/
#define	PreviewGetYData()	__emit__(0x65,0x67,0x8A,0x07)
static	void	PASCAL	PreViewGrayPicture(void)
{	//Preview little picture
	int	i,line,Count;
	HDC	hdc;
	LPVIDEODATA	VideoDataPtr;
	BYTE 	far *	VideoPtr;
	BYTE 	far *	Ptr;
	HPALETTE	hOldPal;

	if(Start)	return;	//Had off screen not draw the preview picture
	if(OffScrSel==NULL) return;
	VideoPtr=&PreViewBuffer[0][0][0];
	VideoDataPtr=MK_FP(OffScrSel,0);
	if(VideoDataPtr->SelfFlags!=0x21485453) return;
	_AX=VideoDataPtr->Selector;
	__emit__(0x8E,0xE8);//mov gs,ax
	if(DeleteLine==5)
		{
		/////////////352x240/////////////
		Count=0;
		for(line=0;line<56;line++)
			{
			Count++;
			Ptr=VideoPtr+(55-line)*64;
			for(i=0;i<16;i++)
				{
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=6;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=5;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=6;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=5;
				}
			VideoDataPtr->YPlane+=800;
			if(Count<3)
				{
				VideoDataPtr->YPlane+=4*0x480;
				}
			else	{
				VideoDataPtr->YPlane+=3*0x480;
				if(Count>=7) Count=0;
				}
			}
		}
	else	{
		/////////////352x288/////////////
		Count=0;
		for(line=0;line<56;line++)
			{
			Count++;
			Ptr=VideoPtr+(55-line)*64;
			for(i=0;i<16;i++)
				{
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=6;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=5;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=6;
				_EDI=VideoDataPtr->YPlane;
				PreviewGetYData();
				*Ptr++=_AL;
				VideoDataPtr->YPlane+=5;
				}
			VideoDataPtr->YPlane+=800;
			if(Count<7)
				{
				VideoDataPtr->YPlane+=4*0x480;
				}
			else	{
				VideoDataPtr->YPlane+=5*0x480;
				Count=0;
				}
			}
		}
	///////////// Display this sample ///////////
	if(BmpInfoPtr==NULL) Build256CBmpInfo();
	hdc=GetDC(MainWindow);
	if(PreviewhPal==0) CreatePreviewPalette();
	if(PreviewhPal==0) PreView24BitPicture();	//Can create PAL use 24 Bit format
	hOldPal = SelectPalette (hdc,PreviewhPal,FALSE);
	RealizePalette(hdc);
	SetDIBitsToDevice(hdc,47,24,64,56,0,0,0,56,&PreViewBuffer[0][0][0],
				(BITMAPINFO FAR*)BmpInfoPtr,DIB_RGB_COLORS);
	SelectPalette (hdc,hOldPal,FALSE);
	ReleaseDC(MainWindow,hdc);
}
static	void	PASCAL	PreViewGrayReDraw(void)
{
	HDC	hdc;
	LPVIDEODATA	VideoDataPtr;
	HPALETTE	hOldPal;

	if(Start)	return;	//Had off screen not draw the preview picture
	if(OffScrSel==NULL) return;
	VideoDataPtr=MK_FP(OffScrSel,0);
	if(VideoDataPtr->SelfFlags!=0x21485453) return;
	if(BmpInfoPtr==NULL) Build256CBmpInfo();
	hdc=GetDC(MainWindow);
	if(PreviewhPal==0) CreatePreviewPalette();
	if(PreviewhPal==0) PreView24BitPicture();	//Can create PAL use 24 Bit format
	hOldPal = SelectPalette (hdc,PreviewhPal,FALSE);
	RealizePalette(hdc);
	SetDIBitsToDevice(hdc,47,24,64,56,0,0,0,56,&PreViewBuffer[0][0][0],
				(BITMAPINFO FAR*)BmpInfoPtr,DIB_RGB_COLORS);
	SelectPalette (hdc,hOldPal,FALSE);
	ReleaseDC(MainWindow,hdc);
}
///////////////////////////////////////
extern	int	WindowsColorBits;	//Windows now Color bits
void	PASCAL FAR	PreViewPicture(void)
{	//Preview little picture
	if(WindowsColorBits>8)	PreView24BitPicture();
	else	PreViewGrayPicture();
}
void	PASCAL FAR	PreViewReDraw(void)
{
	if(WindowsColorBits>8)	PreView24BitReDraw();
	else	PreViewGrayReDraw();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -