diff options
author | arved <arved@unknown> | 2001-02-10 03:25:29 +0000 |
---|---|---|
committer | arved <arved@unknown> | 2001-02-10 03:25:29 +0000 |
commit | e761b3ccd521280551ed77b6b890d9d3e686bd5a (patch) | |
tree | 006a9b650c6ca2bcfaf30152e11e35d96336c5bb /src/org/apache/fop | |
parent | 2bf851895741ccbd138d987cc2cd11fab5456229 (diff) | |
download | xmlgraphics-fop-e761b3ccd521280551ed77b6b890d9d3e686bd5a.tar.gz xmlgraphics-fop-e761b3ccd521280551ed77b6b890d9d3e686bd5a.zip |
MIF renderer
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194037 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop')
-rw-r--r-- | src/org/apache/fop/render/mif/MIFRenderer.java | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/src/org/apache/fop/render/mif/MIFRenderer.java b/src/org/apache/fop/render/mif/MIFRenderer.java new file mode 100644 index 000000000..34509081d --- /dev/null +++ b/src/org/apache/fop/render/mif/MIFRenderer.java @@ -0,0 +1,541 @@ +/*-- $Id$ -- + + ============================================================================ + 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/>. + + */ + +// Author : Seshadri G + + + + +package org.apache.fop.render.mif; + +// FOP +import org.apache.fop.render.Renderer; +import org.apache.fop.messaging.MessageHandler; +import org.apache.fop.image.ImageArea; +import org.apache.fop.image.FopImage; +import org.apache.fop.apps.FOPException; +import org.apache.fop.fo.properties.*; +import org.apache.fop.fo.*; +import org.apache.fop.layout.*; +import org.apache.fop.layout.inline.*; +import org.apache.fop.datatypes.*; +import org.apache.fop.svg.PathPoint; +import org.apache.fop.mif.*; +import org.apache.fop.layout.*; +import org.apache.fop.image.*; + +import org.w3c.dom.*; +import org.w3c.dom.svg.*; +import org.w3c.dom.css.*; +import org.w3c.dom.svg.SVGLength; + +import org.apache.fop.dom.svg.*; +import org.apache.fop.dom.svg.SVGRectElementImpl; +import org.apache.fop.dom.svg.SVGTextElementImpl; +import org.apache.fop.dom.svg.SVGLineElementImpl; +import org.apache.fop.dom.svg.SVGArea; + +// Java +import java.io.IOException; +import java.io.OutputStream; +import java.util.Enumeration; +import java.awt.Rectangle; +import java.util.Vector; +import java.util.Hashtable; +/** + * Renderer that renders areas to MIF + */ +public class MIFRenderer implements Renderer { + + private String currentFontName; + private String currentFontSize; + private int pageHeight; + private int pageWidth; + + /** the current vertical position in millipoints from bottom */ + protected int currentYPosition = 0; + + /** the current horizontal position in millipoints from left */ + protected int currentXPosition = 0; + + /** the horizontal position of the current area container */ + private int currentAreaContainerXPosition = 0; + + + /** the MIF Document being created */ + protected MIFDocument mifDoc; + + + /* is a table currently open? */ + private boolean inTable=false; + + + + /** + * create the MIF renderer + */ + public MIFRenderer() { + this.mifDoc = new MIFDocument(); + } + + + /** + * render the areas into MIF + * + * @param areaTree the laid-out area tree + * @param writer the PrintWriter to write the MIF with + */ + + public void render(AreaTree areaTree, + OutputStream stream) throws IOException, FOPException { + + MessageHandler.logln("rendering areas to MIF"); + // idReferences=areaTree.getIDReferences(); + //this.pdfResources = this.pdfDoc.getResources(); + //this.pdfDoc.setIDReferences(idReferences); + Enumeration e = areaTree.getPages().elements(); + while (e.hasMoreElements()) { + this.renderPage((Page) e.nextElement()); + } + + + // MessageHandler.logln("writing out MIF"); + + this.mifDoc.output(stream); + stream.close(); + } + + + + + /** set up the given FontInfo */ + public void setupFontInfo(FontInfo fontInfo) { + + FontSetup.setup(fontInfo); + //FontSetup.addToFontFormat(this.mifDoc, fontInfo); + + + } + + /** set the producer of the rendering */ + public void setProducer(String producer) {} + + + public void renderAreaContainer(AreaContainer area) { + + if (area.foCreator != null && area.foCreator.getName() == "fo:table") { + + this.mifDoc.createTable(); + this.inTable=true; + } + else + if (area.foCreator != null && area.foCreator.getName() == "fo:table-body") { + + this.mifDoc.setCurrent("fo:table-body"); + } + else + if (area.foCreator != null && area.foCreator.getName() == "fo:table-column") { + + int colWidth=((org.apache.fop.fo.flow.TableColumn) area.foCreator).getColumnWidth(); + this.mifDoc.setColumnProp(colWidth); + } + else + if (area.foCreator != null && area.foCreator.getName() == "fo:table-row") { + + this.mifDoc.startRow(); + } + else + if (area.foCreator != null && area.foCreator.getName() == "fo:table-cell") { + + int rowSpan=((org.apache.fop.fo.flow.TableCell) area.foCreator).getNumRowsSpanned(); + int colSpan=((org.apache.fop.fo.flow.TableCell) area.foCreator).getNumColumnsSpanned(); + this.mifDoc.startCell(rowSpan,colSpan); + } + else + if (inTable) { + + inTable=false; + this.mifDoc.endTable(); + + } + int saveY = this.currentYPosition; + int saveX = this.currentAreaContainerXPosition; + + if (area.getPosition() == 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() == Position.RELATIVE) { + + this.currentYPosition -= area.getYPosition(); + this.currentAreaContainerXPosition += area.getXPosition(); + + } else if (area.getPosition() == Position.STATIC) { + + this.currentYPosition -= + area.getPaddingTop() + area.borderWidthTop; + this.currentAreaContainerXPosition +=area.getPaddingLeft() + area.borderWidthLeft; + } + + this.currentXPosition = this.currentAreaContainerXPosition; + doFrame(area); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Box b = (Box) e.nextElement(); + b.render(this); + } + if (area.getPosition() != Position.STATIC) { + this.currentYPosition = saveY; + this.currentAreaContainerXPosition = saveX; + } else + this.currentYPosition -= area.getHeight(); + } + + public void renderBodyAreaContainer(BodyAreaContainer area) { + + + int saveY = this.currentYPosition; + int saveX = this.currentAreaContainerXPosition; + + if (area.getPosition() == Position.ABSOLUTE) { + // Y position is computed assuming positive Y axis, adjust for negative postscript one + this.currentYPosition = area.getYPosition(); + this.currentAreaContainerXPosition = area.getXPosition(); + } else if (area.getPosition() == Position.RELATIVE) { + this.currentYPosition -= area.getYPosition(); + this.currentAreaContainerXPosition += area.getXPosition(); + } + + this.currentXPosition = this.currentAreaContainerXPosition; + int w, h; + int rx = this.currentAreaContainerXPosition; + w = area.getContentWidth(); + h = area.getContentHeight(); + int ry = this.currentYPosition; + ColorType bg = area.getBackgroundColor(); + + /* + + // 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, new PDFColor(bg), new PDFColor(bg)); + } + + */ + /* + + // floats & footnotes stuff + renderAreaContainer(area.getBeforeFloatReferenceArea()); + renderAreaContainer(area.getFootnoteReferenceArea()); + + */ + // main reference area + Enumeration e = area.getMainReferenceArea().getChildren().elements(); + while (e.hasMoreElements()) { + Box b = (Box) e.nextElement(); + b.render(this); // span areas + } + + if (area.getPosition() != Position.STATIC) { + this.currentYPosition = saveY; + this.currentAreaContainerXPosition = saveX; + } else + this.currentYPosition -= area.getHeight(); + + } + + + private void doFrame(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, + new PDFColor(bg), + new PDFColor(bg)); + } + + */ + + rx = rx - area.borderWidthLeft; + ry = ry + area.borderWidthTop; + w = w + area.borderWidthLeft + area.borderWidthRight; + h = h + area.borderWidthTop + area.borderWidthBottom; + + //Create a textrect with these dimensions. + //The y co-ordinate is measured +ve downwards so subtract page-height + + this.mifDoc.setTextRectProp(rx,pageHeight-ry,w,h); + + + /* + + if (area.borderWidthTop != 0) + addLine(rx, ry, rx + w, ry, + area.borderWidthTop, + new PDFColor(area.borderColorTop)); + if (area.borderWidthLeft != 0) + addLine(rx, ry, rx, ry - h, + area.borderWidthLeft, + new PDFColor(area.borderColorLeft)); + if (area.borderWidthRight != 0) + addLine(rx + w, ry, rx + w, ry - h, + area.borderWidthRight, + new PDFColor(area.borderColorRight)); + if (area.borderWidthBottom != 0) + addLine(rx, ry - h, rx + w, ry - h, + area.borderWidthBottom, + new PDFColor(area.borderColorBottom)); + + */ + } + + public void renderSpanArea(SpanArea area) { + + //A span maps to a textframe + + + this.mifDoc.createTextRect(area.getColumnCount()); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Box b = (Box) e.nextElement(); + b.render(this); // column areas + } + } + + + + + + + /** render the given block area */ + public void renderBlockArea(BlockArea area) { + + this.mifDoc.setBlockProp(area.getStartIndent(),area.getEndIndent()); + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + Box b = (Box) e.nextElement(); + b.render(this); + } + + } + + /** render the given display space */ + public void renderDisplaySpace(DisplaySpace space) { + + int d = space.getSize(); + this.currentYPosition -= d; + + } + + /** render the given SVG area */ + public void renderSVGArea(SVGArea area) {} + + /** render a foreign object area */ + public void renderForeignObjectArea(ForeignObjectArea area) { + } + + public void renderWordArea(WordArea area) { + String s; + s = area.getText(); + this.mifDoc.addToStream(s); + + this.currentXPosition += area.getContentWidth(); + } + + /** render the given image area */ + public void renderImageArea(ImageArea area) { + + int x = this.currentAreaContainerXPosition + area.getXOffset(); + int y = this.currentYPosition; + int w = area.getContentWidth(); + int h = area.getHeight(); + + this.currentYPosition -= h; + + FopImage img = area.getImage(); + if (img instanceof SVGImage) { + /* try { + SVGSVGElement svg = + ((SVGImage) img).getSVGDocument().getRootElement(); + currentStream.add("ET\nq\n" + (((float) w) / 1000f) + + " 0 0 " + (((float) h) / 1000f) + " " + + (((float) x) / 1000f) + " " + + (((float)(y - h)) / 1000f) + " cm\n"); + // renderSVG(svg, (int) x, (int) y); + currentStream.add("Q\nBT\n"); + } catch (FopImageException e) { + } */ + + MessageHandler.logln("Warning: SVG images not supported in this version"); + } else { + String url = img.getURL(); + this.mifDoc.addImage(url,x,pageHeight-y,w,h); + + } + } + + + + /** render the given inline area */ + public void renderInlineArea(InlineArea area) {} + + /** render the given inline space */ + public void renderInlineSpace(InlineSpace space) { + + // I dont need the size of space! I just need to + // leave a blank space each time + String s=" "; + this.mifDoc.addToStream(s); // cool! + this.currentXPosition += space.getSize(); + } + + /** render the given line area */ + 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; + + //The start of a new linearea corresponds to a new para in FM + + this.mifDoc.startLine(); + + Enumeration e = area.getChildren().elements(); + while (e.hasMoreElements()) { + + Box b = (Box) e.nextElement(); + this.currentYPosition = ry - area.getPlacementOffset(); + b.render(this); + + } + this.currentYPosition = ry-h; + this.currentXPosition = rx; + + + } + + + + /** render the given page */ + public void renderPage(Page page) { + + AreaContainer before, after; + BodyAreaContainer body; + body = page.getBody(); + before = page.getBefore(); + after = page.getAfter(); + + this.currentFontName = ""; + this.currentFontSize = "0"; + + pageHeight=page.getHeight(); + pageWidth=page.getWidth(); + this.mifDoc.setDocumentHeightWidth(pageHeight,pageWidth); + + + this.mifDoc.createPage(); + + renderBodyAreaContainer(body); + + + // If the area is an instance of anything other than body, it goes into the + // corresponding master page. + + + if (before != null) { + + this.mifDoc.createTextRect(1); // Create a rect with one col + renderAreaContainer(before); + } + + if (after != null) { + + this.mifDoc.createTextRect(1); // Create a rect with one col + renderAreaContainer(after); + } + + } + + /** render the given leader area */ + public void renderLeaderArea(LeaderArea area) {} + + +} |