default namespace = "http://www.w3.org/2000/svg"
namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"


## 
##     SVG 1.1 Filter Module
##     file: svg-filter.rng
## 
##     This is SVG, a language for describing two-dimensional graphics in XML.
##     Copyright 2001, 2002 W3C (MIT, INRIA, Keio), All Rights Reserved.
##
##     Modifications Copyright 2007 Mozilla Foundation
## 
##     $Id$
##   

## 
##     Filter
## 
##         filter, feBlend, feColorMatrix, feComponentTransfer, feComposite,
##         feConvolveMatrix, feDiffuseLighting, feDisplacementMap, feFlood,
##         feGaussianBlur, feImage, feMerge, feMergeNode, feMorphology, feOffset,
##         feSpecularLighting, feTile, feTurbulence, feDistantLight, fePointLight,
##         feSpotLight, feFuncR, feFuncG, feFuncB, feFuncA
## 
##     This module declares markup to provide support for filter effect.
##   
[ xml:lang = "en" ]
grammar {
    include "svg-basic-filter.rnc"
    
    ## 
    ##       extend SVG.FilterPrimitive.class
    ##     
    SVG.FilterPrimitive.class |=
        feConvolveMatrix
        | feDiffuseLighting
        | feDisplacementMap
        | feMorphology
        | feSpecularLighting
        | feTurbulence
    a:documentation [
        "\x{a}" ~
        "    feConvolveMatrix: Filter Effect Convolve Matrix Element\x{a}" ~
        "  "
    ]
    SVG.feConvolveMatrix.content = (animate | set)*
    feConvolveMatrix =
        element feConvolveMatrix {
            attlist.feConvolveMatrix, SVG.feConvolveMatrix.content
        }
    attlist.feConvolveMatrix &=
        SVG.Core.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitiveWithIn.attrib,
        attribute order { NumberOptionalNumber.datatype },
        attribute kernelMatrix { text },
        attribute divisor { Number.datatype }?,
        attribute bias { Number.datatype }?,
        attribute targetX { Integer.datatype }?,
        attribute targetY { Integer.datatype }?,
        [ a:defaultValue = "duplicate" ]
        attribute edgeMode { string "duplicate" | string "wrap" | string "none" }?,
        attribute kernelUnitLength { NumberOptionalNumber.datatype }?,
        attribute preserveAlpha { Boolean.datatype }?
    a:documentation [
        "\x{a}" ~
        "    feDiffuseLighting: Filter Effect Diffuse Lighting Element\x{a}" ~
        "  "
    ]
    SVG.feDiffuseLighting.content =
        (feDistantLight | fePointLight | feSpotLight),
        (animate | set | animateColor)*
    feDiffuseLighting =
        element feDiffuseLighting {
            attlist.feDiffuseLighting, SVG.feDiffuseLighting.content
        }
    attlist.feDiffuseLighting &=
        SVG.Core.attrib,
        SVG.Style.attrib,
        SVG.Color.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitiveWithIn.attrib,
        attribute lighting-color { SVGColor.datatype }?,
        attribute surfaceScale { Number.datatype }?,
        attribute diffuseConstant { Number.datatype }?,
        attribute kernelUnitLength { NumberOptionalNumber.datatype }?
    a:documentation [
        "\x{a}" ~
        "    feDisplacementMap: Filter Effect Displacement Map Element\x{a}" ~
        "  "
    ]
    SVG.feDisplacementMap.content = (animate | set)*
    feDisplacementMap =
        element feDisplacementMap {
            attlist.feDisplacementMap, SVG.feDisplacementMap.content
        }
    attlist.feDisplacementMap &=
        SVG.Core.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitiveWithIn.attrib,
        attribute in2 { text },
        attribute scale { Number.datatype }?,
        [ a:defaultValue = "A" ]
        attribute xChannelSelector { string "R" | string "G" | string "B" | string "A" }?,
        [ a:defaultValue = "A" ]
        attribute yChannelSelector { string "R" | string "G" | string "B" | string "A" }?
    a:documentation [
        "\x{a}" ~
        "    feMorphology: Filter Effect Morphology Element\x{a}" ~
        "  "
    ]
    SVG.feMorphology.content = (animate | set)*
    feMorphology =
        element feMorphology {
            attlist.feMorphology, SVG.feMorphology.content
        }
    attlist.feMorphology &=
        SVG.Core.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitiveWithIn.attrib,
        [ a:defaultValue = "erode" ]
        attribute operator { string "erode" | string "dilate" }?,
        attribute radius { NumberOptionalNumber.datatype }?
    a:documentation [
        "\x{a}" ~
        "    feSpecularLighting: Filter Effect Specular Lighting Element\x{a}" ~
        "  "
    ]
    SVG.feSpecularLighting.content =
        (feDistantLight | fePointLight | feSpotLight),
        (animate | set | animateColor)*
    feSpecularLighting =
        element feSpecularLighting {
            attlist.feSpecularLighting, SVG.feSpecularLighting.content
        }
    attlist.feSpecularLighting &=
        SVG.Core.attrib,
        SVG.Style.attrib,
        SVG.Color.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitiveWithIn.attrib,
        attribute lighting-color { SVGColor.datatype }?,
        attribute surfaceScale { Number.datatype }?,
        attribute specularConstant { Number.datatype }?,
        attribute specularExponent { Number.datatype }?,
        attribute kernelUnitLength { NumberOptionalNumber.datatype }?
    a:documentation [
        "\x{a}" ~
        "    feTurbulence: Filter Effect Turbulence Element\x{a}" ~
        "  "
    ]
    SVG.feTurbulence.content = (animate | set)*
    feTurbulence =
        element feTurbulence {
            attlist.feTurbulence, SVG.feTurbulence.content
        }
    attlist.feTurbulence &=
        SVG.Core.attrib,
        SVG.FilterColor.attrib,
        SVG.FilterPrimitive.attrib,
        attribute baseFrequency { NumberOptionalNumber.datatype }?,
        attribute numOctaves { Integer.datatype }?,
        attribute seed { Number.datatype }?,
        [ a:defaultValue = "noStitch" ]
        attribute stitchTiles { string "stitch" | string "noStitch" }?,
        [ a:defaultValue = "turbulence" ]
        attribute type { string "fractalNoise" | string "turbulence" }?
    a:documentation [
        "\x{a}" ~
        "    feDistantLight: Filter Effect Distant Light Element\x{a}" ~
        "  "
    ]
    SVG.feDistantLight.content = (animate | set)*
    feDistantLight =
        element feDistantLight {
            attlist.feDistantLight, SVG.feDistantLight.content
        }
    attlist.feDistantLight &=
        SVG.Core.attrib,
        attribute azimuth { Number.datatype }?,
        attribute elevation { Number.datatype }?
    a:documentation [
        "\x{a}" ~
        "    fePointLight: Filter Effect Point Light Element\x{a}" ~
        "  "
    ]
    SVG.fePointLight.content = (animate | set)*
    fePointLight =
        element fePointLight {
            attlist.fePointLight, SVG.fePointLight.content
        }
    attlist.fePointLight &=
        SVG.Core.attrib,
        attribute x { Number.datatype }?,
        attribute y { Number.datatype }?,
        attribute z { Number.datatype }?
    a:documentation [
        "\x{a}" ~
        "    feSpotLight: Filter Effect Spot Light Element\x{a}" ~
        "  "
    ]
    SVG.feSpotLight.content = (animate | set)*
    feSpotLight =
        element feSpotLight {
            attlist.feSpotLight, SVG.feSpotLight.content
        }
    attlist.feSpotLight &=
        SVG.Core.attrib,
        attribute x { Number.datatype }?,
        attribute y { Number.datatype }?,
        attribute z { Number.datatype }?,
        attribute pointsAtX { Number.datatype }?,
        attribute pointsAtY { Number.datatype }?,
        attribute pointsAtZ { Number.datatype }?,
        attribute specularExponent { Number.datatype }?,
        attribute limitingConeAngle { Number.datatype }?
}
