TYPE Fixed = RECORD CASE Boolean OF True : (w : LongInt); False : (f, i : Word); END; { originally by SEAN PALMER, I just mangled it :^) } PROCEDURE ScaleBitmap(VAR bmp2scale; actualx, actualy : Byte; bstrtx, bstrty, bendx, bendy : Word); { These are notes I added, so they might be wrong. :^) } { - bmp2scale is an array [0..actualx, 0..actualy] of byte } { which contains the original bitmap } { - actualx and actualy are the actual width and height of } { the normal bitmap } { - bstrtx and bstrty are the x and y values for the upper- } { left-hand corner of the scaled bitmap } { - bendx and bendy are the lower-right-hand corner of the } { scaled version of the original bitmap } { - eg. to paste an unscaled version of a bitmap that is } { 64x64 pixels in size in the top left-hand corner of the } { screen, fill the array with data and call: } { ScaleBitmap(bitmap, 64, 64, 0, 0, 63, 63); } { - apparently, the bitmap is read starting at (0,0) and } { then going to (0,1), then (0,2), etc; meaning that it's } { not read horizontally, but vertically } VAR bmp_sx, bmp_sy, bmp_cy : Fixed; bmp_s, bmp_w, bmp_h : Word; BEGIN bmp_w := bendx - bstrtx + 1; bmp_h := bendy - bstrty + 1; bmp_sx.w := actualx * $10000 DIV bmp_w; bmp_sy.w := actualy * $10000 DIV bmp_h; bmp_s := 320 - bmp_w; bmp_cy.w := 0; ASM PUSH DS MOV DS,WORD PTR bmp2scale + 2 MOV AX,$A000; MOV ES,AX; CLD; MOV AX,320; MUL bstrty; ADD ax,bstrtx; MOV DI,AX; @L2: MOV AX,bmp_cy.i; MUL actualx; MOV BX,AX; ADD BX,WORD PTR bmp2scale; MOV CX,bmp_w; MOV SI,0; MOV DX,bmp_sx.f; @L: MOV AL,[BX]; STOSB; ADD SI,DX; ADC BX,bmp_sx.i; LOOP @L ADD DI,bmp_s; MOV AX,bmp_sy.f; MOV bx,bmp_sy.i; ADD bmp_cy.f,AX; ADC bmp_cy.i,BX; DEC WORD PTR bmp_h; JNZ @L2; POP DS; END; END;