I had thought of putting a TGBRAVirtualScreen inside a TScrollBox, but wanted to expand on that a fair bit more in a re-usable component. So I've used a TScrollingWinControl as a base, it 'owns' a TBGRABitmap, does 'stuff' and creates a work TBGRABitmap, and draws the work BM to the canvas of the TScrollingWinControl either using either top left or centered coordinates. At the moment the 'stuff' is scaling using TResampleMode and TResampleFilter. By setting the properties of the scrollbars from the dimensions of the work BM all seems to work nicely.
Until I scale large bitmaps - when it becomes very slow (8x scaling on a 1000x2000 image). I've realised that I have been very naive in simply creating a (often huge) work BM and drawing it to the canvas using BM.Draw(Canvas, offsetX, offsetY). I think I should be extracting the area of the original BM that will be visible, doing 'stuff' on that, and drawing only that portion. At this stage I'm struggling for the methodology that I should follow. Any pointers?