- From: Paul LeBeau <paul.lebeau@gmail.com>
- Date: Fri, 3 Jun 2016 02:18:58 +1200
- To: "J. R. Haigh" <jrhaigh+ml.w3.svg@fsfe.org>
- Cc: www-svg <www-svg@w3.org>
- Message-ID: <CACfsppC_K345vQBM17yyMckE9QQR_cFH4+EaA3jMecWf1f2o3A@mail.gmail.com>
Hi J.R.
It is possible to create an SVG that has uses two masks that are
"complments" of one another and share a single path definition.
Here's a simple example:
<svg width="500" height="300">
<defs>
<path id="maskshape" d="M0 0 L200 0 C250 100 250 200 200 300 L0 300 Z"/>
<mask id="mask1">
<rect width="500" height="300" fill="black"/>
<use xlink:href="#maskshape" fill="white"/>
</mask>
<mask id="mask1-complement">
<rect width="500" height="300" fill="white"/>
<use xlink:href="#maskshape" fill="black"/>
</mask>
</defs>
<rect width="500" height="300" fill="darkorange" mask="url(#mask1)" />
<rect width="500" height="300" fill="darkslateblue"
mask="url(#mask1-complement)" />
</svg>
https://jsfiddle.net/tukk4so2/
Regards
Paul
On 2 June 2016 at 20:52, J. R. Haigh <jrhaigh+ml.w3.svg@fsfe.org> wrote:
> Dear SVG standards editors,
> Something which I frequently want to do is to clip 2 objects such
> that one fits tightly with the other. I create a clipping path for object A
> and a complementary clipping path for object B. This is cumbersome because
> updating the original clipping path does not update its complement.
> It also suffers from a common misrendering of antialiased edges
> which leaves a ‘hairline’ of translucency, 1 pixel thick regardless of the
> zoom. This is a misrendering because supersampling diminishes the hairline
> – surely a correct rendering of /scalable/ vector graphics should not be
> affected by the zoom level or resolution, i.e. be ‘resolution-agnostic’.
> Furthermore, when trying to generalise this to masking, it gets
> even more cumbersome. Creating a complement mask object may be a challenge
> in itself, but to have to update it manually each time the original is
> altered is even more cumbersome.
> However, I've found a way of using compositing filters to
> demonstrate the concept of complement masking, and this can be used for
> complementary clipping without hairlines even without resolution-agnostic
> rendering:
>
> <filter
> style="color-interpolation-filters:sRGB"
> id="filter-complementary-masking"
> inkscape:label="Complementary Masking">
> <feImage
> id="feImage-objectA"
> xlink:href="#objectA"
> result="result1" />
> <feComposite
> id="feComposite-mask"
> in2="SourceAlpha"
> operator="in"
> result="result2" />
> <feImage
> id="feImage-objectB"
> xlink:href="#objectB"
> result="result3" />
> <feComposite
> id="feComposite-complementMask"
> in2="SourceAlpha"
> operator="out"
> result="result4" />
> <feComposite
> id="feComposite-add"
> in2="result2"
> operator="arithmetic"
> k2="1"
> k3="1" />
> </filter>
>
> It's not very practical, though, because it comes with a few problems
> which make it cumbersome:
> • behaves very differently from the SVG mask element (
> https://www.w3.org/TR/SVG/masking#Masking ) for which this is
> conceptually a generalisation of;
> - the XML looks very different and is applied using the Filter
> Editor in Inkscape rather than the ‘Object’ → ‘Mask’ → ‘Set’ menu item;
> - the original objects remain;
> - the masked objects do not appear in their original positions;
> - the masked objects move when the path is moved or when it is
> altered such that the left or top edges of the bounding box move (the
> objects should stay still regardless of how the path is manipulated);
> • in Inkscape 0.91 (at least), the feImage filter renders clipped paths at
> fixed resolution (anything closer than 1:1 zoom appears pixelated; even
> when the clipped path is part of a group, only the clipped path has fixed
> resolution, other objects within the group are scalable).
>
> Ideally, the masking and clipping of the SVG standard should be
> updated to provide a native means to do complementary masking. The
> resolution-dependent rendering remains a problem, though, particularly for
> complementary clipping because I also often want object A and object B to
> be clones of the same object, but for there to be 1 or more other objects
> between the normal clip and the complement clip in the Z-order.
> I suggest that the amendment to the standard wrt. complementary
> clipping be:
> • introduce 2 new insideness rules, ‘zero’ and ‘even’[1], used for the
> fill-rule and clip-rule properties – an svg:clipPath element can be used
> for a complement clipping by setting clip-rule to ‘zero’ in the default
> case where the ‘original clip’ uses the ‘nonzero’ insideness rule, or
> ‘even’ where the original is set to ‘odd’;
> • require resolution-agnostic rendering such that hairlines are fixed on
> the complementary clipping and other situations in which they appear.
> (Note 1: Also please make ‘odd’ a synonym of ‘evenodd’, as the insideness
> is just when it's odd, not even.)
> For the complementary masking, the svg:mask element can be used as
> it is in the defs, staying consistent with svg:clipPath which is also used
> as-is, but in the drawing, something needs to take exactly 2 input objects,
> so maybe there should be a new container element which takes exactly 2
> children and has a mask property specifying an svg:mask element (from the
> defs) and applies it as a mask to the first element and as a complement
> mask to the second element, much in the manner of the above filter. The
> specifics of how best to specify the 2 input objects needs some more
> thought.
> The complementary masking would perhaps be most commonly useful
> for merging 2 different objects, but the usecase of weaving objects
> together still applies:
> • an object is cloned (this will be the main one which others are weaved
> into);
> • 1 or more other objects are grouped with either of the clones with the
> clone at the back of the group;
> • the group and the other clone (or the 2 groups if both clones have had
> objects grouped to them) are then complementary masked together again.
> More than 2 objects can be complementary masked by nesting such
> maskings and using n - 1 svg:mask references where n is the number of
> objects that are desired to be complementary masked. Overall it's a pretty
> comprehensive generalisation I think, at least as far as I can see.
> I hope that these suggestions are useful for progressing the
> standard.
>
> Yours faithfully,
> J. R. Haigh.
> --
> Sent from Claws Mail on NixOS.
>
>
>
Received on Thursday, 2 June 2016 14:19:45 UTC