VDU 23,22,640;480;8,16,16,128
VDU 24,400;300;600;700; : REM Set graphics viewport
LR_LOADFROMFILE = 16
image$ = "C:\windows\coffee bean.bmp"
SYS "LoadImage", 0, image$, 0, 0, 0, LR_LOADFROMFILE TO himg%
IF himg%=0 ERROR 100, "Cannot load image " + image$
angle = 0
REPEAT
PROCDrawImageRot(himg%, 200, 180, 128, 128, angle)
angle += PI/90
WAIT 4
UNTIL FALSE
END
REM Draw a rotated image
DEF PROCDrawImageRot(himage%,x%,y%,dx%,dy%,angle)
LOCAL hdctemp%,diag%,bmp{},plg{},rc{},ca,sa
DIM bmp{Type%,Width%,Height%,WidthBytes%,Planes{l&,h&},BitsPixel{l&,h&},Bits%}
DIM plg{x1%,y1%,x2%,y2%,x3%,y3%}, rc{l%,t%,r%,b%}
diag%=SQR(dx%^2+dy%^2)+1 : ca=COS(angle) : sa=SIN(angle)
plg.x1%=x%+diag%/2-dx%/2*ca-dy%/2*sa
plg.y1%=y%+diag%/2-dy%/2*ca+dx%/2*sa
plg.x2%=x%+diag%/2+dx%/2*ca-dy%/2*sa
plg.y2%=y%+diag%/2-dy%/2*ca-dx%/2*sa
plg.x3%=x%+diag%/2-dx%/2*ca+dy%/2*sa
plg.y3%=y%+diag%/2+dy%/2*ca+dx%/2*sa
rc.l% = x% : rc.t% = y% : rc.r% = x%+diag% : rc.b% = y%+diag%
SYS "CreateCompatibleDC", @memhdc% TO hdctemp%
SYS "SelectObject", hdctemp%, himage%
SYS "GetObject", himage%, DIM(bmp{}), bmp{}
SYS "SelectClipRgn", @memhdc%, @vdu.hr%
SYS "PatBlt", @memhdc%, x%, y%, diag%, diag%, &FF0062
SYS "PlgBlt", @memhdc%, plg{}, hdctemp%, 0, 0, bmp.Width%, bmp.Height%, 0, 0, 0
SYS "InvalidateRect", @hwnd%, rc{}, 0
SYS "DeleteDC", hdctemp%
ENDPROC
MODE 8
OFF
INSTALL @lib$ + "GFXLIB2"
PROCInitGFXLIB
INSTALL @lib$ + "GFXLIB_modules\PlotRotateScale2"
PROCInitModule
gfxlib% = FNLoadImg( @lib$ + "GFXLIB_media\gfxlib_480x128x8.BMP", 0 )
ball% = FNLoadImg( @lib$ + "GFXLIB_media\ball1_64x64x8.BMP", 0 )
bmW% = 200
bmH% = 120
bm% = FNmalloc( 4 * bmW% * bmH% )
bmW2% = 280
bmH2% = 190
bm2% = FNmalloc( 4 * bmW2% * bmH2% )
angle = 0.0
scale = 1.0
*REFRESH OFF
REPEAT
SYS GFXLIB_Clr%, dispVars{}, FNrgb( 0, 20, 60 )
R% = RND( -12345678 )
FOR I% = 1 TO 50
SYS GFXLIB_Plot%, dispVars{}, ball%, 64, 64, RND(640)-32, RND(512)-32
NEXT I%
SYS GFXLIB_Plot%, dispVars{}, gfxlib%, 480, 128, (640-480)/2, 32
SYS GFXLIB_SaveAndSetDispVars%, dispVars{}, bm%, bmW%, bmH%
SYS GFXLIB_Clr%, dispVars{}, FNrgb( 0, 0, 0 )
SYS GFXLIB_PlotRotateScale2%, dispVars{}, gfxlib%, 480, 128, \
\ bmW%/2, bmH%/2, &10000*angle, &10000*scale
SYS GFXLIB_RestoreDispVars%, dispVars{}
SYS GFXLIB_Plot%, dispVars{}, bm%, bmW%, bmH%, 60, 270
SYS GFXLIB_SaveAndSetDispVars%, dispVars{}, bm2%, bmW2%, bmH2%
SYS GFXLIB_Clr%, dispVars{}, FNrgb( 0, 0, 0 )
SYS GFXLIB_PlotRotateScale2%, dispVars{}, gfxlib%, 480, 128, \
\ bmW2%/2, bmH2%/2, &10000*(-angle), &10000*scale
SYS GFXLIB_RestoreDispVars%, dispVars{}
SYS GFXLIB_BPlot%, dispVars{}, bm2%, bmW2%, bmH2%, 320, 270
angle += 1
IF angle >= 360 THEN angle -= 360
PROCdisplay
UNTIL FALSE