Had a look at drawWorld:submorphs:invalidAreasOn: today, the "Experimental top-down drawing" there does not seem to be working optimally. Basically, when there's many windows behind one you're resizing, this many times leads to ALL of them getting repainted. Attached is a fix for this, so only the system window areas which are visible and affected are updated. It will not speed up cases when resizing a complex morph (like the Changes Log), but helps when resizing simple ones with many other windows in the background. If anyone interested in faster resizing (without fastDragWindow) would review the code/check if it helps them it'd be nice. A simple test is to open up a couple system browsers, put them on top of eachother, and resize a simple window (Like the "Welcome to Pharo" window) over their bounds.
Then load the changes, and see if you notice a difference.

In a test i did (same windows open/resized, as described above), time spent in drawWorld:submorphs:invalidAreasOn: was reduced from 86% to 65.7% after filing in changes.

If anyone with a better understanding of Morphic know if anything larger than the clippingBounds is safe to use as default in Morph>>areasRemainingToFill: , that would probably help as well.

Cheers,
Henry
'From Pharo0.1 of 16 May 2008 [Latest update: #10243] on 25 February 2009 at 
2:30:25 pm'!

!Morph methodsFor: 'drawing' stamp: 'Henrik Sperre Johansen 2/25/2009 12:06'!
areasRemainingToFill: aRectangle
        "May be overridden by any subclasses with opaque regions"

        ^ Array withAll: (aRectangle areasOutside: self clippingBounds)! !


!WorldState methodsFor: 'update cycle' stamp: 'Henrik Sperre Johansen 2/25/2009 
13:52'!
drawWorld: aWorld submorphs: submorphs invalidAreasOn: aCanvas 
        "Redraw the damaged areas of the given canvas and clear the damage 
list. Return a collection of the areas that
were redrawn."

        | rectList c i n mm morphs rects rectToFill remnants remnantIntersects 
rect validList |
        rectList := damageRecorder invalidRectsFullBounds: aWorld viewBox.
        "sort by areas to draw largest portions first"
        rectList := rectList asArray sort: [:r1 :r2 | r1 area > r2 area].
        damageRecorder reset.
        n := submorphs size.
        morphs := OrderedCollection new: n * 2.
        rects := OrderedCollection new: n * 2.
        validList := OrderedCollection new: n * 2.
        rectList do: 
                        [:dirtyRect | 
                        dirtyRect allAreasOutsideList: validList
                                do: 
                                        [:r | 
                                        "Experimental top-down drawing --
                        Traverses top to bottom, stopping if the entire area is 
filled.
                        If only a single rectangle remains, then continue with 
the reduced rectangle."

                                        rectToFill := r.
                                        remnants := OrderedCollection with: r.
                                        i := 1.
                                        [remnants isEmpty or: [i > n]] 
whileFalse: 
                                                        [mm := submorphs at: i.
                                                        ((remnantIntersects := 
remnants select: [:each | (mm fullBounds intersects: each)]) notEmpty and: [mm 
visible]) 
                                                                ifTrue: 
                                                                        [morphs 
addLast: mm.
                                                                        
                                                                        rects 
addLast: (Rectangle merging: (remnantIntersects collect: [:each | mm fullBounds 
intersect: each])).
                                                                        
remnants removeAll: remnantIntersects.
                                                                        
remnantIntersects do: [:eachIntersect | remnants addAll: (mm 
areasRemainingToFill: eachIntersect)].
                                                                        
remnants size = 1 ifTrue: [rectToFill := remnants first].
                                                                        
remnants isEmpty ifTrue: [rectToFill := nil]].
                                                        i := i + 1].
                                        "Now paint from bottom to top, but 
using the reduced rectangles."
                                        rectToFill 
                                                ifNotNil: [aWorld drawOn: (c := 
aCanvas copyClipRect: rectToFill)].
                                        [morphs isEmpty] whileFalse: 
                                                        [(rect := rects 
removeLast) == rectToFill 
                                                                ifFalse: [c := 
aCanvas copyClipRect: (rectToFill := rect)].
                                                        c fullDrawMorph: morphs 
removeLast].
                                        morphs reset.
                                        rects reset.
                                        validList add: r]].
        ^validList! !

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to