/***************************************************************************
	 Программа просмотра логотипов Windows95 написана специально для
         демонстрации возможностей С-- v0.212 при использовании структур.
         Размер logoview.com - 1143 байта.
***************************************************************************/

?parsecommandline TRUE
?resize TRUE
?codesize
?jumptomain NONE
?use80386

?include "WRITE.H--"
?include "file.h--"
?include "bmp.h--"
?include "vgans.h--"
?include "keycodes.h--"
?include "video.h--"

?define NUMCOLOR 256

int sizerot,startpal;
struct _BITMAPINFOHEADER info;
struct _RGBQUAD bufpal[NUMCOLOR];
struct PALITRA pal[NUMCOLOR];

main()
int handl,i,sizestr;
struct _BITMAPFILEHEADER header;
int bufstr;
char rot,naprvl;
int j;
{
	IF(@PARAMCOUNT()==0){
		WRITESTR("\nLOGOVIEW - программа просмотра файлов Windows логотипов.\nЗапуск: LOGOVIEW file\n");
		return;
	}
	@PARAMSTR(0);
	DX><AX;
	handl=@FOPEN(0);
	IF((AX==0){
		WRITESTR("Не могу открыть файл.\n");
		return ;
	}
	FREAD(,AX,sizeof(header),#header);
	IF(header.Type!=0x4d42){
		WRITESTR("Файл неизвестного формата");
		return ;
	}
	FREAD(,handl,sizeof(info),#info);
	IF(info.BitCount!=8){
		WRITESTR("Этот файл имеет не 256 цветов");
		return ;
	}
	FSEEK(SEEK_SET,handl,0,sizeof(_BITMAPFILEHEADER)+info.Size);
	sizestr=info.Width%4;	//опр размер буфера под строку экрана
	IF(AX==0)sizestr=info.Width;
	ELSE sizestr=info.Width/4+1*4;
	bufstr=@GETMEM(sizestr);
	FREAD(,handl,sizeof(bufpal),#bufpal);	//считать палитру
	FOR(i=0;i<NUMCOLOR;i++){	//преобразовать паллитру в удобный вид
		pal[i].Red=bufpal[i].Red/4;
		pal[i].Green=bufpal[i].Green/4;
		pal[i].Blue=bufpal[i].Blue/4;
	}
	SET320X400MODE();	//уст режим 320 х 400
	SETVGADAC(0,,NUMCOLOR*3,,,#pal);	//загрузить палитру
	FSEEK(SEEK_SET,handl,0,header.Offbits);	//на начало картинки
	FOR(i=info.Height;i>0;i--){	//вывести картинку на экран
		@READFAR(,handl,sizestr,bufstr);
		FOR(j=0;j<info.Width;j++){
			ES=bufstr;
			BX=j;
			BL=ESBYTE[BX];
			@WRITEPIXEL400(,,j,i-1);
		}
	}
	IF(info.PalRot==0)rot=FALSE;	//надо ли манипулировать с палитрой?
	ELSE{
		rot=TRUE;                   //параметры для манипуляции с палитрой
		naprvl=TRUE;
		sizerot=256-info.PalRot;
		startpal=info.PalRot;
	}
	for(;;){
		do{
			IF(rot==TRUE){
				IF(info.StyleRot==0){
					SavePal();
					startpal++;
					IF(startpal==256)startpal=info.PalRot;
				}
				ELSE{
					IF(naprvl==TRUE){
						SavePal();
						startpal++;
						IF(startpal==256){
							naprvl=FALSE;
							startpal--;
						}
					}
					ELSE{
						SavePal();
						startpal--;
						IF(startpal<info.PalRot){
							naprvl=TRUE;
							startpal++;
						}
					}
				}
			}
			WAITVSYNC();
		}while(@KBHIT()==0);
		IF(@BIOSREADKEY()==k_esc)BREAK;
	}
	@SETVIDEOMODE(vid_text80c);
	@FREEMEM(bufstr);
	@FCLOSE(,handl);
  WRITESTR(" (C) Copyrigth M.Sheker\nThe continuation follows...");
}

void SavePal()
int i,j;
{
	WAITVSYNC();
	i=256-startpal;
	SETVGADAC(info.PalRot,,i*3,,,#pal[startpal]);
	j=sizerot-i*3;
	IF(j!=0)SETVGADAC(info.PalRot+i,,j,,,#pal[info.PalRot]);
}
