[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
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;
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]