diff options
author | fotis <fotis@unknown> | 2000-11-16 15:37:01 +0000 |
---|---|---|
committer | fotis <fotis@unknown> | 2000-11-16 15:37:01 +0000 |
commit | ff5f56081090a486965e0c766b1a5119dc6ed884 (patch) | |
tree | 7e6963b7d5a409f6076665b2c63f5624a5cde446 /src/org/apache/fop/render | |
parent | 8704ded58939a15b4ea557095ddff2d485e39296 (diff) | |
download | xmlgraphics-fop-ff5f56081090a486965e0c766b1a5119dc6ed884.tar.gz xmlgraphics-fop-ff5f56081090a486965e0c766b1a5119dc6ed884.zip |
AWTRenderer uses now system fonts and not pdf fonts. All (error) messages
are handled in the Gui [Dorothea Wiarda]
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193823 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/render')
-rw-r--r-- | src/org/apache/fop/render/awt/AWTFontMetrics.java | 304 | ||||
-rw-r--r-- | src/org/apache/fop/render/awt/AWTRenderer.java | 2241 | ||||
-rw-r--r-- | src/org/apache/fop/render/awt/FontMetricsMapper.java | 182 | ||||
-rw-r--r-- | src/org/apache/fop/render/awt/FontSetup.java | 228 | ||||
-rw-r--r-- | src/org/apache/fop/render/pdf/Font.java | 3 |
5 files changed, 1878 insertions, 1080 deletions
diff --git a/src/org/apache/fop/render/awt/AWTFontMetrics.java b/src/org/apache/fop/render/awt/AWTFontMetrics.java new file mode 100644 index 000000000..5ddeb9fc0 --- /dev/null +++ b/src/org/apache/fop/render/awt/AWTFontMetrics.java @@ -0,0 +1,304 @@ +/* + + ============================================================================ + The Apache Software License, Version 1.1 + ============================================================================ + + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + + Redistribution and use in source and binary forms, with or without modifica- + tion, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. + + 4. The names "Fop" and "Apache Software Foundation" must not be used to + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. + + 5. Products derived from this software may not be called "Apache", nor may + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package org.apache.fop.render.awt; + +//FOP +import org.apache.fop.messaging.MessageHandler; +import org.apache.fop.layout.FontInfo; +import org.apache.fop.layout.FontDescriptor; +import org.apache.fop.layout.FontState; + +// Java +import java.util.Enumeration; +import java.util.Hashtable; +import java.awt.Component; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.awt.FontMetrics; +import java.awt.font.FontRenderContext; +import java.awt.font.TextLayout; + +/** +* This is a FontMetrics to be used for AWT rendering. +* It instanciates a font, depening on famil and style +* values. The java.awt.FontMetrics for this font is then +* created to be used for the actual measurement. +* Since layout is word by word and since it is expected that +* two subsequent words often share the same style, the +* Font and FontMetrics is buffered and only changed if needed. +*<p> +* Since FontState and FontInfo multiply all factors by +* size, we assume a "standard" font of FONT_SIZE. +*/ + +public class AWTFontMetrics { + /** + * Font size standard used for metric measurements + */ + public static final int FONT_SIZE = 1; + + /** + * This factor multiplies the calculated values to scale + * to FOP internal measurements + */ + public static final int FONT_FACTOR = (1000 * 1000) / FONT_SIZE; + + + /** + * The width of all 256 character, if requested + */ + private int width[] = null; + + /** + * The typical height of a small cap latter + */ + private int xHeight = 0; + + /** + * Buffered font. + * f1 is bufferd for metric measurements during layout. + * fSized is buffered for display purposes + */ + private Font f1 = null; //, fSized = null; + + /** + * The family type of the font last used + */ + private String family = ""; + + /** + * The style of the font last used + */ + private int style = 0; + + /** + * The size of the font last used + */ + private float size = 0; + + /** + * The FontMetrics object used to calculate character width etc. + */ + private FontMetrics fmt = null; + + /** + * Component parent is needed to have an AWT reference from which to get + * the font metrics + */ + Component parent; + + /** + * Constructs a new Font-metrics. + * @param parent an AWT component - this is needed so + * that we can get an instance of + * java.awt.FontMetrics + */ + public AWTFontMetrics(Component parent) { + this.parent = parent; + } + + /** + * Determines the font ascent of the Font described by this + * FontMetrics object + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @return ascent in milliponts + */ + public int getAscender(String family, int style, int size) { + setFont(family, style, size); + return (FONT_FACTOR * fmt.getAscent()); + } + + + /** + * The size of a capital letter measured from the font's baseline + */ + public int getCapHeight(String family, int style, int size) { + setFont(family, style, size); + return (FONT_FACTOR * fmt.getAscent()); + } + + /** + * Determines the font descent of the Font described by this + * FontMetrics object + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @return descent in milliponts + */ + public int getDescender(String family, int style, int size) { + setFont(family, style, size); + return (-1 * FONT_FACTOR * fmt.getDescent()); + } + + /** + * Determines the typical font height of a small cap letter + * FontMetrics object + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @return font height in milliponts + */ + public int getXHeight(String family, int style, int size) { + setFont(family, style, size); + return (int)(FONT_FACTOR * xHeight); + } + + /** + * Returns width (in 1/1000ths of point size) of character at + * code point i + * @param i the character for which to get the width + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @param size the of the font + */ + public int width(int i, String family, int style, int size) { + int w; + setFont(family, style, size); + // the output seems to look a little better if the + // space is rendered larger than given by + // the FontMetrics object + if (i <= 32) + w = (int)(1.4 * fmt.charWidth(i) * FONT_FACTOR); + else + w = (int)(fmt.charWidth(i) * FONT_FACTOR); + return w; + } + + /** + * Return widths (in 1/1000ths of point size) of all + * characters + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + */ + public int[] getWidths(String family, int style, int size) { + int i; + + if (width == null) { + width = new int[256]; + } + setFont(family, style, size); + for (i = 0 ; i < 256 ; i++) { + width[i] = FONT_FACTOR * fmt.charWidth(i); + } + return width; + } + + /** + * Checks whether the font for which values are + * requested is the one used immediately before or + * whether it is a new one + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @return true if the font was changed, false otherwise + */ + private boolean setFont(String family, int style, int size) { + boolean changed = false; + Rectangle2D rect; + TextLayout layout; + int s = (int)(size / 1000f); + Graphics2D g; + + if (f1 == null) { + f1 = new Font(family, style, s); + fmt = parent.getFontMetrics(f1); + changed = true; + } else { + if ((this.style != style) || !this.family.equals(family) || + this.size != s) { + if (family.equals(this.family)) { + f1 = f1.deriveFont(style, (float) s); + } else + f1 = new Font(family, style, s); + fmt = parent.getFontMetrics(f1); + changed = true; + } + // else the font is unchanged from last time + } + if (changed) { + g = (Graphics2D) parent.getGraphics(); + layout = new TextLayout("m", f1, g.getFontRenderContext()); + rect = layout.getBounds(); + xHeight = (int) rect.getHeight(); + } + // save the family and style for later comparison + this.family = family; + this.style = style; + this.size = s; + return changed; + } + + + /** + * Returns a java.awt.Font instance for the desired + * family, style and size type. + * This is here, so that the font-mapping + * of FOP-defined fonts to java-fonts can be done + * in one place and does not need to occur in + *AWTFontRenderer. + * @param family font family (jave name) to use + * @param style font style (jave def.) to use + * @param size font size + * @return font with the desired characeristics. + */ + public java.awt.Font getFont(String family, int style, int size) { + Font f; + + setFont(family, style, size); + return f1; + /*if( setFont(family,style, size) ) fSized = null; + if( fSized == null || this.size != size ) { + fSized = f1.deriveFont( size / 1000f ); + } + this.size = size; + return fSized;*/ + } +} + + + + + + diff --git a/src/org/apache/fop/render/awt/AWTRenderer.java b/src/org/apache/fop/render/awt/AWTRenderer.java index e098d6fc4..809bcff7f 100644 --- a/src/org/apache/fop/render/awt/AWTRenderer.java +++ b/src/org/apache/fop/render/awt/AWTRenderer.java @@ -35,25 +35,23 @@ import java.beans.*; import javax.swing.*; import java.awt.print.*; import java.awt.image.BufferedImage; +import java.text.*; import org.apache.fop.render.Renderer; public class AWTRenderer implements Renderer, Printable, Pageable { - protected int pageWidth = 0; - protected int pageHeight = 0; - protected double scaleFactor = 100.0; - protected int pageNumber = 0; - protected AreaTree tree; - protected ProgressListener progressListener = null; - protected Translator res = null; + protected int pageWidth = 0; + protected int pageHeight = 0; + protected double scaleFactor = 100.0; + protected int pageNumber = 0; + protected AreaTree tree; + protected ProgressListener progressListener = null; + protected Translator res = null; - protected Hashtable fontNames = new Hashtable(); - protected Hashtable fontStyles = new Hashtable(); - protected Color saveColor; - - // Key - Font name, Value - java Font name. - protected static Hashtable JAVA_FONT_NAMES; + protected Hashtable fontNames = new Hashtable(); + protected Hashtable fontStyles = new Hashtable(); + protected Color saveColor = null; /** * Image Object and Graphics Object. The Graphics Object is the Graphics @@ -65,1148 +63,1231 @@ public class AWTRenderer implements Renderer, Printable, Pageable { /** * The current (internal) font name */ - protected String currentFontName; + protected String currentFontName; + + + /** + * The parent component, used to set up the font. + * This is needed as FontSetup needs a live AWT component + * in order to generate valid font measures. + */ + protected Component parent; + + /** * The current font size in millipoints */ - protected int currentFontSize; + protected int currentFontSize; /** * The current colour's red, green and blue component */ - protected float currentRed = 0; - protected float currentGreen = 0; - protected float currentBlue = 0; + protected float currentRed = 0; + protected float currentGreen = 0; + protected float currentBlue = 0; /** * The current vertical position in millipoints from bottom */ - protected int currentYPosition = 0; + protected int currentYPosition = 0; /** * The current horizontal position in millipoints from left */ - protected int currentXPosition = 0; + protected int currentXPosition = 0; /** * The horizontal position of the current area container */ - private int currentAreaContainerXPosition = 0; + private int currentAreaContainerXPosition = 0; - static { - JAVA_FONT_NAMES = new Hashtable(); - JAVA_FONT_NAMES.put("Times", "serif"); - JAVA_FONT_NAMES.put("Times-Roman", "serif"); - JAVA_FONT_NAMES.put("Courier", "monospaced"); - JAVA_FONT_NAMES.put("Helvetica", "sansserif"); - // JAVA_FONT_NAMES.put("Serif", "sansserif"); - } + public AWTRenderer(Translator aRes) { + res = aRes; + } - public AWTRenderer(Translator aRes) { - res = aRes; - } + /** + * Sets parent component which is used to set up the font. + * This is needed as FontSetup needs a live AWT component + * in order to generate valid font measures. + * @param parent the live AWT component reference + */ + public void setComponent(Component parent) { + this.parent = parent; + } - public int getPageNumber() { - return pageNumber; - } + public int getPageNumber() { + return pageNumber; + } - public void setPageNumber(int aValue) { - pageNumber = aValue; - } + public void setPageNumber(int aValue) { + pageNumber = aValue; + } - public void setScaleFactor(double newScaleFactor) { - scaleFactor = newScaleFactor; - } + public void setScaleFactor(double newScaleFactor) { + scaleFactor = newScaleFactor; + } - public double getScaleFactor() { - return scaleFactor; - } + public double getScaleFactor() { + return scaleFactor; + } public BufferedImage getLastRenderedPage() { - return pageImage; + return pageImage; } /** - * add a line to the current stream - * - * @param x1 the start x location in millipoints - * @param y1 the start y location in millipoints - * @param x2 the end x location in millipoints - * @param y2 the end y location in millipoints - * @param th the thickness in millipoints - * @param r the red component - * @param g the green component - * @param b the blue component - */ + * add a line to the current stream + * + * @param x1 the start x location in millipoints + * @param y1 the start y location in millipoints + * @param x2 the end x location in millipoints + * @param y2 the end y location in millipoints + * @param th the thickness in millipoints + * @param r the red component + * @param g the green component + * @param b the blue component + */ protected void addLine(int x1, int y1, int x2, int y2, int th, - float r, float g, float b) { - graphics.setColor(new Color (r,g,b)); - // graphics.setColor(Color.red); - graphics.drawLine((int)(x1/1000f), pageHeight - (int)(y1/1000f), - (int)(x2/1000f), pageHeight - (int)(y2/1000f)); + float r, float g, float b) { + graphics.setColor(new Color (r, g, b)); + // graphics.setColor(Color.red); + graphics.drawLine((int)(x1 / 1000f), + pageHeight - (int)(y1 / 1000f), (int)(x2 / 1000f), + pageHeight - (int)(y2 / 1000f)); } /** - * draw a filled rectangle - * - * @param x the x position of left edge in millipoints - * @param y the y position of top edge in millipoints - * @param w the width in millipoints - * @param h the height in millipoints - * @param r the red component - * @param g the green component - * @param b the blue component - */ - protected void addRect(int x, int y, int w, int h, - float r, float g, float b) { - graphics.setColor(new Color (r,g,b)); - // graphics.setColor(Color.green); - graphics.drawRect((int) (x/1000f), pageHeight - (int) (y/1000f), - (int) (w/1000f), -(int) (h/1000f)); + * draw a filled rectangle + * + * @param x the x position of left edge in millipoints + * @param y the y position of top edge in millipoints + * @param w the width in millipoints + * @param h the height in millipoints + * @param r the red component + * @param g the green component + * @param b the blue component + */ + protected void addRect(int x, int y, int w, int h, float r, + float g, float b) { + graphics.setColor(new Color (r, g, b)); + // graphics.setColor(Color.green); + graphics.drawRect((int)(x / 1000f), + pageHeight - (int)(y / 1000f), (int)(w / 1000f), + -(int)(h / 1000f)); } /** - * draw a filled rectangle - * - * @param x the x position of left edge in millipoints - * @param y the y position of top edge in millipoints - * @param w the width in millipoints - * @param h the height in millipoints - * @param r the red component of edges - * @param g the green component of edges - * @param b the blue component of edges - * @param fr the red component of the fill - * @param fg the green component of the fill - * @param fb the blue component of the fill - */ - protected void addRect(int x, int y, int w, int h, - float r, float g, float b, - float fr, float fg, float fb) { - graphics.setColor(new Color (r,g,b)); - graphics.fill3DRect((int) (x/1000f), pageHeight - (int) (y/1000f), - (int) (w/1000f), -(int) (h/1000f),true); + * draw a filled rectangle + * + * @param x the x position of left edge in millipoints + * @param y the y position of top edge in millipoints + * @param w the width in millipoints + * @param h the height in millipoints + * @param r the red component of edges + * @param g the green component of edges + * @param b the blue component of edges + * @param fr the red component of the fill + * @param fg the green component of the fill + * @param fb the blue component of the fill + */ + protected void addRect(int x, int y, int w, int h, float r, + float g, float b, float fr, float fg, float fb) { + graphics.setColor(new Color (r, g, b)); + graphics.fill3DRect((int)(x / 1000f), + pageHeight - (int)(y / 1000f), (int)(w / 1000f), + -(int)(h / 1000f), true); } - /** - * To configure before print. - * - * Choose pages - * Zoom factor - * Page format / Landscape or Portrait - **/ - public void transform(Graphics2D g2d, double zoomPercent, double angle) { - AffineTransform at = g2d.getTransform(); - at.rotate(angle); - at.scale(zoomPercent/100.0, zoomPercent/100.0); - g2d.setTransform(at); - } - - protected void drawFrame() { - - int width = pageWidth; - int height = pageHeight; - - graphics.setColor(Color.white); - graphics.fillRect(0, 0, width, height); - graphics.setColor(Color.black); - graphics.drawRect(-1, -1, width+2, height+2); - graphics.drawLine(width+2, 0, width+2, height+2); - graphics.drawLine(width+3, 1, width+3, height+3); - - graphics.drawLine(0, height+2, width+2, height+2); - graphics.drawLine(1, height+3, width+3, height+3); - } - /** - * Retrieve the number of pages in this document. - * - * @return the number of pages - */ - public int getPageCount() - { - if (tree == null) { - return 0; - } + * To configure before print. + * + * Choose pages + * Zoom factor + * Page format / Landscape or Portrait + **/ + public void transform(Graphics2D g2d, double zoomPercent, + double angle) { + AffineTransform at = g2d.getTransform(); + at.rotate(angle); + at.scale(zoomPercent / 100.0, zoomPercent / 100.0); + g2d.setTransform(at); + } + + protected void drawFrame() { + + int width = pageWidth; + int height = pageHeight; + + graphics.setColor(Color.white); + graphics.fillRect(0, 0, width, height); + graphics.setColor(Color.black); + graphics.drawRect(-1, -1, width + 2, height + 2); + graphics.drawLine(width + 2, 0, width + 2, height + 2); + graphics.drawLine(width + 3, 1, width + 3, height + 3); + + graphics.drawLine(0, height + 2, width + 2, height + 2); + graphics.drawLine(1, height + 3, width + 3, height + 3); + } - return tree.getPages().size(); + /** + * Retrieve the number of pages in this document. + * + * @return the number of pages + */ + public int getPageCount() { + if (tree == null) { + return 0; + } + + return tree.getPages().size(); } public void render(int aPageNumber) { - if (tree != null) { + if (tree != null) { try { - render(tree, aPageNumber); - } catch (IOException e) { + render(tree, aPageNumber); + } catch (IOException e) { e.printStackTrace(); - // This exception can't occur because we are not dealing with - // any files. - } - } + // This exception can't occur because we are not dealing with + // any files. + } + } } - public void render(AreaTree areaTree, PrintWriter writer) - throws IOException { - tree = areaTree; - render(areaTree, 0); + public void render(AreaTree areaTree, + PrintWriter writer) throws IOException { + tree = areaTree; + render(areaTree, 0); } - public void render(AreaTree areaTree, int aPageNumber) - throws IOException { - tree = areaTree; - Page page = (Page)areaTree.getPages().elementAt(aPageNumber); + public void render(AreaTree areaTree, + int aPageNumber) throws IOException { + tree = areaTree; + Page page = (Page) areaTree.getPages().elementAt(aPageNumber); + + pageWidth = (int)((float) page.getWidth() / 1000f); + pageHeight = (int)((float) page.getHeight() / 1000f); - pageWidth = (int)((float)page.getWidth() / 1000f); - pageHeight = (int)((float)page.getHeight() / 1000f); + pageImage = new BufferedImage( + (int)((pageWidth * (int) scaleFactor) / 100), + (int)((pageHeight * (int) scaleFactor) / 100), + BufferedImage.TYPE_INT_RGB); - pageImage = new BufferedImage((int)((pageWidth * (int)scaleFactor)/100), - (int)((pageHeight * (int)scaleFactor)/100), - BufferedImage.TYPE_INT_RGB); + graphics = pageImage.createGraphics(); - graphics = pageImage.createGraphics(); + transform(graphics, scaleFactor, 0); + drawFrame(); - transform(graphics, scaleFactor, 0); - drawFrame(); + renderPage(page); + } - renderPage(page); - } + public void renderPage(Page page) { + AreaContainer body, before, after; - public void renderPage(Page page) { - AreaContainer body, before, after; + body = page.getBody(); + before = page.getBefore(); + after = page.getAfter(); - body = page.getBody(); - before = page.getBefore(); - after = page.getAfter(); + this.currentFontName = ""; + this.currentFontSize = 0; - this.currentFontName = ""; - this.currentFontSize = 0; + renderAreaContainer(body); - renderAreaContainer(body); + if (before != null) { + renderAreaContainer(before); + } - if (before != null) { - renderAreaContainer(before); + if (after != null) { + renderAreaContainer(after); + } + + // SG: Wollen wir Links abbilden? + /* + if (page.hasLinks()) { + .... + } + */ } - if (after != null) { - renderAreaContainer(after); + public void renderAreaContainer(AreaContainer area) { + + int saveY = this.currentYPosition; + int saveX = this.currentAreaContainerXPosition; + + if (area.getPosition() == + org.apache.fop.fo.properties.Position.ABSOLUTE) { + // Y position is computed assuming positive Y axis, adjust + //for negative postscript one + this.currentYPosition = + area.getYPosition() - 2 * area.getPaddingTop() - + 2 * area.borderWidthTop; + this.currentAreaContainerXPosition = area.getXPosition(); + } else if (area.getPosition() == + org.apache.fop.fo.properties.Position.RELATIVE) { + this.currentYPosition -= area.getYPosition(); + this.currentAreaContainerXPosition += area.getXPosition(); + } else if (area.getPosition() == + org.apache.fop.fo.properties.Position.STATIC) { + this.currentYPosition -= + area.getPaddingTop() + area.borderWidthTop; + this.currentAreaContainerXPosition += + area.getPaddingLeft() + area.borderWidthLeft; + } + + doFrame(area); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + org.apache.fop.layout.Box b = + (org.apache.fop.layout.Box) e.nextElement(); + b.render(this); + } + + if (area.getPosition() != + org.apache.fop.fo.properties.Position.STATIC) { + this.currentYPosition = saveY; + this.currentAreaContainerXPosition = saveX; + } else { + this.currentYPosition -= area.getHeight(); + } } - // SG: Wollen wir Links abbilden? - /* - if (page.hasLinks()) { - .... + private void doFrame(org.apache.fop.layout.Area area) { + int w, h; + int rx = this.currentAreaContainerXPosition; + w = area.getContentWidth(); + + if (area instanceof BlockArea) { + rx += ((BlockArea) area).getStartIndent(); + } + + h = area.getContentHeight(); + int ry = this.currentYPosition; + ColorType bg = area.getBackgroundColor(); + + rx = rx - area.getPaddingLeft(); + ry = ry + area.getPaddingTop(); + w = w + area.getPaddingLeft() + area.getPaddingRight(); + h = h + area.getPaddingTop() + area.getPaddingBottom(); + + // I'm not sure I should have to check for bg being null + // but I do + if ((bg != null) && (bg.alpha() == 0)) { + this.addRect(rx, ry, w, -h, bg.red(), bg.green(), + bg.blue(), bg.red(), bg.green(), bg.blue()); + } + + rx = rx - area.borderWidthLeft; + ry = ry + area.borderWidthTop; + w = w + area.borderWidthLeft + area.borderWidthRight; + h = h + area.borderWidthTop + area.borderWidthBottom; + + if (area.borderWidthTop != 0) { + addLine(rx, ry, rx + w, ry, area.borderWidthTop, + area.borderColorTop.red(), area.borderColorTop.green(), + area.borderColorTop.blue()); + } + + if (area.borderWidthLeft != 0) { + addLine(rx, ry, rx, ry - h, area.borderWidthLeft, + area.borderColorLeft.red(), + area.borderColorLeft.green(), + area.borderColorLeft.blue()); + } + + if (area.borderWidthRight != 0) { + addLine(rx + w, ry, rx + w, ry - h, area.borderWidthRight, + area.borderColorRight.red(), + area.borderColorRight.green(), + area.borderColorRight.blue()); + } + + if (area.borderWidthBottom != 0) { + addLine(rx, ry - h, rx + w, ry - h, area.borderWidthBottom, + area.borderColorBottom.red(), + area.borderColorBottom.green(), + area.borderColorBottom.blue()); + } } - */ - } - - public void renderAreaContainer(AreaContainer area) { - - int saveY = this.currentYPosition; - int saveX = this.currentAreaContainerXPosition; - - if (area.getPosition() == - org.apache.fop.fo.properties.Position.ABSOLUTE) { - // Y position is computed assuming positive Y axis, adjust - //for negative postscript one - this.currentYPosition = area.getYPosition() - - 2 * area.getPaddingTop() - - 2 * area.borderWidthTop; - this.currentAreaContainerXPosition = area.getXPosition(); - } else if (area.getPosition() == - org.apache.fop.fo.properties.Position.RELATIVE) { - this.currentYPosition -= area.getYPosition(); - this.currentAreaContainerXPosition += area.getXPosition(); - } else if (area.getPosition() == - org.apache.fop.fo.properties.Position.STATIC) { - this.currentYPosition -= area.getPaddingTop() + area.borderWidthTop; - this.currentAreaContainerXPosition += area.getPaddingLeft() + - area.borderWidthLeft; - } - - doFrame(area); - - Enumeration e = area.getChildren().elements(); - while (e.hasMoreElements()) { - org.apache.fop.layout.Box b = - (org.apache.fop.layout.Box) e.nextElement(); - b.render(this); - } - - if (area.getPosition() != - org.apache.fop.fo.properties.Position.STATIC) { - this.currentYPosition = saveY; - this.currentAreaContainerXPosition = saveX; - } else { - this.currentYPosition -= area.getHeight(); + + + + protected Rectangle2D getBounds(org.apache.fop.layout.Area a) { + return new Rectangle2D.Double(currentAreaContainerXPosition, + currentYPosition, a.getAllocationWidth(), a.getHeight()); } - } - - private void doFrame(org.apache.fop.layout.Area area) { - int w, h; - int rx = this.currentAreaContainerXPosition; - w = area.getContentWidth(); - - if (area instanceof BlockArea) { - rx += ((BlockArea)area).getStartIndent(); - } - - h = area.getContentHeight(); - int ry = this.currentYPosition; - ColorType bg = area.getBackgroundColor(); - - rx = rx - area.getPaddingLeft(); - ry = ry + area.getPaddingTop(); - w = w + area.getPaddingLeft() + area.getPaddingRight(); - h = h + area.getPaddingTop() + area.getPaddingBottom(); - - // I'm not sure I should have to check for bg being null - // but I do - if ((bg != null) && (bg.alpha() == 0)) { - this.addRect(rx, ry, w, -h, - bg.red(), bg.green(), bg.blue(), - bg.red(), bg.green(), bg.blue()); + + public void renderBlockArea(BlockArea area) { + doFrame(area); + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + org.apache.fop.layout.Box b = + (org.apache.fop.layout.Box) e.nextElement(); + b.render(this); + } } - rx = rx - area.borderWidthLeft; - ry = ry + area.borderWidthTop; - w = w + area.borderWidthLeft + area.borderWidthRight; - h = h + area.borderWidthTop + area.borderWidthBottom; - - if (area.borderWidthTop != 0) { - addLine(rx, ry, rx + w, ry, - area.borderWidthTop, - area.borderColorTop.red(), area.borderColorTop.green(), - area.borderColorTop.blue()); - } - - if (area.borderWidthLeft != 0) { - addLine(rx, ry, rx, ry - h, - area.borderWidthLeft, - area.borderColorLeft.red(), area.borderColorLeft.green(), - area.borderColorLeft.blue()); - } - - if (area.borderWidthRight != 0) { - addLine(rx + w, ry, rx + w, ry - h, - area.borderWidthRight, - area.borderColorRight.red(), area.borderColorRight.green(), - area.borderColorRight.blue()); - } - - if (area.borderWidthBottom != 0) { - addLine(rx, ry - h, rx + w, ry - h, - area.borderWidthBottom, - area.borderColorBottom.red(), area.borderColorBottom.green(), - area.borderColorBottom.blue()); - } - } - - - - protected Rectangle2D getBounds(org.apache.fop.layout.Area a) { - return new Rectangle2D.Double(currentAreaContainerXPosition, - currentYPosition, - a.getAllocationWidth(), - a.getHeight()); - } - - public void renderBlockArea(BlockArea area) { - doFrame(area); - Enumeration e = area.getChildren().elements(); - while (e.hasMoreElements()) { - org.apache.fop.layout.Box b = - (org.apache.fop.layout.Box) e.nextElement(); - b.render(this); + public void setupFontInfo(FontInfo fontInfo) { + FontSetup.setup(fontInfo, parent); } - } - - public void setupFontInfo(FontInfo fontInfo) { - FontSetup.setup(fontInfo); - Hashtable hash = fontInfo.getFonts(); - org.apache.fop.render.pdf.Font f; - String name; - Object key; - int fontStyle; - - for (Enumeration e = hash.keys(); e.hasMoreElements();) { - fontStyle = java.awt.Font.PLAIN; - key = e.nextElement(); - f = (org.apache.fop.render.pdf.Font)hash.get(key); - name = f.fontName(); - - if (name.toUpperCase().indexOf("BOLD") > 0) { - fontStyle += java.awt.Font.BOLD; - } - if (name.toUpperCase().indexOf("ITALIC") > 0 || - name.toUpperCase().indexOf("OBLIQUE") > 0) { - fontStyle += java.awt.Font.ITALIC; - } - - int hyphenIndex = name.indexOf("-"); - - hyphenIndex = (hyphenIndex < 0) ? name.length() : hyphenIndex; - fontNames.put(key, name.substring(0, hyphenIndex)); - fontStyles.put(key, new Integer(fontStyle)); + + public void renderDisplaySpace(DisplaySpace space) { + int d = space.getSize(); + this.currentYPosition -= d; } - } - - public void renderDisplaySpace(DisplaySpace space) { - int d = space.getSize(); - this.currentYPosition -= d; - } - - - public void renderImageArea(ImageArea area) { - int x = currentAreaContainerXPosition + - area.getXOffset(); - int y = currentYPosition; - int w = area.getContentWidth(); - int h = area.getHeight(); - - FopImage img = area.getImage(); - - if (img == null) { - MessageHandler.logln("Error while loading image : area.getImage() is null"); - graphics.drawRect(x / 1000, - pageHeight - y / 1000, - w / 1000, - h / 1000); - java.awt.Font f = graphics.getFont(); - java.awt.Font smallFont = new java.awt.Font(f.getFontName(),f.getStyle(),8); - graphics.setFont(smallFont); - graphics.drawString("area.getImage() is null", x / 1000, pageHeight - y / 1000); - graphics.setFont(f); - } else { - - String urlString = img.getURL(); - try { - URL url = new URL(urlString); - - ImageIcon icon = new ImageIcon(url); - Image image = icon.getImage(); - - graphics.drawImage(image, x / 1000, - pageHeight - y / 1000, - w / 1000, - h / 1000, - null); - } catch(MalformedURLException mue) { - // cannot normally occur because, if URL is wrong, constructing FopImage - // will already have failed earlier on - } - } - - currentYPosition -= h; - } - - public void renderInlineArea(InlineArea area) { - char ch; - StringBuffer pdf = new StringBuffer(); - - String name = area.getFontState().getFontName(); - int size = area.getFontState().getFontSize(); - - float red = area.getRed(); - float green = area.getGreen(); - float blue = area.getBlue(); - - if ((!name.equals(this.currentFontName)) - || (size != this.currentFontSize)) { - this.currentFontName = name; - this.currentFontSize = size; - } - - if ((red != this.currentRed) - || (green != this.currentGreen) - || (blue != this.currentBlue)) { - this.currentRed = red; - this.currentGreen = green; - this.currentBlue = blue; - } - - int rx = this.currentXPosition; - int bl = this.currentYPosition; - - - String s = area.getText(); - Color oldColor = graphics.getColor(); - java.awt.Font oldFont = graphics.getFont(); - String aFontName = fontNames.get(name).toString(); - - aFontName = getJavaFontName(aFontName); - - java.awt.Font f = - new java.awt.Font(aFontName, - ((Integer)fontStyles.get(name)).intValue(), - (int)(size / 1000f)); - - graphics.setColor(new Color(red, green, blue)); - - /* - Die KLasse TextLayout nimmt für die Ausgabe eigenen Schriftsatz, - der i.R. breiter ist. Deshalb wird bis diese Tatsache sich geklärt/ - geregelt hat weniger schöne Ausgabe über Graphics benutzt. - */ - - // Fonts in bold still have trouble displaying! - FontRenderContext newContext = new FontRenderContext(null, true, true); - TextLayout layout = new TextLayout(s, f, newContext); - graphics.setRenderingHint(RenderingHints.KEY_RENDERING, - RenderingHints.VALUE_RENDER_QUALITY); - layout.draw(graphics, rx / 1000f, (int)(pageHeight - bl / 1000f)); - - graphics.setColor(oldColor); - this.currentXPosition += area.getContentWidth(); - } - - public void renderInlineSpace(InlineSpace space) { - this.currentXPosition += space.getSize(); - } - - public void renderLineArea(LineArea area) { - int rx = this.currentAreaContainerXPosition - + area.getStartIndent(); - int ry = this.currentYPosition; - int w = area.getContentWidth(); - int h = area.getHeight(); - - this.currentYPosition -= area.getPlacementOffset(); - this.currentXPosition = rx; - - int bl = this.currentYPosition; - - Enumeration e = area.getChildren().elements(); - while (e.hasMoreElements()) { - org.apache.fop.layout.Box b = - (org.apache.fop.layout.Box) e.nextElement(); - b.render(this); - } - - this.currentYPosition = ry-h; - } - - /** - * render rule area into PDF - * - * @param area area to render - */ - public void renderRuleArea(RuleArea area) { - int rx = this.currentAreaContainerXPosition - + area.getStartIndent(); - int ry = this.currentYPosition; - int w = area.getContentWidth(); - int h = area.getHeight(); - int th = area.getRuleThickness(); - float r = area.getRed(); - float g = area.getGreen(); - float b = area.getBlue(); - Color oldColor = graphics.getColor(); - - graphics.setColor(new Color(r, g, b)); - graphics.fillRect((int)(rx / 1000f), (int)(pageHeight - ry / 1000f), - (int)(w / 1000f), (int)(th / 1000f)); - graphics.setColor(oldColor); - - } - - public void renderSVGArea(SVGArea area) { - - int x = this.currentAreaContainerXPosition; - int y = this.currentYPosition; - int w = area.getContentWidth(); - int h = area.getHeight(); - - Enumeration e = area.getChildren().elements(); - while (e.hasMoreElements()) { - Object o = e.nextElement(); - if(o instanceof GraphicImpl) { - renderElement(area, (GraphicImpl)o, x, y, null); - } - } - - this.currentYPosition -= h; - - } - - - protected String getJavaFontName(String aName) { - if (aName == null) - return null; - - Object o = JAVA_FONT_NAMES.get(aName); - - return (o == null) ? aName : o.toString(); - } - - public void setProducer(String producer) { - // defined in Renderer Interface - } - - public int print(Graphics g, PageFormat pageFormat, int pageIndex) - throws PrinterException { - if (pageIndex >= tree.getPages().size()) - return NO_SUCH_PAGE; - - Graphics2D oldGraphics = graphics; - int oldPageNumber = pageNumber; - - graphics = (Graphics2D)g; - Page aPage = (Page)tree.getPages().elementAt(pageIndex); - renderPage(aPage); - graphics = oldGraphics; - - return PAGE_EXISTS; - } - - public int getNumberOfPages() { - return tree.getPages().size(); - } - - public PageFormat getPageFormat(int pageIndex) - throws IndexOutOfBoundsException { - if (pageIndex >= tree.getPages().size()) - return null; - - Page page = (Page)tree.getPages().elementAt(pageIndex); - PageFormat pageFormat = new PageFormat(); - Paper paper = new Paper(); - paper.setImageableArea(0, 0, - page.getWidth() / 1000d, page.getHeight() / 1000d); - paper.setSize(page.getWidth() / 1000d, page.getHeight() / 1000d); - pageFormat.setPaper(paper); - - return pageFormat; - } - - public Printable getPrintable(int pageIndex) - throws IndexOutOfBoundsException { - return this; - } - - public void setProgressListener(ProgressListener l) { - progressListener = l; - } - - public static Color colorType2Color(ColorType ct) { - if (ct == null) { - return null; - } - return new Color(ct.red(), ct.green(), ct.blue()); - } - - - - /** - * Draws an image. - * TODO: protect other image formats (JIMI) - */ - public void renderImage(String href, float x, float y, float width, float height, Vector transform) { - // What is with transformations? - try { - URL url = new URL(href); - ImageIcon imageIcon = new ImageIcon(url); - - AffineTransform fullTransform = new AffineTransform(); - AffineTransform aTransform; - - transform = (transform == null) ? new Vector() : transform; - for (int i = 0; i < transform.size(); i++) { - org.w3c.dom.svg.SVGTransform t = (org.w3c.dom.svg.SVGTransform)transform.elementAt(i); - SVGMatrix matrix = t.getMatrix(); - aTransform = new AffineTransform(matrix.getA(), matrix.getB(), matrix.getC(), - matrix.getD(), matrix.getE(), matrix.getF()); - fullTransform.concatenate(aTransform); - } - - BufferedImage bi = new BufferedImage((int) width, (int) height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = bi.createGraphics(); - BufferedImageOp bop = new AffineTransformOp(fullTransform, - AffineTransformOp.TYPE_NEAREST_NEIGHBOR); - g2d.drawImage(imageIcon.getImage(), 0, 0, (int) width, (int) height, imageIcon.getImageObserver()); - graphics.drawImage(bi, bop, (int) x, (int) y); - } catch (Exception ex) { - MessageHandler.errorln("AWTRenderer: renderImage(): " + ex.getMessage()); - } - } - - - - public void renderElement(SVGArea svgarea, GraphicImpl area, int posx, int posy, - Vector parentTransforms) { - int x = posx; - int y = posy; - Hashtable style = area.oldgetStyle(); - DrawingInstruction di = createInstruction(area, style); - - Object o = null; - Vector v = area.oldgetTransform(); - v = (v == null) ? new Vector() : v; - Vector trans = new Vector(v); - parentTransforms = (parentTransforms == null) ? new Vector() : parentTransforms; - - if (parentTransforms != null) { - trans.addAll(0, parentTransforms); - } - - float red = (float) graphics.getColor().getRed(); - float green = (float) graphics.getColor().getGreen(); - float blue = (float) graphics.getColor().getBlue(); - Color c = null; - - ColorType ct = null; - try { - o = style.get("fill"); - if (o != null && o instanceof ColorType) { - ct = (ColorType) o; - c = new Color((int) (ct.red() * 255f), (int) (ct.green() * 255f), (int) (ct.blue() * 255f)); - } - o = style.get("stroke"); - if (c == null && o != null && o instanceof ColorType) { - ct = (ColorType) o; - c = new Color((int) (ct.red() * 255f), (int) (ct.green() * 255f), (int) (ct.blue() * 255f)); - } - } catch (Exception ex) { - MessageHandler.errorln("Can't set color: R G B : " + (int) (ct.red() * 255f) + " " + (int) (ct.green() * 255f) + " " + (int) (ct.blue() * 255f)); - c = Color.pink; - } - - if (c == null) { - c = new Color((int) red, (int) green, (int) blue); - } - Color oldColor = graphics.getColor(); - - if (area instanceof SVGLineElement) { - graphics.setColor(c); - SVGLineElementImpl lg = (SVGLineElementImpl) area; - - float x1 = lg.getX1().getBaseVal().getValue() * 1000 + posx; - float y1 = posy - lg.getY1().getBaseVal().getValue() * 1000 ; - float x2 = lg.getX2().getBaseVal().getValue() * 1000 + posx; - float y2 = posy - lg.getY2().getBaseVal().getValue() * 1000; - // TODO: - // The thickness of contour protect. - int th = 1; - o = style.get("stroke-width"); - if (o != null) - th = (int)((SVGLengthImpl)o).getValue(); - Line2D.Double aLine = new Line2D.Double(x1 / 1000f, pageHeight - y1 / 1000f, - x2 / 1000f, pageHeight - y2 / 1000f); - drawShape(transformShape(trans, aLine), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGRectElement) { - graphics.setColor(c); - SVGRectElement rg = (SVGRectElement)area; - float rectx = rg.getX().getBaseVal().getValue() * 1000 + posx; - float recty = posy - rg.getY().getBaseVal().getValue() * 1000; - float rx = rg.getRx().getBaseVal().getValue() * 1000; - float ry = rg.getRy().getBaseVal().getValue() * 1000; - float rw = rg.getWidth().getBaseVal().getValue() * 1000; - float rh = rg.getHeight().getBaseVal().getValue() * 1000; - - // TODO: - // rx and ry are roundings. - // RoundRectangle2D.Double - Rectangle aRectangle = new Rectangle(); - aRectangle.setRect(rectx / 1000d, pageHeight - recty / 1000d, rw / 1000d, rh / 1000d); - drawShape(transformShape(trans, aRectangle), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGCircleElement) { - graphics.setColor(c); - SVGCircleElement cg = (SVGCircleElement)area; - float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; - float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; - float r = cg.getR().getBaseVal().getValue(); - Ellipse2D.Double anEllipse = new Ellipse2D.Double(cx / 1000d - r, - pageHeight - cy / 1000d - r, - r * 2d, r * 2d); - drawShape(transformShape(trans, anEllipse), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGEllipseElement) { - graphics.setColor(c); - SVGEllipseElement cg = (SVGEllipseElement)area; - float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; - float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; - float rx = cg.getRx().getBaseVal().getValue(); - float ry = cg.getRy().getBaseVal().getValue(); - Ellipse2D.Double anEllipse = new Ellipse2D.Double(cx / 1000d - rx, - pageHeight - cy / 1000d - ry, - rx * 2d, ry * 2d); - drawShape(transformShape(trans, anEllipse), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGImageElementImpl) { - SVGImageElementImpl ig = (SVGImageElementImpl)area; - renderImage(ig.link, ig.x + posx / 1000f, pageHeight - (posy / 1000f - ig.y), ig.width, ig.height, trans); - } else if(area instanceof SVGUseElementImpl) { - SVGUseElementImpl ug = (SVGUseElementImpl)area; - String ref = ug.link; - ref = ref.substring(1, ref.length()); - GraphicImpl graph = null; -// graph = area.locateDef(ref); - if(graph != null) { - // probably not the best way to do this, should be able - // to render without the style being set. -// GraphicImpl parent = graph.getGraphicParent(); -// graph.setParent(area); - // need to clip (if necessary) to the use area - // the style of the linked element is as if is was - // a direct descendant of the use element. - - renderElement(svgarea, graph, posx, posy, trans); -// graph.setParent(parent); - } - } else if (area instanceof SVGPolylineElementImpl) { - graphics.setColor(c); - Vector points = ((SVGPolylineElementImpl)area).points; - PathPoint p = null; - Point2D.Double p1 = null; - Point2D.Double p2 = null; - if (points.size() > 0) { - p = (PathPoint) points.elementAt(0); - double xc = p.x * 1000f + posx; - double yc = posy - p.y * 1000f; - p1 = new Point2D.Double(xc / 1000f, pageHeight - yc / 1000f); - - int[] xarr = {(int) xc}; - int[] yarr = {(int) yc}; - graphics.drawPolyline(xarr, yarr, 1); - } - Line2D.Double aLine; - for (int i = 1; i< points.size(); i++) { - p = (PathPoint) points.elementAt(i); - p2 = new Point2D.Double(p.x + posx / 1000f, pageHeight - (posy - p.y * 1000f) / 1000f); - aLine = new Line2D.Double(p1, p2); - graphics.draw(transformShape(trans, aLine)); - p1 = p2; - } - graphics.setColor(oldColor); - } else if (area instanceof SVGPolygonElementImpl) { - graphics.setColor(c); - java.awt.Polygon aPolygon = convertPolygon(((SVGPolygonElementImpl)area), posx, posy); - drawShape(transformShape(trans, aPolygon), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGGElementImpl) { - renderGArea(svgarea, (SVGGElementImpl)area, x, y, parentTransforms); - } else if (area instanceof SVGPathElementImpl) { - graphics.setColor(c); - GeneralPath path = convertPath((SVGPathElementImpl) area, posx, posy); - drawShape(transformShape(trans, path), di); - graphics.setColor(oldColor); - } else if (area instanceof SVGTextElementImpl) { - MessageHandler.errorln("SVGTextElementImpl is not implemented yet."); - // renderText(svgarea, (SVGTextElementImpl)area, 0, 0, di); - } else if (area instanceof SVGArea) { - // the x and y pos will be wrong! - Enumeration e = ((SVGArea)area).getChildren().elements(); - while (e.hasMoreElements()) { - Object el = e.nextElement(); - if(o instanceof GraphicImpl) { - renderElement((SVGArea)area, (GraphicImpl)el, x, y, parentTransforms); - } - } - } - - // should be done with some cleanup code, so only - // required values are reset. - } // renderElement - - - public void renderGArea(SVGArea svgarea, SVGGElementImpl area, int posx, int posy, Vector v) { - - - Vector trans = null; -// trans = new Vector(area.oldgetTransform()); -// trans.addAll(0, v); -/* Enumeration e = area.getChildren().elements(); - while (e.hasMoreElements()) { - Object o = e.nextElement(); - if(o instanceof GraphicImpl) { - renderElement(svgarea, (GraphicImpl)o, posx, posy, trans); - } - }*/ - } - public void renderGArea(SVGArea svgarea, SVGGElementImpl area, int posx, int posy) - { - renderGArea(svgarea, area, posx, posy, new Vector()); - } - - - /** - * Applies SVGTransform to the shape and gets the transformed shape. - * The type of the new shape may be different to the original type. - */ - public Shape transformShape(Vector trans, Shape shape) { - if (trans == null || trans.size() == 0) { - return shape; - } - - AffineTransform at; - for(int i = trans.size() - 1; i >= 0; i--) { - org.w3c.dom.svg.SVGTransform t = (org.w3c.dom.svg.SVGTransform)trans.elementAt(i); - SVGMatrix matrix = t.getMatrix(); - at = new AffineTransform(matrix.getA(), matrix.getB(), matrix.getC(), - matrix.getD(), matrix.getE(), matrix.getF()); - shape = at.createTransformedShape(shape); - } - return shape; - } - - - /** - * Mapps a SVG-Polygon to a AWT-Polygon. - */ - public java.awt.Polygon convertPolygon(SVGPolygonElementImpl svgpl, int x, int y) { - java.awt.Polygon aPolygon = new java.awt.Polygon(); - Vector points = svgpl.points; - - PathPoint p; - for (int i = 0; i < points.size(); i++) { - p = (PathPoint) points.elementAt(i); - aPolygon.addPoint((int) (x / 1000f + p.x), pageHeight - (int) (y / 1000f - p.y)); - } - - return aPolygon; - } - - // TODO: other attributes of DrawingInstruction protect too. - protected DrawingInstruction createInstruction(GraphicImpl area, Hashtable style) { - DrawingInstruction di = new DrawingInstruction(); - Object sp; - sp = style.get("fill"); - if(sp != null && !(sp instanceof String && sp.equals("none"))) { - di.fill = true; - } - // ... - return di; - } - - // Draws a shape. - // TODO: other attributes of DrawingInstruction protect too. - protected void drawShape(Shape s, DrawingInstruction di) { - if (di.fill) { - graphics.fill(s); - } else { - graphics.draw(s); - } - } - - /** - * Mapps a SVG-Path to a AWT-GeneralPath. - */ - public GeneralPath convertPath(SVGPathElementImpl svgpath, float x, float y) { - Vector points = svgpath.pathElements; - GeneralPath path = new GeneralPath(); - - float lastx = 0; - float lasty = 0; - SVGPathSegImpl pathmoveto = null; - - for(Enumeration e = points.elements(); e.hasMoreElements(); ) { - SVGPathSegImpl pc = (SVGPathSegImpl)e.nextElement(); - float[] vals = pc.getValues(); - float lastcx = 0; - float lastcy = 0; - switch(pc.getPathSegType()) { - case SVGPathSeg.PATHSEG_MOVETO_ABS: - lastx = vals[0]; - lasty = vals[1]; - pathmoveto = pc; - path.moveTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_MOVETO_REL: - if (pathmoveto == null) { - lastx = vals[0]; - lasty = vals[1]; - path.moveTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - pathmoveto = pc; - } else { - lastx += vals[0]; - lasty += vals[1]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - - } - break; - case SVGPathSeg.PATHSEG_LINETO_ABS: - lastx = vals[0]; - lasty = vals[1]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_LINETO_REL: - lastx += vals[0]; - lasty += vals[1]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: - lasty = vals[0]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: - lasty += vals[0]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: - lastx = vals[0]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: - lastx += vals[0]; - path.lineTo(lastx + x / 1000f, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: - lastx = vals[4]; - lasty = vals[5]; - lastcx = vals[2]; - lastcy = vals[3]; - path.curveTo(x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], - x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, - x / 1000f + lastx, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: - path.curveTo(x / 1000f + vals[0] + lastx, pageHeight - y / 1000f + vals[1] + lasty, - x / 1000f + lastx + vals[2], pageHeight - y / 1000f + lasty + vals[3], - x / 1000f + lastx + vals[4], pageHeight - y / 1000f + lasty + vals[5]); - lastcx = vals[2] + lastx; - lastcy = vals[3] + lasty; - lastx += vals[4]; - lasty += vals[5]; - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: - if (lastcx == 0) - lastcx = lastx; - if (lastcy == 0) - lastcy = lasty; - lastx = vals[2]; - lasty = vals[3]; - path.curveTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, - x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], - x / 1000f + lastx, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: - if (lastcx == 0) - lastcx = lastx; - if (lastcy == 0) - lastcy = lasty; - path.curveTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, - x / 1000f + lastx + vals[0], pageHeight - y / 1000f + lasty + vals[1], - x / 1000f + lastx + vals[2], pageHeight - y / 1000f + lasty + vals[3]); - lastx += vals[2]; - lasty += vals[3]; - break; - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: - if (lastcx == 0) - lastcx = lastx; - if (lastcy == 0) - lastcy = lasty; - lastx = vals[0]; - lasty = vals[1]; - lastcx = 0; - lastcy = 0; - path.quadTo(x / 1000f + lastcx, pageHeight - y / 1000f + lastcy, - x / 1000f + lastx, pageHeight - y / 1000f + lasty); - break; - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: - if (lastcx == 0) - lastcx = lastx; - if (lastcy == 0) - lastcy = lasty; - - path.quadTo(x / 1000f + lastcx , pageHeight - y / 1000f + lastcy, - x / 1000f + lastx + vals[0], pageHeight - y / 1000f + lasty + vals[1]); - - lastx += vals[0]; - lasty += vals[1]; - lastcx = 0; - lastcy = 0; - break; - case SVGPathSeg.PATHSEG_ARC_ABS: { - // Arc2D.Double arc = new Arc2D.Double(); - // arc.setAngles(current point, end point); .... - double rx = vals[0]; - double ry = vals[1]; - double theta = vals[2]; - boolean largearcflag = (vals[3] == 1.0); - boolean sweepflag = (vals[4] == 1.0); - - double cx = lastx; - double cy = lasty; - - path.curveTo(x / 1000f + lastx, pageHeight - y / 1000f + lasty, - x / 1000f + vals[0], pageHeight - y / 1000f + vals[1], - x / 1000f + vals[5], pageHeight - y / 1000f + vals[6]); - - lastcx = 0; //?? - lastcy = 0; //?? - lastx = vals[5]; - lasty = vals[6]; - } - break; - case SVGPathSeg.PATHSEG_ARC_REL: { - double rx = vals[0]; - double ry = vals[1]; - double theta = vals[2]; - boolean largearcflag = (vals[3] == 1.0); - boolean sweepflag = (vals[4] == 1.0); - - path.curveTo(x / 1000f + lastx, pageHeight - y / 1000f + lasty, - x / 1000f + (vals[0] + lastx), pageHeight - y / 1000f + (vals[1] + lasty), - x / 1000f + (vals[5] + lastx) , pageHeight - y / 1000f + (vals[6] + lasty)); - lastcx = 0; //?? - lastcy = 0; //?? - lastx += vals[5]; - lasty += vals[6]; - } - break; - case SVGPathSeg.PATHSEG_CLOSEPATH: - path.closePath(); - break; - - - } // switch - } // for points.elements() - - return path; - } // convertPath -/* - if(di == null) { - currentStream.add("S\n"); - } else { - if(di.fill) { - if(di.stroke) { - if(!di.nonzero) - currentStream.add("B*\n"); - else - currentStream.add("B\n"); - } else { - if(!di.nonzero) - currentStream.add("f*\n"); - else - currentStream.add("f\n"); - } - } else { -// if(di.stroke) - currentStream.add("S\n"); - } - } -*/ - - /* - * by pdfrenderer übernommen. - * - */ - class DrawingInstruction { - boolean stroke = false; - boolean nonzero = false; // non-zero fill rule "f*", "B*" operator - boolean fill = false; - int linecap = 0; // butt - int linejoin = 0; // miter - int miterwidth = 8; - } - - public void renderForeignObjectArea(ForeignObjectArea area) { - area.getObject().render(this); - } + + public void renderImageArea(ImageArea area) { + + int x = currentAreaContainerXPosition + + area.getXOffset(); + + int y = currentYPosition; + + int w = area.getContentWidth(); + + int h = area.getHeight(); + + + + FopImage img = area.getImage(); + + + + if (img == null) { + + MessageHandler.logln("Error while loading image : area.getImage() is null"); + + graphics.drawRect(x / 1000, + pageHeight - y / 1000, + w / 1000, + h / 1000); + + java.awt.Font f = graphics.getFont(); + + java.awt.Font smallFont = + new java.awt.Font(f.getFontName(), f.getStyle(), 8); + + graphics.setFont(smallFont); + + graphics.drawString("area.getImage() is null", x / 1000, + pageHeight - y / 1000); + + graphics.setFont(f); + + } else { + + + + String urlString = img.getURL(); + + try { + + URL url = new URL(urlString); + + + + ImageIcon icon = new ImageIcon(url); + + Image image = icon.getImage(); + + + + graphics.drawImage(image, x / 1000, + pageHeight - y / 1000, + w / 1000, + h / 1000, + null); + + } catch (MalformedURLException mue) { + + // cannot normally occur because, if URL is wrong, constructing FopImage + + // will already have failed earlier on + + } + + } + + + + currentYPosition -= h; + + } + + public void renderInlineArea(InlineArea area) { + char ch; + StringBuffer pdf = new StringBuffer(); + + String name = area.getFontState().getFontName(); + int size = area.getFontState().getFontSize(); + boolean underlined = area.getUnderlined(); + + float red = area.getRed(); + float green = area.getGreen(); + float blue = area.getBlue(); + + FontMetricsMapper mapper; + try { + mapper = (FontMetricsMapper) + area.getFontState().getFontInfo().getMetricsFor(name); + } catch (FOPException iox) { + mapper = new FontMetricsMapper("MonoSpaced", + java.awt.Font.PLAIN, parent); + } + + if ((!name.equals(this.currentFontName)) || + (size != this.currentFontSize)) { + this.currentFontName = name; + this.currentFontSize = size; + } + + if ((red != this.currentRed) || (green != this.currentGreen) || + (blue != this.currentBlue)) { + this.currentRed = red; + this.currentGreen = green; + this.currentBlue = blue; + } + + int rx = this.currentXPosition; + int bl = this.currentYPosition; + + + String s = area.getText(); + Color oldColor = graphics.getColor(); + java.awt.Font oldFont = graphics.getFont(); + java.awt.Font f = mapper.getFont(size); + + if (saveColor != null) { + if (saveColor.getRed() != red || + saveColor.getGreen() != green || + saveColor.getBlue() != blue) { + saveColor = new Color(red, green, blue); + } + } else { + saveColor = new Color(red, green, blue); + } + graphics.setColor(saveColor); + + FontRenderContext newContext = graphics.getFontRenderContext(); + AttributedString ats = new AttributedString(s); + ats.addAttribute(TextAttribute.FONT, f); + if (underlined) { + ats.addAttribute(TextAttribute.UNDERLINE, + TextAttribute.UNDERLINE_ON); + } + AttributedCharacterIterator iter = ats.getIterator(); + graphics.drawString(iter, rx / 1000f, + (int)(pageHeight - bl / 1000f)); + + graphics.setColor(oldColor); + this.currentXPosition += area.getContentWidth(); + } + + public void renderInlineSpace(InlineSpace space) { + this.currentXPosition += space.getSize(); + } + + public void renderLineArea(LineArea area) { + int rx = this.currentAreaContainerXPosition + area.getStartIndent(); + int ry = this.currentYPosition; + int w = area.getContentWidth(); + int h = area.getHeight(); + + this.currentYPosition -= area.getPlacementOffset(); + this.currentXPosition = rx; + + int bl = this.currentYPosition; + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + org.apache.fop.layout.Box b = + (org.apache.fop.layout.Box) e.nextElement(); + b.render(this); + } + + this.currentYPosition = ry - h; + } + + /** + * render rule area into PDF + * + * @param area area to render + */ + public void renderRuleArea(RuleArea area) { + int rx = this.currentAreaContainerXPosition + area.getStartIndent(); + int ry = this.currentYPosition; + int w = area.getContentWidth(); + int h = area.getHeight(); + int th = area.getRuleThickness(); + float r = area.getRed(); + float g = area.getGreen(); + float b = area.getBlue(); + Color oldColor = graphics.getColor(); + + graphics.setColor(new Color(r, g, b)); + graphics.fillRect((int)(rx / 1000f), + (int)(pageHeight - ry / 1000f), (int)(w / 1000f), + (int)(th / 1000f)); + graphics.setColor(oldColor); + + } + + public void renderSVGArea(SVGArea area) { + + int x = this.currentAreaContainerXPosition; + int y = this.currentYPosition; + int w = area.getContentWidth(); + int h = area.getHeight(); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Object o = e.nextElement(); + if (o instanceof GraphicImpl) { + renderElement(area, (GraphicImpl) o, x, y, null); + } + } + + this.currentYPosition -= h; + + } + + + + public void setProducer(String producer) { + // defined in Renderer Interface + } + + public int print(Graphics g, PageFormat pageFormat, + int pageIndex) throws PrinterException { + if (pageIndex >= tree.getPages().size()) + return NO_SUCH_PAGE; + + Graphics2D oldGraphics = graphics; + int oldPageNumber = pageNumber; + + graphics = (Graphics2D) g; + Page aPage = (Page) tree.getPages().elementAt(pageIndex); + renderPage(aPage); + graphics = oldGraphics; + + return PAGE_EXISTS; + } + + public int getNumberOfPages() { + return tree.getPages().size(); + } + + public PageFormat getPageFormat(int pageIndex) + throws IndexOutOfBoundsException { + if (pageIndex >= tree.getPages().size()) + return null; + + Page page = (Page) tree.getPages().elementAt(pageIndex); + PageFormat pageFormat = new PageFormat(); + Paper paper = new Paper(); + paper.setImageableArea(0, 0, page.getWidth() / 1000d, + page.getHeight() / 1000d); + paper.setSize(page.getWidth() / 1000d, page.getHeight() / 1000d); + pageFormat.setPaper(paper); + + return pageFormat; + } + + public Printable getPrintable(int pageIndex) + throws IndexOutOfBoundsException { + return this; + } + + public void setProgressListener(ProgressListener l) { + progressListener = l; + } + + public static Color colorType2Color(ColorType ct) { + if (ct == null) { + return null; + } + return new Color(ct.red(), ct.green(), ct.blue()); + } + + + + /** + * Draws an image. + * TODO: protect other image formats (JIMI) + */ + public void renderImage(String href, float x, float y, float width, + float height, Vector transform) { + // What is with transformations? + try { + URL url = new URL(href); + ImageIcon imageIcon = new ImageIcon(url); + + AffineTransform fullTransform = new AffineTransform(); + AffineTransform aTransform; + + transform = (transform == null) ? new Vector() : transform; + for (int i = 0; i < transform.size(); i++) { + org.w3c.dom.svg.SVGTransform t = + (org.w3c.dom.svg.SVGTransform) + transform.elementAt(i); + SVGMatrix matrix = t.getMatrix(); + aTransform = new AffineTransform(matrix.getA(), + matrix.getB(), matrix.getC(), matrix.getD(), + matrix.getE(), matrix.getF()); + fullTransform.concatenate(aTransform); + } + + BufferedImage bi = new BufferedImage((int) width, (int) height, + BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bi.createGraphics(); + BufferedImageOp bop = new AffineTransformOp(fullTransform, + AffineTransformOp.TYPE_NEAREST_NEIGHBOR); + g2d.drawImage(imageIcon.getImage(), 0, 0, (int) width, + (int) height, imageIcon.getImageObserver()); + graphics.drawImage(bi, bop, (int) x, (int) y); + } catch (Exception ex) { + MessageHandler.errorln("AWTRenderer: renderImage(): " + + ex.getMessage()); + } + } + + + + public void renderElement(SVGArea svgarea, GraphicImpl area, + int posx, int posy, Vector parentTransforms) { + int x = posx; + int y = posy; + Hashtable style = area.oldgetStyle(); + DrawingInstruction di = createInstruction(area, style); + + Object o = null; + Vector v = area.oldgetTransform(); + v = (v == null) ? new Vector() : v; + Vector trans = new Vector(v); + parentTransforms = (parentTransforms == null) ? new Vector() : + parentTransforms; + + if (parentTransforms != null) { + trans.addAll(0, parentTransforms); + } + + float red = (float) graphics.getColor().getRed(); + float green = (float) graphics.getColor().getGreen(); + float blue = (float) graphics.getColor().getBlue(); + Color c = null; + + ColorType ct = null; + try { + o = style.get("fill"); + if (o != null && o instanceof ColorType) { + ct = (ColorType) o; + c = new Color((int)(ct.red() * 255f), + (int)(ct.green() * 255f), (int)(ct.blue() * 255f)); + } + o = style.get("stroke"); + if (c == null && o != null && o instanceof ColorType) { + ct = (ColorType) o; + c = new Color((int)(ct.red() * 255f), + (int)(ct.green() * 255f), (int)(ct.blue() * 255f)); + } + } catch (Exception ex) { + MessageHandler.errorln("Can't set color: R G B : " + + (int)(ct.red() * 255f) + " " + + (int)(ct.green() * 255f) + " " + + (int)(ct.blue() * 255f)); + c = Color.pink; + } + + if (c == null) { + c = new Color((int) red, (int) green, (int) blue); + } + Color oldColor = graphics.getColor(); + + if (area instanceof SVGLineElement) { + graphics.setColor(c); + SVGLineElementImpl lg = (SVGLineElementImpl) area; + + float x1 = lg.getX1().getBaseVal().getValue() * 1000 + posx; + float y1 = posy - lg.getY1().getBaseVal().getValue() * 1000 ; + float x2 = lg.getX2().getBaseVal().getValue() * 1000 + posx; + float y2 = posy - lg.getY2().getBaseVal().getValue() * 1000; + // TODO: + // The thickness of contour protect. + int th = 1; + o = style.get("stroke-width"); + if (o != null) + th = (int)((SVGLengthImpl) o).getValue(); + Line2D.Double aLine = new Line2D.Double(x1 / 1000f, + pageHeight - y1 / 1000f, x2 / 1000f, + pageHeight - y2 / 1000f); + drawShape(transformShape(trans, aLine), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGRectElement) { + graphics.setColor(c); + SVGRectElement rg = (SVGRectElement) area; + float rectx = rg.getX().getBaseVal().getValue() * 1000 + posx; + float recty = posy - rg.getY().getBaseVal().getValue() * 1000; + float rx = rg.getRx().getBaseVal().getValue() * 1000; + float ry = rg.getRy().getBaseVal().getValue() * 1000; + float rw = rg.getWidth().getBaseVal().getValue() * 1000; + float rh = rg.getHeight().getBaseVal().getValue() * 1000; + + // TODO: + // rx and ry are roundings. + // RoundRectangle2D.Double + Rectangle aRectangle = new Rectangle(); + aRectangle.setRect(rectx / 1000d, + pageHeight - recty / 1000d, rw / 1000d, rh / 1000d); + drawShape(transformShape(trans, aRectangle), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGCircleElement) { + graphics.setColor(c); + SVGCircleElement cg = (SVGCircleElement) area; + float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; + float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; + float r = cg.getR().getBaseVal().getValue(); + Ellipse2D.Double anEllipse = + new Ellipse2D.Double(cx / 1000d - r, + pageHeight - cy / 1000d - r, r * 2d, r * 2d); + drawShape(transformShape(trans, anEllipse), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGEllipseElement) { + graphics.setColor(c); + SVGEllipseElement cg = (SVGEllipseElement) area; + float cx = cg.getCx().getBaseVal().getValue() * 1000 + posx; + float cy = posy - cg.getCy().getBaseVal().getValue() * 1000; + float rx = cg.getRx().getBaseVal().getValue(); + float ry = cg.getRy().getBaseVal().getValue(); + Ellipse2D.Double anEllipse = + new Ellipse2D.Double(cx / 1000d - rx, + pageHeight - cy / 1000d - ry, rx * 2d, ry * 2d); + drawShape(transformShape(trans, anEllipse), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGImageElementImpl) { + SVGImageElementImpl ig = (SVGImageElementImpl) area; + renderImage(ig.link, ig.x + posx / 1000f, + pageHeight - (posy / 1000f - ig.y), ig.width, + ig.height, trans); + } else if (area instanceof SVGUseElementImpl) { + SVGUseElementImpl ug = (SVGUseElementImpl) area; + String ref = ug.link; + ref = ref.substring(1, ref.length()); + GraphicImpl graph = null; + // graph = area.locateDef(ref); + if (graph != null) { + // probably not the best way to do this, should be able + // to render without the style being set. + // GraphicImpl parent = graph.getGraphicParent(); + // graph.setParent(area); + // need to clip (if necessary) to the use area + // the style of the linked element is as if is was + // a direct descendant of the use element. + + renderElement(svgarea, graph, posx, posy, trans); + // graph.setParent(parent); + } + } else if (area instanceof SVGPolylineElementImpl) { + graphics.setColor(c); + Vector points = ((SVGPolylineElementImpl) area).points; + PathPoint p = null; + Point2D.Double p1 = null; + Point2D.Double p2 = null; + if (points.size() > 0) { + p = (PathPoint) points.elementAt(0); + double xc = p.x * 1000f + posx; + double yc = posy - p.y * 1000f; + p1 = new Point2D.Double(xc / 1000f, + pageHeight - yc / 1000f); + + int[] xarr = {(int) xc}; + int[] yarr = {(int) yc}; + graphics.drawPolyline(xarr, yarr, 1); + } + Line2D.Double aLine; + for (int i = 1; i < points.size(); i++) { + p = (PathPoint) points.elementAt(i); + p2 = new Point2D.Double(p.x + posx / 1000f, + pageHeight - (posy - p.y * 1000f) / 1000f); + aLine = new Line2D.Double(p1, p2); + graphics.draw(transformShape(trans, aLine)); + p1 = p2; + } + graphics.setColor(oldColor); + } else if (area instanceof SVGPolygonElementImpl) { + graphics.setColor(c); + java.awt.Polygon aPolygon = + convertPolygon(((SVGPolygonElementImpl) area), + posx, posy); + drawShape(transformShape(trans, aPolygon), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGGElementImpl) { + renderGArea(svgarea, (SVGGElementImpl) area, x, y, + parentTransforms); + } else if (area instanceof SVGPathElementImpl) { + graphics.setColor(c); + GeneralPath path = + convertPath((SVGPathElementImpl) area, posx, posy); + drawShape(transformShape(trans, path), di); + graphics.setColor(oldColor); + } else if (area instanceof SVGTextElementImpl) { + MessageHandler.errorln("SVGTextElementImpl is not implemented yet."); + // renderText(svgarea, (SVGTextElementImpl)area, 0, 0, di); + } else if (area instanceof SVGArea) { + // the x and y pos will be wrong! + Enumeration e = ((SVGArea) area).getChildren().elements(); + while (e.hasMoreElements()) { + Object el = e.nextElement(); + if (o instanceof GraphicImpl) { + renderElement((SVGArea) area, (GraphicImpl) el, x, + y, parentTransforms); + } + } + } + + // should be done with some cleanup code, so only + // required values are reset. + } // renderElement + + + public void renderGArea(SVGArea svgarea, SVGGElementImpl area, + int posx, int posy, Vector v) { + + + Vector trans = null; + // trans = new Vector(area.oldgetTransform()); + // trans.addAll(0, v); + /* Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Object o = e.nextElement(); + if(o instanceof GraphicImpl) { + renderElement(svgarea, (GraphicImpl)o, posx, posy, trans); + } + }*/ + } + public void renderGArea(SVGArea svgarea, SVGGElementImpl area, + int posx, int posy) { + renderGArea(svgarea, area, posx, posy, new Vector()); + } + + + /** + * Applies SVGTransform to the shape and gets the transformed shape. + * The type of the new shape may be different to the original type. + */ + public Shape transformShape(Vector trans, Shape shape) { + if (trans == null || trans.size() == 0) { + return shape; + } + + AffineTransform at; + for (int i = trans.size() - 1; i >= 0; i--) { + org.w3c.dom.svg.SVGTransform t = + (org.w3c.dom.svg.SVGTransform) trans.elementAt(i); + SVGMatrix matrix = t.getMatrix(); + at = new AffineTransform(matrix.getA(), matrix.getB(), + matrix.getC(), matrix.getD(), matrix.getE(), + matrix.getF()); + shape = at.createTransformedShape(shape); + } + return shape; + } + + + /** + * Mapps a SVG-Polygon to a AWT-Polygon. + */ + public java.awt.Polygon convertPolygon(SVGPolygonElementImpl svgpl, + int x, int y) { + java.awt.Polygon aPolygon = new java.awt.Polygon(); + Vector points = svgpl.points; + + PathPoint p; + for (int i = 0; i < points.size(); i++) { + p = (PathPoint) points.elementAt(i); + aPolygon.addPoint((int)(x / 1000f + p.x), + pageHeight - (int)(y / 1000f - p.y)); + } + + return aPolygon; + } + + // TODO: other attributes of DrawingInstruction protect too. + protected DrawingInstruction createInstruction(GraphicImpl area, + Hashtable style) { + DrawingInstruction di = new DrawingInstruction(); + Object sp; + sp = style.get("fill"); + if (sp != null && !(sp instanceof String && sp.equals("none"))) { + di.fill = true; + } + // ... + return di; + } + + // Draws a shape. + // TODO: other attributes of DrawingInstruction protect too. + protected void drawShape(Shape s, DrawingInstruction di) { + if (di.fill) { + graphics.fill(s); + } else { + graphics.draw(s); + } + } + + /** + * Mapps a SVG-Path to a AWT-GeneralPath. + */ + public GeneralPath convertPath(SVGPathElementImpl svgpath, float x, + float y) { + Vector points = svgpath.pathElements; + GeneralPath path = new GeneralPath(); + + float lastx = 0; + float lasty = 0; + SVGPathSegImpl pathmoveto = null; + + for (Enumeration e = points.elements(); e.hasMoreElements();) { + SVGPathSegImpl pc = (SVGPathSegImpl) e.nextElement(); + float[] vals = pc.getValues(); + float lastcx = 0; + float lastcy = 0; + switch (pc.getPathSegType()) { + case SVGPathSeg.PATHSEG_MOVETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + pathmoveto = pc; + path.moveTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_MOVETO_REL: + if (pathmoveto == null) { + lastx = vals[0]; + lasty = vals[1]; + path.moveTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + pathmoveto = pc; + } else { + lastx += vals[0]; + lasty += vals[1]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + + } + break; + case SVGPathSeg.PATHSEG_LINETO_ABS: + lastx = vals[0]; + lasty = vals[1]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_REL: + lastx += vals[0]; + lasty += vals[1]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: + lasty = vals[0]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: + lasty += vals[0]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: + lastx = vals[0]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: + lastx += vals[0]; + path.lineTo(lastx + x / 1000f, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: + lastx = vals[4]; + lasty = vals[5]; + lastcx = vals[2]; + lastcy = vals[3]; + path.curveTo(x / 1000f + vals[0], + pageHeight - y / 1000f + vals[1], + x / 1000f + lastcx, + pageHeight - y / 1000f + lastcy, + x / 1000f + lastx, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: + path.curveTo(x / 1000f + vals[0] + lastx, + pageHeight - y / 1000f + vals[1] + lasty, + x / 1000f + lastx + vals[2], + pageHeight - y / 1000f + lasty + vals[3], + x / 1000f + lastx + vals[4], + pageHeight - y / 1000f + lasty + vals[5]); + lastcx = vals[2] + lastx; + lastcy = vals[3] + lasty; + lastx += vals[4]; + lasty += vals[5]; + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + lastx = vals[2]; + lasty = vals[3]; + path.curveTo(x / 1000f + lastcx, + pageHeight - y / 1000f + lastcy, + x / 1000f + vals[0], + pageHeight - y / 1000f + vals[1], + x / 1000f + lastx, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + path.curveTo(x / 1000f + lastcx, + pageHeight - y / 1000f + lastcy, + x / 1000f + lastx + vals[0], + pageHeight - y / 1000f + lasty + vals[1], + x / 1000f + lastx + vals[2], + pageHeight - y / 1000f + lasty + vals[3]); + lastx += vals[2]; + lasty += vals[3]; + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + lastx = vals[0]; + lasty = vals[1]; + lastcx = 0; + lastcy = 0; + path.quadTo(x / 1000f + lastcx, + pageHeight - y / 1000f + lastcy, + x / 1000f + lastx, + pageHeight - y / 1000f + lasty); + break; + case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: + if (lastcx == 0) + lastcx = lastx; + if (lastcy == 0) + lastcy = lasty; + + path.quadTo(x / 1000f + lastcx , + pageHeight - y / 1000f + lastcy, + x / 1000f + lastx + vals[0], + pageHeight - y / 1000f + lasty + vals[1]); + + lastx += vals[0]; + lasty += vals[1]; + lastcx = 0; + lastcy = 0; + break; + case SVGPathSeg.PATHSEG_ARC_ABS: + { + // Arc2D.Double arc = new Arc2D.Double(); + // arc.setAngles(current point, end point); .... + double rx = vals[0]; + double ry = vals[1]; + double theta = vals[2]; + boolean largearcflag = (vals[3] == 1.0); + boolean sweepflag = (vals[4] == 1.0); + + double cx = lastx; + double cy = lasty; + + path.curveTo(x / 1000f + lastx, + pageHeight - y / 1000f + lasty, + x / 1000f + vals[0], + pageHeight - y / 1000f + vals[1], + x / 1000f + vals[5], + pageHeight - y / 1000f + vals[6]); + + lastcx = 0; //?? + lastcy = 0; //?? + lastx = vals[5]; + lasty = vals[6]; + } + break; + case SVGPathSeg.PATHSEG_ARC_REL: + { + double rx = vals[0]; + double ry = vals[1]; + double theta = vals[2]; + boolean largearcflag = (vals[3] == 1.0); + boolean sweepflag = (vals[4] == 1.0); + + path.curveTo(x / 1000f + lastx, + pageHeight - y / 1000f + lasty, + x / 1000f + (vals[0] + lastx), + pageHeight - y / 1000f + (vals[1] + lasty), + x / 1000f + (vals[5] + lastx), + pageHeight - y / 1000f + (vals[6] + lasty)); + lastcx = 0; //?? + lastcy = 0; //?? + lastx += vals[5]; + lasty += vals[6]; + } + break; + case SVGPathSeg.PATHSEG_CLOSEPATH: + path.closePath(); + break; + + + } // switch + } // for points.elements() + + return path; + } // convertPath + /* + if(di == null) { + currentStream.add("S\n"); + } else { + if(di.fill) { + if(di.stroke) { + if(!di.nonzero) + currentStream.add("B*\n"); + else + currentStream.add("B\n"); + } else { + if(!di.nonzero) + currentStream.add("f*\n"); + else + currentStream.add("f\n"); + } + } else { + // if(di.stroke) + currentStream.add("S\n"); + } + } + */ + + /* + * by pdfrenderer übernommen. + * + */ + class DrawingInstruction { + boolean stroke = false; + boolean nonzero = false; // non-zero fill rule "f*", "B*" operator + boolean fill = false; + int linecap = 0; // butt + int linejoin = 0; // miter + int miterwidth = 8; + } + + public void renderForeignObjectArea(ForeignObjectArea area) { + area.getObject().render(this); + } } diff --git a/src/org/apache/fop/render/awt/FontMetricsMapper.java b/src/org/apache/fop/render/awt/FontMetricsMapper.java new file mode 100644 index 000000000..ee7f519d1 --- /dev/null +++ b/src/org/apache/fop/render/awt/FontMetricsMapper.java @@ -0,0 +1,182 @@ +/* + + ============================================================================ + The Apache Software License, Version 1.1 + ============================================================================ + + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + + Redistribution and use in source and binary forms, with or without modifica- + tion, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. + + 4. The names "Fop" and "Apache Software Foundation" must not be used to + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. + + 5. Products derived from this software may not be called "Apache", nor may + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package org.apache.fop.render.awt; + +//FOP +import org.apache.fop.messaging.MessageHandler; +import org.apache.fop.layout.FontInfo; +import org.apache.fop.layout.FontDescriptor; +import org.apache.fop.layout.FontState; + +// Java +import java.util.Enumeration; +import java.util.Hashtable; +import java.awt.Component; +import java.awt.Font; + + +/** +* This class implements org.apache.fop.layout.FontMetric and +* is added to the hash table in FontInfo. It deferes the +* actual calculation of the metrics to +* AWTFontMetrics. It only keeps the java name and +* style as member varibles +*/ + +public class FontMetricsMapper implements org.apache.fop.layout.FontMetric { + /** + * The first and last non space-character + */ + private final static int FIRST_CHAR = 32; + private final static int LAST_CHAR = 255; + + /** + * This is a AWTFontMetrics that does the real calculation. + * It is only one class that dynamically determines the font-size. + */ + private static AWTFontMetrics metric = null; + + /** + * The java name of the font. + # Make the family name immutable. + */ + private final String family; + + /** + * The java style of the font. + # Make the style immutable. + */ + private final int style; + + /** + * Constructs a new Font-metrics. + * @param family the family name of the font (java value) + * @param style the java type style value of the font + * @param parent an AWT component - this is needed so + * that we can get an instance of + * java.awt.FontMetrics + */ + public FontMetricsMapper(String family, int style, Component parent) { + this.family = family; + this.style = style; + if (metric == null) + metric = new AWTFontMetrics(parent); + } + + /** + * Determines the font ascent of the Font described by this + * FontMetrics object + * @return ascent in milliponts + */ + public int getAscender(int size) { + return metric.getAscender(family, style, size); + } + + + /** + * The size of a capital letter measured from the font's baseline + */ + public int getCapHeight(int size) { + return metric.getCapHeight(family, style, size); + } + + /** + * Determines the font descent of the Font described by this + * FontMetrics object + * @return descent in milliponts + */ + public int getDescender(int size) { + return metric.getDescender(family, style, size); + } + + /** + * Determines the typical font height of this + * FontMetrics object + * @return font height in milliponts + */ + public int getXHeight(int size) { + return metric.getXHeight(family, style, size); + } + + + public int getFirstChar() { + return FIRST_CHAR; + } + + public int getLastChar() { + return LAST_CHAR; + } + + /** + * return width (in 1/1000ths of point size) of character at + * code point i. + */ + public int width(int i, int size) { + return metric.width(i, family, style, size); + } + + + /** + * return width (in 1/1000ths of point size) of all character + */ + public int[] getWidths(int size) { + return metric.getWidths(family, style, size); + } + + /** + * Gets a Font instance of the Font that this + * FontMetrics describes in the desired size. + * @return font with the desired characeristics. + */ + public Font getFont(int size) { + return metric.getFont(family, style, size); + } +} + + + + + diff --git a/src/org/apache/fop/render/awt/FontSetup.java b/src/org/apache/fop/render/awt/FontSetup.java new file mode 100644 index 000000000..2d24f55bd --- /dev/null +++ b/src/org/apache/fop/render/awt/FontSetup.java @@ -0,0 +1,228 @@ +/*-- $Id: FontSetup.java -- + + ============================================================================ + The Apache Software License, Version 1.1 + ============================================================================ + + Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + + Redistribution and use in source and binary forms, with or without modifica- + tion, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. The end-user documentation included with the redistribution, if any, must + include the following acknowledgment: "This product includes software + developed by the Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, if + and wherever such third-party acknowledgments normally appear. + + 4. The names "Fop" and "Apache Software Foundation" must not be used to + endorse or promote products derived from this software without prior + written permission. For written permission, please contact + apache@apache.org. + + 5. Products derived from this software may not be called "Apache", nor may + "Apache" appear in their name, without prior written permission of the + Apache Software Foundation. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This software consists of voluntary contributions made by many individuals + on behalf of the Apache Software Foundation and was originally created by + James Tauber <jtauber@jtauber.com>. For more information on the Apache + Software Foundation, please see <http://www.apache.org/>. + + */ +package org.apache.fop.render.awt; + +// FOP +import org.apache.fop.messaging.MessageHandler; +import org.apache.fop.layout.FontInfo; +import org.apache.fop.layout.FontDescriptor; + +// Java +import java.util.Enumeration; +import java.util.Hashtable; +import java.awt.Font; +import java.awt.Component; + +/** + * sets up the AWT fonts. It is similar to + * org.apache.fop.render.pdf.FontSetup. + * Assigns the font (with metrics) to internal names like "F1" and + * assigns family-style-weight triplets to the fonts + */ +public class FontSetup { + + + /** sets up the font info object. + * + * adds metrics for basic fonts and useful family-style-weight + * triplets for lookup + * + * @param fontInfo the font info object to set up + * @param parent needed, since a live AWT component is needed + * to get a valid java.awt.FontMetrics object + */ + public static void setup(FontInfo fontInfo, Component parent) { + FontMetricsMapper metric; + int normal, bold, bolditalic, italic; + + MessageHandler.logln("setting up fonts"); + + /* available java fonts are: + Serif - bold, normal, italic, bold-italic + SansSerif - bold, normal, italic, bold-italic + MonoSpaced - bold, normal, italic, bold-italic + */ + normal = java.awt.Font.PLAIN; + bold = java.awt.Font.BOLD; + italic = java.awt.Font.ITALIC; + bolditalic = java.awt.Font.BOLD + java.awt.Font.ITALIC; + + metric = new FontMetricsMapper("SansSerif", normal, parent); + // --> goes to F1 + fontInfo.addMetrics("F1", metric); + metric = new FontMetricsMapper("SansSerif",italic, parent); + // --> goes to F2 + fontInfo.addMetrics("F2", metric); + metric = new FontMetricsMapper("SansSerif", bold, parent); + // --> goes to F3 + fontInfo.addMetrics("F3", metric); + metric = new FontMetricsMapper("SansSerif", bolditalic, parent); + // --> goes to F4 + fontInfo.addMetrics("F4", metric); + + + metric = new FontMetricsMapper("Serif", normal, parent); + // --> goes to F5 + fontInfo.addMetrics("F5", metric); + metric = new FontMetricsMapper("Serif", italic, parent); + // --> goes to F6 + fontInfo.addMetrics("F6", metric); + metric = new FontMetricsMapper("Serif", bold, parent); + // --> goes to F7 + fontInfo.addMetrics("F7", metric); + metric = new FontMetricsMapper("Serif", bolditalic, parent); + // --> goes to F8 + fontInfo.addMetrics("F8", metric); + + metric = new FontMetricsMapper("MonoSpaced", normal, parent); + // --> goes to F9 + fontInfo.addMetrics("F9", metric); + metric = new FontMetricsMapper("MonoSpaced", italic, parent); + // --> goes to F10 + fontInfo.addMetrics("F10", metric); + metric = new FontMetricsMapper("MonoSpaced", bold, parent); + // --> goes to F11 + fontInfo.addMetrics("F11", metric); + metric = new FontMetricsMapper("MonoSpaced", bolditalic, parent); + // --> goes to F12 + fontInfo.addMetrics("F12", metric); + + metric = new FontMetricsMapper("Symbol", bolditalic, parent); + // --> goes to F13 and F14 + fontInfo.addMetrics("F13", metric); + fontInfo.addMetrics("F14", metric); + + //Custom type 1 fonts step 1/2 + // fontInfo.addMetrics("F15", new OMEP()); + // fontInfo.addMetrics("F16", new GaramondLightCondensed()); + // fontInfo.addMetrics("F17", new BauerBodoniBoldItalic()); + + /* any is treated as serif */ + fontInfo.addFontProperties("F5", "any", "normal", "normal"); + fontInfo.addFontProperties("F6", "any", "italic", "normal"); + fontInfo.addFontProperties("F6", "any", "oblique", "normal"); + fontInfo.addFontProperties("F7", "any", "normal", "bold"); + fontInfo.addFontProperties("F8", "any", "italic", "bold"); + fontInfo.addFontProperties("F8", "any", "oblique", "bold"); + + fontInfo.addFontProperties("F1", "sans-serif", "normal", "normal"); + fontInfo.addFontProperties("F2", "sans-serif", "oblique", "normal"); + fontInfo.addFontProperties("F2", "sans-serif", "italic", "normal"); + fontInfo.addFontProperties("F3", "sans-serif", "normal", "bold"); + fontInfo.addFontProperties("F4", "sans-serif", "oblique", "bold"); + fontInfo.addFontProperties("F4", "sans-serif", "italic", "bold"); + fontInfo.addFontProperties("F5", "serif", "normal", "normal"); + fontInfo.addFontProperties("F6", "serif", "oblique", "normal"); + fontInfo.addFontProperties("F6", "serif", "italic", "normal"); + fontInfo.addFontProperties("F7", "serif", "normal", "bold"); + fontInfo.addFontProperties("F8", "serif", "oblique", "bold"); + fontInfo.addFontProperties("F8", "serif", "italic", "bold"); + fontInfo.addFontProperties("F9", "monospace", "normal", "normal"); + fontInfo.addFontProperties("F10", "monospace", "oblique", "normal"); + fontInfo.addFontProperties("F10", "monospace", "italic", "normal"); + fontInfo.addFontProperties("F11", "monospace", "normal", "bold"); + fontInfo.addFontProperties("F12", "monospace", "oblique", "bold"); + fontInfo.addFontProperties("F12", "monospace", "italic", "bold"); + + fontInfo.addFontProperties("F1", "Helvetica", "normal", "normal"); + fontInfo.addFontProperties("F2", "Helvetica", "oblique", "normal"); + fontInfo.addFontProperties("F2", "Helvetica", "italic", "normal"); + fontInfo.addFontProperties("F3", "Helvetica", "normal", "bold"); + fontInfo.addFontProperties("F4", "Helvetica", "oblique", "bold"); + fontInfo.addFontProperties("F4", "Helvetica", "italic", "bold"); + fontInfo.addFontProperties("F5", "Times", "normal", "normal"); + fontInfo.addFontProperties("F6", "Times", "oblique", "normal"); + fontInfo.addFontProperties("F6", "Times", "italic", "normal"); + fontInfo.addFontProperties("F7", "Times", "normal", "bold"); + fontInfo.addFontProperties("F8", "Times", "oblique", "bold"); + fontInfo.addFontProperties("F8", "Times", "italic", "bold"); + fontInfo.addFontProperties("F9", "Courier", "normal", "normal"); + fontInfo.addFontProperties("F10", "Courier", "oblique", "normal"); + fontInfo.addFontProperties("F10", "Courier", "italic", "normal"); + fontInfo.addFontProperties("F11", "Courier", "normal", "bold"); + fontInfo.addFontProperties("F12", "Courier", "oblique", "bold"); + fontInfo.addFontProperties("F12", "Courier", "italic", "bold"); + fontInfo.addFontProperties("F13", "Symbol", "normal", "normal"); + fontInfo.addFontProperties("F14", "ZapfDingbats", "normal", "normal"); + + //Custom type 1 fonts step 2/2 + // fontInfo.addFontProperties("F15", "OMEP", "normal", "normal"); + // fontInfo.addFontProperties("F16", "Garamond-LightCondensed", "normal", "normal"); + // fontInfo.addFontProperties("F17", "BauerBodoni", "italic", "bold"); + + /* for compatibility with PassiveTex */ + fontInfo.addFontProperties("F5", "Times-Roman", "normal", "normal"); + fontInfo.addFontProperties("F6", "Times-Roman", "oblique", "normal"); + fontInfo.addFontProperties("F6", "Times-Roman", "italic", "normal"); + fontInfo.addFontProperties("F7", "Times-Roman", "normal", "bold"); + fontInfo.addFontProperties("F8", "Times-Roman", "oblique", "bold"); + fontInfo.addFontProperties("F8", "Times-Roman", "italic", "bold"); + fontInfo.addFontProperties("F5", "Times Roman", "normal", "normal"); + fontInfo.addFontProperties("F6", "Times Roman", "oblique", "normal"); + fontInfo.addFontProperties("F6", "Times Roman", "italic", "normal"); + fontInfo.addFontProperties("F7", "Times Roman", "normal", "bold"); + fontInfo.addFontProperties("F8", "Times Roman", "oblique", "bold"); + fontInfo.addFontProperties("F8", "Times Roman", "italic", "bold"); + fontInfo.addFontProperties("F9", "Computer-Modern-Typewriter", + "normal", "normal"); + } + +} + + + + + + + + + + diff --git a/src/org/apache/fop/render/pdf/Font.java b/src/org/apache/fop/render/pdf/Font.java index 5717a62ad..88e677cd1 100644 --- a/src/org/apache/fop/render/pdf/Font.java +++ b/src/org/apache/fop/render/pdf/Font.java @@ -68,3 +68,6 @@ public abstract class Font implements FontMetric { */ public abstract String fontName(); } + + + |