{ Here is a version of a bitmap scaler. It is rather old and isn't very optimized. Please do not send improvements to me, as I don't want them. The unit IMAGE is included in the next message. } Program ScaleImage; { A bitmap scaler } { Alex Chalfin achalfin@uceng.uc.edu } { About 1 1/2 years old. It works and its pretty fast } { Sorry about the Pascal only, bungled, uncommented code } Uses Crt,Image; Var Pic, Bit : Pointer; X, y, z, A1, A12 : Integer; Procedure Scale(Factor : Real; Var Image, Scaled : Pointer); Var NewLength, NewWidth, Segment, Offset, ScaleSeg, ScaleOfs : Word; ScaleSize, Count3, Count2, Count, Orig, Orig2, TallStep, SideStep : Word; Msb, Lsb, TallLeft, SideLeft, TallSkip, SideSkip : Byte; Begin Segment := Seg(Image^); Offset := Ofs(Image^); Msb := Mem[Segment:Offset + 2]; Lsb := Mem[SegMent:Offset + 3]; Orig2 := (Msb ShL 8) + Lsb; ScaleSize := Trunc((Factor * Factor) * ((MsB ShL 8) + LsB)); GetMem(Scaled, (ScaleSize) + 4); ScaleSeg := Seg(Scaled^); ScaleOfs := Ofs(Scaled^); Msb := Mem[Segment:Offset]; Lsb := Mem[Segment:Offset + 1]; Orig := ((Msb ShL 8) + LsB); NewWidth := Trunc(Factor * Orig); NewLength := Trunc(Factor * (Orig2 div Orig)); A1 := newwidth; A12 := newlength; TallStep := Trunc(NewLength / (Orig2 div Orig)); SideStep := NewWidth Div Orig; TallLeft := NewLength Mod TallStep; SideLeft := NewWidth Mod SideStep; Mem[ScaleSeg:ScaleOfs] := NewWidth Shr 8; Mem[ScaleSeg:ScaleOfs + 1] := NewWidth and 255; Mem[ScaleSeg:ScaleOfs + 2] := (NewLength * NewWidth + 4) Shr 8; Mem[ScaleSeg:ScaleOfs + 3] := (NewLength * NewWidth + 4) and 255; ScaleOfs := ScaleOfs + 4; Offset := Offset + 4; If TallLeft > 0 Then TallSkip := TallSkip + 1; If SideLeft > 0 Then SideSkip := SideSkip + 1; For Count := 1 to (Orig2 Div Orig) do Begin For Count2 := 1 to Orig do Begin FillChar(Mem[ScaleSeg:ScaleOfs], SideStep, Mem[Segment:Offset]); ScaleOfs := ScaleOfs + SideStep; Offset := Offset + 1; End; For Count3 := 1 to (TallStep - 1) do Begin Move(Mem[ScaleSeg:ScaleOfs - NewWidth], Mem[ScaleSeg:ScaleOfs], NewWi ScaleOfs := ScaleOfs + NewWidth; End; End; End; Begin Asm mov ax,13h int 10h End; For X := 0 to 199 do FillChar(Mem[$A000:X*320], 320, X); z := ImageSize(1, 1, 10, 10); Getmem(Pic, z); Getimage(1, 1, 10, 10, Pic^); for z := 1 to 15 do begin Scale(z, Pic, Bit); Putimage((320 div 2) - (A1 div 2), (200 div 2) - (A12 div 2), Bit^); { Delay(200);} end; Readln; Asm mov ax,3 int 10h End; End. { Here is the IMAGE unit required for the bitmap scaler. Again, don't send me improvements. } Unit Image; Interface Function ImageSize(X1, Y1, X2, Y2 : Word): Word; Procedure GetImage(X1, Y1, X2, Y2 : Word; Var BitMap); Procedure Putimage(X1, Y1 : Word; Var BitMap); Implementation Function ImageSize(X1, Y1, X2, Y2 : Word) : Word; Begin ImageSize := 4 + ((1 + (Y2 - Y1)) * (1 + (X2 - X1))); End; Procedure GetImage(X1, Y1, X2, Y2 : Word; Var BitMap); Var BitMapPicSize : Word; {size of bitmap to be saved} Count : Word; {counting variable} TempOfs : Word; {length of a line in bitmap} Offset : Word; {offset to move move memory to} Msb, Lsb : Byte; {most and least significant bytes of a word} Begin BitMapPicSize := ImageSize(X1, Y1, X2, Y2); OffSet := Ofs(BitMap); TempOfs := (X2 - X1) + 1; Msb := TempOfs ShR 8; {\ } Lsb := TempOfs and 255; { \ } MemW[Seg(BitMap):OffSet] := Msb; { | Save line length in pointer } Offset := OffSet + Sizeof(Msb); { | } MemW[Seg(BitMap):OffSet] := Lsb; { / } Offset := OffSet + Sizeof(Msb); {/ } Msb := BitMapPicSize ShR 8; {\ } Lsb := BitMapPicSize and 255; { \ } MemW[Seg(BitMap):OffSet] := Msb; { | Save imagesize in pointer } Offset := OffSet + Sizeof(Msb); { | } MemW[Seg(BitMap):OffSet] := Lsb; { / } OffSet := OffSet + Sizeof(Lsb); {/ } For Count := Y1 to Y2 do {\ } Begin { \ } Move(MemW[$A000:X1 + (320 * Count)], { \ Save picture info } MemW[Seg(BitMap):Offset], TempOfs); { / } OffSet := OffSet + TempOfs; { / } End; {/ } End; Procedure Putimage(X1, Y1 : Word; Var BitMap); Var OffSet : Word; BitLength : Word; BitSize : Word; VGAOffSet : Word; Msb : Byte; Lsb : Byte; BitCount : Word; Begin VGAOffSet := X1 + (Y1 * 320); OffSet := Ofs(BitMap); Msb := MemW[Seg(BitMap):Offset]; Lsb := MemW[Seg(BitMap):Offset + 1]; BitLength := (Msb ShL 8) + Lsb; Msb := MemW[Seg(BitMap):Offset + 2]; Lsb := MemW[Seg(BitMap):Offset + 3]; OffSet := OffSet + 4; BitSize := (Msb Shl 8) + Lsb; BitSize := ((BitSize - 2) div BitLength); For BitCount := 1 to BitSize do Begin Move(MemW[Seg(BitMap):OffSet], MemW[$A000:VGAOffSet], BitLength); OffSet := OffSet + BitLength; VgaOffSet := VGAOffSet + 320; End; End; End.