You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by vh...@apache.org on 2014/02/03 20:29:26 UTC

svn commit: r1564017 [7/9] - in /xmlgraphics/fop/trunk: ./ lib/ src/codegen/fonts/ src/java/org/apache/fop/afp/ src/java/org/apache/fop/afp/fonts/ src/java/org/apache/fop/afp/goca/ src/java/org/apache/fop/afp/svg/ src/java/org/apache/fop/fo/ src/java/o...

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/OutlineFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/OutlineFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/OutlineFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/OutlineFont.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,8 @@
 
 package org.apache.fop.afp.fonts;
 
+import java.awt.Rectangle;
+
 import org.apache.fop.afp.AFPEventProducer;
 
 /**
@@ -38,4 +40,18 @@ public class OutlineFont extends Abstrac
         super(name, embeddable, charSet, eventProducer);
     }
 
+    /**
+     * Obtain the width of the character for the specified point size.
+     * @param character the character
+     * @param size the font size (in mpt)
+     * @return the width of the character for the specified point size
+     */
+    public int getWidth(int character, int size) {
+        return charSet.getWidth(toUnicodeCodepoint(character), size);
+    }
+
+    @Override
+    public Rectangle getBoundingBox(int character, int size) {
+        return charSet.getCharacterBox(toUnicodeCodepoint(character), size);
+    }
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/RasterFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/RasterFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/RasterFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/fonts/RasterFont.java Mon Feb  3 19:29:24 2014
@@ -19,8 +19,8 @@
 
 package org.apache.fop.afp.fonts;
 
+import java.awt.Rectangle;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -135,46 +135,21 @@ public class RasterFont extends AFPFont 
 
     }
 
-    /**
-     * Get the first character in this font.
-     * @return the first character in this font.
-     */
-    public int getFirstChar() {
-        Iterator<CharacterSet> it = charSets.values().iterator();
-        if (it.hasNext()) {
-            CharacterSet csm = it.next();
-            return csm.getFirstChar();
-        } else {
-            String msg = "getFirstChar() - No character set found for font:" + getFontName();
-            LOG.error(msg);
-            throw new FontRuntimeException(msg);
-        }
-    }
-
-    /**
-     * Get the last character in this font.
-     * @return the last character in this font.
-     */
-    public int getLastChar() {
-
-        Iterator<CharacterSet> it = charSets.values().iterator();
-        if (it.hasNext()) {
-            CharacterSet csm = it.next();
-            return csm.getLastChar();
+    private int metricsToAbsoluteSize(CharacterSet cs, int value, int givenSize) {
+        int nominalVerticalSize = cs.getNominalVerticalSize();
+        if (nominalVerticalSize != 0) {
+            return value * nominalVerticalSize;
         } else {
-            String msg = "getLastChar() - No character set found for font:" + getFontName();
-            LOG.error(msg);
-            throw new FontRuntimeException(msg);
+            return value * givenSize;
         }
-
     }
 
-    private int metricsToAbsoluteSize(CharacterSet cs, int value, int givenSize) {
+    private int metricsToAbsoluteSize(CharacterSet cs, double value, int givenSize) {
         int nominalVerticalSize = cs.getNominalVerticalSize();
         if (nominalVerticalSize != 0) {
-            return value * nominalVerticalSize;
+            return (int) (value * nominalVerticalSize);
         } else {
-            return value * givenSize;
+            return (int) (value * givenSize);
         }
     }
 
@@ -191,6 +166,20 @@ public class RasterFont extends AFPFont 
         return metricsToAbsoluteSize(cs, cs.getAscender(), size);
     }
 
+    /** {@inheritDoc} */
+    public int getUnderlinePosition(int size) {
+        CharacterSet cs = getCharacterSet(size);
+        return metricsToAbsoluteSize(cs, cs.getUnderscorePosition(), size);
+    }
+
+    @Override
+    public int getUnderlineThickness(int size) {
+        CharacterSet cs = getCharacterSet(size);
+        int underscoreWidth = cs.getUnderscoreWidth();
+        return underscoreWidth == 0 ? super.getUnderlineThickness(size)
+                : metricsToAbsoluteSize(cs, underscoreWidth, size);
+    }
+
     /**
      * Obtains the height of capital letters for the specified point size.
      *
@@ -234,33 +223,20 @@ public class RasterFont extends AFPFont 
      */
     public int getWidth(int character, int size) {
         CharacterSet cs = getCharacterSet(size);
-        return metricsToAbsoluteSize(cs, cs.getWidth(toUnicodeCodepoint(character)), size);
+        return metricsToAbsoluteSize(cs, cs.getWidth(toUnicodeCodepoint(character), 1), size);
     }
 
     /**
-     * Get the getWidth (in 1/1000ths of a point size) of all characters in this
-     * character set.
-     *
-     * @param size the font size (in mpt)
-     * @return the widths of all characters
+     * TODO
      */
-    public int[] getWidths(int size) {
+    public Rectangle getBoundingBox(int character, int size) {
         CharacterSet cs = getCharacterSet(size);
-        int[] widths = cs.getWidths();
-        for (int i = 0, c = widths.length; i < c; i++) {
-            widths[i] = metricsToAbsoluteSize(cs, widths[i], size);
-        }
-        return widths;
-    }
-
-    /**
-     * Get the getWidth (in 1/1000ths of a point size) of all characters in this
-     * character set.
-     *
-     * @return the widths of all characters
-     */
-    public int[] getWidths() {
-        return getWidths(1000);
+        Rectangle characterBox = cs.getCharacterBox(toUnicodeCodepoint(character), 1);
+        int x = metricsToAbsoluteSize(cs, characterBox.getX(), size);
+        int y = metricsToAbsoluteSize(cs, characterBox.getY(), size);
+        int w = metricsToAbsoluteSize(cs, characterBox.getWidth(), size);
+        int h = metricsToAbsoluteSize(cs, characterBox.getHeight(), size);
+        return new Rectangle(x, y, w, h);
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/goca/GraphicsCharacterString.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/goca/GraphicsCharacterString.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/goca/GraphicsCharacterString.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/goca/GraphicsCharacterString.java Mon Feb  3 19:29:24 2014
@@ -67,7 +67,11 @@ public class GraphicsCharacterString ext
 
     /** {@inheritDoc} */
     public int getDataLength() {
-        return super.getDataLength() + str.length();
+        try {
+            return super.getDataLength() + getStringAsBytes().length;
+        } catch (IOException ioe) {
+            throw new RuntimeException(ioe);
+        }
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPBridgeContext.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPBridgeContext.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPBridgeContext.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPBridgeContext.java Mon Feb  3 19:29:24 2014
@@ -25,13 +25,17 @@ import org.apache.batik.bridge.BridgeCon
 import org.apache.batik.bridge.DocumentLoader;
 import org.apache.batik.bridge.UserAgent;
 import org.apache.batik.gvt.TextPainter;
+import org.apache.batik.gvt.font.DefaultFontFamilyResolver;
+import org.apache.batik.gvt.font.FontFamilyResolver;
 
 import org.apache.xmlgraphics.image.loader.ImageManager;
 import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 
 import org.apache.fop.afp.AFPGraphics2D;
+import org.apache.fop.events.EventBroadcaster;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.svg.AbstractFOPBridgeContext;
+import org.apache.fop.svg.font.AggregatingFontFamilyResolver;
 
 /**
  * An AFP specific implementation of a Batik BridgeContext
@@ -40,6 +44,8 @@ public class AFPBridgeContext extends Ab
 
     private final AFPGraphics2D g2d;
 
+    private final EventBroadcaster eventBroadCaster;
+
     /**
      * Constructs a new bridge context.
      *
@@ -54,47 +60,35 @@ public class AFPBridgeContext extends Ab
      */
     public AFPBridgeContext(UserAgent userAgent, FontInfo fontInfo,
             ImageManager imageManager, ImageSessionContext imageSessionContext,
-            AffineTransform linkTransform, AFPGraphics2D g2d) {
+            AffineTransform linkTransform, AFPGraphics2D g2d, EventBroadcaster eventBroadCaster) {
         super(userAgent, fontInfo, imageManager, imageSessionContext, linkTransform);
         this.g2d = g2d;
+        this.eventBroadCaster = eventBroadCaster;
     }
 
-    /**
-     * Constructs a new bridge context.
-     * @param userAgent the user agent
-     * @param documentLoader the Document Loader to use for referenced documents.
-     * @param fontInfo the font list for the text painter, may be null
-     *                 in which case text is painted as shapes
-     * @param imageManager an image manager
-     * @param imageSessionContext an image session context
-     * @param linkTransform AffineTransform to properly place links,
-     *                      may be null
-     * @param g2d an AFPGraphics 2D implementation
-     */
-    public AFPBridgeContext(UserAgent userAgent, DocumentLoader documentLoader,
+    private AFPBridgeContext(UserAgent userAgent, DocumentLoader documentLoader,
             FontInfo fontInfo, ImageManager imageManager,
             ImageSessionContext imageSessionContext,
-            AffineTransform linkTransform, AFPGraphics2D g2d) {
-        super(userAgent, documentLoader, fontInfo, imageManager,
-              imageSessionContext, linkTransform);
+            AffineTransform linkTransform, AFPGraphics2D g2d, EventBroadcaster eventBroadCaster) {
+        super(userAgent, documentLoader, fontInfo, imageManager, imageSessionContext, linkTransform);
         this.g2d = g2d;
+        this.eventBroadCaster = eventBroadCaster;
     }
 
     /** {@inheritDoc} */
     @Override
     public void registerSVGBridges() {
         super.registerSVGBridges();
-
         if (fontInfo != null) {
             AFPTextHandler textHandler = new AFPTextHandler(fontInfo, g2d.getResourceManager());
             g2d.setCustomTextHandler(textHandler);
-
-            TextPainter textPainter = new AFPTextPainter(textHandler);
-            setTextPainter(textPainter);
-
+            //TODO
+            FontFamilyResolver fontFamilyResolver = new AggregatingFontFamilyResolver(
+                    new AFPFontFamilyResolver(fontInfo, eventBroadCaster), DefaultFontFamilyResolver.SINGLETON);
+            TextPainter textPainter = new AFPTextPainter(textHandler, fontFamilyResolver);
+            setTextPainter(new AFPTextPainter(textHandler, fontFamilyResolver));
             putBridge(new AFPTextElementBridge(textPainter));
         }
-
         putBridge(new AFPImageElementBridge());
     }
 
@@ -105,7 +99,7 @@ public class AFPBridgeContext extends Ab
                 fontInfo,
                 getImageManager(),
                 getImageSessionContext(),
-                linkTransform, g2d);
+                linkTransform, g2d, eventBroadCaster);
     }
 
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextHandler.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextHandler.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextHandler.java Mon Feb  3 19:29:24 2014
@@ -135,27 +135,18 @@ public class AFPTextHandler extends FOPT
                 if (log.isDebugEnabled()) {
                     log.debug("  with overriding font: " + internalFontName + ", " + fontSize);
                 }
-            } else {
-                java.awt.Font awtFont = g2d.getFont();
-                Font fopFont = fontInfo.getFontInstanceForAWTFont(awtFont);
-                if (log.isDebugEnabled()) {
-                    log.debug("  with font: " + fopFont);
-                }
-                internalFontName = fopFont.getFontName();
-                fontSize = fopFont.getFontSize();
+                fontSize = (int) Math.round(g2d.convertToAbsoluteLength(fontSize));
+                fontReference = registerPageFont(pageFonts, internalFontName, fontSize);
+                // TODO: re-think above registerPageFont code...
+                AFPFont afpFont = (AFPFont) fontInfo.getFonts().get(internalFontName);
+                final CharacterSet charSet = afpFont.getCharacterSet(fontSize);
+                // Work-around for InfoPrint's AFP which loses character set state
+                // over Graphics Data
+                // boundaries.
+                graphicsObj.setCharacterSet(fontReference);
+                // add the character string
+                graphicsObj.addString(str, Math.round(x), Math.round(y), charSet);
             }
-            fontSize = (int)Math.round(
-                    g2d.convertToAbsoluteLength(fontSize));
-            fontReference = registerPageFont(pageFonts, internalFontName, fontSize);
-            // TODO: re-think above registerPageFont code...
-            AFPFont afpFont = (AFPFont) fontInfo.getFonts().get(internalFontName);
-            final CharacterSet charSet = afpFont.getCharacterSet(fontSize);
-            // Work-around for InfoPrint's AFP which loses character set state
-            // over Graphics Data
-            // boundaries.
-            graphicsObj.setCharacterSet(fontReference);
-            // add the character string
-            graphicsObj.addString(str, Math.round(x), Math.round(y), charSet);
         } else {
             //Inside Batik's SVG filter operations, you won't get an AFPGraphics2D
             g.drawString(str, x, y);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextPainter.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextPainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/svg/AFPTextPainter.java Mon Feb  3 19:29:24 2014
@@ -21,6 +21,9 @@ package org.apache.fop.afp.svg;
 
 import java.awt.Graphics2D;
 
+import org.apache.batik.gvt.font.FontFamilyResolver;
+import org.apache.batik.gvt.renderer.StrokingTextPainter;
+
 import org.apache.fop.afp.AFPGraphics2D;
 import org.apache.fop.svg.AbstractFOPTextPainter;
 import org.apache.fop.svg.FOPTextHandler;
@@ -39,8 +42,8 @@ public class AFPTextPainter extends Abst
      * Create a new text painter with the given font information.
      * @param nativeTextHandler the NativeTextHandler instance used for text painting
      */
-    public AFPTextPainter(FOPTextHandler nativeTextHandler) {
-        super(nativeTextHandler);
+    public AFPTextPainter(FOPTextHandler nativeTextHandler, FontFamilyResolver fopFontFamilyResolver) {
+        super(nativeTextHandler, new FOPStrokingTextPainter(fopFontFamilyResolver));
     }
 
     /** {@inheritDoc} */
@@ -48,4 +51,18 @@ public class AFPTextPainter extends Abst
         return g2d instanceof AFPGraphics2D;
     }
 
+    private static class FOPStrokingTextPainter extends StrokingTextPainter {
+
+        private final FontFamilyResolver fopFontFontFamily;
+
+        FOPStrokingTextPainter(FontFamilyResolver fopFontFontFamily) {
+            this.fopFontFontFamily = fopFontFontFamily;
+        }
+
+        @Override
+        protected FontFamilyResolver getFontFamilyResolver() {
+            return fopFontFontFamily;
+        }
+    }
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOText.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOText.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOText.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fo/FOText.java Mon Feb  3 19:29:24 2014
@@ -21,7 +21,6 @@ package org.apache.fop.fo;
 
 import java.awt.Color;
 import java.nio.CharBuffer;
-import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Stack;
 
@@ -38,12 +37,13 @@ import org.apache.fop.fo.properties.Comm
 import org.apache.fop.fo.properties.KeepProperty;
 import org.apache.fop.fo.properties.Property;
 import org.apache.fop.fo.properties.SpaceProperty;
+import org.apache.fop.fonts.TextFragment;
 import org.apache.fop.util.CharUtilities;
 
 /**
  * A text node (PCDATA) in the formatting object tree.
  */
-public class FOText extends FONode implements CharSequence {
+public class FOText extends FONode implements CharSequence, TextFragment {
 
     /** the <code>CharBuffer</code> containing the text */
     private CharBuffer charBuffer;
@@ -93,9 +93,6 @@ public class FOText extends FONode imple
     /* bidi levels */
     private int[] bidiLevels;
 
-    /* advanced script processing state */
-    private Map/*<MapRange,String>*/ mappings;
-
     private static final int IS_WORD_CHAR_FALSE = 0;
     private static final int IS_WORD_CHAR_TRUE = 1;
     private static final int IS_WORD_CHAR_MAYBE = 2;
@@ -804,93 +801,6 @@ public class FOText extends FONode imple
         }
     }
 
-    /**
-     * Add characters mapped by script substitution processing.
-     * @param start index in character buffer
-     * @param end index in character buffer
-     * @param mappedChars sequence of character codes denoting substituted characters
-     */
-    public void addMapping(int start, int end, CharSequence mappedChars) {
-        if (mappings == null) {
-            mappings = new java.util.HashMap();
-        }
-        mappings.put(new MapRange(start, end), mappedChars.toString());
-    }
-
-    /**
-     * Determine if characters over specific interval  have a mapping.
-     * @param start index in character buffer
-     * @param end index in character buffer
-     * @return true if a mapping exist such that the mapping's interval is coincident to
-     * [start,end)
-     */
-    public boolean hasMapping(int start, int end) {
-        return (mappings != null) && (mappings.containsKey(new MapRange(start, end)));
-    }
-
-    /**
-     * Obtain mapping of characters over specific interval.
-     * @param start index in character buffer
-     * @param end index in character buffer
-     * @return a string of characters representing the mapping over the interval
-     * [start,end)
-     */
-    public String getMapping(int start, int end) {
-        if (mappings != null) {
-            return (String) mappings.get(new MapRange(start, end));
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Obtain length of mapping of characters over specific interval.
-     * @param start index in character buffer
-     * @param end index in character buffer
-     * @return the length of the mapping (if present) or zero
-     */
-    public int getMappingLength(int start, int end) {
-        if (mappings != null) {
-            return ((String) mappings.get(new MapRange(start, end))) .length();
-        } else {
-            return 0;
-        }
-    }
-
-    /**
-     * Obtain bidirectional levels of mapping of characters over specific interval.
-     * @param start index in character buffer
-     * @param end index in character buffer
-     * @return a (possibly empty) array of bidi levels or null
-     * in case no bidi levels have been assigned
-     */
-    public int[] getMappingBidiLevels(int start, int end) {
-        if (hasMapping(start, end)) {
-            int   nc = end - start;
-            int   nm = getMappingLength(start, end);
-            int[] la = getBidiLevels(start, end);
-            if (la == null) {
-                return null;
-            } else if (nm == nc) {            // mapping is same length as mapped range
-                return la;
-            } else if (nm > nc) {             // mapping is longer than mapped range
-                int[] ma = new int [ nm ];
-                System.arraycopy(la, 0, ma, 0, la.length);
-                for (int i = la.length,
-                          n = ma.length, l = (i > 0) ? la [ i - 1 ] : 0; i < n; i++) {
-                    ma [ i ] = l;
-                }
-                return ma;
-            } else {                            // mapping is shorter than mapped range
-                int[] ma = new int [ nm ];
-                System.arraycopy(la, 0, ma, 0, ma.length);
-                return ma;
-            }
-        } else {
-            return getBidiLevels(start, end);
-        }
-    }
-
     @Override
     protected Stack collectDelimitedTextRanges(Stack ranges, DelimitedTextRange currentRange) {
         if (currentRange != null) {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/Base14Font.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/Base14Font.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/Base14Font.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/Base14Font.java Mon Feb  3 19:29:24 2014
@@ -25,4 +25,15 @@ package org.apache.fop.fonts;
  */
 public abstract class Base14Font extends Typeface {
 
+    /** Thickness for underline and strikeout. */
+    private static final int LINE_THICKNESS = 50;
+
+    public int getStrikeoutPosition(int size) {
+        return getXHeight(size) / 2;
+    }
+
+    public int getStrikeoutThickness(int size) {
+        return size * LINE_THICKNESS;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/CustomFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/CustomFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/CustomFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/CustomFont.java Mon Feb  3 19:29:24 2014
@@ -37,6 +37,9 @@ import org.apache.fop.apps.io.InternalRe
 public abstract class CustomFont extends Typeface
             implements FontDescriptor, MutableFont {
 
+    /** Fallback thickness for underline and strikeout when not provided by the font. */
+    private static final int DEFAULT_LINE_THICKNESS = 50;
+
     private String fontName;
     private String fullName;
     private Set<String> familyNames;
@@ -60,6 +63,14 @@ public abstract class CustomFont extends
     private int firstChar;
     private int lastChar = 255;
 
+    private int underlinePosition;
+
+    private int underlineThickness;
+
+    private int strikeoutPosition;
+
+    private int strikeoutThickness;
+
     private Map<Integer, Map<Integer, Integer>> kerning;
 
     private boolean useKerning = true;
@@ -507,4 +518,40 @@ public abstract class CustomFont extends
         return copy;
     }
 
+    public int getUnderlinePosition(int size) {
+        return (underlinePosition == 0)
+                ? getDescender(size) / 2
+                : size * underlinePosition;
+    }
+
+    public void setUnderlinePosition(int underlinePosition) {
+        this.underlinePosition = underlinePosition;
+    }
+
+    public int getUnderlineThickness(int size) {
+        return size * ((underlineThickness == 0) ? DEFAULT_LINE_THICKNESS : underlineThickness);
+    }
+
+    public void setUnderlineThickness(int underlineThickness) {
+        this.underlineThickness = underlineThickness;
+    }
+
+    public int getStrikeoutPosition(int size) {
+        return (strikeoutPosition == 0)
+                ? getXHeight(size) / 2
+                : size * strikeoutPosition;
+    }
+
+    public void setStrikeoutPosition(int strikeoutPosition) {
+        this.strikeoutPosition = strikeoutPosition;
+    }
+
+    public int getStrikeoutThickness(int size) {
+        return (strikeoutThickness == 0) ? getUnderlineThickness(size) : size * strikeoutThickness;
+    }
+
+    public void setStrikeoutThickness(int strikeoutThickness) {
+        this.strikeoutThickness = strikeoutThickness;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontInfo.java Mon Feb  3 19:29:24 2014
@@ -30,6 +30,7 @@ import java.util.TreeSet;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+
 /**
  * The FontInfo holds font information for the layout and rendering of a fo document.
  * This stores the list of available fonts that are setup by
@@ -135,12 +136,10 @@ public class FontInfo {
         if (oldName != null) {
             int oldPriority = tripletPriorities.get(triplet).intValue();
             if (oldPriority < newPriority) {
-                logDuplicateFont(triplet, false, oldName, oldPriority,
-                            internalFontKey, newPriority);
+                logDuplicateFont(triplet, false, oldName, oldPriority, internalFontKey, newPriority);
                 return;
             } else {
-                logDuplicateFont(triplet, true, oldName, oldPriority,
-                            internalFontKey, newPriority);
+                logDuplicateFont(triplet, true, oldName, oldPriority, internalFontKey, newPriority);
             }
         }
         this.triplets.put(triplet, internalFontKey);
@@ -157,9 +156,8 @@ public class FontInfo {
      * @param newKey the new internal font name
      * @param newPriority the priority of the duplicate font mapping
      */
-    private void logDuplicateFont(FontTriplet triplet, boolean replacing,
-                                  String oldKey, int oldPriority,
-                                  String newKey, int newPriority) {
+    private void logDuplicateFont(FontTriplet triplet, boolean replacing, String oldKey, int oldPriority,
+            String newKey, int newPriority) {
         if (log.isDebugEnabled()) {
             log.debug(triplet
                     + (replacing ? ": Replacing " : ": Not replacing ")
@@ -198,8 +196,7 @@ public class FontInfo {
      *                  default font if not found
      * @return internal font triplet key
      */
-    private FontTriplet fontLookup(String family, String style,
-                             int weight, boolean substitutable) {
+    private FontTriplet fontLookup(String family, String style, int weight, boolean substitutable) {
         if (log.isTraceEnabled()) {
             log.trace("Font lookup: " + family + " " + style + " " + weight
                     + (substitutable ? " substitutable" : ""));
@@ -302,8 +299,7 @@ public class FontInfo {
      * @return the requested Font instance
      */
     public Font getFontInstance(FontTriplet triplet, int fontSize) {
-        Map<Integer, Font> sizes
-            = getFontInstanceCache().get(triplet);
+        Map<Integer, Font> sizes = getFontInstanceCache().get(triplet);
         if (sizes == null) {
             sizes = new HashMap<Integer, Font>();
             getFontInstanceCache().put(triplet, sizes);
@@ -379,13 +375,11 @@ public class FontInfo {
      * @param weight font weight
      * @return the font triplet of the font chosen
      */
-    public FontTriplet fontLookup(String family, String style,
-                             int weight) {
+    public FontTriplet fontLookup(String family, String style, int weight) {
         return fontLookup(family, style, weight, true);
     }
 
-    private List<FontTriplet> fontLookup(String[] families, String style,
-            int weight, boolean substitutable) {
+    private List<FontTriplet> fontLookup(String[] families, String style, int weight, boolean substitutable) {
         List<FontTriplet> matchingTriplets = new ArrayList<FontTriplet>();
         FontTriplet triplet = null;
         for (int i = 0; i < families.length; i++) {
@@ -410,8 +404,7 @@ public class FontInfo {
      * @return the set of font triplets of all supported and chosen font-families
      *          in the specified style and weight.
      */
-    public FontTriplet[] fontLookup(String[] families, String style,
-                             int weight) {
+    public FontTriplet[] fontLookup(String[] families, String style, int weight) {
         if (families.length == 0) {
             throw new IllegalArgumentException("Specify at least one font family");
         }
@@ -434,8 +427,8 @@ public class FontInfo {
                 sb.append(families[i]);
             }
             throw new IllegalStateException(
-                        "fontLookup must return an array with at least one "
-                        + "FontTriplet on the last call. Lookup: " + sb.toString());
+                    "fontLookup must return an array with at least one "
+                            + "FontTriplet on the last call. Lookup: " + sb.toString());
 
         }
         FontTriplet[] fontTriplets = new FontTriplet[matchedTriplets.size()];
@@ -469,8 +462,7 @@ public class FontInfo {
      * @param weight font weight
      * @return internal key
      */
-    public FontTriplet findAdjustWeight(String family, String style,
-                             int weight) {
+    public FontTriplet findAdjustWeight(String family, String style, int weight) {
         FontTriplet key = null;
         String f = null;
         int newWeight = weight;
@@ -542,8 +534,7 @@ public class FontInfo {
      * @param weight font weight
      * @return internal key
      */
-    public static FontTriplet createFontKey(String family, String style,
-                                       int weight) {
+    public static FontTriplet createFontKey(String family, String style, int weight) {
         return new FontTriplet(family, style, weight);
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontMetrics.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontMetrics.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontMetrics.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/FontMetrics.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts;
 
+import java.awt.Rectangle;
 import java.util.Map;
 import java.util.Set;
 
@@ -120,6 +121,15 @@ public interface FontMetrics {
     int[] getWidths();
 
     /**
+     * Returns the bounding box of the glyph at the given index, for the given font size.
+     *
+     * @param glyphIndex glyph index
+     * @param size font size
+     * @return the scaled bounding box scaled in 1/1000ths of the given size
+     */
+    Rectangle getBoundingBox(int glyphIndex, int size);
+
+    /**
      * Indicates if the font has kering information.
      * @return True, if kerning is available.
      */
@@ -131,4 +141,38 @@ public interface FontMetrics {
      */
     Map<Integer, Map<Integer, Integer>> getKerningInfo();
 
+    /**
+     * Returns the distance from the baseline to the center of the underline (negative
+     * value indicates below baseline).
+     *
+     * @param size font size
+     * @return the position in 1/1000ths of the font size
+     */
+    int getUnderlinePosition(int size);
+
+    /**
+     * Returns the thickness of the underline.
+     *
+     * @param size font size
+     * @return the thickness in 1/1000ths of the font size
+     */
+    int getUnderlineThickness(int size);
+
+    /**
+     * Returns the distance from the baseline to the center of the strikeout line
+     * (negative value indicates below baseline).
+     *
+     * @param size font size
+     * @return the position in 1/1000ths of the font size
+     */
+    int getStrikeoutPosition(int size);
+
+    /**
+     * Returns the thickness of the strikeout line.
+     *
+     * @param size font size
+     * @return the thickness in 1/1000ths of the font size
+     */
+    int getStrikeoutThickness(int size);
+
 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/LazyFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/LazyFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/LazyFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/LazyFont.java Mon Feb  3 19:29:24 2014
@@ -18,6 +18,7 @@
 /* $Id$ */
 
 package org.apache.fop.fonts;
+import java.awt.Rectangle;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -250,6 +251,26 @@ public class LazyFont extends Typeface i
         return realFont.getXHeight(size);
     }
 
+    public int getUnderlinePosition(int size) {
+        load(true);
+        return realFont.getUnderlinePosition(size);
+    }
+
+    public int getUnderlineThickness(int size) {
+        load(true);
+        return realFont.getUnderlineThickness(size);
+    }
+
+    public int getStrikeoutPosition(int size) {
+        load(true);
+        return realFont.getStrikeoutPosition(size);
+    }
+
+    public int getStrikeoutThickness(int size) {
+        load(true);
+        return realFont.getStrikeoutThickness(size);
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -268,6 +289,11 @@ public class LazyFont extends Typeface i
         return realFont.getWidths();
     }
 
+    public Rectangle getBoundingBox(int glyphIndex, int size) {
+        load(true);
+        return realFont.getBoundingBox(glyphIndex, size);
+    }
+
     /**
      * {@inheritDoc}
      */

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/MultiByteFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/MultiByteFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/MultiByteFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/MultiByteFont.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts;
 
+import java.awt.Rectangle;
 import java.nio.CharBuffer;
 import java.nio.IntBuffer;
 import java.util.BitSet;
@@ -68,6 +69,9 @@ public class MultiByteFont extends CIDFo
     private int firstUnmapped;
     private int lastUnmapped;
 
+    /** Contains the character bounding boxes for all characters in the font */
+    protected Rectangle[] boundingBoxes;
+
     private boolean isOTFFile = false;
 
     // since for most users the most likely glyphs are in the first cmap segments we store their mapping.
@@ -196,6 +200,12 @@ public class MultiByteFont extends CIDFo
         return arr;
     }
 
+    public Rectangle getBoundingBox(int glyphIndex, int size) {
+        int index = isEmbeddable() ? cidSet.getOriginalGlyphIndex(glyphIndex) : glyphIndex;
+        Rectangle bbox = boundingBoxes[index];
+        return new Rectangle(bbox.x * size, bbox.y * size, bbox.width * size, bbox.height * size);
+    }
+
     /**
      * Returns the glyph index for a Unicode character. The method returns 0 if there's no
      * such glyph in the character map.
@@ -401,6 +411,14 @@ public class MultiByteFont extends CIDFo
     }
 
     /**
+     * Sets the bounding boxes array.
+     * @param boundingBoxes array of bounding boxes.
+     */
+    public void setBBoxArray(Rectangle[] boundingBoxes) {
+        this.boundingBoxes = boundingBoxes;
+    }
+
+    /**
      * Returns a Map of used Glyphs.
      * @return Map Map of used Glyphs
      */

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/SingleByteFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/SingleByteFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/SingleByteFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/SingleByteFont.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts;
 
+import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -47,6 +48,8 @@ public class SingleByteFont extends Cust
 
     private int[] width = null;
 
+    private Rectangle[] boundingBoxes;
+
     private Map<Character, UnencodedCharacter> unencodedCharacters;
     private List<SimpleSingleByteEncoding> additionalEncodings;
     private Map<Character, Character> alternativeCodes;
@@ -111,6 +114,24 @@ public class SingleByteFont extends Cust
         return arr;
     }
 
+    public Rectangle getBoundingBox(int glyphIndex, int size) {
+        Rectangle bbox = null;
+        if (glyphIndex < 256) {
+            int idx = glyphIndex - getFirstChar();
+            if (idx >= 0 && idx < boundingBoxes.length) {
+                bbox =  boundingBoxes[idx];
+            }
+        } else if (this.additionalEncodings != null) {
+            int encodingIndex = (glyphIndex / 256) - 1;
+            SimpleSingleByteEncoding encoding = getAdditionalEncoding(encodingIndex);
+            int codePoint = glyphIndex % 256;
+            NamedCharacter nc = encoding.getCharacterForIndex(codePoint);
+            UnencodedCharacter uc = this.unencodedCharacters.get(Character.valueOf(nc.getSingleUnicodeValue()));
+            bbox = uc.getBBox();
+        }
+        return bbox == null ? null : new Rectangle(bbox.x * size, bbox.y * size, bbox.width * size, bbox.height * size);
+    }
+
     /**
      * Lookup a character using its alternative names. If found, cache it so we
      * can speed up lookups.
@@ -292,17 +313,24 @@ public class SingleByteFont extends Cust
         this.width[index - getFirstChar()] = w;
     }
 
+    public void setBoundingBox(int index, Rectangle bbox) {
+        if (this.boundingBoxes == null) {
+            this.boundingBoxes = new Rectangle[getLastChar() - getFirstChar() + 1];
+        }
+        this.boundingBoxes[index - getFirstChar()] = bbox;
+    }
+
     /**
      * Adds an unencoded character (one that is not supported by the primary encoding).
      * @param ch the named character
      * @param width the width of the character
      */
-    public void addUnencodedCharacter(NamedCharacter ch, int width) {
+    public void addUnencodedCharacter(NamedCharacter ch, int width, Rectangle bbox) {
         if (this.unencodedCharacters == null) {
             this.unencodedCharacters = new HashMap<Character, UnencodedCharacter>();
         }
         if (ch.hasSingleUnicodeValue()) {
-            UnencodedCharacter uc = new UnencodedCharacter(ch, width);
+            UnencodedCharacter uc = new UnencodedCharacter(ch, width, bbox);
             this.unencodedCharacters.put(Character.valueOf(ch.getSingleUnicodeValue()), uc);
         } else {
             //Cannot deal with unicode sequences, so ignore this character
@@ -381,10 +409,12 @@ public class SingleByteFont extends Cust
 
         private final NamedCharacter character;
         private final int width;
+        private final Rectangle bbox;
 
-        public UnencodedCharacter(NamedCharacter character, int width) {
+        public UnencodedCharacter(NamedCharacter character, int width, Rectangle bbox) {
             this.character = character;
             this.width = width;
+            this.bbox = bbox;
         }
 
         public NamedCharacter getCharacter() {
@@ -395,6 +425,10 @@ public class SingleByteFont extends Cust
             return this.width;
         }
 
+        public Rectangle getBBox() {
+            return bbox;
+        }
+
         /** {@inheritDoc} */
         @Override
         public String toString() {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OFFontLoader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OFFontLoader.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OFFontLoader.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OFFontLoader.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts.truetype;
 
+import java.awt.Rectangle;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
@@ -149,6 +150,10 @@ public class OFFontLoader extends FontLo
         returnFont.setAscender(otf.getLowerCaseAscent());
         returnFont.setDescender(otf.getLowerCaseDescent());
         returnFont.setFontBBox(otf.getFontBBox());
+        returnFont.setUnderlinePosition(otf.getUnderlinePosition() - otf.getUnderlineThickness() / 2);
+        returnFont.setUnderlineThickness(otf.getUnderlineThickness());
+        returnFont.setStrikeoutPosition(otf.getStrikeoutPosition() - otf.getStrikeoutThickness() / 2);
+        returnFont.setStrikeoutThickness(otf.getStrikeoutThickness());
         returnFont.setFlags(otf.getFlags());
         returnFont.setStemV(Integer.parseInt(otf.getStemV())); //not used for TTF
         returnFont.setItalicAngle(Integer.parseInt(otf.getItalicAngle()));
@@ -161,15 +166,15 @@ public class OFFontLoader extends FontLo
             } else {
                 multiFont.setCIDType(CIDFontType.CIDTYPE2);
             }
-            int[] wx = otf.getWidths();
-            multiFont.setWidthArray(wx);
+            multiFont.setWidthArray(otf.getWidths());
+            multiFont.setBBoxArray(otf.getBoundingBoxes());
         } else {
             singleFont.setFontType(FontType.TRUETYPE);
             singleFont.setEncoding(otf.getCharSetName());
             returnFont.setFirstChar(otf.getFirstChar());
             returnFont.setLastChar(otf.getLastChar());
             singleFont.setTrueTypePostScriptVersion(otf.getPostScriptVersion());
-            copyWidthsSingleByte(otf);
+            copyGlyphMetricsSingleByte(otf);
         }
         returnFont.setCMap(getCMap(otf));
 
@@ -195,10 +200,14 @@ public class OFFontLoader extends FontLo
         return otf.getCMaps().toArray(array);
     }
 
-    private void copyWidthsSingleByte(OpenFont otf) {
+    private void copyGlyphMetricsSingleByte(OpenFont otf) {
         int[] wx = otf.getWidths();
+        Rectangle[] bboxes = otf.getBoundingBoxes();
         for (int i = singleFont.getFirstChar(); i <= singleFont.getLastChar(); i++) {
             singleFont.setWidth(i, otf.getCharWidth(i));
+            int[] bbox = otf.getBBox(i);
+            singleFont.setBoundingBox(i,
+                    new Rectangle(bbox[0], bbox[1], bbox[2] - bbox[0], bbox[3] - bbox[1]));
         }
 
         for (CMapSegment segment : otf.getCMaps()) {
@@ -214,7 +223,7 @@ public class OFFontLoader extends FontLo
                         if (glyphName.length() > 0) {
                             String unicode = Character.toString(u);
                             NamedCharacter nc = new NamedCharacter(glyphName, unicode);
-                            singleFont.addUnencodedCharacter(nc, wx[glyphIndex]);
+                            singleFont.addUnencodedCharacter(nc, wx[glyphIndex], bboxes[glyphIndex]);
                         }
                     }
                 }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OpenFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OpenFont.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OpenFont.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/truetype/OpenFont.java Mon Feb  3 19:29:24 2014
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts.truetype;
 
+import java.awt.Rectangle;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -195,6 +196,10 @@ public abstract class OpenFont {
     private int fontBBox4 = 0;
     private int capHeight = 0;
     private int os2CapHeight = 0;
+    private int underlinePosition;
+    private int underlineThickness;
+    private int strikeoutPosition;
+    private int strikeoutThickness;
     private int xHeight = 0;
     private int os2xHeight = 0;
     //Effective ascender/descender
@@ -995,10 +1000,22 @@ public abstract class OpenFont {
         for (int i = 0; i < wx.length; i++) {
             wx[i] = convertTTFUnit2PDFUnit(mtxTab[i].getWx());
         }
-
         return wx;
     }
 
+    public Rectangle[] getBoundingBoxes() {
+        Rectangle[] boundingBoxes = new Rectangle[mtxTab.length];
+        for (int i = 0; i < boundingBoxes.length; i++) {
+            int[] boundingBox = mtxTab[i].getBoundingBox();
+            boundingBoxes[i] = new Rectangle(
+                    convertTTFUnit2PDFUnit(boundingBox[0]),
+                    convertTTFUnit2PDFUnit(boundingBox[1]),
+                    convertTTFUnit2PDFUnit(boundingBox[2] - boundingBox[0]),
+                    convertTTFUnit2PDFUnit(boundingBox[3] - boundingBox[1]));
+        }
+        return boundingBoxes;
+    }
+
     /**
      * Returns an array (xMin, yMin, xMax, yMax) for a glyph.
      *
@@ -1039,6 +1056,22 @@ public abstract class OpenFont {
         return ansiKerningTab;
     }
 
+    public int getUnderlinePosition() {
+        return convertTTFUnit2PDFUnit(underlinePosition);
+    }
+
+    public int getUnderlineThickness() {
+        return convertTTFUnit2PDFUnit(underlineThickness);
+    }
+
+    public int getStrikeoutPosition() {
+        return convertTTFUnit2PDFUnit(strikeoutPosition);
+    }
+
+    public int getStrikeoutThickness() {
+        return convertTTFUnit2PDFUnit(strikeoutThickness);
+    }
+
     /**
      * Indicates if the font may be embedded.
      * @return boolean True if it may be embedded
@@ -1215,10 +1248,8 @@ public abstract class OpenFont {
         seekTab(fontFile, OFTableName.POST, 0);
         int postFormat = fontFile.readTTFLong();
         italicAngle = fontFile.readTTFULong();
-        //underlinePosition
-        fontFile.readTTFShort();
-        //underlineThickness
-        fontFile.readTTFShort();
+        underlinePosition = fontFile.readTTFShort();
+        underlineThickness = fontFile.readTTFShort();
         isFixedPitch = fontFile.readTTFULong();
 
         //Skip memory usage values
@@ -1322,7 +1353,10 @@ public abstract class OpenFont {
             } else {
                 isEmbeddable = true;
             }
-            fontFile.skip(11 * 2);
+            fontFile.skip(8 * 2);
+            strikeoutThickness = fontFile.readTTFShort();
+            strikeoutPosition = fontFile.readTTFShort();
+            fontFile.skip(2);
             fontFile.skip(10); //panose array
             fontFile.skip(4 * 4); //unicode ranges
             fontFile.skip(4);

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java Mon Feb  3 19:29:24 2014
@@ -19,7 +19,7 @@
 
 package org.apache.fop.fonts.type1;
 
-import java.awt.geom.RectangularShape;
+import java.awt.Rectangle;
 
 import org.apache.fop.fonts.NamedCharacter;
 
@@ -33,7 +33,7 @@ public class AFMCharMetrics {
     private NamedCharacter character;
     private double widthX;
     private double widthY;
-    private RectangularShape bBox;
+    private Rectangle bBox;
 
     /**
      * Returns the character code.
@@ -137,7 +137,7 @@ public class AFMCharMetrics {
      * Returns the character's bounding box.
      * @return the bounding box (or null if it isn't available)
      */
-    public RectangularShape getBBox() {
+    public Rectangle getBBox() {
         return bBox;
     }
 
@@ -145,7 +145,7 @@ public class AFMCharMetrics {
      * Sets the character's bounding box.
      * @param box the bounding box
      */
-    public void setBBox(RectangularShape box) {
+    public void setBBox(Rectangle box) {
         bBox = box;
     }
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java Mon Feb  3 19:29:24 2014
@@ -217,12 +217,16 @@ public class Type1FontLoader extends Fon
         for (AFMCharMetrics metrics : charMetrics) {
             String charName = metrics.getCharName();
             if (charName != null && !glyphNames.contains(charName)) {
-                singleFont.addUnencodedCharacter(metrics.getCharacter(),
-                        (int)Math.round(metrics.getWidthX()));
+                addUnencodedCharacter(singleFont, metrics);
             }
         }
     }
 
+    private static void addUnencodedCharacter(SingleByteFont font, AFMCharMetrics metrics) {
+        font.addUnencodedCharacter(metrics.getCharacter(),
+                (int) Math.round(metrics.getWidthX()), metrics.getBBox());
+    }
+
     /**
      * Adds characters not encoded in the font's primary encoding. This method is used when
      * the primary encoding is built based on the character codes in the AFM rather than
@@ -234,8 +238,7 @@ public class Type1FontLoader extends Fon
         for (int i = 0, c = afm.getCharCount(); i < c; i++) {
             AFMCharMetrics metrics = (AFMCharMetrics)charMetrics.get(i);
             if (!metrics.hasCharCode() && metrics.getCharacter() != null) {
-                singleFont.addUnencodedCharacter(metrics.getCharacter(),
-                        (int)Math.round(metrics.getWidthX()));
+                addUnencodedCharacter(singleFont, metrics);
             }
         }
     }
@@ -281,7 +284,10 @@ public class Type1FontLoader extends Fon
             } else {
                 returnFont.setStemV(80); // Arbitrary value
             }
-            returnFont.setItalicAngle((int) afm.getWritingDirectionMetrics(0).getItalicAngle());
+            AFMWritingDirectionMetrics metrics = afm.getWritingDirectionMetrics(0);
+            returnFont.setItalicAngle((int) metrics.getItalicAngle());
+            returnFont.setUnderlinePosition(metrics.getUnderlinePosition().intValue());
+            returnFont.setUnderlineThickness(metrics.getUnderlineThickness().intValue());
         } else {
             returnFont.setFontBBox(pfm.getFontBBox());
             returnFont.setStemV(pfm.getStemV());
@@ -383,6 +389,7 @@ public class Type1FontLoader extends Fon
             for (AFMCharMetrics chm : afm.getCharMetrics()) {
                 if (chm.hasCharCode()) {
                     singleFont.setWidth(chm.getCharCode(), (int) Math.round(chm.getWidthX()));
+                    singleFont.setBoundingBox(chm.getCharCode(), chm.getBBox());
                 }
             }
             if (useKerning) {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java Mon Feb  3 19:29:24 2014
@@ -33,6 +33,7 @@ import org.apache.batik.bridge.GVTBuilde
 import org.apache.batik.bridge.UserAgent;
 import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
+import org.apache.batik.gvt.font.DefaultFontFamilyResolver;
 
 import org.apache.xmlgraphics.image.GraphicsConstants;
 import org.apache.xmlgraphics.image.loader.Image;
@@ -123,10 +124,8 @@ public class ImageConverterSVG2G2D exten
      * @return the newly created user agent
      */
     protected SimpleSVGUserAgent createBatikUserAgent(float pxToMillimeter) {
-        return new SimpleSVGUserAgent(
-                pxToMillimeter,
-                new AffineTransform()) {
-
+        return new SimpleSVGUserAgent(pxToMillimeter, new AffineTransform(),
+                DefaultFontFamilyResolver.SINGLETON) {
             /** {@inheritDoc} */
             public void displayMessage(String message) {
                 //TODO Refine and pipe through to caller

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java?rev=1564017&r1=1564016&r2=1564017&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java Mon Feb  3 19:29:24 2014
@@ -38,6 +38,7 @@ import org.apache.batik.bridge.UnitProce
 import org.apache.batik.bridge.UserAgent;
 import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
 import org.apache.batik.dom.svg.SVGOMDocument;
+import org.apache.batik.gvt.font.DefaultFontFamilyResolver;
 
 import org.apache.xmlgraphics.image.loader.ImageContext;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
@@ -162,7 +163,7 @@ public class PreloaderSVG extends Abstra
             Element e = doc.getRootElement();
             float pxUnitToMillimeter = UnitConv.IN2MM / context.getSourceResolution();
             UserAgent userAg = new SimpleSVGUserAgent(pxUnitToMillimeter,
-                        new AffineTransform()) {
+                        new AffineTransform(), DefaultFontFamilyResolver.SINGLETON) {
 
                 /** {@inheritDoc} */
                 public void displayMessage(String message) {



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org