Index: fop-core/src/main/java/org/apache/fop/svg/font/FOPGVTGlyphVector.java
===================================================================
--- fop-core/src/main/java/org/apache/fop/svg/font/FOPGVTGlyphVector.java	(revision 1784343)
+++ fop-core/src/main/java/org/apache/fop/svg/font/FOPGVTGlyphVector.java	(working copy)
@@ -20,11 +20,14 @@
 package org.apache.fop.svg.font;
 
 import java.awt.Graphics2D;
+import java.awt.Paint;
 import java.awt.Rectangle;
 import java.awt.Shape;
+import java.awt.Stroke;
 import java.awt.font.FontRenderContext;
 import java.awt.font.GlyphJustificationInfo;
 import java.awt.font.GlyphMetrics;
+import java.awt.font.GlyphVector;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.GeneralPath;
 import java.awt.geom.Point2D;
@@ -35,14 +38,18 @@
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.batik.gvt.font.AWTGVTFont;
+import org.apache.batik.gvt.font.AWTGlyphGeometryCache;
 import org.apache.batik.gvt.font.GVTFont;
 import org.apache.batik.gvt.font.GVTGlyphMetrics;
 import org.apache.batik.gvt.font.GVTGlyphVector;
 import org.apache.batik.gvt.font.GVTLineMetrics;
 import org.apache.batik.gvt.text.GVTAttributedCharacterIterator;
+import org.apache.batik.gvt.text.TextPaintInfo;
 
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontMetrics;
+import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.fonts.GlyphMapping;
 import org.apache.fop.fonts.TextFragment;
 import org.apache.fop.traits.MinOptMax;
@@ -77,6 +84,12 @@
 
     protected Rectangle2D logicalBounds;
 
+    protected AWTGVTFont gvtFont;
+
+    protected GlyphVector awtGlyphVector;
+
+    private Point2D[] defaultGlyphPositions;
+
     FOPGVTGlyphVector(FOPGVTFont font, final CharacterIterator iter, FontRenderContext frc) {
         this.text = new SVGTextFragment(iter);
         this.font = font;
@@ -84,6 +97,28 @@
         this.fontSize = f.getFontSize();
         this.fontMetrics = f.getFontMetrics();
         this.frc = frc;
+
+        FontTriplet fontTriplet = font.getFontTriplet();
+
+        int style = 0;
+        if (fontTriplet.getWeight() >= Font.WEIGHT_BOLD) {
+            style += 1;
+        }
+        if (fontTriplet.getStyle().equals(Font.STYLE_ITALIC)) {
+            style += 2;
+        }
+
+        java.awt.Font awtFont = new java.awt.Font(font.getFamilyName(), style, fontSize / 1000);
+        this.gvtFont = new AWTGVTFont(awtFont);
+        iter.first();
+        this.awtGlyphVector = awtFont.createGlyphVector(frc, iter);
+
+        awtGlyphVector.performDefaultLayout();
+        int n = awtGlyphVector.getNumGlyphs();
+        defaultGlyphPositions = new Point2D.Float[n+1];
+        for (int i = 0; i <= n; i++) {
+            defaultGlyphPositions[i] = awtGlyphVector.getGlyphPosition(i);
+        }
     }
 
     public void performDefaultLayout() {
@@ -294,14 +329,21 @@
     }
 
     public Shape getGlyphOutline(int glyphIndex) {
-        Shape glyphBox = getBoundingBoxes()[glyphIndex];
-        AffineTransform tr = AffineTransform.getTranslateInstance(positions[glyphIndex * 2],
-                positions[glyphIndex * 2 + 1]);
+        Point2D defaultGlyphPos = defaultGlyphPositions[glyphIndex];
+        char c = text.charAt(glyphIndex);
+        AWTGlyphGeometryCache.Value v = AWTGVTFont.getGlyphGeometry
+                (gvtFont, c, awtGlyphVector, glyphIndex, defaultGlyphPos);
+        Shape shape = v.getOutline();
+
+        Point2D glyphPos = getGlyphPosition(glyphIndex);
+        AffineTransform tr = AffineTransform.getTranslateInstance(glyphPos.getX(), glyphPos.getY());
         AffineTransform glyphTransform = getGlyphTransform(glyphIndex);
         if (glyphTransform != null) {
             tr.concatenate(glyphTransform);
         }
-        return tr.createTransformedShape(glyphBox);
+        shape = tr.createTransformedShape(shape);
+
+        return shape;
     }
 
     public Rectangle2D getGlyphCellBounds(int glyphIndex) {
@@ -412,7 +454,30 @@
     }
 
     public void draw(Graphics2D graphics2d, AttributedCharacterIterator aci) {
-        // NOP
+        TextPaintInfo tpi = (TextPaintInfo)aci.getAttribute(GVTAttributedCharacterIterator.TextAttribute.PAINT_INFO);
+
+        if (tpi != null) {
+            Paint paint         = tpi.fillPaint;
+            Stroke stroke       = tpi.strokeStroke;
+            Paint strokePaint   = tpi.strokePaint;
+            boolean visible     = tpi.visible;
+
+            Shape shape = getOutline();
+
+            if (visible) {
+                if (paint != null) {
+                    // fill the text
+                    graphics2d.setPaint(paint);
+                    graphics2d.fill(shape);
+                }
+                if (stroke != null && strokePaint != null) {
+                    // stroke the text
+                    graphics2d.setPaint(strokePaint);
+                    graphics2d.setStroke(stroke);
+                    graphics2d.draw(shape);
+                }
+            }
+        }
     }
 
     private Rectangle2D[] getBoundingBoxes() {
