Lex,
As for scrolling speed, note that it is hard for ScrollPane to do better. The root problem is that the submorphs ivar is a simple Array; a fancier data structure is necessary.
Measuring it a little I found a very specific hot-spot there. Turns out that scroll panes spend ages in computing the local submorph bounds of the transform which can be trivially cached. Try it!
Cheers, - Andreas
'From TeaSqueak3.2 of 19 September 2002 [latest update: #393] on 12 May 2003 at 11:55:08 pm'! Morph subclass: #TransformMorph instanceVariableNames: 'transform smoothing localBounds ' classVariableNames: '' poolDictionaries: '' category: 'Morphic-Basic'!
!TransformMorph methodsFor: 'geometry' stamp: 'ar 5/12/2003 23:15'! layoutChanged localBounds := nil. ^super layoutChanged! !
!TransformMorph methodsFor: 'geometry' stamp: 'ar 5/12/2003 23:15'! localSubmorphBounds "Answer, in my coordinate system, the bounds of all my submorphs (or nil if no submorphs)" | subBounds | localBounds ifNotNil:[^localBounds]. subBounds _ nil. self submorphsDo: [:m | subBounds ifNil: [subBounds _ m fullBounds] ifNotNil: [subBounds _ subBounds quickMerge: m fullBounds]]. ^localBounds := subBounds! !