/******************************************************************************* * 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.generators; import java.util.Map; import org.kabeja.common.DraftEntity; import org.kabeja.common.Style; import org.kabeja.entities.Text; import org.kabeja.math.Bounds; import org.kabeja.math.Point3D; import org.kabeja.math.TransformContext; import org.kabeja.svg.SVGConstants; import org.kabeja.svg.SVGContext; import org.kabeja.svg.SVGUtils; import org.kabeja.tools.FontManager; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; public class SVGTextGenerator extends AbstractSVGSAXGenerator { public void toSAX(ContentHandler handler, Map svgContext, DraftEntity entity, TransformContext transformContext) throws SAXException { Text text = (Text) entity; AttributesImpl attr = new AttributesImpl(); Point3D alignmentPoint = text.calculateAlignmentPoint(); double height = text.getHeight(); if (height == 0.0) { height = ((Bounds) svgContext.get(SVGContext.DRAFT_BOUNDS)) .getHeight() * 0.005; } SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_FONT_SIZE, SVGUtils.formatNumberAttribute(height)); // if there is a SVG font, we will use it if (text.getDocument().getStyle(text.getTextStyle()) != null) { Style style = text.getDocument().getStyle( text.getTextStyle()); FontManager manager = FontManager.getInstance(); String fontID = null; if (manager.hasFontDescription(style.getBigFontFile())) { fontID = style.getBigFontFile(); } else if (manager.hasFontDescription(style.getFontFile())) { fontID = style.getFontFile(); } if (fontID != null) { fontID = fontID.toLowerCase(); if (fontID.endsWith(".shx")) { fontID = fontID.substring(0, fontID.indexOf(".shx")); } SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_FONT_FAMILY, fontID); } } else { // Do we need to set a default? // SVGUtils.addAttribute(attr,SVGConstants.SVG_ATTRIBUTE_FONT_FAMILY,"simplex"); } // set the alignment if (!text.isUpsideDown()) { switch (text.getAlign()) { case 0: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "start"); break; case 1: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "middle"); break; case 2: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "end"); break; case 3: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "end"); break; case 4: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "middle"); break; case 5: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "end"); break; default: SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_TEXT_ANCHOR, "start"); break; } } // in order to get the right text-view StringBuffer transform = new StringBuffer(); if (!text.isBackward()) { SVGUtils.addAttribute(attr, "writing-mode", "lr-tb"); } else { // SVGUtils.addAttribute(attr, "writing-mode", "rl"); transform.append("matrix(-1 0 0 1 "); transform.append(SVGUtils.formatNumberAttribute(2 * alignmentPoint .getX())); transform.append(" 0)"); } if (!text.isUpsideDown()) { transform.append("matrix(1 0 0 -1 0 "); transform.append(SVGUtils.formatNumberAttribute(2 * alignmentPoint .getY())); transform.append(')'); } // rotation if (text.getRotation() != 0.0) { transform.append(" rotate("); transform.append(SVGUtils.formatNumberAttribute((-1 * text .getRotation()))); transform.append(' '); transform.append(SVGUtils.formatNumberAttribute(alignmentPoint .getX())); transform.append(' '); transform.append(SVGUtils.formatNumberAttribute(alignmentPoint .getY())); transform.append(' '); transform.append(')'); } if (text.getObliqueAngle() != 0.0) { transform.append(" skewX("); transform.append((-1 * text.getObliqueAngle())); transform.append(" )"); transform.append(" translate( "); transform.append(SVGUtils.formatNumberAttribute(alignmentPoint .getY() * Math.tan(Math.toRadians(1 * text.getObliqueAngle())))); transform.append(')'); } if (text.getScaleX() != 1.0) { transform.append(" translate( "); transform.append(SVGUtils.formatNumberAttribute(alignmentPoint.getX())); transform.append(",0.0)"); transform.append(" scale("); transform.append(SVGUtils.formatNumberAttribute(text.getScaleX())); transform.append(",1.0)"); transform.append(" translate( "); transform.append(SVGUtils.formatNumberAttribute(-1*alignmentPoint.getX())); transform.append(",0.0)"); } SVGUtils.addAttribute(attr, "transform", transform.toString()); SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_X, SVGUtils .formatNumberAttribute(alignmentPoint.getX())); SVGUtils.addAttribute(attr, SVGConstants.SVG_ATTRIBUTE_Y, SVGUtils .formatNumberAttribute(alignmentPoint.getY())); super.setCommonTextAttributes(attr, svgContext, text); SVGUtils.startElement(handler, SVGConstants.SVG_TEXT, attr); SVGUtils.textDocumentToSAX(handler, text.getTextDocument()); SVGUtils.endElement(handler, SVGConstants.SVG_TEXT); } }