REM. Version 1.1
REM.
REM. Bilinear interpolating image scaler (rough BASIC prototype),
REM. to be translated to assembly language.
REM.
REM. Requires GFXLIB (version 2.03 or higher)
HIMEM = PAGE + 5*&100000
MODE 8 : OFF
INSTALL @lib$ + "GFXLIB2" : PROCInitGFXLIB
INSTALL @lib$ + "GFXLIB_modules\PlotScale" : PROCInitModule
img% = FNLoadImg( @lib$+"GFXLIB_media\gfxlib_480x128x8.BMP", 0)
w% = 480
h% = 128
w2 = 0.8 * w% : w2% = w2
h2 = 0.8 * h% : h2% = h2
img2% = FNmalloc( 4 * (w2%+1)*(h2%+1) )
xr% = ((w% - 1) / w2) * 65536
yr% = ((h% - 1) / h2) * 65536
B% = img2%
PRINT '" Scaling image, please wait..."
FOR I% = 0 TO h2%-1
Y% = (yr% * I%) AND &FFFF0000
dy% = ((yr%*I% - Y%) << 8) >> 16
dy_% = 255 - dy%
Y% = Y% >> 16
FOR J% = 0 TO w2%-1
X% = (xr% * J%) AND &FFFF0000
dx% = ((xr%*J% - X%) << 8) >> 16
X% = X% >> 16
dx_% = 255 - dx%
dxdy% = dx% * dy%
dxdy_% = dx% * dy_%
dx_dy% = dx_% * dy%
dx_dy_% = dx_% * dy_%
A% = img% + 4*(Y%*w% + X%)
a& = ?A%
b& = A%?4
c& = A%?(4*w%)
d& = A%?(4*w% + 4)
?B% = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
a& = ?(A% + 1)
b& = A%?5
c& = A%?(4*w% + 1)
d& = A%?(4*w% + 5)
B%?1 = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
a& = ?(A% + 2)
b& = A%?6
c& = A%?(4*w% + 2)
d& = A%?(4*w% + 6)
B%?2 = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
B% += 4
NEXT
NEXT
CLS
REM. Draw normal, non-scaled image
SYS GFXLIB_BPlot%, dispVars{}, img%, w%, h%, 0, 0
REM. Draw scaled image (nearest neighbour)
SYS GFXLIB_PlotScale%, dispVars{}, img%, w%, h%, w2%, h2%, 0, 170
REM. Draw scaled image (bilinear interpolation)
SYS GFXLIB_BPlot%, dispVars{}, img2%, w2%, h2%, 0, 310
PROCdisplay
PRINT '" Bottom image is normal size (not scaled)"
PRINT " Middle image is scaled using nearest-neighbour algorithm"
PRINT " Top image is scaled using bilinear interpolation"
REM. Version 1.1
REM.
REM. Bilinear interpolating image scaler (rough BASIC prototype),
REM. to be translated to assembly language.
REM.
REM. Requires GFXLIB (version 2.03 or higher)
HIMEM = PAGE + 5*&100000
MODE 8 : OFF
INSTALL @lib$ + "GFXLIB2" : PROCInitGFXLIB
INSTALL @lib$ + "GFXLIB_modules\PlotScale" : PROCInitModule
img% = FNLoadImg( @lib$+"GFXLIB_media\gfxlib_480x128x8.BMP", 0)
FOR Y% = 0 TO 127
FOR X% = 0 TO 479
r2 = (Y%-64)^2 + (X%-240)^2
V% = &FF * (1 + SIN(r2/240)) / 2 + 0.5
img%!(Y%*&780+X%*4) = V% + (V% << 8) + (V% << 16)
NEXT
NEXT
w% = 480
h% = 128
w2 = 0.8 * w% : w2% = w2
h2 = 0.8 * h% : h2% = h2
img2% = FNmalloc( 4 * (w2%+1)*(h2%+1) )
xr% = ((w% - 1) / w2) * 65536
yr% = ((h% - 1) / h2) * 65536
B% = img2%
PRINT '" Scaling image, please wait..."
FOR I% = 0 TO h2%-1
Y% = (yr% * I%) AND &FFFF0000
dy% = ((yr%*I% - Y%) << 8) >> 16
dy_% = 255 - dy%
Y% = Y% >> 16
FOR J% = 0 TO w2%-1
X% = (xr% * J%) AND &FFFF0000
dx% = ((xr%*J% - X%) << 8) >> 16
X% = X% >> 16
dx_% = 255 - dx%
dxdy% = dx% * dy%
dxdy_% = dx% * dy_%
dx_dy% = dx_% * dy%
dx_dy_% = dx_% * dy_%
A% = img% + 4*(Y%*w% + X%)
a& = ?A%
b& = A%?4
c& = A%?(4*w%)
d& = A%?(4*w% + 4)
?B% = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
a& = ?(A% + 1)
b& = A%?5
c& = A%?(4*w% + 1)
d& = A%?(4*w% + 5)
B%?1 = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
a& = ?(A% + 2)
b& = A%?6
c& = A%?(4*w% + 2)
d& = A%?(4*w% + 6)
B%?2 = ( a&*dx_dy_% + b&*dxdy_% + c&*dx_dy% + d&*dxdy% ) >> 16
B% += 4
NEXT
NEXT
CLS
REM. Draw normal, non-scaled image
SYS GFXLIB_BPlot%, dispVars{}, img%, w%, h%, 0, 0
REM. Draw scaled image (nearest neighbour)
SYS GFXLIB_PlotScale%, dispVars{}, img%, w%, h%, w2%, h2%, 0, 170
REM. Draw scaled image (bilinear interpolation)
SYS GFXLIB_BPlot%, dispVars{}, img2%, w2%, h2%, 0, 310
PROCdisplay
PRINT '" Bottom image is normal size (not scaled)"
PRINT " Middle image is scaled using nearest-neighbour algorithm"
PRINT " Top image is scaled using bilinear interpolation"