[squeak-dev] The Trunk: Morphic-mt.1902.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Feb 21 08:31:48 UTC 2022


Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1902.mcz

==================== Summary ====================

Name: Morphic-mt.1902
Author: mt
Time: 21 February 2022, 9:31:41.263853 am
UUID: 6fc55666-eb72-8240-8d39-22e44c25d2fc
Ancestors: Morphic-ct.1901

Adds commentary about the current situation of a morph's drop-shadow cache.

Thanks to Christoph (ct) for pointing this out!

=============== Diff against Morphic-ct.1901 ===============

Item was changed:
  ----- Method: Morph>>updateDropShadowCache (in category 'drawing') -----
  updateDropShadowCache
+ 	"Draws the receiver's drop shadow into a separate form (or cache) to be used repeatedly in #drawDropShadowOn:, which is itself guarded via #hasDropShadow (see #fullDrawOn:).
+ 	
+ 	Note that this cache is not so much about performance as it is about visual aesthetics. While the shadow itself is just one or more repeated calls to fill/frame a (rounded rectangle), we finally cut out (or mask or erase) the inner portion so that translucent receiver's wont look awkward. This is not possible with direct drawing calls to BitBlt onto Display.
+ 	
+ 	Also note that with the advent of the Spur object memory (http://www.mirandabanda.org/cogblog/category/spur/) in the OpenSmalltalk VM, we got a different garbage collector (GC) that does not yet have the most efficient incremental collection strategies. As an effect, repeated invalidation of the drop-shadow cache now entails frequent full-GC pauses and thus noticeable lags (or stuttering) in the environment. This has been the case since the release of Squeak 5.0, where we started to use the Spur object memory and hence the new GC.
+ 	
+ 	To make the full-GC pauses less noticeable, we started to temporarily disable the drop shadow in situations where responsiveness is importent. For example, we do this for frequently used morphs such as all system windows when being resized using their corner (or edge) grips. You can get an overview of thus points by browsing senders of #targetHadDropShadow and #hasDropShadow: (or actually the code 'hasDropShadow: false', which typically starts the temporary disabling of the shadow).
+ 	
+ 	February 2022: We are currently working on improving the incremental compaction in the OpenSmalltalk VM. Once that issue has been solved, we can remove that source code that disables the drop shadow temporarily."
  
  	| shadowOffset shadowBounds offset form canvas drawBlock localBounds mask maskCanvas |
+ 	self flag: #hasDropShadow. "Marker for senders browsing."
+ 	self flag: #targetHadDropShadow. "Marker for senders browsing."
+ 	
  	(shadowOffset := self shadowOffset) isRectangle
  		ifTrue: [
  			shadowBounds := 0 at 0 corner: (self bounds outsetBy: shadowOffset) extent.
  			offset := 0 at 0.
  			localBounds := shadowOffset topLeft extent: self extent ]
  		ifFalse: [
  			| extent |
  			extent := self extent.
  			shadowBounds := 0 at 0 corner: extent + shadowOffset abs.
  			offset := shadowOffset max: 0 at 0.
  			localBounds := (shadowOffset negated max: 0 at 0) extent: extent ].
  		
  	form := Form extent: shadowBounds extent depth: Display depth.
  	canvas := form getCanvas.
  
  	drawBlock := self useSoftDropShadow
  		ifFalse: [
  			[:c | self wantsRoundedCorners
  					ifTrue: [c fillRoundRect: localBounds radius: self cornerRadius fillStyle: self shadowColor]
  					ifFalse: [c fillRectangle: localBounds fillStyle: self shadowColor]]]
  		ifTrue: [
  			[:c | self wantsRoundedCorners
  					ifTrue: [0 to: 9 do: [:i |
  						c
  							fillRoundRect: (shadowBounds insetBy: i)
  							radius: (self cornerRadius max: 20) -i
  							fillStyle: (self shadowColor alpha: self shadowColor alpha * (i+1))]]
  					ifFalse: [0 to: 9 do: [:i | 
  						c
  							fillRoundRect: (shadowBounds insetBy: i) radius: 20-i
  							fillStyle: (self shadowColor alpha: self shadowColor alpha * (i+1))]]]].
  			
  	canvas 
  		translateBy: offset
  		during: [ :shadowCanvas | drawBlock value: shadowCanvas].
  
  	"Support transparent morph colors without having the shadow to shine through.."
  	mask := Form extent: shadowBounds extent depth: Display depth.
  	maskCanvas := mask getCanvas.
  	self wantsRoundedCorners
  		ifTrue: [maskCanvas fillRoundRect: (localBounds insetBy: self borderWidth) radius: self cornerRadius fillStyle: Color black]
  		ifFalse: [maskCanvas fillRectangle: (localBounds insetBy: self borderWidth) fillStyle: Color black].
  	mask
  		displayOn: form
  		at: 0 at 0
  		rule: Form erase.
  	
  	self setProperty: #dropShadow toValue: form.!



More information about the Squeak-dev mailing list