/******************************************************************************* * Copyright 2010 Simon Mieth * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.kabeja.svg; import org.kabeja.xml.AbstractSAXFilter; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; /** * This filter removes the SVG group "draft" which holds the complete drawing. * * @author simon * */ public class RootLayerFilter extends AbstractSAXFilter { private boolean inDraftSection = false; private int groupDepth = 0; private String transformValue = ""; private String strokeWidth = ""; public void endElement(String uri, String localName, String qName) throws SAXException { if (this.inDraftSection) { if (uri.equals(SVGConstants.SVG_NAMESPACE) && localName.equals(SVGConstants.SVG_GROUP)) { if (this.groupDepth == 1) { // we filter out the main group this.inDraftSection = false; return; } groupDepth--; } } super.endElement(uri, localName, qName); } public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if (uri.equals(SVGConstants.SVG_NAMESPACE) && localName.equals(SVGConstants.SVG_GROUP)) { String id = atts.getValue(SVGConstants.XML_ID); if (((id != null) && id.equals("draft")) || this.inDraftSection) { switch (groupDepth) { case 0: // the root group this.transformValue = atts.getValue(SVGConstants.SVG_ATTRIBUTE_TRANSFORM); this.inDraftSection = true; this.strokeWidth = atts.getValue(SVGConstants.SVG_ATTRIBUTE_STROKE_WITDH); break; case 1: AttributesImpl attributes = new AttributesImpl(atts); if (attributes.getIndex( SVGConstants.SVG_ATTRIBUTE_TRANSFORM) != -1) { attributes.setAttribute(attributes.getIndex( SVGConstants.SVG_ATTRIBUTE_TRANSFORM), "", SVGConstants.SVG_ATTRIBUTE_TRANSFORM, SVGConstants.SVG_ATTRIBUTE_TRANSFORM, SVGUtils.DEFAUL_ATTRIBUTE_TYPE, this.transformValue + " " + attributes.getValue( SVGConstants.SVG_ATTRIBUTE_TRANSFORM)); } else { attributes.addAttribute("", SVGConstants.SVG_ATTRIBUTE_TRANSFORM, SVGConstants.SVG_ATTRIBUTE_TRANSFORM, SVGUtils.DEFAUL_ATTRIBUTE_TYPE, this.transformValue); } if (attributes.getIndex( SVGConstants.SVG_ATTRIBUTE_STROKE_WITDH) == -1) { attributes.addAttribute("", SVGConstants.SVG_ATTRIBUTE_STROKE_WITDH, SVGConstants.SVG_ATTRIBUTE_STROKE_WITDH, SVGUtils.DEFAUL_ATTRIBUTE_TYPE, this.strokeWidth); } super.startElement(uri, localName, qName, attributes); break; default: super.startElement(uri, localName, qName, atts); break; } this.groupDepth++; return; } } super.startElement(uri, localName, qName, atts); } }