-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbmp.h
208 lines (205 loc) · 4.31 KB
/
bmp.h
1
/* Bmp.h Code from Whyp Code took from SysXpl4 sources SysXpl Copyright (c) 2002 Whyp www.graphx-prog.fr.st*/int bmpview(char fichier[]){FILE *fp;char txt[30];long taille,log_ttl,log_aff,largeur,longueur,horz=0,haut=0,vert;short i,j,k,inf[1],move=0;unsigned char *tampon,buf,mask,bord;if ((fp = fopen(fichier,"rb")) == NULL) /*ouvre le bmp en lecture binaire */ {error: asm push ax; asm mov ax,0x07; asm int 0x10; asm pop ax; print3(25,10,"ERROR"); print3(6,32,"PRESS A KEY..."); showpage(); waitkey(); fclose(fp); return 0; }fseek(fp,0x00,SEEK_SET);fread(inf,2,1,fp);if (inf[0] != 0x4D42) { fclose(fp); goto error; }fseek(fp,0x12,SEEK_SET);fread(inf,2,1,fp);longueur=inf[0];log_aff=inf[0];log_ttl=inf[0];if (log_ttl%32) log_ttl = 32 * (log_aff/32+1);bord = 8-log_ttl+log_aff;fseek(fp,0x16,SEEK_SET);fread(inf,2,1,fp);largeur=inf[0];vert=largeur;print3(25,10,"BMP VIEWER");print3(6,20,"FILE INFORMATION :");invline(0);sprintf(txt,"RATIO : %ld X %ld",longueur,largeur);print3(8,26,txt);print3(8,32,"COLOR : 1BIT");print3(6,44,"PRESS EXE/F1 TO LAUNCH..");print3(6,50,"PRESS ESC/F6 TO QUIT...");log_ttl/=8;showpage();waitbmp:switch(waitkey()){ case 64:case 1:return 0; case 28:case 59:break; default:goto waitbmp; }if (vert>64) largeur=64;if (log_ttl>16) log_aff=16; else log_aff=log_ttl;horz=0;haut=0;tampon = (char *) malloc(log_ttl);asm mov ax,0x07;asm int 0x10;Move :fseek(fp,haut*log_ttl+horz+0x3E,SEEK_SET);if (horz>=log_ttl-17) mask = 0xFF >> bord;else mask=0;asm mov ax,0x1A20;asm mov es,ax;for (i=0;i<largeur;i++) { fread(tampon,1,log_ttl,fp); k=log_aff-1; tampon[k]^=mask; asm mov si,i; for (j=1;j<=log_aff;j++) { buf=tampon[k--]; asm mov bl,buf; asm not bl; asm mov es:[si],bl; asm add si,64; } }Movebmp: move=0; switch (waitkey()) //Compare et agit selon sa valeur { case 72 : if (vert>64 && (haut+63) < vert) //Haut { if ((haut+71)<vert) haut +=8; else haut=vert-64; goto Move; } break; case 80 : if (vert>64 && haut !=0) //Bas { if(haut-8>0) haut-=8; else haut=0; move=1; } break; case 75 : if (longueur >128 && horz>0) //gauche { horz--; move=1; } break; case 77 : if (longueur >128 && horz+17 <log_ttl) //droite { horz++; move=1; } break; /*case 55 : if (vert>64 && (haut+63) < vert) //Haut-gauche { if ((haut+71)<vert) haut +=8; else haut=vert-64; move=1; } if (longueur >128 && horz>0) { horz--; move=1; } break; case 57 : if (vert>64 && (haut+63) < vert) //Haut-droite { if ((haut+71)<vert) haut +=8; else haut=vert-64; move=1; } if (longueur >128 && horz+17 <log_ttl) { horz++; goto Move; } break; case 49 : if (vert>64 && haut !=0) //Bas-gauche { if(haut-8>0) haut-=8; else haut=0; move=1; } if (longueur >128 && horz>0) { horz--; move=1; } break; case 51 : if (vert>64 && haut !=0) //Bas-droite { if(haut-8>0) haut-=8; else haut=0; move=1; } if (longueur >128 && horz+17 <log_ttl) { horz++; move=1; } break; */ case 1 : //ESC case 28 : fclose(fp); //EXE free(tampon); for (i=0;i<=20000;i++); return 0; case 49 : haut=0; //1 horz=0; goto Move; case 50 : haut=0; //2 if (longueur >128) horz=(log_ttl-17)/2; goto Move; case 51 : haut=0; //3 if (longueur >128 ) horz=log_ttl-17; goto Move; case 52 : horz=0; //4 if (vert>64) haut=(vert-64)/2; goto Move; case 53 : if (vert>64) haut=(vert-64)/2; //5 if (longueur >128) horz=(log_ttl-17)/2; goto Move; case 54 : if (longueur >128 ) horz=log_ttl-17; //6 if (vert>64) haut=(vert-64)/2; goto Move; case 55 : horz=0; //7 if (vert>64) haut=vert-64; goto Move; case 56 : if (vert>64) haut=vert-64; //8 if (longueur >128) horz=(log_ttl-17)/2; goto Move; case 57 : if (longueur >128 ) horz=log_ttl-17; //9 if (vert>64) haut=vert-64; goto Move; }if (move==1) goto Move;goto Movebmp; // sinon on on reteste une touche}