diff options
Diffstat (limited to 'src/java/org/apache/fop/render')
-rw-r--r-- | src/java/org/apache/fop/render/AbstractRenderer.java | 35 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/pdf/PDFRenderer.java | 73 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/xml/XMLRenderer.java | 29 |
3 files changed, 120 insertions, 17 deletions
diff --git a/src/java/org/apache/fop/render/AbstractRenderer.java b/src/java/org/apache/fop/render/AbstractRenderer.java index ab2fc8588..0335c2089 100644 --- a/src/java/org/apache/fop/render/AbstractRenderer.java +++ b/src/java/org/apache/fop/render/AbstractRenderer.java @@ -59,6 +59,8 @@ import org.apache.fop.area.inline.Space; import org.apache.fop.area.inline.Viewport; import org.apache.fop.area.inline.TextArea; import org.apache.fop.area.inline.Character; +import org.apache.fop.area.inline.WordArea; +import org.apache.fop.area.inline.SpaceArea; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.fo.Constants; import org.apache.fop.fonts.FontInfo; @@ -587,14 +589,18 @@ public abstract class AbstractRenderer protected void renderInlineArea(InlineArea inlineArea) { if (inlineArea instanceof TextArea) { renderText((TextArea) inlineArea); + } else if (inlineArea instanceof Character) { + renderCharacter((Character) inlineArea); + } else if (inlineArea instanceof WordArea) { + renderWord((WordArea) inlineArea); + } else if (inlineArea instanceof SpaceArea) { + renderSpace((SpaceArea) inlineArea); } else if (inlineArea instanceof InlineParent) { renderInlineParent((InlineParent) inlineArea); } else if (inlineArea instanceof InlineBlockParent) { renderInlineBlockParent((InlineBlockParent) inlineArea); } else if (inlineArea instanceof Space) { renderInlineSpace((Space) inlineArea); - } else if (inlineArea instanceof Character) { - renderCharacter((Character) inlineArea); } else if (inlineArea instanceof Viewport) { renderViewport((Viewport) inlineArea); } else if (inlineArea instanceof Leader) { @@ -602,7 +608,6 @@ public abstract class AbstractRenderer } } - /** * Render the given Character. * @param ch the character to render @@ -636,7 +641,29 @@ public abstract class AbstractRenderer * @param text the text to render */ protected void renderText(TextArea text) { - currentIPPosition += text.getAllocIPD(); + int saveIP = currentIPPosition; + int saveBP = currentBPPosition; + Iterator iter = text.getChildAreas().iterator(); + while (iter.hasNext()) { + renderInlineArea((InlineArea) iter.next()); + } + currentIPPosition = saveIP + text.getAllocIPD(); + } + + /** + * Render the given WordArea. + * @param word the word to render + */ + protected void renderWord(WordArea word) { + currentIPPosition += word.getAllocIPD(); + } + + /** + * Render the given SpaceArea. + * @param space the space to render + */ + protected void renderSpace(SpaceArea space) { + currentIPPosition += space.getAllocIPD(); } /** diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java index 70beb20fb..69a96f432 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java @@ -52,6 +52,8 @@ import org.apache.fop.area.inline.ForeignObject; import org.apache.fop.area.inline.Image; import org.apache.fop.area.inline.Leader; import org.apache.fop.area.inline.InlineParent; +import org.apache.fop.area.inline.WordArea; +import org.apache.fop.area.inline.SpaceArea; import org.apache.fop.datatypes.ColorType; import org.apache.fop.fonts.Typeface; import org.apache.fop.fonts.Font; @@ -1095,11 +1097,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { // This assumes that *all* CIDFonts use a /ToUnicode mapping Typeface tf = (Typeface) fontInfo.getFonts().get(name); boolean useMultiByte = tf.isMultiByte(); - - // String startText = useMultiByte ? "<FEFF" : "("; - String startText = useMultiByte ? "<" : "("; - String endText = useMultiByte ? "> " : ") "; - + updateFont(name, size, pdf); ColorType ct = (ColorType) text.getTrait(Trait.COLOR); updateColor(ct, true, pdf); @@ -1125,7 +1123,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { pdf.append("1 0 0 -1 " + (rx / 1000f) + " " + (bl / 1000f) + " Tm " + (text.getTextLetterSpaceAdjust() / 1000f) + " Tc " - + (text.getTextWordSpaceAdjust() / 1000f) + " Tw [" + startText); + + (text.getTextWordSpaceAdjust() / 1000f) + " Tw ["); prevWordY = bl; textOpen = true; } else { @@ -1133,24 +1131,77 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { pdf.append("1 0 0 -1 " + (rx / 1000f) + " " + (bl / 1000f) + " Tm " + (text.getTextLetterSpaceAdjust() / 1000f) + " Tc " - + (text.getTextWordSpaceAdjust() / 1000f) + " Tw [" + startText); + + (text.getTextWordSpaceAdjust() / 1000f) + " Tw ["); textOpen = true; } prevWordWidth = text.getIPD(); prevWordX = rx; - String s = text.getTextArea(); + currentStream.add(pdf.toString()); + renderTextDecoration(tf, size, text, bl, rx); + + super.renderText(text); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderWord(WordArea) + */ + public void renderWord(WordArea word) { + String name = (String) word.getParentArea().getTrait(Trait.FONT_NAME); + int size = ((Integer) word.getParentArea().getTrait(Trait.FONT_SIZE)).intValue(); + Typeface tf = (Typeface) fontInfo.getFonts().get(name); + boolean useMultiByte = tf.isMultiByte(); + + String startText = useMultiByte ? "<" : "("; + String endText = useMultiByte ? "> " : ") "; + + StringBuffer pdf = new StringBuffer(); + + pdf.append(startText); + + String s = word.getWord(); + FontMetrics metrics = fontInfo.getMetricsFor(name); Font fs = new Font(name, metrics, size); escapeText(s, fs, useMultiByte, pdf); pdf.append(endText); - + currentStream.add(pdf.toString()); - renderTextDecoration(tf, size, text, bl, rx); + super.renderWord(word); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderSpace(SpaceArea) + */ + public void renderSpace(SpaceArea space) { + String name = (String) space.getParentArea().getTrait(Trait.FONT_NAME); + int size = ((Integer) space.getParentArea().getTrait(Trait.FONT_SIZE)).intValue(); + Typeface tf = (Typeface) fontInfo.getFonts().get(name); + boolean useMultiByte = tf.isMultiByte(); + + String startText = useMultiByte ? "<" : "("; + String endText = useMultiByte ? "> " : ") "; - super.renderText(text); + StringBuffer pdf = new StringBuffer(); + + pdf.append(startText); + + String s = space.getSpace(); + + FontMetrics metrics = fontInfo.getMetricsFor(name); + Font fs = new Font(name, metrics, size); + escapeText(s, fs, useMultiByte, pdf); + pdf.append(endText); + + if (useMultiByte) { + pdf.append(-(((TextArea) space.getParentArea()).getTextWordSpaceAdjust() / (size / 1000)) + " "); + } + + currentStream.add(pdf.toString()); + + super.renderSpace(space); } /** diff --git a/src/java/org/apache/fop/render/xml/XMLRenderer.java b/src/java/org/apache/fop/render/xml/XMLRenderer.java index 71d47df40..da3260d54 100644 --- a/src/java/org/apache/fop/render/xml/XMLRenderer.java +++ b/src/java/org/apache/fop/render/xml/XMLRenderer.java @@ -66,6 +66,8 @@ import org.apache.fop.area.inline.Leader; import org.apache.fop.area.inline.Space; import org.apache.fop.area.inline.Viewport; import org.apache.fop.area.inline.TextArea; +import org.apache.fop.area.inline.SpaceArea; +import org.apache.fop.area.inline.WordArea; /** * Renderer that renders areas to XML for debugging purposes. @@ -613,9 +615,32 @@ public class XMLRenderer extends PrintRenderer { addAreaAttributes(text); addTraitAttributes(text); startElement("text", atts); - characters(text.getTextArea()); - endElement("text"); super.renderText(text); + endElement("text"); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderWord(WordArea) + */ + protected void renderWord(WordArea word) { + atts.clear(); + addAttribute("offset", word.getOffset()); + startElement("word", atts); + characters(word.getWord()); + endElement("word"); + super.renderWord(word); + } + + /** + * @see org.apache.fop.render.AbstractRenderer#renderSpace(SpaceArea) + */ + protected void renderSpace(SpaceArea space) { + atts.clear(); + addAttribute("offset", space.getOffset()); + startElement("space", atts); + characters(space.getSpace()); + endElement("space"); + super.renderSpace(space); } /** |