[squeak-dev] Re: Morph shadows
Andreas Raab
andreas.raab at gmx.de
Thu Dec 10 19:28:34 UTC 2009
Chris Muller wrote:
> paintFor: aKmlPainter
> | canvasBounds |
> super paintFor: aKmlPainter.
> aKmlPainter form == form ifFalse:
> [ (aKmlPainter clipRect intersects: (canvasBounds := self
> surfaceBounds geoToCanvasFor: aKmlPainter)) ifTrue:
> [ (form scaledToSize: (canvasBounds extent))
> displayOn: aKmlPainter form
> at: (canvasBounds topLeft)
> clippingBox: canvasBounds
> rule: Form blend
> fillColor: nil ] ]
I'm missing your morph's drawOn: method. If "aKmlPainter form" in the
above is Display, then yes, that won't work. This really should look
more like the following (assuming that there's a relation between
aKmlPainter and a FormCanvas):
aKmlPainter form == form ifFalse:
[ (aKmlPainter clipRect intersects: (canvasBounds := self
surfaceBounds geoToCanvasFor: aKmlPainter)) ifTrue:[
"<--- here we go -->"
aKmlPainter canvasPassedIntoDrawOn "<-- we need this"
translucentImage: (form scaledToSize: (canvasBounds extent))
at: (canvasBounds topLeft)].
if you're not using the canvas protocol for performance reasons, you'll
have to add extra code in your Morph's drawOn: method, along the lines of:
Morph>>drawOn: aCanvas
"check to see if we can operate directly on Display"
fastPath := (aCanvas isMemberOf: FormCanvas)
and:[aCanvas form == Display]
and:[aCanvas shadowDrawing not].
fastPath ifTrue:[
"fast path - ignore canvas stuff and blit straight to display"
myForm displayOn: Display at: bounds origin. "etc"
] ifFalse:[
"slow path - not drawing to Display so must use canvas protocol"
aCanvas drawImage: myForm at: bounds origin. "etc"
].
This will work for various other cases (like Morph>>imageForm etc) as well.
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|