// 'requiredFeatures', 'requiredExtensions' and 'systemLanguage'
if (!SVGUtilities.matchUserAgent(e, ctx.getUserAgent())) {
return null;
}
CanvasGraphicsNode cgn;
cgn = (CanvasGraphicsNode)instantiateGraphicsNode();
associateSVGContext(ctx, e, cgn);
try {
// In some cases we converted document fragments which didn't
// have a parent SVG element, this check makes sure only the
// real root of the SVG Document tries to do negotiation with
// the UA.
SVGDocument doc = (SVGDocument)e.getOwnerDocument();
SVGOMSVGElement se = (SVGOMSVGElement) e;
boolean isOutermost = (doc.getRootElement() == e);
float x = 0;
float y = 0;
// x and y have no meaning on the outermost 'svg' element
if (!isOutermost) {
// 'x' attribute - default is 0
AbstractSVGAnimatedLength _x =
(AbstractSVGAnimatedLength) se.getX();
x = _x.getCheckedValue();
// 'y' attribute - default is 0
AbstractSVGAnimatedLength _y =
(AbstractSVGAnimatedLength) se.getY();
y = _y.getCheckedValue();
}
// 'width' attribute - default is 100%
AbstractSVGAnimatedLength _width =
(AbstractSVGAnimatedLength) se.getWidth();
float w = _width.getCheckedValue();
// 'height' attribute - default is 100%
AbstractSVGAnimatedLength _height =
(AbstractSVGAnimatedLength) se.getHeight();
float h = _height.getCheckedValue();
// 'visibility'
cgn.setVisible(CSSUtilities.convertVisibility(e));
// 'viewBox' and "preserveAspectRatio' attributes
SVGOMAnimatedRect vb = (SVGOMAnimatedRect) se.getViewBox();
SVGAnimatedPreserveAspectRatio par = se.getPreserveAspectRatio();
AffineTransform viewingTransform =
ViewBox.getPreserveAspectRatioTransform(e, vb, par, w, h, ctx);
float actualWidth = w;
float actualHeight = h;
try {
AffineTransform vtInv = viewingTransform.createInverse();
actualWidth = (float) (w*vtInv.getScaleX());
actualHeight = (float) (h*vtInv.getScaleY());
} catch (NoninvertibleTransformException ex) {}
AffineTransform positionTransform =
AffineTransform.getTranslateInstance(x, y);
// The outermost preserveAspectRatio matrix is set by the user
// agent, so we don't need to set the transform for outermost svg
if (!isOutermost) {
// X & Y are ignored on outermost SVG.
cgn.setPositionTransform(positionTransform);
} else if (doc == ctx.getDocument()) {
// <!> FIXME: hack to compute the original document's size
ctx.setDocumentSize(new Dimension((int) (w + 0.5f),
(int) (h + 0.5f)));
}
// Set the viewing transform, this is often updated when the
// component prepares for rendering.
cgn.setViewingTransform(viewingTransform);
// 'overflow' and 'clip'
Shape clip = null;
if (CSSUtilities.convertOverflow(e)) { // overflow:hidden
float [] offsets = CSSUtilities.convertClip(e);
if (offsets == null) { // clip:auto
clip = new Rectangle2D.Float(x, y, w, h);
} else { // clip:rect(<x> <y> <w> <h>)
// offsets[0] = top
// offsets[1] = right
// offsets[2] = bottom
// offsets[3] = left
clip = new Rectangle2D.Float(x+offsets[3],
y+offsets[0],
w-offsets[1]-offsets[3],
h-offsets[2]-offsets[0]);
}
}
if (clip != null) {
try {
AffineTransform at = new AffineTransform(positionTransform);
at.concatenate(viewingTransform);
at = at.createInverse(); // clip in user space
clip = at.createTransformedShape(clip);
Filter filter = cgn.getGraphicsNodeRable(true);
cgn.setClip(new ClipRable8Bit(filter, clip));
} catch (NoninvertibleTransformException ex) {}
}
RenderingHints hints = null;
hints = CSSUtilities.convertColorRendering(e, hints);
if (hints != null)
cgn.setRenderingHints(hints);
// 'enable-background'
Rectangle2D r = CSSUtilities.convertEnableBackground(e);
if (r != null) {
cgn.setBackgroundEnable(r);
}
if (vb.isSpecified()) {
SVGRect vbr = vb.getAnimVal();
actualWidth = vbr.getWidth();