[self-interest] clipping
Jecel Assumpcao Jr
jecel at merlintec.com
Wed Mar 26 23:11:54 UTC 2003
On Tuesday 25 March 2003 18:05, legyxo42 wrote:
> Hi, I'm trying to clip drawing submorphs with baseBounds of
> their owner. code looks like this:
>
> drawon: aCanvas = (
> baseDrawOn: aCanvas.
> 0 = morphCount ifFalse: [| c |
> c: (aCanvas copyOffset: position).
> c clip: baseBounds. "is this OK?"
It is okay, but not enough since clipping is not fully implemented but
only has some methods here and there. In particular, this line would be
needed:
c gc setClipRectangle: baseBounds.
Adding this line here is a disaster, unfortunately, since the graphics
context (gc) is shared with other canvases and this will mess things
up.
It is very natural to assume that "c clip: ..." would take care of the
details, but it doesn't.
> morphsReverseDo: [| :m | m drawOn: c].
> ].
> self
> )
Here is the simplest solution that will mostly work:
drawon: aCanvas = (
baseDrawOn: aCanvas.
0 = morphCount ifFalse: [| c |
c: (aCanvas copyOffset: position).
morphsReverseDo: [| :m | c withClip: (baseBounds translate: position
negated)
Do: [m drawOn: c]].
].
self
)
This code looks good but when you move the morph the shadow still
includes the outlines of any submorphs that are sticking out. It is
probably easy to fix this.
Having withClip:Do: inside the loop is bad since the same old clipping
rectangle keeps being saved and restored over and over and is always
being replaced with the same rectangle. It would be nice to do this
just once.
-- Jecel
More information about the Self-interest
mailing list