📄 main4.c
字号:
#include "GrTry.c"
typedef struct tagRGBQUAD /* 用于读取调色板信息 */
{
UINT8 r;
UINT8 g;
UINT8 b;
UINT8 reserved;
} RGBQUAD;
int main()
{
INT16 fp;
INT16 i, j;
UINT32 Width, Height, Linebytes;
UINT8 Buffer[768];
RGBQUAD bmiColors[256];
struct REGPACK reg;
InitSVGA(); /* 图形初始化开始 */
SetSVGAMode(TRY640X480X256); /* 实现图形模式 */
if ((fp = open("mnls.bmp", O_RDONLY|O_BINARY)) == -1)
{
printf("can't open the file!");
getch();
return 0;
}
lseek(fp, 18L, SEEK_SET); /* 读取文件宽高 */
read(fp, &Width, 4);
read(fp, &Height, 4);
if (Width%4) /* 拼凑4字节倍数 */
{
Linebytes = Width+(4-Width%4);
}
else
{
Linebytes = Width;
}
/*----------以下为设置调色板信息----------*/
lseek(fp, 54L, SEEK_SET);
if (read(fp, (char *)bmiColors, 1024) != 1024) /* 读当前图片调色板数据 */
{
printf("Can't get palette !\n");
bioskey(0);
exit(0);
}
for (i = 0, j = 0; i < 256; ++i, j +=3) /* 拼凑信息 */
{
Buffer[j] = bmiColors[i].b >> 2;
Buffer[j + 1] = bmiColors[i].g >> 2;
Buffer[j + 2] = bmiColors[i].r >> 2;
}
reg.r_ax = 0x1012;
reg.r_bx = 0;
reg.r_cx = 256;
reg.r_es = FP_SEG(Buffer);
reg.r_dx = FP_OFF(Buffer);
intr(0x10, ®); /* 使用中断完成设置 */
lseek(fp, 1078L, SEEK_SET); /* 开始读取图形数据 */
SelectPage(4);
for (i = Height-1; i >= 0; i--)
{
read(fp, Buffer, Linebytes);/* 一次读取一行 */
switch (i)
{
case 102:
movedata(FP_SEG(Buffer+256), FP_OFF(Buffer+256), FP_SEG(VideoBuffer+(640*i)+256), FP_OFF(VideoBuffer+(640*i)+256), 384);
SelectPage(0);
movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 256);
break;
case 204:
movedata(FP_SEG(Buffer+512), FP_OFF(Buffer+512), FP_SEG(VideoBuffer+(640*i)+512), FP_OFF(VideoBuffer+(640*i)+512), 128);
SelectPage(1);
movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 512);
break;
case 307:
movedata(FP_SEG(Buffer+128), FP_OFF(Buffer+128), FP_SEG(VideoBuffer+(640*i)+128), FP_OFF(VideoBuffer+(640*i)+128), 512);
SelectPage(2);
movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 128);
break;
case 409:
movedata(FP_SEG(Buffer+384), FP_OFF(Buffer+384), FP_SEG(VideoBuffer+(640*i)+384), FP_OFF(VideoBuffer+(640*i)+384), 256);
SelectPage(3);
movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 384);
break;
default:
movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), Linebytes);
}
}
close(fp);
getch();
ExitSVGA(); /* 恢复原始的模式 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -