Proposals/Resource referencing

From SVG

Mask linkage

Background

Requirements

  • Associate a mask (and similar resources) and its target content without relying on ID references
  • For masks only, allow the masking behavior to use either the alpha or the luminance values of the mask content.

Probable requirements:

  • For masks (and possibly clipping paths), allow using content not nested inside a <mask> element to be used as the mask content.

Scope

  • clip-path → <clipPath>
  • cursor → <cursor>
  • fill, stroke → <linearGradient>, <radialGradient>, <pattern>
  • filter → <filter>
  • marker, marker-start, marker-mid, marker-end → <marker>
  • mask → <mask>
  • <feImage xlink:href> → SVG content
  • <font-face-uri xlink:href> → <font>
  • <textPath xlink:href> → <path>

Direction of the linkage

Option A: Target points to resource

e.g. mask: <funciri> | none | inherit | child

Here 'child' means, "find the first child element that is a <mask> and use that."

Likewise for clip-path, cursor, fill, stroke, filter, marker*

For the xlink:href cases, we could add another attribute. Or, we could say that the lack of an attribute means "look to the child".

Issues:

  • To address the different alpha / luminance mask requirement we'd have to overload the syntax further, e.g.
 mask: ([alpha] <funciri>) | none | inherit | ([alpha] child)
  • To address the requirement for targetting non-<mask> (and non-<clipPath>) element content, we could either:
    • say that only applies to the <funciri> syntax, or
    • refine the meaning of 'child' to be something like, "find the first child element that is a <mask> and use that. If there is none, use the first child / make a group and use all the children".
  • There is an inconsistency with animation in that an <animate> element without and xlink:href attribute targets its parent. But that's a different case because the <animate> is the resource, not the target. The directionality is already different to <feImage>, <textPath> etc.

Option B: Resource points to target

From Cyril, "Have a 'target-element' property (for lack of a better name) with two values 'parent' or 'by-reference', the default one being 'by-reference'."[1]

e.g.

<path ... >
  <mask target-element="parent">
  ...
  </mask>
</path>

Issues:

  • What happens if you target a <mask> with target-element="parent"?
  • How to address the alpha vs luminance this way? Just add an attribute to the <mask> element?
  • How to address the requirement for using non-<mask> (non-<clipPath>) content? We could say that only works for mask: <funciri> syntax.
  • The inconsistency with <animate> still remains but that seems unavoidable. Specifically, the for <animate> element, the default value of target-element is "parent" and the meaning of "by-reference" is by my reference and not by where I'm referencing.