Hi, I have got code for taking a pict resource and scrolling it - up down - side to side, and bouncing it or looping it. Is this any use if so, it's probably half a dozen functions - and a few globals Regards Ian PS Actual scrolling follows.. clear local dim err%, Result%, ht%, NewHt% dim Rect0 as rect dim tRect as rect dim bRect as rect dim @ PixMapHndl&, OldGW&, OldDev& dim MPtr&, CPtr& dim a$ LOCAL FN RollMovie (MovHandle&) fn HLock (MovHandle&) MPtr& = [MovHandle&] select case MPtr&.mvMovieDirection% case _mvRunTopBottom offsetrect (MPtr&.mvCutRect,0,MPtr&.mvMoviePage%) case _mvRunLeftRight offsetrect (MPtr&.mvCutRect,MPtr&.mvMoviePage%,0) end select err% = fn sectrect (MPtr&.mvCutRect, MPtr&.mvResPictRect,Rect0) Result% = fn equalrect (Rect0,MPtr&.mvCutRect) long if Result% = _False and (MPtr&.mvMovieCycle% = _mvBounceMovie or MPtr&.mvMovieCycle% = _mvStopMovie) select case MPtr&.mvMovieDirection% case _mvRunTopBottom offsetrect (MPtr&.mvCutRect,0,-MPtr&.mvMoviePage%) case _mvRunLeftRight offsetrect (MPtr&.mvCutRect,-MPtr&.mvMoviePage%,0) end select select case MPtr&.mvMovieCycle% case _mvBounceMovie MPtr&.mvMoviePage% = MPtr&.mvMoviePage% * (-1) case _mvStopMovie MPtr&.mvMovieRun% = _False end select end if long if fn emptyrect (Rect0)' its popped off the edge MPtr&.mvCutRect;8 = MPtr&.mvCopyRect Result% = _True end if CALL GETGWORLD(OldGW&,OldDev&) CALL SETGWORLD(MPtr&.mvCopyGW&,MPtr&.mvCopyDev&) if (fn LockPixels (fn GetGWorldPixmap (MPtr&.mvResPictGW&)) <> _true) then stop "Error in Pixel Lock" if (fn LockPixels (fn GetGWorldPixmap (MPtr&.mvCopyGW&)) <> _true) then stop "Error in Pixel Lock" eraserect (MPtr&.mvCopyRect) long if Result% = _True' everything is OK CALL COPYBITS(#MPtr&.mvResPictGW&+2,#MPtr&.mvCopyGW&+2,MPtr&.mvCutRect ,MPtr&.mvCopyRect,_srcCopy,0) xelse' hard labour tRect;8 = @Rect0 offsetrect (tRect,-tRect.left%, -tRect.top%) CALL COPYBITS(#MPtr&.mvResPictGW&+2,#MPtr&.mvCopyGW&+2,Rect0,tRect,_srcCopy,0) select case MPtr&.mvMovieDirection% case _mvRunTopBottom Rect0.bottom% = MPtr&.mvCopyRect.bottom% - (tRect.bottom% - tRect.top%) Rect0.top% = 0 tRect.bottom% = MPtr&.mvCopyRect.bottom%' - tRect.bottom% tRect.top% = tRect.bottom% - Rect0.bottom% case _mvRunLeftRight Rect0.right% = MPtr&.mvCopyRect.right% - (tRect.right% - tRect.left%) Rect0.left% = 0 tRect.right% = MPtr&.mvCopyRect.right%' - tRect.bottom% tRect.left% = tRect.right% - Rect0.right% end select CALL COPYBITS(#MPtr&.mvResPictGW&+2,#MPtr&.mvCopyGW&+2,Rect0,tRect,_srcCopy,0) end if call unLockPixels (fn GetGWorldPixmap (MPtr&.mvResPictGW&)) call unLockPixels (fn GetGWorldPixmap (MPtr&.mvCopyGW&)) CALL sETGWORLD(OldGW&,OldDev&) END FN = MPtr&.mvMovieRun%