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"
|
|
|
|