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