#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <alloc.h>


#define largesize 32000
typedef struct{int x,y;} Point;
typedef int Large[32000];
typedef int Line[4];

int far Pressed;
Point far Press;
unsigned char pal[256][3];

int far *region[240];
int regc[240];
Line glob[4];



void init320x200(){
  asm{
	mov ax,0x13
	int 10h
  }
}
void textm(){
  asm{
	mov ax,3
	int 10h
  }
}
int showmouse(){
  asm{
	mov ax,0
	int 33h
  }
  if(_AX!=0xffff)return 0;
  asm{
	mov ax,1
	int 33h
  }
  return 1;
}
void hidemouse(){
  asm{
	mov ax,2
	int 33h
  }
}
void far myhook(){
  unsigned int t1,t2;
  asm{
	pusha
	pusha
	mov t1,cx
	mov t2,dx
	popa
  }
  Pressed=1;
  Press.x=t1/2;
  Press.y=t2;

  asm popa
}

void hookmouse(){
  asm{
	push ax
	push cx
	push dx
	push es

	mov ax,00Ch
	mov cx,10
	push cs
	pop  es
	mov dx,offset myhook
	int 33h

    pop es
    pop dx
    pop cx
    pop ax
  }
}
void chpal(int s,int e){
  int t=e-s;
  char *off=(char*)&pal+3*s;
  asm{
	pusha
	push ds
	pop es
	mov dx,off
	mov ax,1012h
	mov bx,s
	mov cx,t
	int 10h
	popa
  }
}
void InitPal(){
  int i;
  for(i=0;i<240;i++){
	pal[i][0]=((i>>5)*255)/7;
	pal[i][1]=(((i>>2)&7)*255)/7;
	pal[i][2]=((i&3)*255)/3;
  }
  for(i=240;i<255;i++){
	pal[i][0]=(i-240)*16;
	pal[i][1]=(i-240)*16;
	pal[i][2]=(i-240)*16;
  }
  pal[255][0]=pal[255][1]=pal[255][2]=255;
  chpal(0,255);
}

void putpix(int x,int y,int c){
  *(unsigned char far*)( 0xA0000000L+320L*(y)+x)=c;
}
int getpix(int x,int y){
  return *(unsigned char far*)( 0xA0000000L+320L*(y)+x);
}
void scrollpal(){
  int j,k,l;
  j=pal[240][0];k=pal[240][1];l=pal[240][2];
  memmove(&pal[240][0],&pal[241][0],14*3);
  pal[254][0]=j;pal[254][1]=k;pal[254][2]=l;
  chpal(240,254);
}
void myexit(int a){
  switch(a){
	case 3:printf("Error in Input File!\n");
	break;
  }
  exit(a);
}
void Draw(int x1,int y1,int x2,int y2,int index){
  int i,j;
  if(x1<0||y1<0||x2>319||y2>199||index<1||index>239)myexit(3);
  for(i=y1;i<=y2;i++)
	for(j=x1;j<=x2;j++)putpix(j,i,index);
}
void swap(int &i,int &j){
  int tmp=i;i=j;j=tmp;
}
void Make(int far*a,int far*b){
  if(a[0]==a[2]){
	if(b[0]!=b[2]||a[0]!=b[0])return;
	if(a[0]<b[0]){
	  if(a[2]<b[0])return;
	  swap(a[2],b[0]);
	}else{
	  if(a[2]>b[0])return;
	  swap(a[2],b[0]);
	}
	return;
  }
  if(a[1]==a[3]){
	if(b[1]!=b[3]||a[1]!=b[1])return;
	if(a[1]<b[1]){
	  if(a[3]<b[1])return;
	  swap(a[3],b[1]);
	}else{
	  if(a[3]>b[1])return;
	  swap(a[3],b[1]);
	}
  }
}

void drawline(int far *a,int ind){
  int i;
  if(a[0]==a[2]){
	for(i=a[1];i<a[3];i++) if(ind>0)putpix(a[0],i,ind);
		  else putpix(a[0],i,i%14+240);
  }
  else if(a[1]==a[3]){
	for(i=a[0];i<a[2];i++) if(ind>0)putpix(i,a[1],ind);
		  else putpix(i,a[1],i%14+240);
  }else {printf("Error !\n");myexit(4);}
}






FILE *inf;
void main(int argc,char *argv[] ){
  char line[100];
  int i,j,k,l,index,p,m;

  if(argc!=2){
	printf("Usage: 01mview.exe <mdf file>\n");
	exit(2);
  }
  inf=fopen(argv[1],"rt");
  if(inf==NULL){printf("Input File Not Found!\n");exit(3);}
  init320x200();
  InitPal();
  Pressed=0;
//  for(i=0;i<320;i++)putpix(i,0,i%15+240);

  fgets(line,100,inf);
  if(line[3]!='/')myexit(3);
  line[3]=0;
  if(strcmp(line,"MDF"))myexit(3);
  i=atoi(&line[4]);
  if(i<1||i>4)myexit(3);
  for(i=0;i<240;i++)regc[i]=0;



  while(!feof(inf)){
	fscanf(inf,"%d %d %d %d %d",&index,&i,&j,&k,&l);
	if(i>k)swap(i,k);
	if(j>l)swap(j,l);
	Draw(i,j,k,l,index);
	if(!regc[index]){
	  region[index]=(int far*)farcalloc(largesize,2);
	}
	glob[0][0]=i;glob[0][1]=j;glob[0][2]=i;glob[0][3]=l;
	glob[1][0]=i;glob[1][1]=j;glob[1][2]=k;glob[1][3]=j;
	glob[2][0]=k;glob[2][1]=j;glob[2][2]=k;glob[2][3]=l;
	glob[3][0]=i;glob[3][1]=l;glob[3][2]=k;glob[3][3]=l;
	for(p=0;p<regc[index];p++)
	  for(m=0;m<4;m++)
		Make(&region[index][p*4],(int far*)&glob[m]);

	i=regc[index];
	for(m=0;m<4;m++){
	  if(glob[m][0]<glob[m][2]||glob[m][1]<glob[m][3]){
		for(j=0;j<4;j++)region[index][i*4+j]=glob[m][j];
		i++;
	  }
	}
	regc[index]=i;
  }
  if(!showmouse()){printf("No Mouse driver installed!\n");exit(1);}
  hookmouse();


  int tekindex=-1;
  do{
	scrollpal();
	delay(100);
	if(!Pressed)continue;
	Pressed=0;
	index=getpix(Press.x,Press.y);
	if(!index||index>239)continue;
	if(tekindex>0){
	  for(i=0;i<regc[tekindex];i++)drawline(&region[tekindex][i*4],tekindex);
	}
	for(i=0;i<regc[index];i++)drawline(&region[index][i*4],-1);
	tekindex=index;
  }while(!kbhit()||(getch()!=27));


  textm();
  hidemouse();
//  getch();
  fcloseall();
}