/* Hi guys, here is a bit of code for bitmap scaling. I'm sure that it's all been seen before but it may help someone. I know that the scale loop can be optimised by introducing more variables, but if anyone spots any other optimisations, please point them out. Compile with bcc, Coments/Suggestions to ks2@st-and.ac.uk Keith */ //RAW format is first 2 words x,y dimensions,rest data //ie full screen is 64004 bytes //Use a full screen bm. //#include //#include #include #include //#include #include //#include #include char far* vga=(char far*)MK_FP(0xA000,0); char far* LoadRAW(char* fname,int& x,int& y); void SetMode13h(); void SetModeText(); void FillVGA(char c); //width,height,new width, new height, x,y of top left on screen void ScaleBM(char far* bm,int w,int h,int nw,int nh,int xpos,int ypos) { char far* loc=vga+xpos+320*ypos; char far* bmc=bm; static long fpxinc,fpxcur,fpyinc,fpycur; fpxinc=(long)((long)w*65535L)/(long)nw; fpyinc=(long)((long)h*65535L)/(long)nh; register int i,j; fpycur=0; for(j=0;j>16]; fpxcur+=fpxinc; } loc+=320; bmc=&bm[(fpycur>>16) * w]; fpycur+=fpyinc; } } extern void SetMode13h(); extern void SetModeText(); main(int argc,char** argv) { char far* bm; long x,y,z; int w,h; if(argc!=2) exit(1); bm=LoadRAW(argv[1],w,h); if(bm==NULL) exit(1); // pal* p; argv[1][strlen(argv[1])-3]='p'; argv[1][strlen(argv[1])-2]='a'; argv[1][strlen(argv[1])-1]='l'; // p=LoadPal(argv[1]); SetMode13h(); // SetPal(p); x=w/2; y=h/2; char q=0; while(q!=27) { int xscr,yscr; for(z=400;z>16;z--) { xscr=(x<<4)/z; //d=2^4=16 => screen fill at z=16 with fullscr bm yscr=(y<<4)/z; ScaleBM(bm,w,h,xscr*2,yscr*2,-xscr+160,-yscr+100); } q=getch(); FillVGA(0); } SetModeText(); return(0); } void SetMode13h() { _AH=0; //BIOS service 00h _AL=0x13; //mode 13h asm int 0x10 } void SetModeText() { _AH=0; _AL=0x03; asm int 0x10 } void FillVGA(char c) { _fmemset(vga,c,64000L); } #include #include #include #include "raw.h" char far* LoadRAW(char* fname,int& x,int& y) { FILE* file=fopen(fname,"rb"); if(file==NULL) { printf("Cannot open %s\n",fname); return NULL; } fread(&x,2,1,file); fread(&y,2,1,file); struct stat statbuf; fstat(fileno(file),&statbuf); // if((long)x*(long)y != (long)statbuf.st_size-4) { // printf("Invalid file %s\n",fname); // return NULL; } char far* rawbuf=(char far*)farmalloc((long)statbuf.st_size-4); if(rawbuf==NULL) { printf("Alloc failed\n"); return NULL; } for(long i=0;i