bella 01/08/02 00:49:35 Modified: sources/org/apache/batik/bridge SVGAltGlyphElementBridge.java SVGAltGlyphHandler.java SVGGVTFont.java SVGGlyphElementBridge.java SVGTextElementBridge.java Log: gradient fill of SVG fonts now works properly Revision Changes Path 1.4 +50 -20 xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphElementBridge.java Index: SVGAltGlyphElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphElementBridge.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SVGAltGlyphElementBridge.java 2001/07/05 06:56:07 1.3 +++ SVGAltGlyphElementBridge.java 2001/08/02 07:49:35 1.4 @@ -11,17 +11,23 @@ import org.apache.batik.dom.svg.SVGOMDocument; import org.apache.batik.dom.util.XLinkSupport; import org.apache.batik.gvt.font.Glyph; +import org.apache.batik.gvt.text.GVTAttributedCharacterIterator; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import java.text.AttributedCharacterIterator; +import java.awt.font.TextAttribute; +import java.awt.Paint; +import java.awt.Stroke; + /** * Bridge class for the <altGlyph> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a> - * @version $Id: SVGAltGlyphElementBridge.java,v 1.3 2001/07/05 06:56:07 bella Exp $ + * @version $Id: SVGAltGlyphElementBridge.java,v 1.4 2001/08/02 07:49:35 bella Exp $ */ public class SVGAltGlyphElementBridge extends AbstractSVGBridge implements ErrorConstants { @@ -53,7 +59,8 @@ */ public Glyph[] createAltGlyphArray(BridgeContext ctx, Element altGlyphElement, - float fontSize) { + float fontSize, + AttributedCharacterIterator aci) { // get the referenced element String uri = XLinkSupport.getXLinkHref(altGlyphElement); @@ -67,7 +74,7 @@ // if the referenced element is a glyph if (refElement.getTagName().equals(SVG_GLYPH_TAG)) { - Glyph glyph = getGlyph(ctx, uri, altGlyphElement, fontSize); + Glyph glyph = getGlyph(ctx, uri, altGlyphElement, fontSize, aci); if (glyph == null) { // failed to create a glyph for the specified glyph uri @@ -82,7 +89,8 @@ // else should be an altGlyphDef element if (refElement.getTagName().equals(SVG_ALT_GLYPH_DEF_TAG)) { - // if not local import the referenced altGlyphDef into the current document + // if not local import the referenced altGlyphDef + // into the current document SVGOMDocument document = (SVGOMDocument)altGlyphElement.getOwnerDocument(); SVGOMDocument refDocument @@ -114,7 +122,8 @@ } if (containsGlyphRefNodes) { // process the glyphRef children - NodeList glyphRefNodes = localRefElement.getElementsByTagName(SVG_GLYPH_REF_TAG); + NodeList glyphRefNodes + = localRefElement.getElementsByTagName(SVG_GLYPH_REF_TAG); int numGlyphRefNodes = glyphRefNodes.getLength(); Glyph[] glyphArray = new Glyph[numGlyphRefNodes]; for (int i = 0; i < numGlyphRefNodes; i++) { @@ -122,7 +131,8 @@ Element glyphRefElement = (Element)glyphRefNodes.item(i); String glyphUri = XLinkSupport.getXLinkHref(glyphRefElement); - Glyph glyph = getGlyph(ctx, glyphUri, altGlyphElement, fontSize); + Glyph glyph + = getGlyph(ctx, glyphUri, altGlyphElement, fontSize, aci); if (glyph == null) { // failed to create a glyph for the specified glyph uri return null; @@ -133,14 +143,16 @@ } else { // try looking for altGlyphItem children - NodeList altGlyphItemNodes = localRefElement.getElementsByTagName(SVG_ALT_GLYPH_ITEM_TAG); + NodeList altGlyphItemNodes + = localRefElement.getElementsByTagName(SVG_ALT_GLYPH_ITEM_TAG); int numAltGlyphItemNodes = altGlyphItemNodes.getLength(); if (numAltGlyphItemNodes > 0) { Glyph[] glyphArray = new Glyph[numAltGlyphItemNodes]; for (int i = 0; i < numAltGlyphItemNodes; i++) { // try to find a resolvable glyphRef Element altGlyphItemElement = (Element)altGlyphItemNodes.item(i); - NodeList altGlyphRefNodes = altGlyphItemElement.getElementsByTagName(SVG_GLYPH_REF_TAG); + NodeList altGlyphRefNodes + = altGlyphItemElement.getElementsByTagName(SVG_GLYPH_REF_TAG); int numAltGlyphRefNodes = altGlyphRefNodes.getLength(); boolean foundMatchingGlyph = false; for (int j = 0; j < numAltGlyphRefNodes; j++) { @@ -148,7 +160,7 @@ Element glyphRefElement = (Element)altGlyphRefNodes.item(j); String glyphUri = XLinkSupport.getXLinkHref(glyphRefElement); - Glyph glyph = getGlyph(ctx, glyphUri, altGlyphElement, fontSize); + Glyph glyph = getGlyph(ctx, glyphUri, altGlyphElement, fontSize, aci); if (glyph != null) { // found a matching glyph for this altGlyphItem glyphArray[i] = glyph; @@ -186,16 +198,19 @@ private Glyph getGlyph(BridgeContext ctx, String glyphUri, Element altGlyphElement, - float fontSize) { + float fontSize, + AttributedCharacterIterator aci) { Element refGlyphElement = null; try { refGlyphElement = ctx.getReferencedElement(altGlyphElement, glyphUri); } catch (BridgeException e) { - // this is ok, it is possible that the glyph at the given uri is not available + // this is ok, it is possible that the glyph at the given + // uri is not available } - if (refGlyphElement == null || !refGlyphElement.getTagName().equals(SVG_GLYPH_TAG)) { + if (refGlyphElement == null + || !refGlyphElement.getTagName().equals(SVG_GLYPH_TAG)) { // couldn't find the referenced glyph element, // or referenced element not a glyph return null; @@ -215,7 +230,8 @@ if (isLocal) { localGlyphElement = refGlyphElement; Element fontElement = (Element)localGlyphElement.getParentNode(); - NodeList fontFaceElements = fontElement.getElementsByTagName(SVG_FONT_FACE_TAG); + NodeList fontFaceElements + = fontElement.getElementsByTagName(SVG_FONT_FACE_TAG); if (fontFaceElements.getLength() > 0) { localFontFaceElement = (Element)fontFaceElements.item(0); } @@ -223,10 +239,12 @@ } else { // import the whole font - Element localFontElement = (Element)document.importNode(refGlyphElement.getParentNode(), true); + Element localFontElement + = (Element)document.importNode(refGlyphElement.getParentNode(), true); Element g = document.createElementNS(SVG_NAMESPACE_URI, SVG_G_TAG); g.appendChild(localFontElement); - CSSUtilities.computeStyleAndURIs((Element)refGlyphElement.getParentNode(), localFontElement); + CSSUtilities.computeStyleAndURIs( + (Element)refGlyphElement.getParentNode(), localFontElement); // get the local glyph element String glyphId = refGlyphElement.getAttributeNS(null, SVG_ID_ATTRIBUTE); @@ -239,7 +257,8 @@ } } // get the local font-face element - NodeList fontFaceElements = localFontElement.getElementsByTagName(SVG_FONT_FACE_TAG); + NodeList fontFaceElements + = localFontElement.getElementsByTagName(SVG_FONT_FACE_TAG); if (fontFaceElements.getLength() > 0) { localFontFaceElement = (Element)fontFaceElements.item(0); } @@ -252,10 +271,21 @@ SVGFontFaceElementBridge fontFaceBridge = (SVGFontFaceElementBridge)ctx.getBridge(localFontFaceElement); - SVGFontFace fontFace = fontFaceBridge.createFontFace(ctx, localFontFaceElement); - - SVGGlyphElementBridge glyphBridge = (SVGGlyphElementBridge)ctx.getBridge(localGlyphElement); - return glyphBridge.createGlyph(ctx, localGlyphElement, altGlyphElement, -1, fontSize, fontFace); + SVGFontFace fontFace + = fontFaceBridge.createFontFace(ctx, localFontFaceElement); + SVGGlyphElementBridge glyphBridge + = (SVGGlyphElementBridge)ctx.getBridge(localGlyphElement); + + aci.first(); + Paint fillPaint = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); + Paint strokePaint = (Paint)aci.getAttribute( + GVTAttributedCharacterIterator.TextAttribute.STROKE_PAINT); + Stroke stroke = (Stroke)aci.getAttribute( + GVTAttributedCharacterIterator.TextAttribute.STROKE); + + return glyphBridge.createGlyph(ctx, localGlyphElement, altGlyphElement, + -1, fontSize, fontFace, + fillPaint, strokePaint, stroke); } } 1.4 +8 -4 xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphHandler.java Index: SVGAltGlyphHandler.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphHandler.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SVGAltGlyphHandler.java 2001/07/05 06:56:07 1.3 +++ SVGAltGlyphHandler.java 2001/08/02 07:49:35 1.4 @@ -15,6 +15,7 @@ import org.apache.batik.util.SVGConstants; import java.awt.font.FontRenderContext; +import java.text.AttributedCharacterIterator; import org.w3c.dom.Element; /** @@ -22,7 +23,7 @@ * GVTGlyphVector for the altGlyph element. * * @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a> - * @version $Id: SVGAltGlyphHandler.java,v 1.3 2001/07/05 06:56:07 bella Exp $ + * @version $Id: SVGAltGlyphHandler.java,v 1.4 2001/08/02 07:49:35 bella Exp $ */ public class SVGAltGlyphHandler implements AltGlyphHandler, SVGConstants { @@ -50,10 +51,13 @@ * @return The GVTGlyphVector containing the alternate glyphs, or null if * the alternate glyphs could not be found. */ - public GVTGlyphVector createGlyphVector(FontRenderContext frc, float fontSize) { + public GVTGlyphVector createGlyphVector(FontRenderContext frc, float fontSize, + AttributedCharacterIterator aci) { if (textElement.getTagName().equals(SVG_ALT_GLYPH_TAG)) { - SVGAltGlyphElementBridge altGlyphBridge = (SVGAltGlyphElementBridge)ctx.getBridge(textElement); - Glyph[] glyphArray = altGlyphBridge.createAltGlyphArray(ctx, textElement, fontSize); + SVGAltGlyphElementBridge altGlyphBridge + = (SVGAltGlyphElementBridge)ctx.getBridge(textElement); + Glyph[] glyphArray + = altGlyphBridge.createAltGlyphArray(ctx, textElement, fontSize, aci); if (glyphArray != null) { return new SVGGVTGlyphVector(null, glyphArray, frc); } 1.6 +42 -7 xml-batik/sources/org/apache/batik/bridge/SVGGVTFont.java Index: SVGGVTFont.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGGVTFont.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SVGGVTFont.java 2001/07/05 06:56:08 1.5 +++ SVGGVTFont.java 2001/08/02 07:49:35 1.6 @@ -9,6 +9,9 @@ package org.apache.batik.bridge; import java.awt.Font; +import java.awt.Paint; +import java.awt.Stroke; +import java.awt.font.TextAttribute; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.font.GlyphVector; @@ -38,7 +41,7 @@ * Represents an SVG font. * * @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a> - * @version $Id: SVGGVTFont.java,v 1.5 2001/07/05 06:56:08 bella Exp $ + * @version $Id: SVGGVTFont.java,v 1.6 2001/08/02 07:49:35 bella Exp $ */ public final class SVGGVTFont implements GVTFont, SVGConstants { @@ -538,8 +541,18 @@ Element glyphElement = glyphElements[i]; SVGGlyphElementBridge glyphBridge = (SVGGlyphElementBridge)ctx.getBridge(glyphElement); - Glyph glyph = glyphBridge.createGlyph( - ctx, glyphElement, textElement, i, fontSize, fontFace); + Glyph glyph; + if (aci != null) { + aci.setIndex(ci.getIndex()); + Paint fillPaint = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); + Paint strokePaint = (Paint)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE_PAINT); + Stroke stroke = (Stroke)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE); + glyph = glyphBridge.createGlyph( + ctx, glyphElement, textElement, i, fontSize, fontFace, fillPaint, strokePaint, stroke); + } else { + glyph = glyphBridge.createGlyph( + ctx, glyphElement, textElement, i, fontSize, fontFace, null, null, null); + } glyphs.add(glyph); foundMatchingGlyph = true; break; @@ -561,8 +574,18 @@ Element glyphElement = glyphElements[i]; SVGGlyphElementBridge glyphBridge = (SVGGlyphElementBridge)ctx.getBridge(glyphElement); - Glyph glyph = glyphBridge.createGlyph( - ctx, glyphElement, textElement, i, fontSize, fontFace); + Glyph glyph; + if (aci != null) { + aci.setIndex(ci.getIndex()); + Paint fillPaint = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); + Paint strokePaint = (Paint)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE_PAINT); + Stroke stroke = (Stroke)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE); + glyph = glyphBridge.createGlyph( + ctx, glyphElement, textElement, i, fontSize, fontFace, fillPaint, strokePaint, stroke); + } else { + glyph = glyphBridge.createGlyph( + ctx, glyphElement, textElement, i, fontSize, fontFace, null, null, null); + } glyphs.add(glyph); foundMatchingGlyph = true; break; @@ -578,8 +601,20 @@ // add the missing glyph SVGGlyphElementBridge glyphBridge = (SVGGlyphElementBridge)ctx.getBridge(missingGlyphElement); - Glyph glyph = glyphBridge.createGlyph( - ctx, missingGlyphElement, textElement, -1, fontSize, fontFace); + Glyph glyph; + if (aci != null) { + aci.setIndex(ci.getIndex()); + Paint fillPaint = (Paint)aci.getAttribute(TextAttribute.FOREGROUND); + Paint strokePaint = (Paint)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE_PAINT); + Stroke stroke = (Stroke)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.STROKE); + glyph = glyphBridge.createGlyph( + ctx, missingGlyphElement, textElement, -1, fontSize, + fontFace, fillPaint, strokePaint, stroke); + } else { + glyph = glyphBridge.createGlyph( + ctx, missingGlyphElement, textElement, -1, fontSize, + fontFace, null, null, null); + } glyphs.add(glyph); } 1.5 +26 -21 xml-batik/sources/org/apache/batik/bridge/SVGGlyphElementBridge.java Index: SVGGlyphElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGGlyphElementBridge.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- SVGGlyphElementBridge.java 2001/07/05 06:56:08 1.4 +++ SVGGlyphElementBridge.java 2001/08/02 07:49:35 1.5 @@ -9,6 +9,9 @@ package org.apache.batik.bridge; import java.awt.Shape; +import java.awt.Paint; +import java.awt.Stroke; +import java.awt.Color; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; @@ -20,8 +23,11 @@ import org.apache.batik.gvt.CompositeGraphicsNode; import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.gvt.ShapeNode; -import org.apache.batik.gvt.ShapePainter; +import org.apache.batik.gvt.StrokeShapePainter; +import org.apache.batik.gvt.FillShapePainter; +import org.apache.batik.gvt.CompositeShapePainter; import org.apache.batik.gvt.font.Glyph; +import org.apache.batik.ext.awt.LinearGradientPaint; import org.apache.batik.parser.AWTPathProducer; import org.apache.batik.parser.ParseException; @@ -37,7 +43,7 @@ * Bridge class for the <glyph> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a> - * @version $Id: SVGGlyphElementBridge.java,v 1.4 2001/07/05 06:56:08 bella Exp $ + * @version $Id: SVGGlyphElementBridge.java,v 1.5 2001/08/02 07:49:35 bella Exp $ */ public class SVGGlyphElementBridge extends AbstractSVGBridge implements ErrorConstants { @@ -72,24 +78,22 @@ Element textElement, int glyphCode, float fontSize, - SVGFontFace fontFace) { + SVGFontFace fontFace, + Paint fillPaint, + Paint strokePaint, + Stroke stroke) { - // build the GVT tree that represents the glyph - GVTBuilder builder = ctx.getGVTBuilder(); - CompositeGraphicsNode glyphContentNode - = new CompositeGraphicsNode(); - float fontHeight = fontFace.getUnitsPerEm(); float scale = fontSize/fontHeight; AffineTransform scaleTransform = AffineTransform.getScaleInstance(scale, -scale); - // create a shape node that represents the d attribute + // create a shape that represents the d attribute String d = glyphElement.getAttributeNS(null, SVG_D_ATTRIBUTE); + Shape dShape = null; if (d.length() != 0) { - ShapeNode shapeNode = new ShapeNode(); AWTPathProducer app = new AWTPathProducer(); app.setWindingRule(CSSUtilities.convertFillRule(glyphElement)); try { @@ -105,15 +109,7 @@ Shape shape = app.getShape(); Shape transformedShape = scaleTransform.createTransformedShape(shape); - - shapeNode.setShape(transformedShape); - - // set up the painter for the d part of the glyph - ShapePainter painter = PaintServer.convertFillAndStroke( - textElement, shapeNode, ctx); - shapeNode.setShapePainter(painter); - - glyphContentNode.add(shapeNode); + dShape = transformedShape; } } @@ -132,8 +128,15 @@ } } + CompositeGraphicsNode glyphContentNode = null; + if (numGlyphChildren > 0) { // the glyph has child elements + // build the GVT tree that represents the glyph children + GVTBuilder builder = ctx.getGVTBuilder(); + + glyphContentNode = new CompositeGraphicsNode(); + // // need to clone the parent font element and glyph element // this is so that the glyph doesn't inherit anything past the font element @@ -318,8 +321,10 @@ Point2D horizOrigin = new Point2D.Float(horizOriginX, horizOriginY); // return a new Glyph - return new Glyph(glyphContentNode, unicode, names, orientation, + return new Glyph(unicode, names, orientation, arabicForm, lang, horizOrigin, vertOrigin, - horizAdvX, vertAdvY, glyphCode, scale); + horizAdvX, vertAdvY, glyphCode, scale, + fillPaint, strokePaint, stroke, + dShape, glyphContentNode); } } 1.31 +34 -30 xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java Index: SVGTextElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- SVGTextElementBridge.java 2001/08/01 05:39:06 1.30 +++ SVGTextElementBridge.java 2001/08/02 07:49:35 1.31 @@ -57,7 +57,7 @@ * Bridge class for the <text> element. * * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a> - * @version $Id: SVGTextElementBridge.java,v 1.30 2001/08/01 05:39:06 bella Exp $ + * @version $Id: SVGTextElementBridge.java,v 1.31 2001/08/02 07:49:35 bella Exp $ */ public class SVGTextElementBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { @@ -973,9 +973,6 @@ } // Unicode-bidi mode - // full support requires revision: see comments - // below regarding 'direction' - v = (CSSPrimitiveValue)cssDecl.getPropertyCSSValueInternal (CSS_UNICODE_BIDI_PROPERTY); s = v.getStringValue(); @@ -1033,6 +1030,8 @@ // Writing mode + boolean horizontal = true; + v = (CSSPrimitiveValue)cssDecl.getPropertyCSSValueInternal (CSS_WRITING_MODE_PROPERTY); s = v.getStringValue(); @@ -1050,10 +1049,11 @@ TextAttribute.WRITING_MODE_RTL); break; case 't': - result.put(GVTAttributedCharacterIterator. + result.put(GVTAttributedCharacterIterator. TextAttribute.WRITING_MODE, GVTAttributedCharacterIterator. TextAttribute.WRITING_MODE_TTB); + horizontal = false; break; } @@ -1142,12 +1142,13 @@ (CSS_LETTER_SPACING_PROPERTY); t = v.getPrimitiveType(); if (t != CSSPrimitiveValue.CSS_IDENT) { - f = UnitProcessor.cssHorizontalCoordinateToUserSpace - (v, CSS_LETTER_SPACING_PROPERTY, uctx); - - // XXX: HACK: Assuming horizontal length units is wrong, - // layout might be vertical! - + if (horizontal) { + f = UnitProcessor.cssHorizontalCoordinateToUserSpace + (v, CSS_LETTER_SPACING_PROPERTY, uctx); + } else { + f = UnitProcessor.cssVerticalCoordinateToUserSpace + (v, CSS_LETTER_SPACING_PROPERTY, uctx); + } result.put(GVTAttributedCharacterIterator. TextAttribute.LETTER_SPACING, new Float(f)); @@ -1161,12 +1162,13 @@ (CSS_WORD_SPACING_PROPERTY); t = v.getPrimitiveType(); if (t != CSSPrimitiveValue.CSS_IDENT) { - f = UnitProcessor.cssHorizontalCoordinateToUserSpace - (v, CSS_WORD_SPACING_PROPERTY, uctx); - - // XXX: HACK: Assuming horizontal length units is wrong, - // layout might be vertical! - + if (horizontal) { + f = UnitProcessor.cssHorizontalCoordinateToUserSpace + (v, CSS_WORD_SPACING_PROPERTY, uctx); + } else { + f = UnitProcessor.cssVerticalCoordinateToUserSpace + (v, CSS_WORD_SPACING_PROPERTY, uctx); + } result.put(GVTAttributedCharacterIterator.TextAttribute.WORD_SPACING, new Float(f)); result.put(GVTAttributedCharacterIterator. @@ -1177,12 +1179,13 @@ // Kerning s = element.getAttributeNS(null, SVG_KERNING_ATTRIBUTE); if (s.length() != 0) { - f = UnitProcessor.svgHorizontalLengthToUserSpace - (s, SVG_KERNING_ATTRIBUTE, uctx); - - // XXX: Assuming horizontal length units is wrong, - // layout might be vertical! - + if (horizontal) { + f = UnitProcessor.svgHorizontalLengthToUserSpace + (s, SVG_KERNING_ATTRIBUTE, uctx); + } else { + f = UnitProcessor.svgVerticalLengthToUserSpace + (s, SVG_KERNING_ATTRIBUTE, uctx); + } result.put(GVTAttributedCharacterIterator.TextAttribute.KERNING, new Float(f)); result.put(GVTAttributedCharacterIterator. @@ -1193,14 +1196,16 @@ // textLength s = element.getAttributeNS(null, SVG_TEXT_LENGTH_ATTRIBUTE); if (s.length() != 0) { - f = UnitProcessor.svgHorizontalLengthToUserSpace - (s, SVG_TEXT_LENGTH_ATTRIBUTE, uctx); - - // XXX: Assuming horizontal length units is wrong, - // layout might be vertical! - + if (horizontal) { + f = UnitProcessor.svgHorizontalLengthToUserSpace + (s, SVG_TEXT_LENGTH_ATTRIBUTE, uctx); + } else { + f = UnitProcessor.svgVerticalLengthToUserSpace + (s, SVG_TEXT_LENGTH_ATTRIBUTE, uctx); + } result.put(GVTAttributedCharacterIterator.TextAttribute.BBOX_WIDTH, new Float(f)); + // lengthAdjust s = element.getAttributeNS(null, SVG_LENGTH_ADJUST_ATTRIBUTE); @@ -1216,7 +1221,6 @@ TextAttribute.LENGTH_ADJUST, GVTAttributedCharacterIterator.TextAttribute.ADJUST_ALL); } - } return result; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]